Skip to content

Commit 9ce07cd

Browse files
authored
Filebrowser: Per folder sort order (PR #2499)
1 parent abdefb0 commit 9ce07cd

22 files changed

+418
-291
lines changed

app/src/main/java/net/gsantner/markor/activity/MainActivity.java

-2
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@ protected void onCreate(final Bundle savedInstanceState) {
7777
} catch (Exception ignored) {
7878
}
7979

80-
8180
_cu = new MarkorContextUtils(this);
8281
setContentView(R.layout.main__activity);
8382
_bottomNav = findViewById(R.id.bottom_navigation_bar);
@@ -427,7 +426,6 @@ public void onFsViewerDoUiUpdate(final GsFileBrowserListAdapter adapter) {
427426
if (getCurrentPos() == tabIdToPos(R.id.nav_notebook)) {
428427
setTitle(getFileBrowserTitle());
429428
}
430-
invalidateOptionsMenu();
431429
}
432430

433431
if (toShow != null && adapter != null) {

app/src/main/java/net/gsantner/markor/format/markdown/MarkdownActionButtons.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -246,14 +246,13 @@ public boolean isValid() {
246246

247247
public static Link extract(final CharSequence text, final int pos) {
248248
final int[] sel = TextViewUtils.getLineSelection(text, pos);
249-
if (sel != null && sel[0] != -1 && sel[1] != -1) {
249+
if (sel[0] != -1 && sel[1] != -1) {
250250
final String line = text.subSequence(sel[0], sel[1]).toString();
251251
final Matcher m = MarkdownSyntaxHighlighter.LINK.matcher(line);
252-
final int po = pos - sel[0];
253252

254253
while (m.find()) {
255-
final int start = m.start(), end = m.end();
256-
if (start <= po && end >= po) {
254+
final int start = m.start() + sel[0], end = m.end() + sel[0];
255+
if (start <= pos && end >= pos) {
257256
final boolean isImage = m.group(1) != null;
258257
final String link = m.group(3);
259258
return new Link(m.group(2), link == null ? null : link.trim(), isImage, start, end);

app/src/main/java/net/gsantner/markor/format/orgmode/OrgmodeActionButtons.java

-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
import net.gsantner.markor.R;
99
import net.gsantner.markor.format.ActionButtonBase;
10-
import net.gsantner.markor.format.orgmode.OrgmodeReplacePatternGenerator;
1110
import net.gsantner.markor.frontend.textview.AutoTextFormatter;
1211
import net.gsantner.markor.model.Document;
1312

app/src/main/java/net/gsantner/markor/format/orgmode/OrgmodeReplacePatternGenerator.java

-3
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,9 @@
77
#########################################################*/
88
package net.gsantner.markor.format.orgmode;
99

10-
import android.util.Log;
11-
1210
import net.gsantner.markor.format.ActionButtonBase;
1311
import net.gsantner.markor.frontend.textview.AutoTextFormatter;
1412
import net.gsantner.markor.frontend.textview.ReplacePatternGeneratorHelper;
15-
import net.gsantner.opoc.format.GsTextUtils;
1613

1714
import java.util.ArrayList;
1815
import java.util.List;

app/src/main/java/net/gsantner/markor/frontend/MarkorDialogFactory.java

+112
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,10 @@
6060
import java.util.Arrays;
6161
import java.util.Collection;
6262
import java.util.Collections;
63+
import java.util.HashMap;
6364
import java.util.HashSet;
6465
import java.util.List;
66+
import java.util.Map;
6567
import java.util.Set;
6668
import java.util.TreeSet;
6769
import java.util.regex.Matcher;
@@ -998,6 +1000,116 @@ public static void showInsertSnippetDialog(final Activity activity, final GsCall
9981000
GsSearchOrCustomTextDialog.showMultiChoiceDialogWithSearchFilterUI(activity, dopt);
9991001
}
10001002

1003+
public static void showFolderSortDialog(
1004+
final Activity activity,
1005+
final GsFileUtils.SortOrder currentOrder,
1006+
final GsFileUtils.SortOrder globalOrder,
1007+
final GsCallback.a1<GsFileUtils.SortOrder> callback
1008+
) {
1009+
final DialogOptions dopt = new DialogOptions();
1010+
baseConf(activity, dopt);
1011+
1012+
final List<String> data = new ArrayList<>();
1013+
final List<Integer> icons = new ArrayList<>();
1014+
final List<Integer> layouts = new ArrayList<>();
1015+
1016+
data.add(activity.getString(R.string.folder_local));
1017+
icons.add(R.drawable.ic_save_black_24dp);
1018+
layouts.add(android.R.layout.simple_list_item_multiple_choice);
1019+
1020+
data.add(activity.getString(R.string.name));
1021+
icons.add(R.drawable.ic_sort_by_alpha_black_24dp);
1022+
layouts.add(android.R.layout.simple_list_item_single_choice);
1023+
1024+
data.add(activity.getString(R.string.date));
1025+
icons.add(R.drawable.ic_date_range_black_24dp);
1026+
layouts.add(android.R.layout.simple_list_item_single_choice);
1027+
1028+
data.add(activity.getString(R.string.size));
1029+
icons.add(R.drawable.ic_sd_card_black_24dp);
1030+
layouts.add(android.R.layout.simple_list_item_single_choice);
1031+
1032+
data.add(activity.getString(R.string.mime_type));
1033+
icons.add(R.drawable.ic_baseline_plagiarism_24);
1034+
layouts.add(android.R.layout.simple_list_item_single_choice);
1035+
1036+
data.add(activity.getString(R.string.folder_first));
1037+
icons.add(R.drawable.ic_baseline_rule_folder_24);
1038+
layouts.add(android.R.layout.simple_list_item_multiple_choice);
1039+
1040+
data.add(activity.getString(R.string.reverse_order));
1041+
icons.add(R.drawable.ic_baseline_arrow_upward_24);
1042+
layouts.add(android.R.layout.simple_list_item_multiple_choice);
1043+
1044+
data.add(activity.getString(R.string.dotfiles));
1045+
icons.add(R.drawable.ic_regex_black_24dp);
1046+
layouts.add(android.R.layout.simple_list_item_multiple_choice);
1047+
1048+
dopt.data = data;
1049+
dopt.iconsForData = icons;
1050+
dopt.listItemLayouts = layouts;
1051+
1052+
dopt.preSelected = new HashSet<>();
1053+
if (currentOrder.isFolderLocal) dopt.preSelected.add(0);
1054+
if (currentOrder.folderFirst) dopt.preSelected.add(5);
1055+
if (currentOrder.reverse) dopt.preSelected.add(6);
1056+
if (currentOrder.showDotFiles) dopt.preSelected.add(7);
1057+
1058+
final Map<String, Integer> typeToPos = new HashMap<>();
1059+
typeToPos.put(GsFileUtils.SORT_BY_NAME, 1);
1060+
typeToPos.put(GsFileUtils.SORT_BY_MTIME, 2);
1061+
typeToPos.put(GsFileUtils.SORT_BY_FILESIZE, 3);
1062+
typeToPos.put(GsFileUtils.SORT_BY_MIMETYPE, 4);
1063+
dopt.preSelected.add(GsCollectionUtils.getOrDefault(typeToPos, currentOrder.sortByType, 1));
1064+
1065+
dopt.isMultiSelectEnabled = true;
1066+
dopt.isSearchEnabled = false;
1067+
dopt.titleText = R.string.sort_by;
1068+
dopt.dialogWidthDp = WindowManager.LayoutParams.WRAP_CONTENT;
1069+
dopt.showCountInOkButton = false;
1070+
dopt.showSelectAllButton = false;
1071+
1072+
final Set<Integer> prevSelection = new HashSet<>(dopt.preSelected);
1073+
final boolean[] resetGlobal = {false};
1074+
final Set<Integer> radioSet = new HashSet<>(Arrays.asList(1, 2, 3, 4));
1075+
dopt.selectionChangedCallback = (selection) -> {
1076+
final Set<Integer> added = GsCollectionUtils.setDiff(selection, prevSelection);
1077+
final Set<Integer> removed = GsCollectionUtils.setDiff(prevSelection, selection);
1078+
if (globalOrder != null && currentOrder.isFolderLocal && removed.contains(0)) {
1079+
// Reset to global if folder local is unchecked
1080+
resetGlobal[0] = true;
1081+
selection.clear();
1082+
if (globalOrder.folderFirst) selection.add(5);
1083+
if (globalOrder.reverse) selection.add(6);
1084+
if (globalOrder.showDotFiles) selection.add(7);
1085+
selection.add(GsCollectionUtils.getOrDefault(typeToPos, globalOrder.sortByType, 1));
1086+
} else if (!Collections.disjoint(removed, radioSet)) {
1087+
// If a radio button is unchecked add it back
1088+
selection.addAll(removed);
1089+
} else if (!Collections.disjoint(added, radioSet)) {
1090+
// If a radio button is checked, remove all other radio buttons
1091+
selection.removeAll(GsCollectionUtils.setDiff(radioSet, added));
1092+
}
1093+
prevSelection.clear();
1094+
prevSelection.addAll(selection);
1095+
};
1096+
1097+
dopt.positionCallback = (selection) -> {
1098+
final GsFileUtils.SortOrder order = new GsFileUtils.SortOrder();
1099+
order.isFolderLocal = selection.contains(0);
1100+
order.folderFirst = selection.contains(5);
1101+
order.reverse = selection.contains(6);
1102+
order.showDotFiles = selection.contains(7);
1103+
if (selection.contains(2)) order.sortByType = GsFileUtils.SORT_BY_MTIME;
1104+
else if (selection.contains(3)) order.sortByType = GsFileUtils.SORT_BY_FILESIZE;
1105+
else if (selection.contains(4)) order.sortByType = GsFileUtils.SORT_BY_MIMETYPE;
1106+
else order.sortByType = GsFileUtils.SORT_BY_NAME;
1107+
callback.callback(order);
1108+
};
1109+
1110+
GsSearchOrCustomTextDialog.showMultiChoiceDialogWithSearchFilterUI(activity, dopt);
1111+
}
1112+
10011113
public static void baseConf(Activity activity, DialogOptions dopt) {
10021114
dopt.isDarkDialog = GsContextUtils.instance.isDarkModeEnabled(activity);
10031115
dopt.clearInputIcon = R.drawable.ic_baseline_clear_24;

app/src/main/java/net/gsantner/markor/frontend/filebrowser/MarkorFileBrowserFactory.java

+2-4
Original file line numberDiff line numberDiff line change
@@ -72,23 +72,21 @@ public static GsFileBrowserOptions.Options prepareFsViewerOpts(
7272
opts.folderImage = R.drawable.ic_folder_white_24dp;
7373
opts.titleText = R.string.select;
7474
opts.mountedStorageFolder = cu.getStorageAccessFolder(context);
75+
opts.sortOrder = appSettings.getFolderSortOrder(null);
7576

7677
updateFsViewerOpts(opts, context, appSettings);
7778

7879
return opts;
7980
}
8081

82+
// We update these because some of these settings can change
8183
public static void updateFsViewerOpts(
8284
final GsFileBrowserOptions.Options opts,
8385
final Context context,
8486
AppSettings appSettings
8587
) {
8688
appSettings = appSettings != null ? appSettings : ApplicationObject.settings();
8789

88-
opts.sortFolderFirst = appSettings.isFileBrowserSortFolderFirst();
89-
opts.sortByType = appSettings.getFileBrowserSortByType();
90-
opts.sortReverse = appSettings.isFileBrowserSortReverse();
91-
opts.filterShowDotFiles = appSettings.isFileBrowserFilterShowDotFiles();
9290
opts.favouriteFiles = appSettings.getFavouriteFiles();
9391
opts.recentFiles = appSettings.getRecentFiles();
9492
opts.popularFiles = appSettings.getPopularFiles();

app/src/main/java/net/gsantner/markor/frontend/textview/HighlightingEditor.java

-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import net.gsantner.markor.R;
3737
import net.gsantner.markor.activity.MainActivity;
3838
import net.gsantner.markor.model.AppSettings;
39-
import net.gsantner.markor.util.TextCasingUtils;
4039
import net.gsantner.opoc.format.GsTextUtils;
4140
import net.gsantner.opoc.wrapper.GsCallback;
4241
import net.gsantner.opoc.wrapper.GsTextWatcherAdapter;

0 commit comments

Comments
 (0)