From 8de4ad94a757c5c545bd3b6adf8bd4b8d2683514 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Sat, 16 Nov 2024 19:53:34 +0800 Subject: [PATCH] feat: custom preview quality Signed-off-by: bggRGjQaUbCoE --- lib/pages/preview/view.dart | 7 +- lib/pages/setting/controller.dart | 3 + lib/pages/setting/style_setting.dart | 134 ++++++++++++++++----------- lib/utils/storage.dart | 1 + 4 files changed, 92 insertions(+), 53 deletions(-) diff --git a/lib/pages/preview/view.dart b/lib/pages/preview/view.dart index 18ee001b..57265056 100644 --- a/lib/pages/preview/view.dart +++ b/lib/pages/preview/view.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:PiliPalaX/utils/extension.dart'; +import 'package:PiliPalaX/utils/storage.dart'; import 'package:flutter/services.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; @@ -36,6 +37,7 @@ class _ImagePreviewState extends State late DoubleClickAnimationListener _doubleClickAnimationListener; List doubleTapScales = [1.0, 2.0]; List? imgList; + int _quality = 80; @override void initState() { @@ -43,6 +45,9 @@ class _ImagePreviewState extends State imgList = widget.imgList?.map((url) => url.http2https).toList(); + _quality = + GStorage.setting.get(SettingBoxKey.previewQuality, defaultValue: 80); + _previewController.initialPage.value = widget.initialPage!; _previewController.currentPage.value = widget.initialPage! + 1; _previewController.imgList.value = imgList!; @@ -169,7 +174,7 @@ class _ImagePreviewState extends State itemCount: imgList!.length, itemBuilder: (BuildContext context, int index) { return ExtendedImage.network( - imgList![index], + '${imgList![index]}@${_quality}q.webp', fit: BoxFit.contain, mode: ExtendedImageMode.gesture, handleLoadingProgress: true, diff --git a/lib/pages/setting/controller.dart b/lib/pages/setting/controller.dart index 424a2b13..36f63e6e 100644 --- a/lib/pages/setting/controller.dart +++ b/lib/pages/setting/controller.dart @@ -24,6 +24,7 @@ class SettingController extends GetxController { RxBool feedBackEnable = false.obs; RxDouble toastOpacity = (1.0).obs; RxInt picQuality = 10.obs; + RxInt previewQ = 80.obs; Rx themeType = ThemeType.system.obs; dynamic userInfo; Rx dynamicBadgeType = DynamicBadgeMode.number.obs; @@ -49,6 +50,8 @@ class SettingController extends GetxController { defaultValue: DynamicBadgeMode.number.code)]; defaultHomePage.value = setting.get(SettingBoxKey.defaultHomePage, defaultValue: 0); + previewQ.value = + setting.get(SettingBoxKey.previewQuality, defaultValue: 80); } loginOut(BuildContext context) async { diff --git a/lib/pages/setting/style_setting.dart b/lib/pages/setting/style_setting.dart index fba6ae86..7660d190 100644 --- a/lib/pages/setting/style_setting.dart +++ b/lib/pages/setting/style_setting.dart @@ -32,7 +32,6 @@ class _StyleSettingState extends State { Get.put(ColorSelectController()); Box setting = GStorage.setting; - late int picQuality; late ThemeType _tempThemeValue; late double maxRowWidth; late UpPanelPosition upPanelPosition; @@ -40,7 +39,6 @@ class _StyleSettingState extends State { @override void initState() { super.initState(); - picQuality = setting.get(SettingBoxKey.defaultPicQa, defaultValue: 10); _tempThemeValue = settingController.themeType.value; maxRowWidth = setting.get(SettingBoxKey.maxRowWidth, defaultValue: 240.0) as double; @@ -221,56 +219,14 @@ class _StyleSettingState extends State { ListTile( dense: false, onTap: () { - showDialog( - context: context, - builder: (context) { - return StatefulBuilder( - builder: (context, StateSetter setState) { - final SettingController settingController = - Get.put(SettingController()); - return AlertDialog( - title: const Text('图片质量'), - contentPadding: const EdgeInsets.only( - top: 20, left: 8, right: 8, bottom: 8), - content: SizedBox( - height: 40, - child: Slider( - value: picQuality.toDouble(), - min: 10, - max: 100, - divisions: 9, - label: '$picQuality%', - onChanged: (double val) { - picQuality = val.toInt(); - setState(() {}); - }, - ), - ), - actions: [ - TextButton( - onPressed: () => Get.back(), - child: Text('取消', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .outline))), - TextButton( - onPressed: () { - setting.put( - SettingBoxKey.defaultPicQa, picQuality); - Get.back(); - settingController.picQuality.value = picQuality; - GlobalData().imgQuality = picQuality; - SmartDialog.showToast('设置成功'); - }, - child: const Text('确定'), - ) - ], - ); - }, - ); - }, - ); + _showQualityDialog( + title: '图片质量', + initValue: settingController.picQuality.value, + callback: (picQuality) { + setting.put(SettingBoxKey.defaultPicQa, picQuality); + settingController.picQuality.value = picQuality; + GlobalData().imgQuality = picQuality; + }); }, title: Text('图片质量', style: titleStyle), subtitle: Text('选择合适的图片清晰度,上限100%', style: subTitleStyle), @@ -285,6 +241,31 @@ class _StyleSettingState extends State { ), ), ), + // preview quality + ListTile( + dense: false, + onTap: () { + _showQualityDialog( + title: '查看大图质量', + initValue: settingController.previewQ.value, + callback: (picQuality) { + setting.put(SettingBoxKey.previewQuality, picQuality); + settingController.previewQ.value = picQuality; + }); + }, + title: Text('查看大图质量', style: titleStyle), + subtitle: Text('选择合适的图片清晰度,上限100%', style: subTitleStyle), + leading: const Icon(Icons.image_outlined), + trailing: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Obx( + () => Text( + '${settingController.previewQ.value}%', + style: Theme.of(context).textTheme.titleSmall, + ), + ), + ), + ), ListTile( dense: false, onTap: () async { @@ -393,4 +374,53 @@ class _StyleSettingState extends State { ), ); } + + void _showQualityDialog({ + required String title, + required int initValue, + required ValueChanged callback, + }) { + showDialog( + context: context, + builder: (context) { + int picQuality = initValue; + return AlertDialog( + title: Text(title), + contentPadding: + const EdgeInsets.only(top: 20, left: 8, right: 8, bottom: 8), + content: SizedBox( + height: 40, + child: Builder( + builder: (context) => Slider( + value: picQuality.toDouble(), + min: 10, + max: 100, + divisions: 9, + label: '$picQuality%', + onChanged: (double val) { + picQuality = val.toInt(); + (context as Element).markNeedsBuild(); + }, + ), + ), + ), + actions: [ + TextButton( + onPressed: () => Get.back(), + child: Text('取消', + style: TextStyle( + color: Theme.of(context).colorScheme.outline))), + TextButton( + onPressed: () { + Get.back(); + callback(picQuality); + SmartDialog.showToast('设置成功'); + }, + child: const Text('确定'), + ) + ], + ); + }, + ); + } } diff --git a/lib/utils/storage.dart b/lib/utils/storage.dart index fbc427be..3b8ed510 100644 --- a/lib/utils/storage.dart +++ b/lib/utils/storage.dart @@ -250,6 +250,7 @@ class SettingBoxKey { blockToast = 'blockToast', blockServer = 'blockServer', blockTrack = 'blockTrack', + previewQuality = 'previewQuality', // 弹幕相关设置 权重(云屏蔽) 屏蔽类型 显示区域 透明度 字体大小 弹幕时间 描边粗细 字体粗细 danmakuWeight = 'danmakuWeight',