From 51c605f5d0a5bcd0df62b358f429a58322744f84 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Fri, 19 Sep 2025 15:32:46 +0800 Subject: [PATCH] tweaks Signed-off-by: bggRGjQaUbCoE --- README.md | 27 ++--- assets/images/logo/logo_large.png | Bin 0 -> 20330 bytes lib/pages/emote/view.dart | 8 +- lib/pages/episode_panel/view.dart | 30 +++-- lib/pages/fav_create/view.dart | 113 ++++++++---------- lib/pages/history/view.dart | 21 ++-- lib/pages/live_emote/view.dart | 6 +- lib/pages/live_room/widgets/chat_panel.dart | 2 +- lib/pages/main/view.dart | 8 +- lib/pages/video/ai_conclusion/view.dart | 99 +++++++-------- .../video/introduction/pgc/controller.dart | 6 +- .../pgc/widgets/intro_detail.dart | 5 +- .../video/introduction/ugc/controller.dart | 8 +- lib/pages/video/introduction/ugc/view.dart | 11 +- .../ugc/widgets/selectable_text.dart | 38 ++++++ lib/pages/whisper_detail/view.dart | 16 ++- 16 files changed, 227 insertions(+), 171 deletions(-) create mode 100644 assets/images/logo/logo_large.png create mode 100644 lib/pages/video/introduction/ugc/widgets/selectable_text.dart diff --git a/README.md b/README.md index 2e8bf871..37a2e36f 100644 --- a/README.md +++ b/README.md @@ -22,22 +22,18 @@
-## 开发环境 - -```bash -[✓] Flutter (Channel stable, 3.24.0, on Microsoft Windows [版本 10.0.19045.4046], locale zh-CN) -[✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0) -[✓] Xcode - develop for iOS and macOS (Xcode 15.1) -[✓] Chrome - develop for the web -[✓] Android Studio (version 2022.3) -[✓] VS Code (version 1.85.1) -[✓] Connected device (3 available) -[✓] Network resources - -```
+## 适配平台 + +- [x] Android +- [x] iOS +- [x] Pad +- [x] Windows + + +
## refactor @@ -136,11 +132,6 @@ ## 功能 -目前着重移动端(Android、iOS)和Pad端,暂时没有适配桌面端、手表端等 - -
- - - [x] 推荐视频列表(app端) - [x] 最热视频列表 - [x] 热门直播 diff --git a/assets/images/logo/logo_large.png b/assets/images/logo/logo_large.png new file mode 100644 index 0000000000000000000000000000000000000000..2370686ba52b513a6433c5cb4c50b2c985c24e2c GIT binary patch literal 20330 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 literal 0 HcmV?d00001 diff --git a/lib/pages/emote/view.dart b/lib/pages/emote/view.dart index c406afa3..7ceb1910 100644 --- a/lib/pages/emote/view.dart +++ b/lib/pages/emote/view.dart @@ -42,9 +42,11 @@ class _EmotePanelState extends State ThemeData theme, LoadingState?> loadingState, ) { - late final color = Get.currentRoute.startsWith('/whisperDetail') - ? theme.colorScheme.surface - : theme.colorScheme.onInverseSurface; + late final color = ElevationOverlay.colorWithOverlay( + theme.colorScheme.surface, + theme.hoverColor, + Get.currentRoute.startsWith('/whisperDetail') ? 8 : 2, + ); return switch (loadingState) { Loading() => loadingWidget, Success(:var response) => diff --git a/lib/pages/episode_panel/view.dart b/lib/pages/episode_panel/view.dart index 46a14db3..3873f496 100644 --- a/lib/pages/episode_panel/view.dart +++ b/lib/pages/episode_panel/view.dart @@ -74,7 +74,7 @@ class EpisodePanel extends CommonSlidePage { final int initialTabIndex; final bool? isSupportReverse; final bool? isReversed; - final ValueChanged onChangeEpisode; + final Future Function(ugc.BaseEpisodeItem) onChangeEpisode; final VoidCallback? onReverse; final VoidCallback? onClose; @@ -432,19 +432,23 @@ class _EpisodePanelState extends State } SmartDialog.showToast('切换到:$title'); widget.onClose?.call(); - if (!showTitle) { - _currentItemIndex = index; - } - widget.onChangeEpisode(episode); - if (widget.type == EpisodeType.season) { - try { - Get.find( - tag: widget.ugcIntroController!.heroTag, - ).seasonCid = episode.cid; - } catch (_) { - if (kDebugMode) rethrow; + + widget.onChangeEpisode(episode).then((res) { + if (res) { + if (!showTitle) { + _currentItemIndex = index; + } + if (widget.type == EpisodeType.season) { + try { + Get.find( + tag: widget.ugcIntroController!.heroTag, + ).seasonCid = episode.cid; + } catch (_) { + if (kDebugMode) rethrow; + } + } } - } + }); }, onLongPress: () { if (cover?.isNotEmpty == true) { diff --git a/lib/pages/fav_create/view.dart b/lib/pages/fav_create/view.dart index 8a703f5a..22b74d8c 100644 --- a/lib/pages/fav_create/view.dart +++ b/lib/pages/fav_create/view.dart @@ -259,57 +259,58 @@ class _CreateFavPageState extends State { ], ListTile( tileColor: theme.colorScheme.onInverseSurface, - leading: Text.rich( - style: const TextStyle( - height: 1, - fontSize: 14, - ), - TextSpan( - children: [ - TextSpan( - text: '*', - style: TextStyle( - fontSize: 14, - height: 1, - color: theme.colorScheme.error, + title: Row( + children: [ + SizedBox( + width: 55, + child: Text.rich( + TextSpan( + children: [ + TextSpan( + text: '*', + style: TextStyle( + fontSize: 14, + color: theme.colorScheme.error, + ), + ), + const TextSpan( + text: '名称', + style: TextStyle(fontSize: 14), + ), + ], ), ), - const TextSpan( - text: '名称', + ), + Expanded( + child: TextField( + autofocus: true, + readOnly: _attr != null && FavUtils.isDefaultFav(_attr!), + controller: _titleController, style: TextStyle( - height: 1, fontSize: 14, + color: _attr != null && FavUtils.isDefaultFav(_attr!) + ? theme.colorScheme.outline + : null, + ), + inputFormatters: [ + LengthLimitingTextInputFormatter(20), + ], + decoration: InputDecoration( + isDense: true, + hintText: '名称', + hintStyle: TextStyle( + fontSize: 14, + color: theme.colorScheme.outline, + ), + border: const OutlineInputBorder( + borderSide: BorderSide.none, + gapPadding: 0, + ), + contentPadding: EdgeInsets.zero, ), ), - ], - ), - ), - title: TextField( - autofocus: true, - readOnly: _attr != null && FavUtils.isDefaultFav(_attr!), - controller: _titleController, - style: TextStyle( - fontSize: 14, - color: _attr != null && FavUtils.isDefaultFav(_attr!) - ? theme.colorScheme.outline - : null, - ), - inputFormatters: [ - LengthLimitingTextInputFormatter(20), + ), ], - decoration: InputDecoration( - isDense: true, - hintText: '名称', - hintStyle: TextStyle( - fontSize: 14, - color: theme.colorScheme.outline, - ), - border: const OutlineInputBorder( - borderSide: BorderSide.none, - gapPadding: 0, - ), - contentPadding: EdgeInsets.zero, - ), ), ), const SizedBox(height: 16), @@ -319,24 +320,16 @@ class _CreateFavPageState extends State { title: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text.rich( - TextSpan( - children: [ - TextSpan( - text: '简介', - style: TextStyle( - fontSize: 14, - color: theme.colorScheme.onSurfaceVariant, - ), - ), - const TextSpan( - text: '*', - style: TextStyle(color: Colors.transparent), - ), - ], + SizedBox( + width: 55, + child: Text( + '简介', + style: TextStyle( + fontSize: 14, + color: theme.colorScheme.onSurfaceVariant, + ), ), ), - const SizedBox(width: 16), Expanded( child: TextField( minLines: 6, diff --git a/lib/pages/history/view.dart b/lib/pages/history/view.dart index f2ad1212..4f2fdf10 100644 --- a/lib/pages/history/view.dart +++ b/lib/pages/history/view.dart @@ -254,20 +254,25 @@ class _HistoryPageState extends State padding: const EdgeInsets.only(left: 16, right: 6), child: Row( children: [ - Icon( - Icons.info_outline, - size: 18, - color: theme.onSecondaryContainer, - ), - const SizedBox(width: 4), Expanded( - child: Text( - '历史记录功能已关闭', + child: Text.rich( strutStyle: const StrutStyle(height: 1, leading: 0), style: TextStyle( height: 1, color: theme.onSecondaryContainer, ), + TextSpan( + children: [ + WidgetSpan( + child: Icon( + Icons.info_outline, + size: 18, + color: theme.onSecondaryContainer, + ), + ), + const TextSpan(text: ' 历史记录功能已关闭'), + ], + ), ), ), GestureDetector( diff --git a/lib/pages/live_emote/view.dart b/lib/pages/live_emote/view.dart index fcc4cae7..535207c6 100644 --- a/lib/pages/live_emote/view.dart +++ b/lib/pages/live_emote/view.dart @@ -45,7 +45,11 @@ class _LiveEmotePanelState extends State Widget _buildBody(LoadingState?> loadingState) { late final theme = Theme.of(context); - late final color = theme.colorScheme.onInverseSurface; + late final color = ElevationOverlay.colorWithOverlay( + theme.colorScheme.surface, + theme.hoverColor, + 2, + ); return switch (loadingState) { Loading() => loadingWidget, Success(:var response) => diff --git a/lib/pages/live_room/widgets/chat_panel.dart b/lib/pages/live_room/widgets/chat_panel.dart index 9b490a93..1e0d486b 100644 --- a/lib/pages/live_room/widgets/chat_panel.dart +++ b/lib/pages/live_room/widgets/chat_panel.dart @@ -140,7 +140,7 @@ class LiveRoomChatPanel extends StatelessWidget { ), padding: const EdgeInsets.fromLTRB(10, 4, 4, 4), child: Text.rich( - style: const TextStyle(color: Colors.white), + style: const TextStyle(color: Colors.white, height: 1), strutStyle: const StrutStyle(height: 1, leading: 0), TextSpan( children: [ diff --git a/lib/pages/main/view.dart b/lib/pages/main/view.dart index 15800201..6e4bec5f 100644 --- a/lib/pages/main/view.dart +++ b/lib/pages/main/view.dart @@ -51,8 +51,12 @@ class _MainAppState extends State @override void didChangeDependencies() { super.didChangeDependencies(); + final brightness = Theme.brightnessOf(context); NetworkImgLayer.reduce = - NetworkImgLayer.reduceLuxColor != null && context.isDarkMode; + NetworkImgLayer.reduceLuxColor != null && brightness.isDark; + if (Utils.isDesktop) { + windowManager.setBrightness(brightness); + } PageUtils.routeObserver.subscribe( this, ModalRoute.of(context) as PageRoute, @@ -160,6 +164,8 @@ class _MainAppState extends State Future _handleTray() async { if (Platform.isWindows) { await trayManager.setIcon('assets/images/logo/app_icon.ico'); + } else { + await trayManager.setIcon('assets/images/logo/logo_large.png'); } if (!Platform.isLinux) { await trayManager.setToolTip(Constants.appName); diff --git a/lib/pages/video/ai_conclusion/view.dart b/lib/pages/video/ai_conclusion/view.dart index cead90a6..30266886 100644 --- a/lib/pages/video/ai_conclusion/view.dart +++ b/lib/pages/video/ai_conclusion/view.dart @@ -1,6 +1,7 @@ import 'package:PiliPlus/models_new/video/video_ai_conclusion/model_result.dart'; import 'package:PiliPlus/pages/common/slide/common_slide_page.dart'; import 'package:PiliPlus/pages/video/controller.dart'; +import 'package:PiliPlus/pages/video/introduction/ugc/widgets/selectable_text.dart'; import 'package:PiliPlus/utils/duration_utils.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; @@ -69,7 +70,7 @@ class _AiDetailState extends State SliverToBoxAdapter( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 14), - child: SelectableText( + child: selectableText( widget.item.summary!, style: const TextStyle( fontSize: 15, @@ -98,57 +99,59 @@ class _AiDetailState extends State itemCount: widget.item.outline!.length, itemBuilder: (context, index) { final item = widget.item.outline![index]; - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (index != 0) const SizedBox(height: 10), - SelectableText( - item.title!, - style: const TextStyle( - fontSize: 14, - fontWeight: FontWeight.bold, - height: 1.5, + return SelectionArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (index != 0) const SizedBox(height: 10), + Text( + item.title!, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + height: 1.5, + ), ), - ), - const SizedBox(height: 6), - ...?item.partOutline?.map( - (item) => Wrap( - children: [ - SelectableText.rich( - TextSpan( - style: TextStyle( - fontSize: 14, - color: theme.colorScheme.onSurface, - height: 1.5, - ), - children: [ - TextSpan( - text: DurationUtils.formatDuration( - item.timestamp, - ), - style: TextStyle( - color: theme.colorScheme.primary, - ), - recognizer: TapGestureRecognizer() - ..onTap = () { - try { - Get.find( - tag: Get.arguments['heroTag'], - ).plPlayerController.seekTo( - Duration(seconds: item.timestamp!), - ); - } catch (_) {} - }, + const SizedBox(height: 6), + ...?item.partOutline?.map( + (item) => Wrap( + children: [ + Text.rich( + TextSpan( + style: TextStyle( + fontSize: 14, + color: theme.colorScheme.onSurface, + height: 1.5, ), - const TextSpan(text: ' '), - TextSpan(text: item.content!), - ], + children: [ + TextSpan( + text: DurationUtils.formatDuration( + item.timestamp, + ), + style: TextStyle( + color: theme.colorScheme.primary, + ), + recognizer: TapGestureRecognizer() + ..onTap = () { + try { + Get.find( + tag: Get.arguments['heroTag'], + ).plPlayerController.seekTo( + Duration(seconds: item.timestamp!), + ); + } catch (_) {} + }, + ), + const TextSpan(text: ' '), + TextSpan(text: item.content!), + ], + ), ), - ), - ], + ], + ), ), - ), - ], + ], + ), ); }, ), diff --git a/lib/pages/video/introduction/pgc/controller.dart b/lib/pages/video/introduction/pgc/controller.dart index 77d5dd40..8cf3fa8c 100644 --- a/lib/pages/video/introduction/pgc/controller.dart +++ b/lib/pages/video/introduction/pgc/controller.dart @@ -277,7 +277,7 @@ class PgcIntroController extends CommonIntroController { } // 修改分P或番剧分集 - Future onChangeEpisode(BaseEpisodeItem episode) async { + Future onChangeEpisode(BaseEpisodeItem episode) async { try { final int epId = episode.epId ?? episode.id!; final String bvid = episode.bvid ?? this.bvid; @@ -285,7 +285,7 @@ class PgcIntroController extends CommonIntroController { final int? cid = episode.cid ?? await SearchHttp.ab2c(aid: aid, bvid: bvid); if (cid == null) { - return; + return false; } final String? cover = episode.cover; @@ -323,8 +323,10 @@ class PgcIntroController extends CommonIntroController { this.cid.value = cid; queryOnlineTotal(); queryVideoIntro(episode as EpisodeItem); + return true; } catch (e) { if (kDebugMode) debugPrint('pgc onChangeEpisode: $e'); + return false; } } diff --git a/lib/pages/video/introduction/pgc/widgets/intro_detail.dart b/lib/pages/video/introduction/pgc/widgets/intro_detail.dart index 2c53c560..497c17b5 100644 --- a/lib/pages/video/introduction/pgc/widgets/intro_detail.dart +++ b/lib/pages/video/introduction/pgc/widgets/intro_detail.dart @@ -9,6 +9,7 @@ import 'package:PiliPlus/models_new/video/video_tag/data.dart'; import 'package:PiliPlus/pages/common/slide/common_slide_page.dart'; import 'package:PiliPlus/pages/pgc_review/view.dart'; import 'package:PiliPlus/pages/search/widgets/search_text.dart'; +import 'package:PiliPlus/pages/video/introduction/ugc/widgets/selectable_text.dart'; import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart' hide TabBarView; @@ -108,7 +109,7 @@ class _IntroDetailState extends State bottom: MediaQuery.viewPaddingOf(context).bottom + 100, ), children: [ - SelectableText( + selectableText( widget.item.title!, style: const TextStyle(fontSize: 16), ), @@ -152,7 +153,7 @@ class _IntroDetailState extends State style: theme.textTheme.titleMedium, ), const SizedBox(height: 4), - SelectableText( + selectableText( widget.item.evaluate!, style: textStyle, ), diff --git a/lib/pages/video/introduction/ugc/controller.dart b/lib/pages/video/introduction/ugc/controller.dart index 46d2be3a..4ee8812b 100644 --- a/lib/pages/video/introduction/ugc/controller.dart +++ b/lib/pages/video/introduction/ugc/controller.dart @@ -463,7 +463,7 @@ class UgcIntroController extends CommonIntroController with ReloadMixin { } // 修改分P或番剧分集 - Future onChangeEpisode( + Future onChangeEpisode( BaseEpisodeItem episode, { bool isStein = false, }) async { @@ -473,7 +473,7 @@ class UgcIntroController extends CommonIntroController with ReloadMixin { final int? cid = episode.cid ?? await SearchHttp.ab2c(aid: aid, bvid: bvid); if (cid == null) { - return; + return false; } final String? cover = episode.cover; @@ -488,7 +488,7 @@ class UgcIntroController extends CommonIntroController with ReloadMixin { cid: cid, cover: cover, ); - return; + return false; } } @@ -546,8 +546,10 @@ class UgcIntroController extends CommonIntroController with ReloadMixin { this.cid.value = cid; queryOnlineTotal(); + return true; } catch (e) { if (kDebugMode) debugPrint('ugc onChangeEpisode: $e'); + return false; } } diff --git a/lib/pages/video/introduction/ugc/view.dart b/lib/pages/video/introduction/ugc/view.dart index 75a94d0e..e080731c 100644 --- a/lib/pages/video/introduction/ugc/view.dart +++ b/lib/pages/video/introduction/ugc/view.dart @@ -15,6 +15,7 @@ import 'package:PiliPlus/pages/video/introduction/ugc/controller.dart'; import 'package:PiliPlus/pages/video/introduction/ugc/widgets/action_item.dart'; import 'package:PiliPlus/pages/video/introduction/ugc/widgets/page.dart'; import 'package:PiliPlus/pages/video/introduction/ugc/widgets/season.dart'; +import 'package:PiliPlus/pages/video/introduction/ugc/widgets/selectable_text.dart'; import 'package:PiliPlus/pages/video/introduction/ugc/widgets/triple_state.dart'; import 'package:PiliPlus/utils/app_scheme.dart'; import 'package:PiliPlus/utils/date_utils.dart'; @@ -327,13 +328,9 @@ class _UgcIntroPanelState extends TripleState { ), if (videoDetail.descV2?.isNotEmpty == true) ...[ const SizedBox(height: 8), - SelectableText.rich( + selectableRichText( style: const TextStyle(height: 1.4), - TextSpan( - children: [ - buildContent(theme, videoDetail), - ], - ), + buildContent(theme, videoDetail), ), ], Obx(() { @@ -601,7 +598,7 @@ class _UgcIntroPanelState extends TripleState { caseSensitive: false, ); - InlineSpan buildContent(ThemeData theme, VideoDetailData content) { + TextSpan buildContent(ThemeData theme, VideoDetailData content) { if (content.descV2.isNullOrEmpty) { return const TextSpan(); } diff --git a/lib/pages/video/introduction/ugc/widgets/selectable_text.dart b/lib/pages/video/introduction/ugc/widgets/selectable_text.dart new file mode 100644 index 00000000..be92da75 --- /dev/null +++ b/lib/pages/video/introduction/ugc/widgets/selectable_text.dart @@ -0,0 +1,38 @@ +import 'package:PiliPlus/utils/utils.dart'; +import 'package:flutter/material.dart'; + +Widget selectableText( + String text, { + TextStyle? style, +}) { + if (Utils.isDesktop) { + return SelectionArea( + child: Text( + style: style, + text, + ), + ); + } + return SelectableText( + style: style, + text, + ); +} + +Widget selectableRichText( + TextSpan textSpan, { + TextStyle? style, +}) { + if (Utils.isDesktop) { + return SelectionArea( + child: Text.rich( + style: style, + textSpan, + ), + ); + } + return SelectableText.rich( + style: style, + textSpan, + ); +} diff --git a/lib/pages/whisper_detail/view.dart b/lib/pages/whisper_detail/view.dart index b6688206..3df80ad2 100644 --- a/lib/pages/whisper_detail/view.dart +++ b/lib/pages/whisper_detail/view.dart @@ -44,6 +44,11 @@ class _WhisperDetailPageState Widget build(BuildContext context) { final ThemeData theme = Theme.of(context); final padding = MediaQuery.viewPaddingOf(context); + late final containerColor = ElevationOverlay.colorWithOverlay( + theme.colorScheme.surface, + theme.hoverColor, + 1, + ); return Scaffold( resizeToAvoidBottomInset: false, appBar: AppBar( @@ -145,8 +150,11 @@ class _WhisperDetailPageState ), ), if (_whisperDetailController.mid != null) ...[ - _buildInputView(theme), - buildPanelContainer(theme, theme.colorScheme.onInverseSurface), + _buildInputView(theme, containerColor), + buildPanelContainer( + theme, + containerColor, + ), ] else SizedBox(height: padding.bottom), ], @@ -228,11 +236,11 @@ class _WhisperDetailPageState ); } - Widget _buildInputView(ThemeData theme) { + Widget _buildInputView(ThemeData theme, Color containerColor) { return Container( padding: const EdgeInsets.symmetric(vertical: 8), decoration: BoxDecoration( - color: theme.colorScheme.onInverseSurface, + color: containerColor, borderRadius: const BorderRadius.vertical(top: Radius.circular(16)), ), child: Row(