diff --git a/lib/common/widgets/disabled_icon.dart b/lib/common/widgets/disabled_icon.dart index fc67b1ca4..328de9349 100644 --- a/lib/common/widgets/disabled_icon.dart +++ b/lib/common/widgets/disabled_icon.dart @@ -3,18 +3,16 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; -class DisabledIcon extends SingleChildRenderObjectWidget { +class DisabledIcon extends SingleChildRenderObjectWidget { const DisabledIcon({ super.key, - required T child, + required Widget super.child, this.disable = false, this.color, this.iconSize, - double? lineLengthScale, - StrokeCap? strokeCap, - }) : lineLengthScale = lineLengthScale ?? 0.9, - strokeCap = strokeCap ?? StrokeCap.butt, - super(child: child); + this.lineLengthScale = 0.9, + this.strokeCap = .butt, + }); final bool disable; final Color? color; @@ -48,12 +46,12 @@ class DisabledIcon extends SingleChildRenderObjectWidget { ..disable = disable ..iconSize = iconSize ?? - (child is Icon ? (child as Icon?)?.size : null) ?? + (child is Icon ? (child as Icon).size : null) ?? iconTheme.size ?? 24.0 ..color = color ?? - (child is Icon ? (child as Icon?)?.color : null) ?? + (child is Icon ? (child as Icon).color : null) ?? iconTheme.color! ..strokeCap = strokeCap ..lineLengthScale = lineLengthScale; diff --git a/lib/common/widgets/gesture/image_horizontal_drag_gesture_recognizer.dart b/lib/common/widgets/gesture/image_horizontal_drag_gesture_recognizer.dart index 783d40a70..19c1b8c09 100644 --- a/lib/common/widgets/gesture/image_horizontal_drag_gesture_recognizer.dart +++ b/lib/common/widgets/gesture/image_horizontal_drag_gesture_recognizer.dart @@ -1,8 +1,19 @@ import 'package:PiliPlus/common/widgets/gesture/horizontal_drag_gesture_recognizer.dart'; -import 'package:PiliPlus/common/widgets/gesture/image_tap_gesture_recognizer.dart' - show ImageGestureRecognizerMixin; import 'package:flutter/gestures.dart'; +mixin ImageGestureRecognizerMixin on GestureRecognizer { + int? _pointer; + + @override + void addPointer(PointerDownEvent event) { + if (_pointer == event.pointer) { + return; + } + _pointer = event.pointer; + super.addPointer(event); + } +} + typedef IsBoundaryAllowed = bool Function(Offset? initialPosition, OffsetPair lastPosition); diff --git a/lib/common/widgets/gesture/image_tap_gesture_recognizer.dart b/lib/common/widgets/gesture/image_tap_gesture_recognizer.dart deleted file mode 100644 index 76fd287c4..000000000 --- a/lib/common/widgets/gesture/image_tap_gesture_recognizer.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:flutter/gestures.dart' - show - GestureRecognizer, - TapGestureRecognizer, - DoubleTapGestureRecognizer, - PointerDownEvent; - -mixin ImageGestureRecognizerMixin on GestureRecognizer { - int? _pointer; - - @override - void addPointer(PointerDownEvent event) { - if (_pointer == event.pointer) { - return; - } - _pointer = event.pointer; - super.addPointer(event); - } -} - -class ImageTapGestureRecognizer extends TapGestureRecognizer - with ImageGestureRecognizerMixin { - ImageTapGestureRecognizer({ - super.debugOwner, - super.supportedDevices, - super.allowedButtonsFilter, - super.preAcceptSlopTolerance, - super.postAcceptSlopTolerance, - }); -} - -class ImageDoubleTapGestureRecognizer extends DoubleTapGestureRecognizer - with ImageGestureRecognizerMixin { - ImageDoubleTapGestureRecognizer({ - super.debugOwner, - super.supportedDevices, - super.allowedButtonsFilter, - }); -} diff --git a/lib/common/widgets/image/cached_network_svg_image.dart b/lib/common/widgets/image/cached_network_svg_image.dart index eb24dd762..4c3258f2b 100644 --- a/lib/common/widgets/image/cached_network_svg_image.dart +++ b/lib/common/widgets/image/cached_network_svg_image.dart @@ -67,31 +67,6 @@ class CachedNetworkSVGImage extends StatefulWidget { @override State createState() => _CachedNetworkSVGImageState(); - static Future preCache( - String imageUrl, { - String? cacheKey, - BaseCacheManager? cacheManager, - }) { - final key = cacheKey ?? _generateKeyFromUrl(imageUrl); - cacheManager ??= DefaultCacheManager(); - return cacheManager.downloadFile(key); - } - - static Future clearCacheForUrl( - String imageUrl, { - String? cacheKey, - BaseCacheManager? cacheManager, - }) { - final key = cacheKey ?? _generateKeyFromUrl(imageUrl); - cacheManager ??= DefaultCacheManager(); - return cacheManager.removeFile(key); - } - - static Future clearCache({BaseCacheManager? cacheManager}) { - cacheManager ??= DefaultCacheManager(); - return cacheManager.emptyCache(); - } - static String _generateKeyFromUrl(String url) => url.split('?').first; } diff --git a/lib/common/widgets/image_viewer/gallery_viewer.dart b/lib/common/widgets/image_viewer/gallery_viewer.dart index 80526be08..ba652f144 100644 --- a/lib/common/widgets/image_viewer/gallery_viewer.dart +++ b/lib/common/widgets/image_viewer/gallery_viewer.dart @@ -20,7 +20,6 @@ import 'dart:io' show File, Platform; import 'package:PiliPlus/common/widgets/colored_box_transition.dart'; import 'package:PiliPlus/common/widgets/flutter/page/page_view.dart'; import 'package:PiliPlus/common/widgets/gesture/image_horizontal_drag_gesture_recognizer.dart'; -import 'package:PiliPlus/common/widgets/gesture/image_tap_gesture_recognizer.dart'; import 'package:PiliPlus/common/widgets/image_viewer/image.dart'; import 'package:PiliPlus/common/widgets/image_viewer/loading_indicator.dart'; import 'package:PiliPlus/common/widgets/image_viewer/viewer.dart'; @@ -81,8 +80,8 @@ class _GalleryViewerState extends State late final PageController _pageController; - late final ImageTapGestureRecognizer _tapGestureRecognizer; - late final ImageDoubleTapGestureRecognizer _doubleTapGestureRecognizer; + late final TapGestureRecognizer _tapGestureRecognizer; + late final DoubleTapGestureRecognizer _doubleTapGestureRecognizer; late final ImageHorizontalDragGestureRecognizer _horizontalDragGestureRecognizer; late final LongPressGestureRecognizer _longPressGestureRecognizer; @@ -116,13 +115,13 @@ class _GalleryViewerState extends State _pageController = PageController(initialPage: widget.initIndex); final gestureSettings = MediaQuery.maybeGestureSettingsOf(Get.context!); - _tapGestureRecognizer = ImageTapGestureRecognizer() + _tapGestureRecognizer = TapGestureRecognizer() // ..onTap = _onTap ..gestureSettings = gestureSettings; if (PlatformUtils.isDesktop) { _tapGestureRecognizer.onSecondaryTapUp = _showDesktopMenu; } - _doubleTapGestureRecognizer = ImageDoubleTapGestureRecognizer() + _doubleTapGestureRecognizer = DoubleTapGestureRecognizer() ..onDoubleTap = () {} ..gestureSettings = gestureSettings; _horizontalDragGestureRecognizer = ImageHorizontalDragGestureRecognizer(); @@ -360,7 +359,6 @@ class _GalleryViewerState extends State onDragStart: _onDragStart, onDragUpdate: _onDragUpdate, onDragEnd: _onDragEnd, - tapGestureRecognizer: _tapGestureRecognizer, doubleTapGestureRecognizer: _doubleTapGestureRecognizer, horizontalDragGestureRecognizer: _horizontalDragGestureRecognizer, onChangePage: _onChangePage, @@ -373,7 +371,6 @@ class _GalleryViewerState extends State minScale: widget.minScale, maxScale: widget.maxScale, containerSize: _containerSize, - tapGestureRecognizer: _tapGestureRecognizer, doubleTapGestureRecognizer: _doubleTapGestureRecognizer, horizontalDragGestureRecognizer: _horizontalDragGestureRecognizer, onChangePage: _onChangePage, @@ -395,7 +392,6 @@ class _GalleryViewerState extends State onDragStart: null, onDragUpdate: null, onDragEnd: null, - tapGestureRecognizer: _tapGestureRecognizer, doubleTapGestureRecognizer: _doubleTapGestureRecognizer, horizontalDragGestureRecognizer: _horizontalDragGestureRecognizer, @@ -434,7 +430,6 @@ class _GalleryViewerState extends State onDragStart: _onDragStart, onDragUpdate: _onDragUpdate, onDragEnd: _onDragEnd, - tapGestureRecognizer: _tapGestureRecognizer, doubleTapGestureRecognizer: _doubleTapGestureRecognizer, horizontalDragGestureRecognizer: _horizontalDragGestureRecognizer, diff --git a/lib/common/widgets/image_viewer/image.dart b/lib/common/widgets/image_viewer/image.dart index 60b07cada..21f54677a 100644 --- a/lib/common/widgets/image_viewer/image.dart +++ b/lib/common/widgets/image_viewer/image.dart @@ -7,9 +7,9 @@ import 'dart:math' as math; import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/gesture/image_horizontal_drag_gesture_recognizer.dart'; -import 'package:PiliPlus/common/widgets/gesture/image_tap_gesture_recognizer.dart'; import 'package:PiliPlus/common/widgets/image_viewer/viewer.dart'; import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter/semantics.dart'; @@ -42,7 +42,6 @@ class Image extends StatefulWidget { required this.onDragStart, required this.onDragUpdate, required this.onDragEnd, - required this.tapGestureRecognizer, required this.doubleTapGestureRecognizer, required this.horizontalDragGestureRecognizer, required this.onChangePage, @@ -81,7 +80,6 @@ class Image extends StatefulWidget { required this.onDragStart, required this.onDragUpdate, required this.onDragEnd, - required this.tapGestureRecognizer, required this.doubleTapGestureRecognizer, required this.horizontalDragGestureRecognizer, required this.onChangePage, @@ -127,7 +125,6 @@ class Image extends StatefulWidget { required this.onDragStart, required this.onDragUpdate, required this.onDragEnd, - required this.tapGestureRecognizer, required this.doubleTapGestureRecognizer, required this.horizontalDragGestureRecognizer, required this.onChangePage, @@ -176,7 +173,6 @@ class Image extends StatefulWidget { required this.onDragStart, required this.onDragUpdate, required this.onDragEnd, - required this.tapGestureRecognizer, required this.doubleTapGestureRecognizer, required this.horizontalDragGestureRecognizer, required this.onChangePage, @@ -225,7 +221,6 @@ class Image extends StatefulWidget { required this.onDragStart, required this.onDragUpdate, required this.onDragEnd, - required this.tapGestureRecognizer, required this.doubleTapGestureRecognizer, required this.horizontalDragGestureRecognizer, required this.onChangePage, @@ -285,8 +280,7 @@ class Image extends StatefulWidget { final ValueChanged? onDragEnd; final ValueChanged? onChangePage; - final ImageTapGestureRecognizer tapGestureRecognizer; - final ImageDoubleTapGestureRecognizer doubleTapGestureRecognizer; + final DoubleTapGestureRecognizer doubleTapGestureRecognizer; final ImageHorizontalDragGestureRecognizer horizontalDragGestureRecognizer; @override @@ -630,7 +624,6 @@ class _ImageState extends State with WidgetsBindingObserver { onDragStart: widget.onDragStart, onDragUpdate: widget.onDragUpdate, onDragEnd: widget.onDragEnd, - tapGestureRecognizer: widget.tapGestureRecognizer, doubleTapGestureRecognizer: widget.doubleTapGestureRecognizer, horizontalDragGestureRecognizer: widget.horizontalDragGestureRecognizer, onChangePage: widget.onChangePage, diff --git a/lib/common/widgets/image_viewer/viewer.dart b/lib/common/widgets/image_viewer/viewer.dart index 1b5de44eb..823664585 100644 --- a/lib/common/widgets/image_viewer/viewer.dart +++ b/lib/common/widgets/image_viewer/viewer.dart @@ -20,7 +20,6 @@ import 'dart:math' as math; import 'package:PiliPlus/common/widgets/gesture/horizontal_drag_gesture_recognizer.dart' show touchSlopH; import 'package:PiliPlus/common/widgets/gesture/image_horizontal_drag_gesture_recognizer.dart'; -import 'package:PiliPlus/common/widgets/gesture/image_tap_gesture_recognizer.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/foundation.dart'; @@ -44,7 +43,6 @@ class Viewer extends StatefulWidget { required this.onDragStart, required this.onDragUpdate, required this.onDragEnd, - required this.tapGestureRecognizer, required this.doubleTapGestureRecognizer, required this.horizontalDragGestureRecognizer, required this.onChangePage, @@ -63,8 +61,7 @@ class Viewer extends StatefulWidget { final ValueChanged? onDragEnd; final ValueChanged? onChangePage; - final ImageTapGestureRecognizer tapGestureRecognizer; - final ImageDoubleTapGestureRecognizer doubleTapGestureRecognizer; + final DoubleTapGestureRecognizer doubleTapGestureRecognizer; final ImageHorizontalDragGestureRecognizer horizontalDragGestureRecognizer; @override @@ -101,8 +98,7 @@ class _ViewerState extends State with SingleTickerProviderStateMixin { late Size _imageSize; - late final ImageTapGestureRecognizer _tapGestureRecognizer; - late final ImageDoubleTapGestureRecognizer _doubleTapGestureRecognizer; + late final DoubleTapGestureRecognizer _doubleTapGestureRecognizer; late final ImageHorizontalDragGestureRecognizer _horizontalDragGestureRecognizer; late final ScaleGestureRecognizer _scaleGestureRecognizer; @@ -153,7 +149,6 @@ class _ViewerState extends State with SingleTickerProviderStateMixin { duration: const Duration(milliseconds: 300), )..addListener(_listener); - _tapGestureRecognizer = widget.tapGestureRecognizer; _doubleTapGestureRecognizer = widget.doubleTapGestureRecognizer; _horizontalDragGestureRecognizer = widget.horizontalDragGestureRecognizer; @@ -419,11 +414,9 @@ class _ViewerState extends State with SingleTickerProviderStateMixin { void _onPointerDown(PointerDownEvent event) { _scalePos = event.position; - _tapGestureRecognizer.addPointer(event); _doubleTapGestureRecognizer ..onDoubleTapDown = _onDoubleTapDown - ..onDoubleTap = _onDoubleTap - ..addPointer(event); + ..onDoubleTap = _onDoubleTap; _horizontalDragGestureRecognizer ..isBoundaryAllowed = _isBoundaryAllowed ..addPointer(event); diff --git a/lib/models_new/live/live_danmaku/danmaku_msg.dart b/lib/models_new/live/live_danmaku/danmaku_msg.dart index b0fe0ae17..8c972c41c 100644 --- a/lib/models_new/live/live_danmaku/danmaku_msg.dart +++ b/lib/models_new/live/live_danmaku/danmaku_msg.dart @@ -4,26 +4,23 @@ import 'package:PiliPlus/pages/danmaku/danmaku_model.dart'; class DanmakuMsg { final String name; - final Object uid; final String text; final Map? emots; final BaseEmote? uemote; - final LiveDanmaku extra; final Owner? reply; + final LiveDanmaku extra; const DanmakuMsg({ required this.name, - required this.uid, required this.text, this.emots, this.uemote, - required this.extra, this.reply, + required this.extra, }); factory DanmakuMsg.fromPrefetch(Map obj) { final user = obj['user']; - final uid = user['uid']; BaseEmote? uemote; if ((obj['emoticon']?['emoticon_unique'] as String?)?.isNotEmpty == true) { uemote = BaseEmote.fromJson(obj['emoticon']); @@ -41,30 +38,28 @@ class DanmakuMsg { } return DanmakuMsg( name: user['base']['name'], - uid: uid, text: obj['text'], emots: (obj['emots'] as Map?)?.map( (k, v) => MapEntry(k, BaseEmote.fromJson(v)), ), uemote: uemote, + reply: reply, extra: LiveDanmaku( id: obj['id_str'], - mid: uid, + mid: user['uid'], dmType: obj['dm_type'], ts: checkInfo['ts'], ct: checkInfo['ct'], ), - reply: reply, ); } Map toJson() => { 'name': name, - 'uid': uid, 'text': text, - 'emots': emots, - 'uemote': uemote?.toJson(), + 'emots': ?emots, + 'uemote': ?uemote?.toJson(), + 'reply': ?reply?.toJson(), 'extra': extra.toJson(), - 'reply': reply?.toJson(), }; } diff --git a/lib/pages/live_room/controller.dart b/lib/pages/live_room/controller.dart index d33aeac20..fdfba57c1 100644 --- a/lib/pages/live_room/controller.dart +++ b/lib/pages/live_room/controller.dart @@ -182,12 +182,12 @@ class LiveRoomController extends GetxController { void onInit() { super.onInit(); scrollController = ScrollController()..addListener(listener); - final account = Accounts.heartbeat; + final account = Accounts.main; isLogin = account.isLogin; mid = account.mid; queryLiveUrl(); queryLiveInfoH5(); - if (isLogin && !Pref.historyPause) { + if (Accounts.heartbeat.isLogin && !Pref.historyPause) { VideoHttp.roomEntryAction(roomId: roomId); } if (showSuperChat) { @@ -428,7 +428,7 @@ class LiveRoomController extends GetxController { LiveMessageStream( streamToken: info.token!, roomId: roomId, - uid: mid, + uid: Accounts.heartbeat.mid, servers: info.hostList! .map((host) => 'wss://${host.host}:${host.wssPort}/sub') .toList(), @@ -488,7 +488,6 @@ class LiveRoomController extends GetxController { addDm( DanmakuMsg( name: name, - uid: uid, text: msg, emots: (extra['emots'] as Map?)?.map( (k, v) => MapEntry(k, BaseEmote.fromJson(v)), @@ -574,7 +573,7 @@ class LiveRoomController extends GetxController { } Future onLike() async { - if (!Accounts.main.isLogin) { + if (!isLogin) { likeClickTime.value = 0; return; } @@ -593,7 +592,7 @@ class LiveRoomController extends GetxController { } void onSendDanmaku([bool fromEmote = false]) { - if (!Accounts.main.isLogin) { + if (!isLogin) { SmartDialog.showToast('账号未登录'); return; } @@ -623,7 +622,7 @@ class LiveRoomController extends GetxController { } void reportSC(SuperChatItem item) { - if (!Accounts.main.isLogin) { + if (!isLogin) { SmartDialog.showToast('账号未登录'); return; } diff --git a/lib/pages/live_room/view.dart b/lib/pages/live_room/view.dart index 8ae12d984..20d203c87 100644 --- a/lib/pages/live_room/view.dart +++ b/lib/pages/live_room/view.dart @@ -714,7 +714,7 @@ class _LiveRoomPageState extends State ..savedDanmaku = [ RichTextItem.fromStart( '@${item.name} ', - rawText: item.uid.toString(), + rawText: item.extra.mid.toString(), type: .at, id: item.extra.id.toString(), ), diff --git a/lib/pages/live_room/widgets/chat_panel.dart b/lib/pages/live_room/widgets/chat_panel.dart index d833f3a58..a6d42d283 100644 --- a/lib/pages/live_room/widgets/chat_panel.dart +++ b/lib/pages/live_room/widgets/chat_panel.dart @@ -8,7 +8,6 @@ import 'package:PiliPlus/models_new/live/live_superchat/item.dart'; import 'package:PiliPlus/pages/live_room/controller.dart'; 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/utils.dart'; import 'package:flutter/foundation.dart' show kDebugMode; @@ -82,7 +81,7 @@ class LiveRoomChatPanel extends StatelessWidget { color: nameColor, fontSize: 14, ), - recognizer: item.uid == 0 + recognizer: item.extra.mid == 0 ? null : (NoDeadlineTapGestureRecognizer() ..onTapUp = (e) => _showMsgMenu( @@ -292,7 +291,11 @@ class LiveRoomChatPanel extends StatelessWidget { ) { final dx = details.globalPosition.dx; final renderBox = itemContext.findRenderObject() as RenderBox; - final dy = renderBox.localToGlobal(renderBox.size.bottomLeft(.zero)).dy; + final dy = + details.globalPosition.dy - + details.localPosition.dy + + renderBox.size.height - + 4; // padding final autoScroll = liveRoomController.autoScroll && !liveRoomController.disableAutoScroll.value; @@ -321,7 +324,7 @@ class LiveRoomChatPanel extends StatelessWidget { ), PopupMenuItem( height: 38, - onTap: () => Get.toNamed('/member?mid=${item.uid}'), + onTap: () => Get.toNamed('/member?mid=${item.extra.mid}'), child: const Text( '去TA的个人空间', style: TextStyle(fontSize: 13), @@ -338,9 +341,9 @@ class LiveRoomChatPanel extends StatelessWidget { PopupMenuItem( height: 38, onTap: () async { - if (!Accounts.main.isLogin) return; + if (!liveRoomController.isLogin) return; final res = await LiveHttp.liveShieldUser( - uid: item.uid, + uid: item.extra.mid, roomid: roomId, type: 1, ); diff --git a/lib/pages/setting/models/style_settings.dart b/lib/pages/setting/models/style_settings.dart index 9c5bbe943..834f82c65 100644 --- a/lib/pages/setting/models/style_settings.dart +++ b/lib/pages/setting/models/style_settings.dart @@ -25,9 +25,11 @@ import 'package:PiliPlus/pages/setting/widgets/multi_select_dialog.dart'; import 'package:PiliPlus/pages/setting/widgets/select_dialog.dart'; import 'package:PiliPlus/pages/setting/widgets/slider_dialog.dart'; import 'package:PiliPlus/plugin/pl_player/utils/fullscreen.dart'; +import 'package:PiliPlus/utils/extension/file_ext.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/theme_ext.dart'; import 'package:PiliPlus/utils/global_data.dart'; +import 'package:PiliPlus/utils/path_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_key.dart'; @@ -38,6 +40,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; +import 'package:path/path.dart' as path; List get styleSettings => [ if (PlatformUtils.isDesktop) ...[ @@ -56,16 +59,7 @@ List get styleSettings => [ needReboot: true, ), ], - if (Platform.isLinux) - const SwitchModel( - title: '使用SSD(Server-Side Decoration)', - subtitle: '(Linux)强制使用Server-Side Decoration', - leading: Icon(Icons.web_asset), - setKey: SettingBoxKey.useSSD, - defaultVal: false, - needReboot: true, - onChanged: GStorage.syncToDisk, - ), + if (Platform.isLinux) _useSSDModel(), SwitchModel( title: '横屏适配', subtitle: '启用横屏布局与逻辑,平板、折叠屏等可开启;建议全屏方向设为【不改变当前方向】', @@ -920,3 +914,31 @@ Future _showBarHideTypeDialog( setState(); } } + +NormalModel _useSSDModel() { + final file = File(path.join(appSupportDirPath, 'use_ssd')); + void onChanged(BuildContext context, VoidCallback setState) { + (file.existsSync() ? file.tryDel() : file.create()).whenComplete(() { + if (context.mounted) { + setState(); + } + }); + } + + return NormalModel( + title: '使用SSD(Server-Side Decoration)', + leading: const Icon(Icons.web_asset), + onTap: onChanged, + getTrailing: (theme) => Builder( + builder: (context) => Transform.scale( + scale: 0.8, + alignment: .centerRight, + child: Switch( + value: file.existsSync(), + onChanged: (_) => + onChanged(context, (context as Element).markNeedsBuild), + ), + ), + ), + ); +} diff --git a/lib/pages/setting/widgets/popup_item.dart b/lib/pages/setting/widgets/popup_item.dart index 6c83d9b9e..4e5ef1894 100644 --- a/lib/pages/setting/widgets/popup_item.dart +++ b/lib/pages/setting/widgets/popup_item.dart @@ -45,19 +45,19 @@ class _PopupListTileState extends State> { final _key = PlatformUtils.isDesktop ? null : GlobalKey(); void _showButtonMenu(TapUpDetails details, T value) { - final box = context.findRenderObject() as RenderBox; - final offset = box.localToGlobal(box.size.topLeft(.zero)); + final thisOffset = details.globalPosition - details.localPosition; final double dx; if (PlatformUtils.isDesktop) { dx = details.globalPosition.dx + 1; } else { - final box = _key!.currentContext!.findRenderObject() as RenderBox; - final offset = box.localToGlobal(box.size.topLeft(.zero)); - dx = offset.dx; + final thisBox = context.findRenderObject() as RenderBox; + final titleBox = _key!.currentContext!.findRenderObject() as RenderBox; + final titleOffset = titleBox.localToGlobal(.zero, ancestor: thisBox); + dx = thisOffset.dx + titleOffset.dx; } showMenu( context: context, - position: RelativeRect.fromLTRB(dx, offset.dy + 5, dx, 0), + position: RelativeRect.fromLTRB(dx, thisOffset.dy + 5, dx, 0), items: widget.itemBuilder(context), initialValue: value, requestFocus: false, diff --git a/lib/plugin/pl_player/view.dart b/lib/plugin/pl_player/view.dart index a23a3f51d..02f3d6dc5 100644 --- a/lib/plugin/pl_player/view.dart +++ b/lib/plugin/pl_player/view.dart @@ -467,6 +467,7 @@ class _PLVideoPlayerState extends State tooltip: '分段信息', icon: DisabledIcon( iconSize: 22, + color: Colors.white, disable: !show, child: Transform.rotate( angle: math.pi / 2, diff --git a/lib/services/audio_handler.dart b/lib/services/audio_handler.dart index aba5f3af3..a58dcaff1 100644 --- a/lib/services/audio_handler.dart +++ b/lib/services/audio_handler.dart @@ -147,76 +147,78 @@ class VideoPlayerServiceHandler extends BaseAudioHandler with SeekHandler { Uri getUri(String? cover) => Uri.parse(ImageUtils.safeThumbnailUrl(cover)); late final id = '$cid$herotag'; - MediaItem? mediaItem; - if (data is VideoDetailData) { - if ((data.pages?.length ?? 0) > 1) { - final current = data.pages?.firstWhereOrNull( - (element) => element.cid == cid, - ); + final MediaItem mediaItem; + switch (data) { + case VideoDetailData(:final pages): + if (pages != null && pages.length > 1) { + final current = pages.firstWhereOrNull((e) => e.cid == cid); + mediaItem = MediaItem( + id: id, + title: current?.part ?? '', + artist: data.owner?.name, + duration: Duration(seconds: current?.duration ?? 0), + artUri: getUri(data.pic), + ); + } else { + mediaItem = MediaItem( + id: id, + title: data.title ?? '', + artist: data.owner?.name, + duration: Duration(seconds: data.duration ?? 0), + artUri: getUri(data.pic), + ); + } + case EpisodeItem(): mediaItem = MediaItem( id: id, - title: current?.part ?? '', - artist: data.owner?.name, - duration: Duration(seconds: current?.duration ?? 0), - artUri: getUri(data.pic), + title: data.showTitle ?? data.longTitle ?? data.title ?? '', + artist: artist, + duration: data.from == 'pugv' + ? Duration(seconds: data.duration ?? 0) + : Duration(milliseconds: data.duration ?? 0), + artUri: getUri(data.cover), ); - } else { + case RoomInfoH5Data(): mediaItem = MediaItem( id: id, - title: data.title ?? '', - artist: data.owner?.name, + title: data.roomInfo?.title ?? '', + artist: data.anchorInfo?.baseInfo?.uname, + artUri: getUri(data.roomInfo?.cover), + isLive: true, + ); + case Part(): + mediaItem = MediaItem( + id: id, + title: data.part ?? '', + artist: artist, duration: Duration(seconds: data.duration ?? 0), - artUri: getUri(data.pic), + artUri: getUri(cover), ); - } - } else if (data is EpisodeItem) { - mediaItem = MediaItem( - id: id, - title: data.showTitle ?? data.longTitle ?? data.title ?? '', - artist: artist, - duration: data.from == 'pugv' - ? Duration(seconds: data.duration ?? 0) - : Duration(milliseconds: data.duration ?? 0), - artUri: getUri(data.cover), - ); - } else if (data is RoomInfoH5Data) { - mediaItem = MediaItem( - id: id, - title: data.roomInfo?.title ?? '', - artist: data.anchorInfo?.baseInfo?.uname, - artUri: getUri(data.roomInfo?.cover), - isLive: true, - ); - } else if (data is Part) { - mediaItem = MediaItem( - id: id, - title: data.part ?? '', - artist: artist, - duration: Duration(seconds: data.duration ?? 0), - artUri: getUri(cover), - ); - } else if (data is DetailItem) { - mediaItem = MediaItem( - id: id, - title: data.arc.title, - artist: data.owner.name, - duration: Duration(seconds: data.arc.duration.toInt()), - artUri: getUri(data.arc.cover), - ); - } else if (data is BiliDownloadEntryInfo) { - final coverFile = File(path.join(data.entryDirPath, PathUtils.coverName)); - final uri = coverFile.existsSync() - ? coverFile.absolute.uri - : getUri(data.cover); - mediaItem = MediaItem( - id: id, - title: data.showTitle, - artist: data.ownerName, - duration: Duration(milliseconds: data.totalTimeMilli), - artUri: uri, - ); + case DetailItem(:final arc): + mediaItem = MediaItem( + id: id, + title: arc.title, + artist: data.owner.name, + duration: Duration(seconds: arc.duration.toInt()), + artUri: getUri(arc.cover), + ); + case BiliDownloadEntryInfo(): + final coverFile = File( + path.join(data.entryDirPath, PathUtils.coverName), + ); + final uri = coverFile.existsSync() + ? coverFile.absolute.uri + : getUri(data.cover); + mediaItem = MediaItem( + id: id, + title: data.showTitle, + artist: data.ownerName, + duration: Duration(milliseconds: data.totalTimeMilli), + artUri: uri, + ); + default: + return; } - if (mediaItem == null) return; // if (kDebugMode) debugPrint("exist: ${PlPlayerController.instanceExists()}"); if (!PlPlayerController.instanceExists()) return; _item.add(mediaItem); diff --git a/lib/utils/storage.dart b/lib/utils/storage.dart index 3392f4a0e..dc0b77cc3 100644 --- a/lib/utils/storage.dart +++ b/lib/utils/storage.dart @@ -1,5 +1,4 @@ import 'dart:convert'; -import 'dart:io'; import 'package:PiliPlus/models/model_owner.dart'; import 'package:PiliPlus/models/user/danmaku_rule_adapter.dart'; @@ -62,11 +61,6 @@ abstract final class GStorage { ]); } - static Future syncToDisk([_]) { - final jsonPath = path.join(appSupportDirPath, 'settings.json'); - return File(jsonPath).writeAsString(exportAllSettings()); - } - static String exportAllSettings() { return Utils.jsonEncoder.convert({ setting.name: setting.toMap(), diff --git a/lib/utils/storage_key.dart b/lib/utils/storage_key.dart index b8a6955ee..915cc6713 100644 --- a/lib/utils/storage_key.dart +++ b/lib/utils/storage_key.dart @@ -157,8 +157,7 @@ abstract final class SettingBoxKey { showWindowTitleBar = 'showWindowTitleBar', desktopVolume = 'desktopVolume', showTrayIcon = 'showTrayIcon', - uiScale = 'uiScale', - useSSD = 'useSSD'; + uiScale = 'uiScale'; static const String subtitlePreferenceV2 = 'subtitlePreferenceV2', enableDragSubtitle = 'enableDragSubtitle', diff --git a/lib/utils/storage_pref.dart b/lib/utils/storage_pref.dart index cb815b7ec..b881dc547 100644 --- a/lib/utils/storage_pref.dart +++ b/lib/utils/storage_pref.dart @@ -914,9 +914,6 @@ abstract final class Pref { static bool get showWindowTitleBar => _setting.get(SettingBoxKey.showWindowTitleBar, defaultValue: true); - static bool get useSSD => - _setting.get(SettingBoxKey.useSSD, defaultValue: false); - static double get desktopVolume => _setting.get(SettingBoxKey.desktopVolume, defaultValue: 1.0); diff --git a/linux/runner/my_application.cc b/linux/runner/my_application.cc index 753a7d9ed..29438bd5f 100644 --- a/linux/runner/my_application.cc +++ b/linux/runner/my_application.cc @@ -5,10 +5,6 @@ #include #endif -#include -#include -#include - #include "flutter/generated_plugin_registrant.h" struct _MyApplication { @@ -50,22 +46,9 @@ static void my_application_activate(GApplication *application) { // if future cases occur). const gboolean use_header_bar = [window]() -> gboolean { - auto UseSSD = []() -> bool { - const gchar *config_root = g_get_user_data_dir(); - gchar *full_path_c = g_build_filename(config_root, "com.example.piliplus", - "settings.json", NULL); - std::string config_path(full_path_c); - g_free(full_path_c); - std::ifstream f(config_path); - if (!f.is_open()) { - return false; - } - - std::string content{std::istreambuf_iterator(f), {}}; - return (content.find("\"useSSD\": true,") != std::string::npos); - // user choose to use SSD - }; - if (UseSSD()) + if (g_file_test( + g_build_filename(g_get_user_data_dir(), "com.example.piliplus", "use_ssd", NULL), + G_FILE_TEST_EXISTS)) return FALSE; #ifdef GDK_WINDOWING_X11