From 3a6b6614a4bb19288e4fc7b3d5edc3153858acc2 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Thu, 27 Mar 2025 15:43:08 +0800 Subject: [PATCH] opt: video tool bar Closes #528 Signed-off-by: bggRGjQaUbCoE --- lib/pages/video/detail/controller.dart | 2 + lib/pages/video/detail/view_v.dart | 139 +++++++++++------- .../video/detail/widgets/header_control.dart | 4 +- 3 files changed, 89 insertions(+), 56 deletions(-) diff --git a/lib/pages/video/detail/controller.dart b/lib/pages/video/detail/controller.dart index cb3235aa..aa93a36d 100644 --- a/lib/pages/video/detail/controller.dart +++ b/lib/pages/video/detail/controller.dart @@ -95,6 +95,7 @@ class VideoDetailController extends GetxController // 默认记录历史记录 bool enableHeart = true; Floating? floating; + late final headerCtrKey = GlobalKey(); late PreferredSizeWidget headerControl; Box get setting => GStorage.setting; @@ -291,6 +292,7 @@ class VideoDetailController extends GetxController floating = Floating(); } headerControl = HeaderControl( + key: headerCtrKey, controller: plPlayerController, videoDetailCtr: this, floating: floating, diff --git a/lib/pages/video/detail/view_v.dart b/lib/pages/video/detail/view_v.dart index 0c755a37..cadbd070 100644 --- a/lib/pages/video/detail/view_v.dart +++ b/lib/pages/video/detail/view_v.dart @@ -856,62 +856,93 @@ class _VideoDetailPageVState extends State ], ), ), - if (videoDetailController.playedTime == - null) - Align( - alignment: Alignment.centerRight, - child: PopupMenuButton( - icon: Icon( - Icons.more_vert, - color: themeData - .colorScheme.onSurface, - ), - onSelected: (String type) async { - switch (type) { - case 'later': - await videoIntroController - .viewLater(); - break; - case 'report': - if (!Accounts - .main.isLogin) { - SmartDialog.showToast( - '账号未登录'); - } else { - Get.toNamed('/webview', - parameters: { - 'url': - 'https://www.bilibili.com/appeal/?avid=${IdUtils.bv2av(videoDetailController.bvid)}&bvid=${videoDetailController.bvid}' - }); - } - break; - case 'note': - videoDetailController - .showNoteList(context); - break; - } - }, - itemBuilder: - (BuildContext context) => - >[ - const PopupMenuItem( - value: 'later', - child: Text('稍后再看'), - ), - if (videoDetailController - .epId == - null) - const PopupMenuItem( - value: 'note', - child: Text('查看笔记'), + Align( + alignment: Alignment.centerRight, + child: videoDetailController + .playedTime == + null + ? PopupMenuButton( + icon: Icon( + Icons.more_vert, + color: themeData + .colorScheme.onSurface, + ), + onSelected: + (String type) async { + switch (type) { + case 'later': + await videoIntroController + .viewLater(); + break; + case 'report': + if (!Accounts + .main.isLogin) { + SmartDialog.showToast( + '账号未登录'); + } else { + Get.toNamed( + '/webview', + parameters: { + 'url': + 'https://www.bilibili.com/appeal/?avid=${IdUtils.bv2av(videoDetailController.bvid)}&bvid=${videoDetailController.bvid}' + }); + } + break; + case 'note': + videoDetailController + .showNoteList( + context); + break; + } + }, + itemBuilder: (BuildContext + context) => + >[ + const PopupMenuItem( + value: 'later', + child: Text('稍后再看'), + ), + if (videoDetailController + .epId == + null) + const PopupMenuItem< + String>( + value: 'note', + child: Text('查看笔记'), + ), + const PopupMenuItem( + value: 'report', + child: Text('举报'), + ), + ], + ) + : SizedBox( + width: 42, + height: 34, + child: IconButton( + tooltip: "更多设置", + style: ButtonStyle( + padding: + WidgetStateProperty + .all(EdgeInsets + .zero), + ), + onPressed: () { + videoDetailController + .headerCtrKey + .currentState + ?.showSettingSheet(); + }, + icon: Icon( + Icons.more_vert_outlined, + size: 19, + color: themeData + .colorScheme + .onSurface, + ), ), - const PopupMenuItem( - value: 'report', - child: Text('举报'), ), - ], - ), - ), + ), ], ), ), diff --git a/lib/pages/video/detail/widgets/header_control.dart b/lib/pages/video/detail/widgets/header_control.dart index db2eb67d..0481c752 100644 --- a/lib/pages/video/detail/widgets/header_control.dart +++ b/lib/pages/video/detail/widgets/header_control.dart @@ -53,13 +53,13 @@ class HeaderControl extends StatefulWidget implements PreferredSizeWidget { final String heroTag; @override - State createState() => _HeaderControlState(); + State createState() => HeaderControlState(); @override Size get preferredSize => throw UnimplementedError(); } -class _HeaderControlState extends State { +class HeaderControlState extends State { PlayUrlModel get videoInfo => videoDetailCtr.data; static const TextStyle subTitleStyle = TextStyle(fontSize: 12); static const TextStyle titleStyle = TextStyle(fontSize: 14);