From 52e94e902bbb427ce9d00058c340873b92dcaa6f Mon Sep 17 00:00:00 2001 From: PaperCube Date: Sat, 17 Feb 2024 00:58:57 +0000 Subject: [PATCH] Option in settings to disable SFTP folders-first --- .dart_tool/flutter_gen/gen_l10n/l10n.dart | 6 ++++++ .dart_tool/flutter_gen/gen_l10n/l10n_de.dart | 3 +++ .dart_tool/flutter_gen/gen_l10n/l10n_en.dart | 3 +++ .dart_tool/flutter_gen/gen_l10n/l10n_fr.dart | 3 +++ .dart_tool/flutter_gen/gen_l10n/l10n_id.dart | 3 +++ .dart_tool/flutter_gen/gen_l10n/l10n_zh.dart | 6 ++++++ lib/data/store/setting.dart | 3 +++ lib/l10n/app_de.arb | 1 + lib/l10n/app_en.arb | 1 + lib/l10n/app_fr.arb | 1 + lib/l10n/app_id.arb | 1 + lib/l10n/app_zh.arb | 1 + lib/l10n/app_zh_tw.arb | 1 + lib/view/page/setting/entry.dart | 8 ++++++++ lib/view/page/storage/sftp.dart | 14 ++++++++------ 15 files changed, 49 insertions(+), 6 deletions(-) diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n.dart b/.dart_tool/flutter_gen/gen_l10n/l10n.dart index 677861a8..a18f7d87 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n.dart @@ -1342,6 +1342,12 @@ abstract class S { /// **'Use `rm -r` to delete a folder in SFTP.'** String get sftpRmrDirSummary; + /// No description provided for @sftpShowFoldersFirst. + /// + /// In en, this message translates to: + /// **'Disply folders first'** + String get sftpShowFoldersFirst; + /// No description provided for @sftpSSHConnected. /// /// In en, this message translates to: diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_de.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_de.dart index 26ff855d..4a721363 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_de.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_de.dart @@ -651,6 +651,9 @@ class SDe extends S { @override String get sftpRmrDirSummary => 'Verwenden Sie \"rm -r\", um das Verzeichnis in SFTP zu löschen.'; + @override + String get sftpShowFoldersFirst => 'Ordner zuerst anzeigen'; + @override String get sftpSSHConnected => 'SFTP Verbunden'; diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart index af8889f8..abdf03d9 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart @@ -651,6 +651,9 @@ class SEn extends S { @override String get sftpRmrDirSummary => 'Use `rm -r` to delete a folder in SFTP.'; + @override + String get sftpShowFoldersFirst => 'Disply folders first'; + @override String get sftpSSHConnected => 'SFTP Connected'; diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_fr.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_fr.dart index 4a6d77c5..7f64e41f 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_fr.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_fr.dart @@ -651,6 +651,9 @@ class SFr extends S { @override String get sftpRmrDirSummary => 'Utilisez `rm -r` pour supprimer un dossier dans SFTP.'; + @override + String get sftpShowFoldersFirst => 'Dossiers d\'abord lors du tri'; + @override String get sftpSSHConnected => 'SFTP connecté'; diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_id.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_id.dart index 939e7dd1..1c74e9f7 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_id.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_id.dart @@ -651,6 +651,9 @@ class SId extends S { @override String get sftpRmrDirSummary => 'Gunakan `rm -r` untuk menghapus dir di SFTP'; + @override + String get sftpShowFoldersFirst => 'Folder ditampilkan lebih dulu'; + @override String get sftpSSHConnected => 'Sftp terhubung'; diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart index 5b3bfd6c..ec5d0427 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart @@ -651,6 +651,9 @@ class SZh extends S { @override String get sftpRmrDirSummary => '在 SFTP 中使用 `rm -r` 来删除文件夹'; + @override + String get sftpShowFoldersFirst => '排序时文件夹显示在前'; + @override String get sftpSSHConnected => 'SFTP 已连接...'; @@ -1502,6 +1505,9 @@ class SZhTw extends SZh { @override String get sftpRmrDirSummary => '在 SFTP 中使用 `rm -r` 來刪除文件夾'; + @override + String get sftpShowFoldersFirst => '排序時文件夾顯示在前'; + @override String get sftpSSHConnected => 'SFTP 已連接...'; diff --git a/lib/data/store/setting.dart b/lib/data/store/setting.dart index 0691c1c6..8b80e998 100644 --- a/lib/data/store/setting.dart +++ b/lib/data/store/setting.dart @@ -197,6 +197,9 @@ class SettingStore extends PersistentStore { /// Open SFTP with last viewed path late final sftpOpenLastPath = property('sftpOpenLastPath', true); + /// Show folders first in SFTP file browser + late final sftpShowFoldersFirst = property('sftpShowFoldersFirst', true); + /// Show tip of suspend late final showSuspendTip = property('showSuspendTip', true); diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index beeb6819..e54d1ae3 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -207,6 +207,7 @@ "setting": "Einstellungen", "sftpDlPrepare": "Verbindung vorbereiten...", "sftpRmrDirSummary": "Verwenden Sie \"rm -r\", um das Verzeichnis in SFTP zu löschen.", + "sftpShowFoldersFirst": "Ordner zuerst anzeigen", "sftpSSHConnected": "SFTP Verbunden", "showDistLogo": "Distributionslogo anzeigen", "shutdown": "Abschaltung", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 19f9778d..dcfd18de 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -207,6 +207,7 @@ "setting": "Settings", "sftpDlPrepare": "Preparing to connect...", "sftpRmrDirSummary": "Use `rm -r` to delete a folder in SFTP.", + "sftpShowFoldersFirst": "Disply folders first", "sftpSSHConnected": "SFTP Connected", "showDistLogo": "Show distribution logo", "shutdown": "Shutdown", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 5cefc344..9591c9f0 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -207,6 +207,7 @@ "setting": "Paramètres", "sftpDlPrepare": "Préparation de la connexion...", "sftpRmrDirSummary": "Utilisez `rm -r` pour supprimer un dossier dans SFTP.", + "sftpShowFoldersFirst": "Dossiers d'abord lors du tri", "sftpSSHConnected": "SFTP connecté", "showDistLogo": "Afficher le logo de la distribution", "shutdown": "Éteindre", diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index 0debae27..3b436cb6 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -207,6 +207,7 @@ "setting": "Pengaturan", "sftpDlPrepare": "Bersiap untuk terhubung ...", "sftpRmrDirSummary": "Gunakan `rm -r` untuk menghapus dir di SFTP", + "sftpShowFoldersFirst": "Folder ditampilkan lebih dulu", "sftpSSHConnected": "Sftp terhubung", "showDistLogo": "Tampilkan logo distribusi", "shutdown": "Matikan", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 89fb357d..eae5fddb 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -207,6 +207,7 @@ "setting": "设置", "sftpDlPrepare": "准备连接至服务器...", "sftpRmrDirSummary": "在 SFTP 中使用 `rm -r` 来删除文件夹", + "sftpShowFoldersFirst": "排序时文件夹显示在前", "sftpSSHConnected": "SFTP 已连接...", "showDistLogo": "显示发行版 Logo", "shutdown": "关机", diff --git a/lib/l10n/app_zh_tw.arb b/lib/l10n/app_zh_tw.arb index 1e2e1d34..e7dc1200 100644 --- a/lib/l10n/app_zh_tw.arb +++ b/lib/l10n/app_zh_tw.arb @@ -207,6 +207,7 @@ "setting": "設置", "sftpDlPrepare": "準備連接至服務器...", "sftpRmrDirSummary": "在 SFTP 中使用 `rm -r` 來刪除文件夾", + "sftpShowFoldersFirst": "排序時文件夾顯示在前", "sftpSSHConnected": "SFTP 已連接...", "showDistLogo": "顯示發行版 Logo", "shutdown": "关机", diff --git a/lib/view/page/setting/entry.dart b/lib/view/page/setting/entry.dart index 7405bcc7..f622d262 100644 --- a/lib/view/page/setting/entry.dart +++ b/lib/view/page/setting/entry.dart @@ -855,6 +855,7 @@ class _SettingPageState extends State { children: [ _buildSftpRmrDir(), _buildSftpOpenLastPath(), + _buildSftpShowFoldersFirst(), ].map((e) => CardX(child: e)).toList(), ); } @@ -867,6 +868,13 @@ class _SettingPageState extends State { ); } + Widget _buildSftpShowFoldersFirst() { + return ListTile( + title: Text(l10n.sftpShowFoldersFirst), + trailing: StoreSwitch(prop: _setting.sftpShowFoldersFirst), + ); + } + Widget _buildNetViewType() { final items = NetViewType.values .map((e) => PopupMenuItem( diff --git a/lib/view/page/storage/sftp.dart b/lib/view/page/storage/sftp.dart index 82952bf3..4f973812 100644 --- a/lib/view/page/storage/sftp.dart +++ b/lib/view/page/storage/sftp.dart @@ -15,6 +15,7 @@ import 'package:toolbox/data/res/logger.dart'; import 'package:toolbox/data/res/misc.dart'; import 'package:toolbox/data/res/provider.dart'; import 'package:toolbox/data/res/store.dart'; +import 'package:toolbox/data/store/setting.dart'; import 'package:toolbox/view/widget/omit_start_text.dart'; import 'package:toolbox/view/widget/cardx.dart'; @@ -820,11 +821,14 @@ enum _SortType { ; List sort(List files, {bool reversed = false}) { + var comparator = ChainComparator.create(); + if (Stores.setting.sftpShowFoldersFirst.fetch()) { + comparator = comparator.thenTrueFirst((x) => x.attr.isDirectory); + } switch (this) { case _SortType.name: files.sort( - ChainComparator.create() - .thenTrueFirst((x) => x.attr.isDirectory) + comparator .thenWithComparator( (a, b) => Comparators.compareStringCaseInsensitive()( a.filename, b.filename), @@ -835,8 +839,7 @@ enum _SortType { break; case _SortType.time: files.sort( - ChainComparator.create() - .thenTrueFirst((x) => x.attr.isDirectory) + comparator .thenCompareBy( (x) => x.attr.modifyTime ?? 0, reversed: reversed, @@ -846,8 +849,7 @@ enum _SortType { break; case _SortType.size: files.sort( - ChainComparator.create() - .thenTrueFirst((x) => x.attr.isDirectory) + comparator .thenCompareBy( (x) => x.attr.size ?? 0, reversed: reversed,