From 58c7169b8137fb6619bbc84ef1b84069b636873d Mon Sep 17 00:00:00 2001 From: Dynesshely Date: Mon, 1 Apr 2024 19:44:16 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=92=BE=20Feat(Settings):=20New=20snackbar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kitx_mobile/lib/pages/settings_page.dart | 31 ++-- .../appearance_settings_page.dart | 87 +++++------ .../settings_pages/log_settings_page.dart | 147 +++++------------- kitx_mobile/lib/utils/config.dart | 3 +- kitx_mobile/lib/utils/translation/en_us.dart | 5 + kitx_mobile/lib/utils/translation/zh_cn.dart | 5 + 6 files changed, 107 insertions(+), 171 deletions(-) diff --git a/kitx_mobile/lib/pages/settings_page.dart b/kitx_mobile/lib/pages/settings_page.dart index be48bf4..7ee8d85 100644 --- a/kitx_mobile/lib/pages/settings_page.dart +++ b/kitx_mobile/lib/pages/settings_page.dart @@ -26,25 +26,24 @@ class SettingsPage extends StatefulWidget implements ConstantPage { @override State createState() => _SettingsPageState(); + + /// Save Changes + static void saveChanges() => config.saveAsync().then( + (value) => Get.snackbar( + 'Public_Success'.tr, + 'SettingsPage_Saved'.tr, + snackPosition: SnackPosition.BOTTOM, + margin: EdgeInsets.all(20), + icon: const Icon(Icons.task_alt_rounded, color: Colors.greenAccent), + duration: const Duration(milliseconds: 600), + animationDuration: const Duration(milliseconds: 300), + ), + ); } class _SettingsPageState extends State { var tileRadius = ContinuousRectangleBorder(borderRadius: BorderRadius.circular(10.0)); - void showSnackBar(Widget content, {Duration? duration}) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: content, - showCloseIcon: true, - duration: duration ?? Duration(milliseconds: 400), - )); - } - - void saveChanges(BuildContext context) { - config.saveAsync().then( - (value) => showSnackBar(Text('SettingsPage_Saved'.tr)), - ); - } - @override void initState() { super.initState(); @@ -66,14 +65,14 @@ class _SettingsPageState extends State { child: const Text('简体中文'), onTap: () => () { instances.appInfo.languageCodeProperty = 'zh-CN'; - saveChanges(context); + SettingsPage.saveChanges(); }.delay(milliseconds: 200).execute(), ), PopupMenuItem( child: const Text('English (US)'), onTap: () => () { instances.appInfo.languageCodeProperty = 'en-US'; - saveChanges(context); + SettingsPage.saveChanges(); }.delay(milliseconds: 200).execute(), ), ], diff --git a/kitx_mobile/lib/pages/settings_pages/appearance_settings_page.dart b/kitx_mobile/lib/pages/settings_pages/appearance_settings_page.dart index 46556ce..d2bad2a 100644 --- a/kitx_mobile/lib/pages/settings_pages/appearance_settings_page.dart +++ b/kitx_mobile/lib/pages/settings_pages/appearance_settings_page.dart @@ -6,6 +6,7 @@ import 'package:kitx_mobile/pages/controls/settings_group_title.dart'; import 'package:kitx_mobile/pages/pages.dart'; import 'package:kitx_mobile/utils/composer.dart'; import 'package:kitx_mobile/utils/config.dart'; +import 'package:kitx_mobile/utils/handlers/tasks/delayed_task.dart'; import 'package:kitx_mobile/utils/themes/light_theme.dart'; /// Exterior Settings Page @@ -24,23 +25,9 @@ class AppearanceSettingsPage extends StatefulWidget implements ConstantPage { } class _AppearanceSettingsPageState extends State { - var selectedModes = {instances.appInfo.themeMode}; + var selectedMode = instances.appInfo.themeMode.obs; var useMaterial3 = lightThemeData.value.useMaterial3.obs; - void showSnackBar(Widget content, {Duration? duration}) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: content, - showCloseIcon: true, - duration: duration ?? Duration(milliseconds: 400), - )); - } - - void saveChanges(BuildContext context) { - config.saveAsync().then( - (value) => showSnackBar(Text('SettingsPage_Saved'.tr)), - ); - } - @override void initState() { super.initState(); @@ -61,38 +48,38 @@ class _AppearanceSettingsPageState extends State { Container( width: double.infinity, margin: EdgeInsets.symmetric(horizontal: 30, vertical: 10), - child: SegmentedButton( - emptySelectionAllowed: false, - multiSelectionEnabled: false, - segments: >[ - ButtonSegment( - value: ThemeMode.light, - label: Text('SettingsPage_Appearance_Theme_Light'.tr), - icon: Icon(Icons.light_mode), - ), - ButtonSegment( - value: ThemeMode.dark, - label: Text('SettingsPage_Appearance_Theme_Dark'.tr), - icon: Icon(Icons.dark_mode), - ), - ButtonSegment( - value: ThemeMode.system, - label: Text('SettingsPage_Appearance_Theme_FollowSystem'.tr), - icon: Icon(Icons.settings), - ), - ], - selected: selectedModes, - // selectedIcon: Icon(Icons.check), - showSelectedIcon: false, - onSelectionChanged: (Set newSelection) => { - setState(() { - selectedModes = newSelection; - }), - instances.appInfo.themeModeProperty = newSelection.first, - // Global.themeMode = newSelection.first, - // Get.changeThemeMode(newSelection.first), - saveChanges(context), - }, + child: Obx( + () => SegmentedButton( + emptySelectionAllowed: false, + multiSelectionEnabled: false, + segments: >[ + ButtonSegment( + value: ThemeMode.light, + label: Text('SettingsPage_Appearance_Theme_Light'.tr), + icon: Icon(Icons.light_mode), + ), + ButtonSegment( + value: ThemeMode.dark, + label: Text('SettingsPage_Appearance_Theme_Dark'.tr), + icon: Icon(Icons.dark_mode), + ), + ButtonSegment( + value: ThemeMode.system, + label: Text('SettingsPage_Appearance_Theme_FollowSystem'.tr), + icon: Icon(Icons.settings), + ), + ], + selected: {selectedMode.value}, + // selectedIcon: Icon(Icons.check), + showSelectedIcon: false, + onSelectionChanged: (Set newSelection) { + selectedMode.value = newSelection.first; + instances.appInfo.themeModeProperty = newSelection.first; + // Global.themeMode = newSelection.first, + // Get.changeThemeMode(newSelection.first), + SettingsPage.saveChanges.delay(milliseconds: 200).execute(); + }, + ), ), ), const SizedBox(height: 30), @@ -108,7 +95,7 @@ class _AppearanceSettingsPageState extends State { onChanged: (selection) { instances.appInfo.updateTheme(useMaterial3: selection); useMaterial3.value = selection; - saveChanges(context); + SettingsPage.saveChanges(); }, ), ), @@ -134,7 +121,7 @@ class _AppearanceSettingsPageState extends State { value: instances.appInfo.animationEnabled.value, onChanged: (selection) { instances.appInfo.animationEnabled.value = selection; - saveChanges(context); + SettingsPage.saveChanges(); }, ), ), @@ -152,7 +139,7 @@ class _AppearanceSettingsPageState extends State { value: config.delayOpenPageInHomePage.value, onChanged: (selection) { config.delayOpenPageInHomePage.value = selection; - saveChanges(context); + SettingsPage.saveChanges(); }, ), ), diff --git a/kitx_mobile/lib/pages/settings_pages/log_settings_page.dart b/kitx_mobile/lib/pages/settings_pages/log_settings_page.dart index a05d08f..24d3346 100644 --- a/kitx_mobile/lib/pages/settings_pages/log_settings_page.dart +++ b/kitx_mobile/lib/pages/settings_pages/log_settings_page.dart @@ -1,11 +1,10 @@ -import 'dart:io'; - -import 'package:flutter/material.dart'; +import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:kitx_mobile/pages/controls/settings_group_divider.dart'; import 'package:kitx_mobile/pages/controls/settings_group_title.dart'; import 'package:kitx_mobile/pages/pages.dart'; import 'package:kitx_mobile/utils/composer.dart'; -import 'package:kitx_mobile/utils/converters/size_converter.dart'; +import 'package:logger/logger.dart'; /// Log Settings Page class LogSettingsPage extends StatefulWidget implements ConstantPage { @@ -23,29 +22,7 @@ class LogSettingsPage extends StatefulWidget implements ConstantPage { } class _LogSettingsPageState extends State { - var logFilePath = '/data/data/com.crequency.kitx.mobile/app_flutter/flog.db'; - - var logFileSizeString = 'getting ...'.obs; - var logFileExists = false.obs; - - void updateLogFileSizeString() { - var file = File(logFilePath); - if (file.existsSync()) { - logFileSizeString.value = convert2string(file.lengthSync()); - logFileExists.value = true; - } else { - logFileSizeString.value = 'File $logFilePath don\'t exists'; - logFileExists.value = false; - } - } - - void showSnackBar(Widget content, {Duration? duration}) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: content, - showCloseIcon: true, - duration: duration ?? Duration(milliseconds: 400), - )); - } + var logLevel = Logger.level.obs; @override Widget build(BuildContext context) { @@ -60,87 +37,49 @@ class _LogSettingsPageState extends State { Column( children: [ Container( - alignment: Alignment.center, - child: ElevatedButton( - onPressed: () {}, - child: Text('SettingsPage_Log_Clean'.tr), + padding: EdgeInsets.symmetric(horizontal: 30), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('SettingsPage_Log_SelectLevel'.tr), + Obx( + () => DropdownButton( + value: logLevel.value.name, + onChanged: (newLevel) { + // TODO: If new version of log lib removed deprecated member use, change this line + // ignore: deprecated_member_use + if (newLevel == Level.nothing.name || newLevel == Level.wtf.name || newLevel == Level.verbose.name) { + Get.snackbar( + 'Public_Error'.tr, + 'SettingsPage_Log_NotSupportedLevel'.trParams({'level': newLevel ?? 'null'}), + snackPosition: SnackPosition.BOTTOM, + margin: EdgeInsets.all(20), + icon: const Icon(Icons.error_outline_rounded, color: Colors.redAccent), + duration: const Duration(milliseconds: 1200), + animationDuration: const Duration(milliseconds: 300), + ); + return; + } + + Logger.level = Level.values.firstWhere((element) => element.name == newLevel); + logLevel.value = Logger.level; + + SettingsPage.saveChanges(); + }, + items: Level.values.map>((Level value) { + return DropdownMenuItem( + value: value.name, + child: Text(value.name), + ); + }).toList(), + ), + ), + ], ), ), - // group( - // SettingsGroupTitle(titleKey: 'Public_Log'), - // Column( - // children: [ - // Row( - // mainAxisAlignment: MainAxisAlignment.center, - // children: [ - // Obx( - // () => AnimatedContainer( - // duration: Duration(milliseconds: 700), - // curve: Curves.easeInOutCubic, - // width: logFileExists.value ? null : MediaQuery.of(context).size.width / 3 * 2, - // child: Text(logFileSizeString.value), - // ), - // ), - // const SizedBox(width: 10), - // IconButton( - // onPressed: updateLogFileSizeString, - // icon: Icon(Icons.refresh), - // ) - // ], - // ), - // const SizedBox(height: 30), - // Container( - // alignment: Alignment.center, - // child: ElevatedButton( - // onPressed: () async { - // var beforeSize = 0; - // var beforeSizeString = convert2string(beforeSize); - // var nowSize = 0; - // var nowSizeString = convert2string(nowSize); - - // var file = File(logFilePath); - - // if (file.existsSync()) { - // logFileExists.value = true; - - // beforeSize = file.lengthSync(); - // beforeSizeString = convert2string(beforeSize); - // } - - // if (logFileExists.value) { - // await FLog.clearLogs(); - // } else { - // FLog.clearLogs(); - // } - - // file = File(logFilePath); - - // if (logFileExists.value) { - // nowSize = file.lengthSync(); - // nowSizeString = convert2string(nowSize); - // } - - // updateLogFileSizeString(); - - // if (logFileExists.value) { - // showSnackBar(Text('$beforeSizeString -> $nowSizeString')); - // } else { - // showSnackBar(Text('Log file clean action requested.')); - // } - // }.delay(milliseconds: 200).execute, - // child: Text('SettingsPage_Log_Clean'.tr), - // ), - // ), - // const SizedBox(height: 30), - // ElevatedButton(onPressed: () {}, child: const Text('...')), - // ], - // ), - // const SettingsGroupDivider(), - // spacer: null, - // ), ], ), - const SizedBox(), + const SettingsGroupDivider(), ), ], ), diff --git a/kitx_mobile/lib/utils/config.dart b/kitx_mobile/lib/utils/config.dart index b27a699..5ce28e4 100644 --- a/kitx_mobile/lib/utils/config.dart +++ b/kitx_mobile/lib/utils/config.dart @@ -1,5 +1,6 @@ library kitx_moblie.config; +import 'package:flutter/foundation.dart'; import 'package:get/get.dart'; import 'package:kitx_mobile/instances.dart'; import 'package:kitx_mobile/utils/extensions/int_ext.dart'; @@ -54,7 +55,7 @@ class Config { delayOpenPageInHomePage.value = prefs.getBool('delayOpenPageInHomePage') ?? false; - Logger.level = (prefs.getInt('logLevel') ?? 0).toLogLevel(); + Logger.level = (prefs.getInt('logLevel') ?? (kDebugMode ? Level.info.index : Level.warning.index)).toLogLevel(); } /// Save all configurations diff --git a/kitx_mobile/lib/utils/translation/en_us.dart b/kitx_mobile/lib/utils/translation/en_us.dart index 45d19c3..728a017 100644 --- a/kitx_mobile/lib/utils/translation/en_us.dart +++ b/kitx_mobile/lib/utils/translation/en_us.dart @@ -11,6 +11,9 @@ const Map en_us = { 'Public_Restart': 'Restart', 'Public_Chat': 'Chat', 'Public_Closed': 'Closed', + 'Public_Success': 'Success', + 'Public_Failed': 'Failed', + 'Public_Warning': 'Warning', 'Public_Error': 'Error', 'Public_Launch': 'Launch', 'Public_Launching': 'Launching', @@ -55,6 +58,8 @@ const Map en_us = { 'SettingsPage_Appearance_Animation_Additional': 'Additional animation', 'SettingsPage_Appearance_Animation_OpenPageDelay': 'Delay open page', 'SettingsPage_Log_Clean': 'Clean Log', + 'SettingsPage_Log_SelectLevel': 'Select Log Level', + 'SettingsPage_Log_NotSupportedLevel': 'The log level @level is not supported', 'SettingsPage_Saved': 'Changes saved!', 'AboutPage_Title': 'About', 'AboutPage_Version': 'Version', diff --git a/kitx_mobile/lib/utils/translation/zh_cn.dart b/kitx_mobile/lib/utils/translation/zh_cn.dart index 3d421e2..b1b8f84 100644 --- a/kitx_mobile/lib/utils/translation/zh_cn.dart +++ b/kitx_mobile/lib/utils/translation/zh_cn.dart @@ -11,6 +11,9 @@ const Map zh_cn = { 'Public_Restart': '重启', 'Public_Chat': '聊天', 'Public_Closed': '已关闭', + 'Public_Success': '成功', + 'Public_Failed': '失败', + 'Public_Warning': '警告', 'Public_Error': '错误', 'Public_Launch': '启动', 'Public_Launching': '启动中', @@ -55,6 +58,8 @@ const Map zh_cn = { 'SettingsPage_Appearance_Animation_Additional': '额外动画', 'SettingsPage_Appearance_Animation_OpenPageDelay': '延迟打开页面', 'SettingsPage_Log_Clean': '清理日志', + 'SettingsPage_Log_SelectLevel': '选择日志等级', + 'SettingsPage_Log_NotSupportedLevel': '不受支持的日志等级: @level', 'SettingsPage_Saved': '配置已保存!', 'AboutPage_Title': '关于', 'AboutPage_Version': '版本',