mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-30 19:36:25 +08:00
Implementing controlling of the sorting order
The dialog looks quite ugly right now, but at least everything works. I can work on making it prettier after this.
This commit is contained in:
@ -1,4 +1,6 @@
|
|||||||
settings:
|
settings:
|
||||||
|
ok: Ok
|
||||||
|
cancel: Cancel
|
||||||
title: Settings
|
title: Settings
|
||||||
author:
|
author:
|
||||||
label: Full Name
|
label: Full Name
|
||||||
@ -71,11 +73,17 @@ settings:
|
|||||||
markdownEditor: Markdown Editor
|
markdownEditor: Markdown Editor
|
||||||
journalEditor: Journal Editor
|
journalEditor: Journal Editor
|
||||||
defaultFolder: Default Folder
|
defaultFolder: Default Folder
|
||||||
sortingMode:
|
sortingField:
|
||||||
modified: Last Modified
|
modified: Last Modified
|
||||||
created: Created
|
created: Created
|
||||||
filename: File Name
|
filename: File Name
|
||||||
title: Title
|
title: Title
|
||||||
|
sortingOrder:
|
||||||
|
asc: Ascending
|
||||||
|
desc: Descending
|
||||||
|
sortingMode:
|
||||||
|
field: Field
|
||||||
|
order: Order
|
||||||
remoteSync:
|
remoteSync:
|
||||||
auto: Automatic
|
auto: Automatic
|
||||||
manual: Manual
|
manual: Manual
|
||||||
|
@ -70,7 +70,7 @@ class NotesFolderConfig extends Equatable {
|
|||||||
return NotesFolderConfig(
|
return NotesFolderConfig(
|
||||||
defaultEditor: settings.defaultEditor.toEditorType(),
|
defaultEditor: settings.defaultEditor.toEditorType(),
|
||||||
defaultView: settings.defaultView.toFolderViewType(),
|
defaultView: settings.defaultView.toFolderViewType(),
|
||||||
sortingMode: settings.sortingMode,
|
sortingMode: SortingMode(settings.sortingField, settings.sortingOrder),
|
||||||
showNoteSummary: settings.showNoteSummary,
|
showNoteSummary: settings.showNoteSummary,
|
||||||
viewHeader: viewHeader,
|
viewHeader: viewHeader,
|
||||||
fileNameFormat: settings.noteFileNameFormat,
|
fileNameFormat: settings.noteFileNameFormat,
|
||||||
@ -82,7 +82,8 @@ class NotesFolderConfig extends Equatable {
|
|||||||
Future<void> saveToSettings() async {
|
Future<void> saveToSettings() async {
|
||||||
var settings = Settings.instance;
|
var settings = Settings.instance;
|
||||||
|
|
||||||
settings.sortingMode = sortingMode;
|
settings.sortingField = sortingMode.field;
|
||||||
|
settings.sortingOrder = sortingMode.order;
|
||||||
settings.showNoteSummary = showNoteSummary;
|
settings.showNoteSummary = showNoteSummary;
|
||||||
settings.defaultEditor = SettingsEditorType.fromEditorType(defaultEditor);
|
settings.defaultEditor = SettingsEditorType.fromEditorType(defaultEditor);
|
||||||
settings.defaultView =
|
settings.defaultView =
|
||||||
@ -145,8 +146,12 @@ class NotesFolderConfig extends Equatable {
|
|||||||
Log.d('NotesFolderConfig::decode("$contents") -> ${err.toString()}');
|
Log.d('NotesFolderConfig::decode("$contents") -> ${err.toString()}');
|
||||||
}
|
}
|
||||||
|
|
||||||
var sortingMode =
|
var sortingField =
|
||||||
SortingMode.fromInternalString(map["sortingMode"]?.toString());
|
SortingField.fromInternalString(map["sortingField"]?.toString());
|
||||||
|
var sortingOrder =
|
||||||
|
SortingOrder.fromInternalString(map["sortingOrder"]?.toString());
|
||||||
|
var sortingMode = SortingMode(sortingField, sortingOrder);
|
||||||
|
|
||||||
var defaultEditor =
|
var defaultEditor =
|
||||||
SettingsEditorType.fromInternalString(map["defaultEditor"]?.toString());
|
SettingsEditorType.fromInternalString(map["defaultEditor"]?.toString());
|
||||||
var defaultView = SettingsFolderViewType.fromInternalString(
|
var defaultView = SettingsFolderViewType.fromInternalString(
|
||||||
@ -198,7 +203,8 @@ class NotesFolderConfig extends Equatable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var map = <String, dynamic>{
|
var map = <String, dynamic>{
|
||||||
"sortingMode": sortingMode.toInternalString(),
|
"sortingField": sortingMode.field.toInternalString(),
|
||||||
|
"sortingOrder": sortingMode.order.toInternalString(),
|
||||||
"defaultEditor":
|
"defaultEditor":
|
||||||
SettingsEditorType.fromEditorType(defaultEditor).toInternalString(),
|
SettingsEditorType.fromEditorType(defaultEditor).toInternalString(),
|
||||||
"defaultView": SettingsFolderViewType.fromFolderViewType(defaultView)
|
"defaultView": SettingsFolderViewType.fromFolderViewType(defaultView)
|
||||||
|
@ -141,7 +141,8 @@ class SortedNotesFolder with NotesFolderNotifier implements NotesFolder {
|
|||||||
bool get isEmpty => folder.isEmpty;
|
bool get isEmpty => folder.isEmpty;
|
||||||
|
|
||||||
void changeSortingMode(SortingMode sm) {
|
void changeSortingMode(SortingMode sm) {
|
||||||
Log.d("Setting sorting to me ${sm.toInternalString()}");
|
Log.d(
|
||||||
|
"Setting sorting to me ${sm.field.toInternalString()} ${sm.order.toInternalString()}");
|
||||||
_sortingMode = sm;
|
_sortingMode = sm;
|
||||||
_sortFunc = _sortingMode.sortingFunction();
|
_sortFunc = _sortingMode.sortingFunction();
|
||||||
|
|
||||||
|
@ -4,28 +4,14 @@ import 'package:gitjournal/core/note.dart';
|
|||||||
|
|
||||||
typedef NoteSortingFunction = int Function(Note a, Note b);
|
typedef NoteSortingFunction = int Function(Note a, Note b);
|
||||||
|
|
||||||
class SortingMode {
|
class SortingOrder {
|
||||||
static const Modified = SortingMode(
|
static const Ascending = SortingOrder("settings.sortingOrder.asc", "asc");
|
||||||
"settings.sortingMode.modified",
|
static const Descending = SortingOrder("settings.sortingOrder.desc", "desc");
|
||||||
"Modified",
|
static const Default = Descending;
|
||||||
);
|
|
||||||
static const Created = SortingMode(
|
|
||||||
"settings.sortingMode.created",
|
|
||||||
"Created",
|
|
||||||
);
|
|
||||||
static const FileName = SortingMode(
|
|
||||||
"settings.sortingMode.filename",
|
|
||||||
"FileName",
|
|
||||||
);
|
|
||||||
static const Title = SortingMode(
|
|
||||||
"settings.sortingMode.title",
|
|
||||||
"Title",
|
|
||||||
);
|
|
||||||
static const Default = Modified;
|
|
||||||
|
|
||||||
final String _str;
|
final String _str;
|
||||||
final String _publicString;
|
final String _publicString;
|
||||||
const SortingMode(this._publicString, this._str);
|
const SortingOrder(this._publicString, this._str);
|
||||||
|
|
||||||
String toInternalString() {
|
String toInternalString() {
|
||||||
return _str;
|
return _str;
|
||||||
@ -35,14 +21,12 @@ class SortingMode {
|
|||||||
return tr(_publicString);
|
return tr(_publicString);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const options = <SortingMode>[
|
static const options = <SortingOrder>[
|
||||||
Modified,
|
Ascending,
|
||||||
Created,
|
Descending,
|
||||||
FileName,
|
|
||||||
Title,
|
|
||||||
];
|
];
|
||||||
|
|
||||||
static SortingMode fromInternalString(String str) {
|
static SortingOrder fromInternalString(String str) {
|
||||||
for (var opt in options) {
|
for (var opt in options) {
|
||||||
if (opt.toInternalString() == str) {
|
if (opt.toInternalString() == str) {
|
||||||
return opt;
|
return opt;
|
||||||
@ -51,7 +35,7 @@ class SortingMode {
|
|||||||
return Default;
|
return Default;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SortingMode fromPublicString(String str) {
|
static SortingOrder fromPublicString(String str) {
|
||||||
for (var opt in options) {
|
for (var opt in options) {
|
||||||
if (opt.toPublicString() == str) {
|
if (opt.toPublicString() == str) {
|
||||||
return opt;
|
return opt;
|
||||||
@ -62,67 +46,166 @@ class SortingMode {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
assert(false, "SortingMode toString should never be called");
|
assert(false, "SortingOrder toString should never be called");
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// vHanda FIXME: The modified and created should come from Git if not present in the document
|
class SortingField {
|
||||||
NoteSortingFunction sortingFunction() {
|
static const Modified = SortingField(
|
||||||
switch (_str) {
|
"settings.sortingField.modified",
|
||||||
case "Created":
|
"Modified",
|
||||||
return (Note a, Note b) {
|
);
|
||||||
var aDt = a.created;
|
static const Created = SortingField(
|
||||||
var bDt = b.created;
|
"settings.sortingField.created",
|
||||||
if (aDt == null && bDt != null) {
|
"Created",
|
||||||
return 1;
|
);
|
||||||
}
|
static const FileName = SortingField(
|
||||||
if (aDt != null && bDt == null) {
|
"settings.sortingField.filename",
|
||||||
return -1;
|
"FileName",
|
||||||
}
|
);
|
||||||
if (bDt == null && aDt == null) {
|
static const Title = SortingField(
|
||||||
return a.fileName.compareTo(b.fileName);
|
"settings.sortingField.title",
|
||||||
}
|
"Title",
|
||||||
return bDt.compareTo(aDt);
|
);
|
||||||
};
|
|
||||||
|
|
||||||
case "Title":
|
static const Default = Modified;
|
||||||
return (Note a, Note b) {
|
|
||||||
var aTitleExists = a.title != null && a.title.isNotEmpty;
|
|
||||||
var bTitleExists = b.title != null && b.title.isNotEmpty;
|
|
||||||
|
|
||||||
if (!aTitleExists && bTitleExists) {
|
final String _str;
|
||||||
return 1;
|
final String _publicString;
|
||||||
}
|
const SortingField(this._publicString, this._str);
|
||||||
if (aTitleExists && !bTitleExists) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (!aTitleExists && !bTitleExists) {
|
|
||||||
return a.fileName.compareTo(b.fileName);
|
|
||||||
}
|
|
||||||
return a.title.compareTo(b.title);
|
|
||||||
};
|
|
||||||
|
|
||||||
case "FileName":
|
String toInternalString() {
|
||||||
return (Note a, Note b) {
|
return _str;
|
||||||
return a.fileName.compareTo(b.fileName);
|
}
|
||||||
};
|
|
||||||
|
|
||||||
case "Modified":
|
String toPublicString() {
|
||||||
default:
|
return tr(_publicString);
|
||||||
return (Note a, Note b) {
|
}
|
||||||
var aDt = a.modified;
|
|
||||||
var bDt = b.modified;
|
static const options = <SortingField>[
|
||||||
if (aDt == null && bDt != null) {
|
Modified,
|
||||||
return 1;
|
Created,
|
||||||
}
|
FileName,
|
||||||
if (aDt != null && bDt == null) {
|
Title,
|
||||||
return -1;
|
];
|
||||||
}
|
|
||||||
if (bDt == null && aDt == null) {
|
static SortingField fromInternalString(String str) {
|
||||||
return a.fileName.compareTo(b.fileName);
|
for (var opt in options) {
|
||||||
}
|
if (opt.toInternalString() == str) {
|
||||||
return bDt.compareTo(aDt);
|
return opt;
|
||||||
};
|
}
|
||||||
}
|
}
|
||||||
|
return Default;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
assert(false, "SortingField toString should never be called");
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class SortingMode {
|
||||||
|
final SortingField field;
|
||||||
|
final SortingOrder order;
|
||||||
|
|
||||||
|
SortingMode(this.field, this.order);
|
||||||
|
|
||||||
|
NoteSortingFunction sortingFunction() {
|
||||||
|
switch (field) {
|
||||||
|
case SortingField.Created:
|
||||||
|
return order == SortingOrder.Descending
|
||||||
|
? _sortCreatedDesc
|
||||||
|
: _reverse(_sortCreatedDesc);
|
||||||
|
|
||||||
|
case SortingField.Title:
|
||||||
|
return order == SortingOrder.Descending
|
||||||
|
? _reverse(_sortTitleAsc)
|
||||||
|
: _sortTitleAsc;
|
||||||
|
|
||||||
|
case SortingField.FileName:
|
||||||
|
return order == SortingOrder.Descending
|
||||||
|
? _reverse(_sortFileNameAsc)
|
||||||
|
: _sortFileNameAsc;
|
||||||
|
|
||||||
|
case SortingField.Modified:
|
||||||
|
default:
|
||||||
|
return order == SortingOrder.Descending
|
||||||
|
? _sortModifiedDesc
|
||||||
|
: _reverse(_sortModifiedDesc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) =>
|
||||||
|
identical(this, other) ||
|
||||||
|
other is SortingMode && other.field == field && other.order == order;
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode => order.hashCode ^ field.hashCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
int _sortCreatedDesc(Note a, Note b) {
|
||||||
|
var aDt = a.created;
|
||||||
|
var bDt = b.created;
|
||||||
|
if (aDt == null && bDt != null) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (aDt != null && bDt == null) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (bDt == null && aDt == null) {
|
||||||
|
return a.fileName.compareTo(b.fileName);
|
||||||
|
}
|
||||||
|
return bDt.compareTo(aDt);
|
||||||
|
}
|
||||||
|
|
||||||
|
int _sortModifiedDesc(Note a, Note b) {
|
||||||
|
var aDt = a.modified;
|
||||||
|
var bDt = b.modified;
|
||||||
|
if (aDt == null && bDt != null) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (aDt != null && bDt == null) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (bDt == null && aDt == null) {
|
||||||
|
return a.fileName.compareTo(b.fileName);
|
||||||
|
}
|
||||||
|
return bDt.compareTo(aDt);
|
||||||
|
}
|
||||||
|
|
||||||
|
int _sortTitleAsc(Note a, Note b) {
|
||||||
|
var aTitleExists = a.title != null && a.title.isNotEmpty;
|
||||||
|
var bTitleExists = b.title != null && b.title.isNotEmpty;
|
||||||
|
|
||||||
|
if (!aTitleExists && bTitleExists) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (aTitleExists && !bTitleExists) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (!aTitleExists && !bTitleExists) {
|
||||||
|
return a.fileName.compareTo(b.fileName);
|
||||||
|
}
|
||||||
|
return a.title.compareTo(b.title);
|
||||||
|
}
|
||||||
|
|
||||||
|
int _sortFileNameAsc(Note a, Note b) {
|
||||||
|
return a.fileName.compareTo(b.fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
NoteSortingFunction _reverse(NoteSortingFunction func) {
|
||||||
|
return (Note a, Note b) {
|
||||||
|
int r = func(a, b);
|
||||||
|
if (r == 0) {
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
if (r < 0) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
@ -39,8 +39,8 @@ class JournalView extends StatelessWidget {
|
|||||||
var textTheme = Theme.of(context).textTheme;
|
var textTheme = Theme.of(context).textTheme;
|
||||||
|
|
||||||
DateTime date;
|
DateTime date;
|
||||||
var sortingMode = folder.config.sortingMode;
|
var sortingField = folder.config.sortingMode.field;
|
||||||
if (sortingMode == SortingMode.Created) {
|
if (sortingField == SortingField.Created) {
|
||||||
date = note.created;
|
date = note.created;
|
||||||
} else {
|
} else {
|
||||||
date = note.modified;
|
date = note.modified;
|
||||||
|
@ -79,10 +79,10 @@ class StandardView extends StatelessWidget {
|
|||||||
Widget trailing = Container();
|
Widget trailing = Container();
|
||||||
|
|
||||||
DateTime date;
|
DateTime date;
|
||||||
var sortingMode = folder.config.sortingMode;
|
var sortingField = folder.config.sortingMode.field;
|
||||||
if (sortingMode == SortingMode.Modified) {
|
if (sortingField == SortingField.Modified) {
|
||||||
date = note.modified;
|
date = note.modified;
|
||||||
} else if (sortingMode == SortingMode.Created) {
|
} else if (sortingField == SortingField.Created) {
|
||||||
date = note.created;
|
date = note.created;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ import 'package:gitjournal/widgets/app_bar_menu_button.dart';
|
|||||||
import 'package:gitjournal/widgets/app_drawer.dart';
|
import 'package:gitjournal/widgets/app_drawer.dart';
|
||||||
import 'package:gitjournal/widgets/new_note_nav_bar.dart';
|
import 'package:gitjournal/widgets/new_note_nav_bar.dart';
|
||||||
import 'package:gitjournal/widgets/note_search_delegate.dart';
|
import 'package:gitjournal/widgets/note_search_delegate.dart';
|
||||||
import 'package:gitjournal/widgets/sorting_order_selector.dart';
|
import 'package:gitjournal/widgets/sorting_mode_selector.dart';
|
||||||
import 'package:gitjournal/widgets/sync_button.dart';
|
import 'package:gitjournal/widgets/sync_button.dart';
|
||||||
|
|
||||||
enum DropDownChoices {
|
enum DropDownChoices {
|
||||||
@ -190,7 +190,7 @@ class _FolderViewState extends State<FolderView> {
|
|||||||
var newSortingMode = await showDialog<SortingMode>(
|
var newSortingMode = await showDialog<SortingMode>(
|
||||||
context: context,
|
context: context,
|
||||||
builder: (BuildContext context) =>
|
builder: (BuildContext context) =>
|
||||||
SortingOrderSelector(sortedNotesFolder.sortingMode),
|
SortingModeSelector(sortedNotesFolder.sortingMode),
|
||||||
);
|
);
|
||||||
|
|
||||||
if (newSortingMode != null) {
|
if (newSortingMode != null) {
|
||||||
|
@ -32,7 +32,8 @@ class Settings extends ChangeNotifier {
|
|||||||
String journalEditordefaultNewNoteFolderSpec = "";
|
String journalEditordefaultNewNoteFolderSpec = "";
|
||||||
|
|
||||||
RemoteSyncFrequency remoteSyncFrequency = RemoteSyncFrequency.Default;
|
RemoteSyncFrequency remoteSyncFrequency = RemoteSyncFrequency.Default;
|
||||||
SortingMode sortingMode = SortingMode.Default;
|
SortingField sortingField = SortingField.Default;
|
||||||
|
SortingOrder sortingOrder = SortingOrder.Default;
|
||||||
SettingsEditorType defaultEditor = SettingsEditorType.Default;
|
SettingsEditorType defaultEditor = SettingsEditorType.Default;
|
||||||
SettingsFolderViewType defaultView = SettingsFolderViewType.Default;
|
SettingsFolderViewType defaultView = SettingsFolderViewType.Default;
|
||||||
bool showNoteSummary = true;
|
bool showNoteSummary = true;
|
||||||
@ -88,7 +89,10 @@ class Settings extends ChangeNotifier {
|
|||||||
remoteSyncFrequency = RemoteSyncFrequency.fromInternalString(
|
remoteSyncFrequency = RemoteSyncFrequency.fromInternalString(
|
||||||
pref.getString("remoteSyncFrequency"));
|
pref.getString("remoteSyncFrequency"));
|
||||||
|
|
||||||
sortingMode = SortingMode.fromInternalString(pref.getString("sortingMode"));
|
sortingField =
|
||||||
|
SortingField.fromInternalString(pref.getString("sortingField"));
|
||||||
|
sortingOrder =
|
||||||
|
SortingOrder.fromInternalString(pref.getString("sortingOrder"));
|
||||||
defaultEditor =
|
defaultEditor =
|
||||||
SettingsEditorType.fromInternalString(pref.getString("defaultEditor"));
|
SettingsEditorType.fromInternalString(pref.getString("defaultEditor"));
|
||||||
defaultView = SettingsFolderViewType.fromInternalString(
|
defaultView = SettingsFolderViewType.fromInternalString(
|
||||||
@ -169,8 +173,10 @@ class Settings extends ChangeNotifier {
|
|||||||
"remoteSyncFrequency",
|
"remoteSyncFrequency",
|
||||||
remoteSyncFrequency.toInternalString(),
|
remoteSyncFrequency.toInternalString(),
|
||||||
defaultSet.remoteSyncFrequency.toInternalString());
|
defaultSet.remoteSyncFrequency.toInternalString());
|
||||||
_setString(pref, "sortingMode", sortingMode.toInternalString(),
|
_setString(pref, "sortingField", sortingField.toInternalString(),
|
||||||
defaultSet.sortingMode.toInternalString());
|
defaultSet.sortingField.toInternalString());
|
||||||
|
_setString(pref, "sortingOrder", sortingOrder.toInternalString(),
|
||||||
|
defaultSet.sortingOrder.toInternalString());
|
||||||
_setString(pref, "defaultEditor", defaultEditor.toInternalString(),
|
_setString(pref, "defaultEditor", defaultEditor.toInternalString(),
|
||||||
defaultSet.defaultEditor.toInternalString());
|
defaultSet.defaultEditor.toInternalString());
|
||||||
_setString(pref, "defaultView", defaultView.toInternalString(),
|
_setString(pref, "defaultView", defaultView.toInternalString(),
|
||||||
@ -252,7 +258,8 @@ class Settings extends ChangeNotifier {
|
|||||||
journalEditordefaultNewNoteFolderSpec,
|
journalEditordefaultNewNoteFolderSpec,
|
||||||
"defaultEditor": defaultEditor.toInternalString(),
|
"defaultEditor": defaultEditor.toInternalString(),
|
||||||
"defaultView": defaultView.toInternalString(),
|
"defaultView": defaultView.toInternalString(),
|
||||||
"sortingMode": sortingMode.toInternalString(),
|
"sortingField": sortingField.toInternalString(),
|
||||||
|
"sortingOrder": sortingOrder.toInternalString(),
|
||||||
"remoteSyncFrequency": remoteSyncFrequency.toInternalString(),
|
"remoteSyncFrequency": remoteSyncFrequency.toInternalString(),
|
||||||
"showNoteSummary": showNoteSummary.toString(),
|
"showNoteSummary": showNoteSummary.toString(),
|
||||||
"folderViewHeaderType": folderViewHeaderType,
|
"folderViewHeaderType": folderViewHeaderType,
|
||||||
|
87
lib/widgets/sorting_mode_selector.dart
Normal file
87
lib/widgets/sorting_mode_selector.dart
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
|
||||||
|
import 'package:gitjournal/core/sorting_mode.dart';
|
||||||
|
import 'package:gitjournal/screens/settings_screen.dart';
|
||||||
|
|
||||||
|
class SortingModeSelector extends StatefulWidget {
|
||||||
|
final SortingMode selectedMode;
|
||||||
|
|
||||||
|
SortingModeSelector(this.selectedMode);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_SortingModeSelectorState createState() => _SortingModeSelectorState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _SortingModeSelectorState extends State<SortingModeSelector> {
|
||||||
|
SortingField field;
|
||||||
|
SortingOrder order;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
field = widget.selectedMode.field;
|
||||||
|
order = widget.selectedMode.order;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
var children = <Widget>[
|
||||||
|
SettingsHeader(tr('settings.sortingMode.field')),
|
||||||
|
for (var sf in SortingField.options) _buildSortingTile(sf),
|
||||||
|
SettingsHeader(tr('settings.sortingMode.order')),
|
||||||
|
for (var so in SortingOrder.options) _buildSortingOrderTile(so),
|
||||||
|
];
|
||||||
|
|
||||||
|
return AlertDialog(
|
||||||
|
title: Text(tr("widgets.SortingOrderSelector.title")),
|
||||||
|
content: Column(
|
||||||
|
children: children,
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
),
|
||||||
|
actions: [
|
||||||
|
OutlineButton(
|
||||||
|
child: Text(tr('settings.cancel')),
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
OutlineButton(
|
||||||
|
child: Text(tr('settings.ok')),
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.of(context).pop(SortingMode(field, order));
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
RadioListTile<SortingField> _buildSortingTile(SortingField sf) {
|
||||||
|
return RadioListTile<SortingField>(
|
||||||
|
title: Text(sf.toPublicString()),
|
||||||
|
value: sf,
|
||||||
|
groupValue: field,
|
||||||
|
onChanged: (SortingField sf) {
|
||||||
|
setState(() {
|
||||||
|
field = sf;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
RadioListTile<SortingOrder> _buildSortingOrderTile(SortingOrder so) {
|
||||||
|
return RadioListTile<SortingOrder>(
|
||||||
|
title: Text(so.toPublicString()),
|
||||||
|
value: so,
|
||||||
|
groupValue: order,
|
||||||
|
onChanged: (SortingOrder so) {
|
||||||
|
setState(() {
|
||||||
|
order = so;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -1,41 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
|
||||||
|
|
||||||
import 'package:gitjournal/core/sorting_mode.dart';
|
|
||||||
|
|
||||||
class SortingOrderSelector extends StatelessWidget {
|
|
||||||
final SortingMode selectedMode;
|
|
||||||
|
|
||||||
SortingOrderSelector(this.selectedMode);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
var children = <Widget>[
|
|
||||||
_buildSortingTile(context, SortingMode.Modified),
|
|
||||||
_buildSortingTile(context, SortingMode.Created),
|
|
||||||
_buildSortingTile(context, SortingMode.Title),
|
|
||||||
_buildSortingTile(context, SortingMode.FileName),
|
|
||||||
];
|
|
||||||
|
|
||||||
return AlertDialog(
|
|
||||||
title: Text(tr("widgets.SortingOrderSelector.title")),
|
|
||||||
content: Column(
|
|
||||||
children: children,
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
RadioListTile<SortingMode> _buildSortingTile(
|
|
||||||
BuildContext context,
|
|
||||||
SortingMode sm,
|
|
||||||
) {
|
|
||||||
return RadioListTile<SortingMode>(
|
|
||||||
title: Text(sm.toPublicString()),
|
|
||||||
value: sm,
|
|
||||||
groupValue: selectedMode,
|
|
||||||
onChanged: (SortingMode sm) => Navigator.of(context).pop(sm),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
@ -29,7 +29,8 @@ void main() {
|
|||||||
defaultEditor: EditorType.Checklist,
|
defaultEditor: EditorType.Checklist,
|
||||||
defaultView: FolderViewType.Standard,
|
defaultView: FolderViewType.Standard,
|
||||||
showNoteSummary: true,
|
showNoteSummary: true,
|
||||||
sortingMode: SortingMode.Modified,
|
sortingMode:
|
||||||
|
SortingMode(SortingField.Modified, SortingOrder.Descending),
|
||||||
viewHeader: StandardViewHeader.TitleOrFileName,
|
viewHeader: StandardViewHeader.TitleOrFileName,
|
||||||
fileNameFormat: NoteFileNameFormat.Default,
|
fileNameFormat: NoteFileNameFormat.Default,
|
||||||
folder: folder,
|
folder: folder,
|
||||||
|
@ -39,7 +39,8 @@ void main() {
|
|||||||
test('Should load the notes sorted', () async {
|
test('Should load the notes sorted', () async {
|
||||||
var sf = SortedNotesFolder(
|
var sf = SortedNotesFolder(
|
||||||
folder: folder,
|
folder: folder,
|
||||||
sortingMode: SortingMode.Modified,
|
sortingMode:
|
||||||
|
SortingMode(SortingField.Modified, SortingOrder.Descending),
|
||||||
);
|
);
|
||||||
expect(sf.hasNotes, true);
|
expect(sf.hasNotes, true);
|
||||||
expect(sf.isEmpty, false);
|
expect(sf.isEmpty, false);
|
||||||
@ -57,7 +58,8 @@ void main() {
|
|||||||
test('Should on modification remains sorted', () async {
|
test('Should on modification remains sorted', () async {
|
||||||
var sf = SortedNotesFolder(
|
var sf = SortedNotesFolder(
|
||||||
folder: folder,
|
folder: folder,
|
||||||
sortingMode: SortingMode.Modified,
|
sortingMode:
|
||||||
|
SortingMode(SortingField.Modified, SortingOrder.Descending),
|
||||||
);
|
);
|
||||||
|
|
||||||
var i = sf.notes.indexWhere((n) => n.body == "1");
|
var i = sf.notes.indexWhere((n) => n.body == "1");
|
||||||
@ -73,7 +75,8 @@ void main() {
|
|||||||
test('Should add new note correctly', () async {
|
test('Should add new note correctly', () async {
|
||||||
var sf = SortedNotesFolder(
|
var sf = SortedNotesFolder(
|
||||||
folder: folder,
|
folder: folder,
|
||||||
sortingMode: SortingMode.Modified,
|
sortingMode:
|
||||||
|
SortingMode(SortingField.Modified, SortingOrder.Descending),
|
||||||
);
|
);
|
||||||
|
|
||||||
var note = Note(folder, p.join(folder.folderPath, "new.md"));
|
var note = Note(folder, p.join(folder.folderPath, "new.md"));
|
||||||
@ -96,7 +99,8 @@ void main() {
|
|||||||
test('Should add new note to end works correctly', () async {
|
test('Should add new note to end works correctly', () async {
|
||||||
var sf = SortedNotesFolder(
|
var sf = SortedNotesFolder(
|
||||||
folder: folder,
|
folder: folder,
|
||||||
sortingMode: SortingMode.Modified,
|
sortingMode:
|
||||||
|
SortingMode(SortingField.Modified, SortingOrder.Descending),
|
||||||
);
|
);
|
||||||
|
|
||||||
var note = Note(folder, p.join(folder.folderPath, "new.md"));
|
var note = Note(folder, p.join(folder.folderPath, "new.md"));
|
||||||
@ -120,7 +124,8 @@ void main() {
|
|||||||
var folder = NotesFolderFS(null, tempDir.path);
|
var folder = NotesFolderFS(null, tempDir.path);
|
||||||
var sf = SortedNotesFolder(
|
var sf = SortedNotesFolder(
|
||||||
folder: folder,
|
folder: folder,
|
||||||
sortingMode: SortingMode.Modified,
|
sortingMode:
|
||||||
|
SortingMode(SortingField.Modified, SortingOrder.Descending),
|
||||||
);
|
);
|
||||||
|
|
||||||
await folder.loadRecursively();
|
await folder.loadRecursively();
|
||||||
|
@ -21,7 +21,8 @@ void main() {
|
|||||||
n4.created = null;
|
n4.created = null;
|
||||||
|
|
||||||
var notes = [n1, n2, n3, n4];
|
var notes = [n1, n2, n3, n4];
|
||||||
var sortFn = SortingMode.Created.sortingFunction();
|
var sortFn = SortingMode(SortingField.Created, SortingOrder.Descending)
|
||||||
|
.sortingFunction();
|
||||||
|
|
||||||
notes.sort(sortFn);
|
notes.sort(sortFn);
|
||||||
expect(notes[0], n2);
|
expect(notes[0], n2);
|
||||||
@ -45,7 +46,8 @@ void main() {
|
|||||||
n4.modified = null;
|
n4.modified = null;
|
||||||
|
|
||||||
var notes = [n1, n2, n3, n4];
|
var notes = [n1, n2, n3, n4];
|
||||||
var sortFn = SortingMode.Modified.sortingFunction();
|
var sortFn = SortingMode(SortingField.Modified, SortingOrder.Descending)
|
||||||
|
.sortingFunction();
|
||||||
|
|
||||||
notes.sort(sortFn);
|
notes.sort(sortFn);
|
||||||
expect(notes[0], n2);
|
expect(notes[0], n2);
|
||||||
|
Reference in New Issue
Block a user