Add sorting folders feature

This commit is contained in:
2024-11-13 12:44:51 +08:00
parent 9bdcba1270
commit 5d4e8f5b84
4 changed files with 95 additions and 32 deletions

View File

@@ -204,7 +204,8 @@
"Select in range": "区间选择",
"Finished": "已完成",
"Updating": "更新中",
"Update Comics Info": "更新漫画信息"
"Update Comics Info": "更新漫画信息",
"Create Folder": "新建文件夹"
},
"zh_TW": {
"Home": "首頁",
@@ -411,6 +412,7 @@
"Select in range": "區間選擇",
"Finished": "已完成",
"Updating": "更新中",
"Update Comics Info": "更新漫畫信息"
"Update Comics Info": "更新漫畫信息",
"Create Folder": "新建文件夾"
}
}

View File

@@ -238,12 +238,12 @@ class LocalFavoritesManager with ChangeNotifier {
return folders;
}
void updateOrder(Map<String, int> order) {
for (var folder in order.keys) {
void updateOrder(List<String> folders) {
for (int i = 0; i < folders.length; i++) {
_db.execute("""
insert or replace into folder_order (folder_name, order_value)
values (?, ?);
""", [folder, order[folder]]);
""", [folders[i], i]);
}
notifyListeners();
}

View File

@@ -159,7 +159,7 @@ Future<List<FavoriteItem>> updateComicsInfo(String folder) async {
return;
} catch (e) {
retry--;
if(retry == 0) {
if (retry == 0) {
rethrow;
}
continue;
@@ -205,7 +205,7 @@ Future<List<FavoriteItem>> updateComicsInfo(String folder) async {
isCanceled = true;
context.pop();
},
child: isFinished ?Text("OK".tl) : Text("Cancel".tl),
child: isFinished ? Text("OK".tl) : Text("Cancel".tl),
),
],
);
@@ -216,16 +216,16 @@ Future<List<FavoriteItem>> updateComicsInfo(String folder) async {
isCanceled = true;
});
while(index < comics.length) {
while (index < comics.length) {
var futures = <Future>[];
const maxConcurrency = 4;
if(isCanceled) {
if (isCanceled) {
return comics;
}
for (var i = 0; i < maxConcurrency; i++) {
if (index+i >= comics.length) break;
if (index + i >= comics.length) break;
futures.add(updateSingleComic(index + i).then((v) {
finished.value++;
}, onError: (_) {
@@ -240,3 +240,51 @@ Future<List<FavoriteItem>> updateComicsInfo(String folder) async {
return comics;
}
Future<void> sortFolders() async {
var folders = LocalFavoritesManager().folderNames;
await showPopUpWidget(
App.rootContext,
StatefulBuilder(builder: (context, setState) {
return PopUpWidgetScaffold(
title: "Sort".tl,
tailing: [
Tooltip(
message: "Help".tl,
child: IconButton(
icon: const Icon(Icons.help_outline),
onPressed: () {
showInfoDialog(
context: context,
title: "Reorder".tl,
content: "Long press and drag to reorder.".tl,
);
},
),
)
],
body: ReorderableListView.builder(
onReorder: (oldIndex, newIndex) {
if (oldIndex < newIndex) {
newIndex--;
}
setState(() {
var item = folders.removeAt(oldIndex);
folders.insert(newIndex, item);
});
},
itemCount: folders.length,
itemBuilder: (context, index) {
return ListTile(
key: ValueKey(folders[index]),
title: Text(folders[index]),
);
},
),
);
}),
);
LocalFavoritesManager().updateOrder(folders);
}

View File

@@ -80,7 +80,6 @@ class _LeftBarState extends State<_LeftBar> implements FolderList {
padding: const EdgeInsets.symmetric(vertical: 8),
child: Row(
children: [
const SizedBox(width: 16),
Icon(
Icons.local_activity,
color: context.colorScheme.secondary,
@@ -88,27 +87,41 @@ class _LeftBarState extends State<_LeftBar> implements FolderList {
const SizedBox(width: 12),
Text("Local".tl),
const Spacer(),
IconButton(
icon: const Icon(Icons.search),
color: context.colorScheme.primary,
onPressed: () {
context.to(() => const LocalSearchPage());
},
MenuButton(
entries: [
MenuEntry(
icon: Icons.search,
text: 'Search'.tl,
onClick: () {
context.to(() => const LocalSearchPage());
},
),
MenuEntry(
icon: Icons.add,
text: 'Create Folder'.tl,
onClick: () {
newFolder().then((value) {
setState(() {
folders = LocalFavoritesManager().folderNames;
});
});
},
),
MenuEntry(
icon: Icons.reorder,
text: 'Sort'.tl,
onClick: () {
sortFolders().then((value) {
setState(() {
folders = LocalFavoritesManager().folderNames;
});
});
},
),
],
),
IconButton(
icon: const Icon(Icons.add),
color: context.colorScheme.primary,
onPressed: () {
newFolder().then((value) {
setState(() {
folders = LocalFavoritesManager().folderNames;
});
});
},
),
const SizedBox(width: 16),
],
),
).paddingHorizontal(16),
);
}
index--;
@@ -219,13 +232,13 @@ class _LeftBarState extends State<_LeftBar> implements FolderList {
@override
void update() {
if(!mounted) return;
if (!mounted) return;
setState(() {});
}
@override
void updateFolders() {
if(!mounted) return;
if (!mounted) return;
setState(() {
folders = LocalFavoritesManager().folderNames;
networkFolders = ComicSource.all()