From f5a814cfe479896460ef1cdbfce25b1a4ee1d186 Mon Sep 17 00:00:00 2001 From: nyne Date: Sat, 25 Jan 2025 16:50:04 +0800 Subject: [PATCH] Improve UI --- assets/translation.json | 10 ++- lib/pages/settings/explore_settings.dart | 6 +- lib/pages/settings/setting_components.dart | 96 ++++++++++++++++------ 3 files changed, 83 insertions(+), 29 deletions(-) diff --git a/assets/translation.json b/assets/translation.json index 4e91040..8ad6a72 100644 --- a/assets/translation.json +++ b/assets/translation.json @@ -314,7 +314,10 @@ "New Version": "新版本", "@c updates": "@c 项更新", "No updates": "无更新", - "Set comic source list url": "设置漫画源列表URL" + "Set comic source list url": "设置漫画源列表URL", + "Deselect All": "取消全选", + "Add keyword": "添加关键词", + "Keyword": "关键词" }, "zh_TW": { "Home": "首頁", @@ -631,6 +634,9 @@ "New Version": "新版本", "@c updates": "@c 項更新", "No updates": "無更新", - "Set comic source list url": "設置漫畫源列表URL" + "Set comic source list url": "設置漫畫源列表URL", + "Deselect All": "取消全選", + "Add keyword": "添加關鍵詞", + "Keyword": "關鍵詞" } } \ No newline at end of file diff --git a/lib/pages/settings/explore_settings.dart b/lib/pages/settings/explore_settings.dart index 2d93a9f..dc40018 100644 --- a/lib/pages/settings/explore_settings.dart +++ b/lib/pages/settings/explore_settings.dart @@ -108,8 +108,9 @@ class _ManageBlockingWordViewState extends State<_ManageBlockingWordView> { return PopUpWidgetScaffold( title: "Keyword blocking".tl, tailing: [ - IconButton( + TextButton.icon( icon: const Icon(Icons.add), + label: Text("Add".tl), onPressed: add, ), ], @@ -135,7 +136,6 @@ class _ManageBlockingWordViewState extends State<_ManageBlockingWordView> { void add() { showDialog( context: App.rootContext, - barrierColor: Colors.black.toOpacity(0.1), builder: (context) { var controller = TextEditingController(); String? error; @@ -186,7 +186,7 @@ Widget setExplorePagesWidget() { var pages = {}; for (var c in ComicSource.all()) { for (var page in c.explorePages) { - pages[page.title] = page.title; + pages[page.title] = page.title.ts(c.key); } } return _MultiPagesFilter( diff --git a/lib/pages/settings/setting_components.dart b/lib/pages/settings/setting_components.dart index 9b8d94a..a842a1f 100644 --- a/lib/pages/settings/setting_components.dart +++ b/lib/pages/settings/setting_components.dart @@ -376,6 +376,14 @@ class _MultiPagesFilterState extends State<_MultiPagesFilter> { super.initState(); } + @override + void dispose() { + super.dispose(); + Future.microtask(() { + updateSetting(); + }); + } + var reorderWidgetKey = UniqueKey(); var scrollController = ScrollController(); final _key = GlobalKey(); @@ -404,7 +412,6 @@ class _MultiPagesFilterState extends State<_MultiPagesFilter> { setState(() { keys = List.from(reorderFunc(keys)); }); - updateSetting(); }, children: tiles, builder: (children) { @@ -424,7 +431,11 @@ class _MultiPagesFilterState extends State<_MultiPagesFilter> { title: widget.title, tailing: [ if (keys.length < widget.pages.length) - IconButton(onPressed: showAddDialog, icon: const Icon(Icons.add)) + TextButton.icon( + label: Text("Add".tl), + icon: const Icon(Icons.add), + onPressed: showAddDialog, + ) ], body: view, ); @@ -438,9 +449,8 @@ class _MultiPagesFilterState extends State<_MultiPagesFilter> { setState(() { keys.remove(key); }); - updateSetting(); }, - icon: const Icon(Icons.delete)), + icon: const Icon(Icons.delete_outline)), ); return ListTile( @@ -463,30 +473,68 @@ class _MultiPagesFilterState extends State<_MultiPagesFilter> { canAdd[key] = value; } }); + var selected = []; showDialog( context: context, builder: (context) { - return ContentDialog( - title: "Add".tl, - content: Column( - mainAxisSize: MainAxisSize.min, - children: canAdd.entries - .map( - (e) => ListTile( - title: Text(e.value), - key: Key(e.key), - onTap: () { - context.pop(); - setState(() { - keys.add(e.key); - }); - updateSetting(); - }, - ), + return StatefulBuilder(builder: (context, setState) { + return ContentDialog( + title: "Add".tl, + content: Column( + mainAxisSize: MainAxisSize.min, + children: canAdd.entries + .map( + (e) => CheckboxListTile( + value: selected.contains(e.key), + title: Text(e.value), + key: Key(e.key), + onChanged: (value) { + setState(() { + if (value!) { + selected.add(e.key); + } else { + selected.remove(e.key); + } + }); + }, + ), + ) + .toList(), + ), + actions: [ + if (selected.length < canAdd.length) + TextButton( + child: Text("Select All".tl), + onPressed: () { + setState(() { + selected = canAdd.keys.toList(); + }); + }, ) - .toList(), - ), - ); + else + TextButton( + child: Text("Deselect All".tl), + onPressed: () { + setState(() { + selected.clear(); + }); + }, + ), + const SizedBox(width: 8), + FilledButton( + onPressed: selected.isNotEmpty + ? () { + this.setState(() { + keys.addAll(selected); + }); + Navigator.pop(context); + } + : null, + child: Text("Add".tl), + ), + ], + ); + }); }, ); }