From 591078d4e4090f36f1ed4a12e81103d65aa2c4b3 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Sat, 11 Jan 2025 21:22:29 +0800 Subject: [PATCH] feat: custom refresh dragPercent/displacement related #139 Signed-off-by: bggRGjQaUbCoE --- lib/common/widgets/refresh_indicator.dart | 8 +- lib/pages/setting/widgets/model.dart | 137 +++++++++++++++----- lib/pages/setting/widgets/slide_dialog.dart | 8 +- lib/utils/storage.dart | 12 ++ 4 files changed, 124 insertions(+), 41 deletions(-) diff --git a/lib/common/widgets/refresh_indicator.dart b/lib/common/widgets/refresh_indicator.dart index bb41b51b..8dc92039 100644 --- a/lib/common/widgets/refresh_indicator.dart +++ b/lib/common/widgets/refresh_indicator.dart @@ -10,7 +10,7 @@ Widget refreshIndicator({ required Widget child, }) { return RefreshIndicator( - displacement: 10, + displacement: displacement, onRefresh: onRefresh, child: child, ); @@ -22,7 +22,9 @@ Widget refreshIndicator({ // The over-scroll distance that moves the indicator to its maximum // displacement, as a percentage of the scrollable's container extent. -const double _kDragContainerExtentPercentage = 0.15; + +double displacement = 40; +double kDragContainerExtentPercentage = 0.25; // How much the scroll's drag gesture can overshoot the RefreshIndicator's // displacement; max displacement = _kDragSizeFactorLimit * displacement. @@ -471,7 +473,7 @@ class RefreshIndicatorState extends State assert(_mode == _RefreshIndicatorMode.drag || _mode == _RefreshIndicatorMode.armed); double newValue = - _dragOffset! / (containerExtent * _kDragContainerExtentPercentage); + _dragOffset! / (containerExtent * kDragContainerExtentPercentage); if (_mode == _RefreshIndicatorMode.armed) { newValue = math.max(newValue, 1.0 / _kDragSizeFactorLimit); } diff --git a/lib/pages/setting/widgets/model.dart b/lib/pages/setting/widgets/model.dart index 733e0810..2d6bd676 100644 --- a/lib/pages/setting/widgets/model.dart +++ b/lib/pages/setting/widgets/model.dart @@ -1,6 +1,8 @@ import 'dart:io'; import 'dart:math'; +import 'package:PiliPlus/common/widgets/refresh_indicator.dart' + show kDragContainerExtentPercentage, displacement; import 'package:PiliPlus/http/interceptor_anonymity.dart'; import 'package:PiliPlus/models/common/dynamic_badge_mode.dart'; import 'package:PiliPlus/models/common/dynamics_type.dart'; @@ -161,7 +163,7 @@ List get styleSettings => [ ); }); if (result != null) { - GStorage.setting.put(SettingBoxKey.maxRowWidth, result); + await GStorage.setting.put(SettingBoxKey.maxRowWidth, result); SmartDialog.showToast('重启生效'); setState(); } @@ -208,7 +210,8 @@ List get styleSettings => [ }, ); if (result != null) { - GStorage.setting.put(SettingBoxKey.upPanelPosition, result.index); + await GStorage.setting + .put(SettingBoxKey.upPanelPosition, result.index); SmartDialog.showToast('重启生效'); setState(); } @@ -238,13 +241,14 @@ List get styleSettings => [ }, ); if (result != null) { - GStorage.setting.put(SettingBoxKey.dynamicBadgeMode, result.index); MainController mainController = Get.put(MainController()); mainController.dynamicBadgeMode = DynamicBadgeMode.values[result.index]; if (mainController.dynamicBadgeMode != DynamicBadgeMode.hidden) { mainController.getUnreadDynamic(); } + await GStorage.setting + .put(SettingBoxKey.dynamicBadgeMode, result.index); SmartDialog.showToast('设置成功'); setState(); } @@ -269,7 +273,6 @@ List get styleSettings => [ }, ); if (result != null) { - GStorage.setting.put(SettingBoxKey.msgBadgeMode, result.index); MainController mainController = Get.put(MainController()); mainController.msgBadgeMode = DynamicBadgeMode.values[result.index]; if (mainController.msgBadgeMode != DynamicBadgeMode.hidden) { @@ -277,6 +280,8 @@ List get styleSettings => [ } else { mainController.msgUnReadCount.value = ''; } + await GStorage.setting + .put(SettingBoxKey.msgBadgeMode, result.index); SmartDialog.showToast('设置成功'); setState(); } @@ -301,13 +306,13 @@ List get styleSettings => [ }, ); if (result != null) { - GStorage.setting.put(SettingBoxKey.msgUnReadTypeV2, - result.map((item) => item.index).toList()..sort()); MainController mainController = Get.put(MainController()); mainController.msgUnReadTypes = result; if (mainController.msgBadgeMode != DynamicBadgeMode.hidden) { mainController.queryUnreadMsg(); } + await GStorage.setting.put(SettingBoxKey.msgUnReadTypeV2, + result.map((item) => item.index).toList()..sort()); SmartDialog.showToast('设置成功'); setState(); } @@ -342,9 +347,10 @@ List get styleSettings => [ context: Get.context!, title: '图片质量', initValue: GStorage.picQuality, - callback: (picQuality) { - GStorage.setting.put(SettingBoxKey.defaultPicQa, picQuality); + callback: (picQuality) async { GlobalData().imgQuality = picQuality; + await GStorage.setting + .put(SettingBoxKey.defaultPicQa, picQuality); setState(); }, ); @@ -368,8 +374,9 @@ List get styleSettings => [ context: Get.context!, title: '查看大图质量', initValue: GStorage.previewQ, - callback: (picQuality) { - GStorage.setting.put(SettingBoxKey.previewQuality, picQuality); + callback: (picQuality) async { + await GStorage.setting + .put(SettingBoxKey.previewQuality, picQuality); setState(); }, ); @@ -401,8 +408,8 @@ List get styleSettings => [ }, ); if (result != null) { + await GStorage.setting.put(SettingBoxKey.defaultToastOp, result); SmartDialog.showToast('设置成功'); - GStorage.setting.put(SettingBoxKey.defaultToastOp, result); setState(); } }, @@ -467,7 +474,7 @@ List get styleSettings => [ }, ); if (result != null) { - GStorage.setting.put(SettingBoxKey.defaultHomePage, result); + await GStorage.setting.put(SettingBoxKey.defaultHomePage, result); SmartDialog.showToast('设置成功,重启生效'); setState(); } @@ -619,7 +626,8 @@ List get playSettings => [ }, ); if (result != null) { - GStorage.setting.put(SettingBoxKey.subtitlePreference, result); + await GStorage.setting + .put(SettingBoxKey.subtitlePreference, result); setState(); } }, @@ -730,7 +738,7 @@ List get playSettings => [ }, ); if (result != null) { - GStorage.setting.put(SettingBoxKey.fullScreenMode, result); + await GStorage.setting.put(SettingBoxKey.fullScreenMode, result); setState(); } }, @@ -754,7 +762,8 @@ List get playSettings => [ }, ); if (result != null) { - GStorage.setting.put(SettingBoxKey.btmProgressBehavior, result); + await GStorage.setting + .put(SettingBoxKey.btmProgressBehavior, result); setState(); } }, @@ -826,7 +835,7 @@ List get videoSettings => [ }, ); if (result != null) { - GStorage.setting.put(SettingBoxKey.CDNService, result); + await GStorage.setting.put(SettingBoxKey.CDNService, result); setState(); } }, @@ -867,7 +876,7 @@ List get videoSettings => [ }, ); if (result != null) { - GStorage.setting.put(SettingBoxKey.defaultVideoQa, result); + await GStorage.setting.put(SettingBoxKey.defaultVideoQa, result); setState(); } }, @@ -892,7 +901,8 @@ List get videoSettings => [ }, ); if (result != null) { - GStorage.setting.put(SettingBoxKey.defaultVideoQaCellular, result); + await GStorage.setting + .put(SettingBoxKey.defaultVideoQaCellular, result); setState(); } }, @@ -917,7 +927,7 @@ List get videoSettings => [ }, ); if (result != null) { - GStorage.setting.put(SettingBoxKey.defaultAudioQa, result); + await GStorage.setting.put(SettingBoxKey.defaultAudioQa, result); setState(); } }, @@ -942,7 +952,8 @@ List get videoSettings => [ }, ); if (result != null) { - GStorage.setting.put(SettingBoxKey.defaultAudioQaCellular, result); + await GStorage.setting + .put(SettingBoxKey.defaultAudioQaCellular, result); setState(); } }, @@ -966,7 +977,7 @@ List get videoSettings => [ }, ); if (result != null) { - GStorage.setting.put(SettingBoxKey.defaultDecode, result); + await GStorage.setting.put(SettingBoxKey.defaultDecode, result); setState(); } }, @@ -990,7 +1001,7 @@ List get videoSettings => [ }, ); if (result != null) { - GStorage.setting.put(SettingBoxKey.secondDecode, result); + await GStorage.setting.put(SettingBoxKey.secondDecode, result); setState(); } }, @@ -1042,7 +1053,7 @@ List get videoSettings => [ }, ); if (result != null) { - GStorage.setting.put(SettingBoxKey.videoSync, result); + await GStorage.setting.put(SettingBoxKey.videoSync, result); setState(); } }, @@ -1066,7 +1077,7 @@ List get videoSettings => [ }, ); if (result != null) { - GStorage.setting.put(SettingBoxKey.hardwareDecoding, result); + await GStorage.setting.put(SettingBoxKey.hardwareDecoding, result); setState(); } }, @@ -1098,7 +1109,7 @@ List get recommendSettings => [ SmartDialog.showToast('尚未登录,无法收到个性化推荐'); } } - GStorage.setting.put(SettingBoxKey.defaultRcmdType, result); + await GStorage.setting.put(SettingBoxKey.defaultRcmdType, result); SmartDialog.showToast('下次启动时生效'); setState(); } @@ -1168,7 +1179,7 @@ List get recommendSettings => [ }, ); if (result != null) { - GStorage.setting + await GStorage.setting .put(SettingBoxKey.minLikeRatioForRecommend, result); RecommendFilter.update(); setState(); @@ -1215,8 +1226,9 @@ List get recommendSettings => [ }, ); if (result != null) { - void updateDuration(int value) { - GStorage.setting.put(SettingBoxKey.minDurationForRcmd, value); + void updateDuration(int value) async { + await GStorage.setting + .put(SettingBoxKey.minDurationForRcmd, value); RecommendFilter.update(); setState(); } @@ -1652,6 +1664,63 @@ List get extraSettings => [ setKey: SettingBoxKey.openInBrowser, defaultVal: false, ), + SettingsModel( + settingsType: SettingsType.normal, + title: '刷新滑动距离', + leading: Icon(Icons.refresh), + setKey: SettingBoxKey.refreshDragPercentage, + getSubtitle: () => '当前滑动距离: ${GStorage.refreshDragPercentage}x', + onTap: (setState) async { + double? result = await showDialog( + context: Get.context!, + builder: (context) { + return SlideDialog( + title: '刷新滑动距离', + min: 0.1, + max: 0.5, + divisions: 8, + precise: 2, + value: GStorage.refreshDragPercentage, + ); + }, + ); + if (result != null) { + kDragContainerExtentPercentage = result; + await GStorage.setting + .put(SettingBoxKey.refreshDragPercentage, result); + Get.forceAppUpdate(); + setState(); + } + }, + ), + SettingsModel( + settingsType: SettingsType.normal, + title: '刷新指示器高度', + leading: Icon(Icons.height), + setKey: SettingBoxKey.refreshDisplacement, + getSubtitle: () => '当前指示器高度: ${GStorage.refreshDisplacement}', + onTap: (setState) async { + double? result = await showDialog( + context: Get.context!, + builder: (context) { + return SlideDialog( + title: '刷新指示器高度', + min: 10.0, + max: 100.0, + divisions: 9, + value: GStorage.refreshDisplacement, + ); + }, + ); + if (result != null) { + displacement = result; + await GStorage.setting + .put(SettingBoxKey.refreshDisplacement, result); + Get.forceAppUpdate(); + setState(); + } + }, + ), SettingsModel( settingsType: SettingsType.sw1tch, enableFeedback: true, @@ -1743,7 +1812,7 @@ List get extraSettings => [ }, ); if (result != null) { - GStorage.setting.put(SettingBoxKey.replySortType, result); + await GStorage.setting.put(SettingBoxKey.replySortType, result); setState(); } }, @@ -1768,7 +1837,8 @@ List get extraSettings => [ }, ); if (result != null) { - GStorage.setting.put(SettingBoxKey.defaultDynamicType, result); + await GStorage.setting + .put(SettingBoxKey.defaultDynamicType, result); setState(); } }, @@ -1792,7 +1862,7 @@ List get extraSettings => [ }, ); if (result != null) { - GStorage.setting.put(SettingBoxKey.memberTab, result.index); + await GStorage.setting.put(SettingBoxKey.memberTab, result.index); setState(); } }, @@ -1950,10 +2020,7 @@ SettingsModel getBanwordModel({ child: const Text('保存'), onPressed: () async { Get.back(); - await GStorage.setting.put( - key, - banWord, - ); + await GStorage.setting.put(key, banWord); setState(); SmartDialog.showToast('已保存'); }, diff --git a/lib/pages/setting/widgets/slide_dialog.dart b/lib/pages/setting/widgets/slide_dialog.dart index 95651d8e..f2272ba3 100644 --- a/lib/pages/setting/widgets/slide_dialog.dart +++ b/lib/pages/setting/widgets/slide_dialog.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -// import 'package:PiliPlus/models/common/theme_type.dart'; +import 'package:get/get_utils/get_utils.dart'; class SlideDialog extends StatefulWidget { final T value; @@ -8,6 +8,7 @@ class SlideDialog extends StatefulWidget { final double max; final int? divisions; final String? suffix; + final int precise; const SlideDialog({ super.key, @@ -17,6 +18,7 @@ class SlideDialog extends StatefulWidget { required this.max, this.divisions, this.suffix, + this.precise = 1, }); @override @@ -47,11 +49,11 @@ class _SlideDialogState extends State> { value: _tempValue, min: widget.min, max: widget.max, - divisions: widget.divisions ?? 10, + divisions: widget.divisions, label: '$_tempValue${widget.suffix ?? ''}', onChanged: (double value) { setState(() { - _tempValue = value; + _tempValue = value.toPrecision(widget.precise); }); }, ), diff --git a/lib/utils/storage.dart b/lib/utils/storage.dart index cb2337f1..18ff7943 100644 --- a/lib/utils/storage.dart +++ b/lib/utils/storage.dart @@ -1,6 +1,8 @@ import 'dart:convert'; import 'dart:io'; import 'package:PiliPlus/common/widgets/pair.dart'; +import 'package:PiliPlus/common/widgets/refresh_indicator.dart' + show kDragContainerExtentPercentage, displacement; import 'package:PiliPlus/http/constants.dart'; import 'package:PiliPlus/models/common/dynamic_badge_mode.dart'; import 'package:PiliPlus/models/common/tab_type.dart'; @@ -212,6 +214,12 @@ class GStorage { static double get blockLimit => setting.get(SettingBoxKey.blockLimit, defaultValue: 0.0); + static double get refreshDragPercentage => + setting.get(SettingBoxKey.refreshDragPercentage, defaultValue: 0.25); + + static double get refreshDisplacement => + setting.get(SettingBoxKey.refreshDisplacement, defaultValue: 40.0); + static String get blockUserID { String blockUserID = setting.get(SettingBoxKey.blockUserID, defaultValue: ''); @@ -390,6 +398,8 @@ class GStorage { ); // 视频设置 video = await Hive.openBox('video'); + displacement = GStorage.refreshDisplacement; + kDragContainerExtentPercentage = GStorage.refreshDragPercentage; // 设置全局变量 GlobalData() ..imgQuality = defaultPicQa @@ -538,6 +548,8 @@ class SettingBoxKey { banWordForZone = 'banWordForZone', savedRcmdTip = 'savedRcmdTip', openInBrowser = 'openInBrowser', + refreshDragPercentage = 'refreshDragPercentage', + refreshDisplacement = 'refreshDisplacement', // Sponsor Block enableSponsorBlock = 'enableSponsorBlock',