From 02bd68f6978eaddd61a88fe797e85664275648da Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Sun, 14 Dec 2025 12:20:20 +0800 Subject: [PATCH] opt desktop pip Signed-off-by: bggRGjQaUbCoE --- .../live_room/widgets/header_control.dart | 20 ++++++++++++++ lib/pages/main/view.dart | 6 +++++ lib/pages/video/widgets/header_control.dart | 27 +++++++++++++++++++ lib/plugin/pl_player/controller.dart | 20 ++++++-------- 4 files changed, 61 insertions(+), 12 deletions(-) diff --git a/lib/pages/live_room/widgets/header_control.dart b/lib/pages/live_room/widgets/header_control.dart index f31196844..e3e9fcf3e 100644 --- a/lib/pages/live_room/widgets/header_control.dart +++ b/lib/pages/live_room/widgets/header_control.dart @@ -121,6 +121,26 @@ class _LiveHeaderControlState extends State child, ...?timeBatteryWidgets, const SizedBox(width: 10), + if (Utils.isDesktop && !plPlayerController.isDesktopPip) + Obx(() { + final isAlwaysOnTop = plPlayerController.isAlwaysOnTop.value; + return ComBtn( + height: 30, + tooltip: '${isAlwaysOnTop ? '取消' : ''}置顶', + icon: isAlwaysOnTop + ? const Icon( + size: 18, + Icons.push_pin, + color: Colors.white, + ) + : const Icon( + size: 18, + Icons.push_pin_outlined, + color: Colors.white, + ), + onTap: () => plPlayerController.setAlwaysOnTop(!isAlwaysOnTop), + ); + }), ComBtn( height: 30, tooltip: '发弹幕', diff --git a/lib/pages/main/view.dart b/lib/pages/main/view.dart index be550a308..2377bb8aa 100644 --- a/lib/pages/main/view.dart +++ b/lib/pages/main/view.dart @@ -118,12 +118,18 @@ class _MainAppState extends State @override Future onWindowMoved() async { + if (PlPlayerController.instance?.isDesktopPip ?? false) { + return; + } final Offset offset = await windowManager.getPosition(); _setting.put(SettingBoxKey.windowPosition, [offset.dx, offset.dy]); } @override Future onWindowResized() async { + if (PlPlayerController.instance?.isDesktopPip ?? false) { + return; + } final Rect bounds = await windowManager.getBounds(); _setting.putAll({ SettingBoxKey.windowSize: [bounds.width, bounds.height], diff --git a/lib/pages/video/widgets/header_control.dart b/lib/pages/video/widgets/header_control.dart index 5d2efb165..a433fba82 100644 --- a/lib/pages/video/widgets/header_control.dart +++ b/lib/pages/video/widgets/header_control.dart @@ -2567,6 +2567,33 @@ class HeaderControlState extends State title, // show current datetime ...?timeBatteryWidgets, + if (Utils.isDesktop && !plPlayerController.isDesktopPip) + Obx(() { + final isAlwaysOnTop = plPlayerController.isAlwaysOnTop.value; + return SizedBox( + width: 42, + height: 34, + child: IconButton( + tooltip: '${isAlwaysOnTop ? '取消' : ''}置顶', + style: const ButtonStyle( + padding: WidgetStatePropertyAll(EdgeInsets.zero), + ), + onPressed: () => + plPlayerController.setAlwaysOnTop(!isAlwaysOnTop), + icon: isAlwaysOnTop + ? const Icon( + size: 19, + Icons.push_pin, + color: Colors.white, + ) + : const Icon( + size: 19, + Icons.push_pin_outlined, + color: Colors.white, + ), + ), + ); + }), if (!isFileSource) ...[ if (!isFSOrPip) ...[ if (videoDetailCtr.isUgc) diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index 756e82273..02520fdba 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -227,6 +227,12 @@ class PlPlayerController { late bool isDesktopPip = false; late Rect _lastWindowBounds; + late final RxBool isAlwaysOnTop = false.obs; + Future setAlwaysOnTop(bool value) { + isAlwaysOnTop.value = value; + return windowManager.setAlwaysOnTop(value); + } + Offset initialFocalPoint = Offset.zero; Future exitDesktopPip() { @@ -235,18 +241,8 @@ class PlPlayerController { windowManager.setTitleBarStyle(TitleBarStyle.normal), windowManager.setMinimumSize(const Size(400, 700)), windowManager.setBounds(_lastWindowBounds), - windowManager.setAlwaysOnTop(false), + setAlwaysOnTop(false), windowManager.setAspectRatio(0), - setting.putAll({ - SettingBoxKey.windowSize: [ - _lastWindowBounds.width, - _lastWindowBounds.height, - ], - SettingBoxKey.windowPosition: [ - _lastWindowBounds.left, - _lastWindowBounds.top, - ], - }), ]); } @@ -270,9 +266,9 @@ class PlPlayerController { } await windowManager.setMinimumSize(size); + setAlwaysOnTop(true); windowManager ..setSize(size) - ..setAlwaysOnTop(true) ..setAspectRatio(width / height); }