diff --git a/lib/common/widgets/image/custom_grid_view.dart b/lib/common/widgets/image/custom_grid_view.dart index edc0aa3b2..594d00004 100644 --- a/lib/common/widgets/image/custom_grid_view.dart +++ b/lib/common/widgets/image/custom_grid_view.dart @@ -148,7 +148,7 @@ class CustomGridView extends StatelessWidget { HapticFeedback.mediumImpact(); showMenu( context: context, - position: .fromLTRB(offset.dx, offset.dy, offset.dx, 0), + position: PageUtils.menuPosition(offset), items: [ if (PlatformUtils.isMobile) PopupMenuItem( diff --git a/lib/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart b/lib/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart index f7b476427..06613ee12 100644 --- a/lib/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart +++ b/lib/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart @@ -494,7 +494,7 @@ class _InteractiveviewerGalleryState extends State void _showDesktopMenu(Offset offset, SourceModel item) { showMenu( context: context, - position: RelativeRect.fromLTRB(offset.dx, offset.dy, offset.dx, 0), + position: PageUtils.menuPosition(offset), items: [ PopupMenuItem( height: 42, diff --git a/lib/main.dart b/lib/main.dart index 2a397584a..5a01aa232 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -305,10 +305,10 @@ class MyApp extends StatelessWidget { data: mediaQuery.copyWith( // Tell child the logical size it should layout to size: scaledSize, + textScaler: textScaler, padding: mediaQuery.padding / uiScale, viewPadding: mediaQuery.viewPadding / uiScale, viewInsets: mediaQuery.viewInsets / uiScale, - textScaler: textScaler, ), // Use OverflowBox to let child layout to scaledSize, // then FittedBox scales it to fit actualSize diff --git a/lib/pages/live_room/controller.dart b/lib/pages/live_room/controller.dart index 665d867c0..a1845b706 100644 --- a/lib/pages/live_room/controller.dart +++ b/lib/pages/live_room/controller.dart @@ -527,9 +527,11 @@ class LiveRoomController extends GetxController { } else { bool? refresh; for (final id in ids) { - final item = superChatMsg.firstWhereOrNull((e) => e.id == id); - item?.deleted = true; - refresh ??= true; + if (superChatMsg.firstWhereOrNull((e) => e.id == id) + case final item?) { + item.deleted = true; + refresh ??= true; + } } if (refresh ?? false) { superChatMsg.refresh(); diff --git a/lib/pages/live_room/superchat/superchat_card.dart b/lib/pages/live_room/superchat/superchat_card.dart index 6017a925f..94f6c9ad9 100644 --- a/lib/pages/live_room/superchat/superchat_card.dart +++ b/lib/pages/live_room/superchat/superchat_card.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/models/common/image_type.dart'; import 'package:PiliPlus/models_new/live/live_superchat/item.dart'; +import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; @@ -93,7 +94,7 @@ class _SuperChatCardState extends State { } showMenu( context: context, - position: RelativeRect.fromLTRB(offset.dx, offset.dy, offset.dx, 0), + position: PageUtils.menuPosition(offset), items: [ PopupMenuItem( height: 38, @@ -200,7 +201,7 @@ class _SuperChatCardState extends State { item.message, style: TextStyle( color: Utils.parseColor(item.messageFontColor), - decoration: !widget.persistentSC && item.deleted + decoration: widget.persistentSC && item.deleted ? .lineThrough : null, decorationThickness: 1.5, diff --git a/lib/pages/live_room/widgets/chat_panel.dart b/lib/pages/live_room/widgets/chat_panel.dart index 179270e70..67e2ce43f 100644 --- a/lib/pages/live_room/widgets/chat_panel.dart +++ b/lib/pages/live_room/widgets/chat_panel.dart @@ -9,6 +9,7 @@ import 'package:PiliPlus/pages/live_room/superchat/superchat_card.dart'; import 'package:PiliPlus/pages/video/widgets/header_control.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/extension/theme_ext.dart'; +import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/gestures.dart'; @@ -294,9 +295,11 @@ class LiveRoomChatPanel extends StatelessWidget { TapUpDetails details, DanmakuMsg item, ) { - final dx = details.globalPosition.dx; + final uiScale = Pref.uiScale; + final dx = details.globalPosition.dx / uiScale; final renderBox = itemContext.findRenderObject() as RenderBox; - final dy = renderBox.localToGlobal(renderBox.size.bottomLeft(.zero)).dy; + final dy = + renderBox.localToGlobal(renderBox.size.bottomLeft(.zero)).dy / uiScale; final autoScroll = liveRoomController.autoScroll && !liveRoomController.disableAutoScroll.value; diff --git a/lib/pages/setting/models/style_settings.dart b/lib/pages/setting/models/style_settings.dart index 1245f96fa..8141b9070 100644 --- a/lib/pages/setting/models/style_settings.dart +++ b/lib/pages/setting/models/style_settings.dart @@ -805,6 +805,7 @@ void _showUiScaleDialog( value: uiScale, min: _minUiScale, max: _maxUiScale, + secondaryTrackValue: 1.0, divisions: ((_maxUiScale - _minUiScale) * 20).toInt(), label: textController.text, onChanged: (value) => setDialogState(() { @@ -845,6 +846,7 @@ void _showUiScaleDialog( TextButton( onPressed: () { Navigator.pop(context); + Pref.uiScale = 1.0; GStorage.setting.delete(SettingBoxKey.uiScale).whenComplete(() { setState(); Get.appUpdate(); @@ -864,6 +866,7 @@ void _showUiScaleDialog( TextButton( onPressed: () { Navigator.pop(context); + Pref.uiScale = uiScale; GStorage.setting.put(SettingBoxKey.uiScale, uiScale).whenComplete( () { setState(); diff --git a/lib/pages/video/controller.dart b/lib/pages/video/controller.dart index 69dd355f9..443ac79bb 100644 --- a/lib/pages/video/controller.dart +++ b/lib/pages/video/controller.dart @@ -1885,34 +1885,39 @@ class VideoDetailController extends GetxController final index = episodes.indexWhere( (e) => e.cid == (seasonCid ?? cid.value), ); - final size = context.mediaQuerySize; - final maxChildSize = PlatformUtils.isMobile && !size.isPortrait - ? 1.0 - : 0.7; + showModalBottomSheet( context: context, useSafeArea: true, isScrollControlled: true, - constraints: BoxConstraints(maxWidth: min(640, size.shortestSide)), - builder: (context) => DraggableScrollableSheet( - snap: true, - expand: false, - minChildSize: 0, - snapSizes: [maxChildSize], - maxChildSize: maxChildSize, - initialChildSize: maxChildSize, - builder: (context, scrollController) => DownloadPanel( - index: index, - videoDetail: videoDetail, - pgcItem: pgcItem, - episodes: episodes!, - scrollController: scrollController, - videoDetailController: this, - heroTag: heroTag, - ugcIntroController: ugcIntroController, - cidSet: cidSet, - ), + constraints: BoxConstraints( + maxWidth: min(640, context.mediaQueryShortestSide), ), + builder: (context) { + final maxChildSize = + PlatformUtils.isMobile && !context.mediaQuerySize.isPortrait + ? 1.0 + : 0.7; + return DraggableScrollableSheet( + snap: true, + expand: false, + minChildSize: 0, + snapSizes: [maxChildSize], + maxChildSize: maxChildSize, + initialChildSize: maxChildSize, + builder: (context, scrollController) => DownloadPanel( + index: index, + videoDetail: videoDetail, + pgcItem: pgcItem, + episodes: episodes!, + scrollController: scrollController, + videoDetailController: this, + heroTag: heroTag, + ugcIntroController: ugcIntroController, + cidSet: cidSet, + ), + ); + }, ); } } diff --git a/lib/pages/whisper/widgets/item.dart b/lib/pages/whisper/widgets/item.dart index b5aa71028..c1f452324 100644 --- a/lib/pages/whisper/widgets/item.dart +++ b/lib/pages/whisper/widgets/item.dart @@ -12,6 +12,7 @@ import 'package:PiliPlus/utils/date_utils.dart'; import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/theme_ext.dart'; +import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:fixnum/fixnum.dart'; import 'package:flutter/material.dart' hide ListTile; @@ -102,38 +103,35 @@ class WhisperSessionItem extends StatelessWidget { }, ), onSecondaryTapUp: PlatformUtils.isDesktop - ? (details) { - final offset = details.globalPosition; - showMenu( - context: context, - position: .fromLTRB(offset.dx, offset.dy, offset.dx, 0), - items: [ + ? (details) => showMenu( + context: context, + position: PageUtils.menuPosition(details.globalPosition), + items: [ + PopupMenuItem( + height: 42, + onTap: () => onSetTop(item.isPinned, item.id), + child: Text(item.isPinned ? '移除置顶' : '置顶'), + ), + if (item.id.privateId.hasTalkerUid()) PopupMenuItem( height: 42, - onTap: () => onSetTop(item.isPinned, item.id), - child: Text(item.isPinned ? '移除置顶' : '置顶'), + onTap: () => + onSetMute(item.isMuted, item.id.privateId.talkerUid), + child: Text('${item.isMuted ? '关闭' : '开启'}免打扰'), ), - if (item.id.privateId.hasTalkerUid()) - PopupMenuItem( - height: 42, - onTap: () => - onSetMute(item.isMuted, item.id.privateId.talkerUid), - child: Text('${item.isMuted ? '关闭' : '开启'}免打扰'), + if (item.id.privateId.hasTalkerUid()) + PopupMenuItem( + height: 42, + onTap: () => showConfirmDialog( + context: context, + title: '确定删除该对话?', + onConfirm: () => + onRemove(item.id.privateId.talkerUid.toInt()), ), - if (item.id.privateId.hasTalkerUid()) - PopupMenuItem( - height: 42, - onTap: () => showConfirmDialog( - context: context, - title: '确定删除该对话?', - onConfirm: () => - onRemove(item.id.privateId.talkerUid.toInt()), - ), - child: const Text('删除'), - ), - ], - ); - } + child: const Text('删除'), + ), + ], + ) : null, onTap: () { if (item.hasUnread()) { diff --git a/lib/pages/whisper_detail/view.dart b/lib/pages/whisper_detail/view.dart index c96f3bffa..d141e770b 100644 --- a/lib/pages/whisper_detail/view.dart +++ b/lib/pages/whisper_detail/view.dart @@ -20,6 +20,7 @@ import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/widget_ext.dart'; import 'package:PiliPlus/utils/feed_back.dart'; +import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart' hide TextField; @@ -197,7 +198,7 @@ class _WhisperDetailPageState void _showMenu(Offset offset, int index, Msg item, bool isOwner) { showMenu( context: context, - position: .fromLTRB(offset.dx, offset.dy, offset.dx, 0), + position: PageUtils.menuPosition(offset), items: [ if (isOwner) PopupMenuItem( diff --git a/lib/utils/page_utils.dart b/lib/utils/page_utils.dart index 50b6ba472..dfa90247b 100644 --- a/lib/utils/page_utils.dart +++ b/lib/utils/page_utils.dart @@ -22,10 +22,12 @@ import 'package:PiliPlus/utils/app_scheme.dart'; import 'package:PiliPlus/utils/extension/context_ext.dart'; import 'package:PiliPlus/utils/extension/extension.dart'; import 'package:PiliPlus/utils/extension/iterable_ext.dart'; +import 'package:PiliPlus/utils/extension/size_ext.dart'; import 'package:PiliPlus/utils/extension/string_ext.dart'; import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/id_utils.dart'; +import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:PiliPlus/utils/url_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; @@ -41,6 +43,13 @@ abstract final class PageUtils { static final RouteObserver routeObserver = RouteObserver(); + static RelativeRect menuPosition(Offset offset) { + final uiScale = Pref.uiScale; + final dx = offset.dx / uiScale; + final dy = offset.dy / uiScale; + return .fromLTRB(dx, dy, dx, 0); + } + static Future imageView({ int initialPage = 0, required List imgList, @@ -331,13 +340,17 @@ abstract final class PageUtils { maxWidth: min(640, context.mediaQueryShortestSide), ), builder: (BuildContext context) { + final maxChildSize = + PlatformUtils.isMobile && !context.mediaQuerySize.isPortrait + ? 1.0 + : 0.7; return DraggableScrollableSheet( minChildSize: 0, maxChildSize: 1, - initialChildSize: 0.7, snap: true, expand: false, - snapSizes: const [0.7], + snapSizes: [maxChildSize], + initialChildSize: maxChildSize, builder: (BuildContext context, ScrollController scrollController) { return FavPanel( ctr: ctr, diff --git a/lib/utils/request_utils.dart b/lib/utils/request_utils.dart index 8e00183bc..944f7ae92 100644 --- a/lib/utils/request_utils.dart +++ b/lib/utils/request_utils.dart @@ -24,6 +24,7 @@ import 'package:PiliPlus/pages/later/controller.dart'; import 'package:PiliPlus/pages/login/geetest/geetest_webview_dialog.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/extension/context_ext.dart'; +import 'package:PiliPlus/utils/extension/size_ext.dart'; import 'package:PiliPlus/utils/extension/string_ext.dart'; import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; @@ -173,13 +174,18 @@ abstract final class RequestUtils { maxWidth: min(640, context.mediaQueryShortestSide), ), builder: (BuildContext context) { + final maxChildSize = + PlatformUtils.isMobile && + !context.mediaQuerySize.isPortrait + ? 1.0 + : 0.7; return DraggableScrollableSheet( minChildSize: 0, maxChildSize: 1, - initialChildSize: 0.7, snap: true, expand: false, - snapSizes: const [0.7], + snapSizes: [maxChildSize], + initialChildSize: maxChildSize, builder: ( BuildContext context, diff --git a/lib/utils/storage_pref.dart b/lib/utils/storage_pref.dart index e02c3c8e8..8a18670b3 100644 --- a/lib/utils/storage_pref.dart +++ b/lib/utils/storage_pref.dart @@ -646,8 +646,10 @@ abstract final class Pref { static double get defaultTextScale => _setting.get(SettingBoxKey.defaultTextScale, defaultValue: 1.0); - static double get uiScale => - _setting.get(SettingBoxKey.uiScale, defaultValue: 1.0); + static double uiScale = _setting.get( + SettingBoxKey.uiScale, + defaultValue: 1.0, + ); static bool get dynamicsWaterfallFlow => _setting.get(SettingBoxKey.dynamicsWaterfallFlow, defaultValue: true);