diff --git a/ui/lib/movie_watchlist.dart b/ui/lib/movie_watchlist.dart index b1fc841..de29928 100644 --- a/ui/lib/movie_watchlist.dart +++ b/ui/lib/movie_watchlist.dart @@ -28,21 +28,22 @@ class _MovieDetailsPageState extends ConsumerState { Widget build(BuildContext context) { var seriesDetails = ref.watch(mediaDetailsProvider(widget.id)); - return seriesDetails.when( - data: (details) { - return ListView( - children: [ - DetailCard(details: details), - NestedTabBar( - id: widget.id, - ) - ], - ); - }, - error: (err, trace) { - return Text("$err"); - }, - loading: () => const MyProgressIndicator()); + return SelectionArea( + child: seriesDetails.when( + data: (details) { + return ListView( + children: [ + DetailCard(details: details), + NestedTabBar( + id: widget.id, + ) + ], + ); + }, + error: (err, trace) { + return Text("$err"); + }, + loading: () => const MyProgressIndicator())); } } diff --git a/ui/lib/settings/settings.dart b/ui/lib/settings/settings.dart index 8da8662..078d903 100644 --- a/ui/lib/settings/settings.dart +++ b/ui/lib/settings/settings.dart @@ -22,7 +22,8 @@ class SystemSettingsPage extends ConsumerStatefulWidget { class _SystemSettingsPageState extends ConsumerState { @override Widget build(BuildContext context) { - return ListView( + return SelectionArea( + child: ListView( children: [ getExpansionTile("常规", const GeneralSettings()), getExpansionTile("索引器", const IndexerSettings()), @@ -33,7 +34,7 @@ class _SystemSettingsPageState extends ConsumerState { getExpansionTile("监控列表", const Importlist()), getExpansionTile("认证", const AuthSettings()) ], - ); + )); } Widget getExpansionTile(String name, Widget body) { diff --git a/ui/lib/system_page.dart b/ui/lib/system_page.dart index d0a12e8..2389eb2 100644 --- a/ui/lib/system_page.dart +++ b/ui/lib/system_page.dart @@ -23,7 +23,8 @@ class _SystemPageState extends ConsumerState { Widget build(BuildContext context) { final logs = ref.watch(logFileDataProvider); final about = ref.watch(aboutDataProvider); - return SingleChildScrollView( + return SelectionArea( + child: SingleChildScrollView( child: Column( children: [ ExpansionTile( @@ -190,6 +191,6 @@ class _SystemPageState extends ConsumerState { ) ], ), - ); + )); } } diff --git a/ui/lib/tv_details.dart b/ui/lib/tv_details.dart index e912f3b..f5695fd 100644 --- a/ui/lib/tv_details.dart +++ b/ui/lib/tv_details.dart @@ -34,156 +34,159 @@ class _TvDetailsPageState extends ConsumerState { Widget build(BuildContext context) { final screenWidth = MediaQuery.of(context).size.width; var seriesDetails = ref.watch(mediaDetailsProvider(widget.seriesId)); - return seriesDetails.when( - data: (details) { - Map> m = {}; - for (final ep in details.episodes!) { - var row = DataRow(cells: [ - DataCell(Text("${ep.episodeNumber}")), - DataCell(Text("${ep.title}")), - DataCell(Opacity( - opacity: 0.5, - child: Text(ep.airDate ?? "-"), - )), - DataCell( - Opacity( - opacity: 0.7, - child: ep.status == "downloading" - ? const IconButton( - tooltip: "下载中", - onPressed: null, - icon: Icon(Icons.downloading)) - : (ep.status == "downloaded" + return SelectionArea( + child: seriesDetails.when( + data: (details) { + Map> m = {}; + for (final ep in details.episodes!) { + var row = DataRow(cells: [ + DataCell(Text("${ep.episodeNumber}")), + DataCell(Text("${ep.title}")), + DataCell(Opacity( + opacity: 0.5, + child: Text(ep.airDate ?? "-"), + )), + DataCell( + Opacity( + opacity: 0.7, + child: ep.status == "downloading" ? const IconButton( - tooltip: "已下载", + tooltip: "下载中", onPressed: null, - icon: Icon(Icons.download_done)) - : (ep.monitored == true - ? IconButton( - tooltip: "监控中", - onPressed: () { - ref - .read(mediaDetailsProvider( - widget.seriesId) - .notifier) - .changeMonitoringStatus( - ep.id!, false); - }, - icon: const Icon(Icons.alarm)) - : Opacity( - opacity: 0.7, - child: IconButton( - tooltip: "未监控", + icon: Icon(Icons.downloading)) + : (ep.status == "downloaded" + ? const IconButton( + tooltip: "已下载", + onPressed: null, + icon: Icon(Icons.download_done)) + : (ep.monitored == true + ? IconButton( + tooltip: "监控中", onPressed: () { ref .read(mediaDetailsProvider( widget.seriesId) .notifier) .changeMonitoringStatus( - ep.id!, true); + ep.id!, false); }, - icon: const Icon(Icons.alarm_off)), - )))), - ), - DataCell(Row( - children: [ - LoadingIconButton( - tooltip: "搜索下载对应剧集", - onPressed: () async { - await ref - .read( - mediaDetailsProvider(widget.seriesId).notifier) - .searchAndDownload(widget.seriesId, - ep.seasonNumber!, ep.episodeNumber!) - .then((v) => showSnakeBar("开始下载: $v")); - }, - icon: Icons.download), - const SizedBox( - width: 10, + icon: const Icon(Icons.alarm)) + : Opacity( + opacity: 0.7, + child: IconButton( + tooltip: "未监控", + onPressed: () { + ref + .read(mediaDetailsProvider( + widget.seriesId) + .notifier) + .changeMonitoringStatus( + ep.id!, true); + }, + icon: const Icon(Icons.alarm_off)), + )))), ), - Tooltip( - message: "查看可用资源", - child: IconButton( - onPressed: () => showAvailableTorrents(widget.seriesId, - ep.seasonNumber ?? 0, ep.episodeNumber ?? 0), - icon: const Icon(Icons.manage_search)), - ) - ], - )) - ]); - - if (m[ep.seasonNumber] == null) { - m[ep.seasonNumber!] = List.empty(growable: true); - } - m[ep.seasonNumber!]!.add(row); - } - List list = List.empty(growable: true); - for (final k in m.keys.toList().reversed) { - final seasonEpisodes = DataTable(columns: [ - const DataColumn(label: Text("#")), - const DataColumn( - label: Text("标题"), - ), - const DataColumn(label: Text("播出时间")), - const DataColumn(label: Text("状态")), - DataColumn( - label: Row( - children: [ - LoadingIconButton( - tooltip: "搜索下载全部剧集", - onPressed: () async { - await ref - .read( - mediaDetailsProvider(widget.seriesId).notifier) - .searchAndDownload(widget.seriesId, k, 0) - .then((v) => showSnakeBar("开始下载: $v")); - //showLoadingWithFuture(f); - }, - icon: Icons.download), - const SizedBox( - width: 10, - ), - Tooltip( - message: "查看可用资源", - child: IconButton( - onPressed: () => - showAvailableTorrents(widget.seriesId, k, 0), - icon: const Icon(Icons.manage_search)), - ) - ], - )) - ], rows: m[k]!); - - var seasonList = ExpansionTile( - tilePadding: const EdgeInsets.fromLTRB(10, 0, 10, 0), - //childrenPadding: const EdgeInsets.fromLTRB(50, 0, 50, 0), - initiallyExpanded: false, - title: k == 0 ? const Text("特别篇") : Text("第 $k 季"), - expandedCrossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - screenWidth < 600 - ? SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: seasonEpisodes, + DataCell(Row( + children: [ + LoadingIconButton( + tooltip: "搜索下载对应剧集", + onPressed: () async { + await ref + .read(mediaDetailsProvider(widget.seriesId) + .notifier) + .searchAndDownload(widget.seriesId, + ep.seasonNumber!, ep.episodeNumber!) + .then((v) => showSnakeBar("开始下载: $v")); + }, + icon: Icons.download), + const SizedBox( + width: 10, + ), + Tooltip( + message: "查看可用资源", + child: IconButton( + onPressed: () => showAvailableTorrents( + widget.seriesId, + ep.seasonNumber ?? 0, + ep.episodeNumber ?? 0), + icon: const Icon(Icons.manage_search)), ) - : seasonEpisodes - ], - ); - list.add(seasonList); - } - return ListView( - children: [ - DetailCard(details: details), - Column( - children: list, - ), - ], - ); - }, - error: (err, trace) { - return Text("$err"); - }, - loading: () => const MyProgressIndicator()); + ], + )) + ]); + + if (m[ep.seasonNumber] == null) { + m[ep.seasonNumber!] = List.empty(growable: true); + } + m[ep.seasonNumber!]!.add(row); + } + List list = List.empty(growable: true); + for (final k in m.keys.toList().reversed) { + final seasonEpisodes = DataTable(columns: [ + const DataColumn(label: Text("#")), + const DataColumn( + label: Text("标题"), + ), + const DataColumn(label: Text("播出时间")), + const DataColumn(label: Text("状态")), + DataColumn( + label: Row( + children: [ + LoadingIconButton( + tooltip: "搜索下载全部剧集", + onPressed: () async { + await ref + .read(mediaDetailsProvider(widget.seriesId) + .notifier) + .searchAndDownload(widget.seriesId, k, 0) + .then((v) => showSnakeBar("开始下载: $v")); + //showLoadingWithFuture(f); + }, + icon: Icons.download), + const SizedBox( + width: 10, + ), + Tooltip( + message: "查看可用资源", + child: IconButton( + onPressed: () => + showAvailableTorrents(widget.seriesId, k, 0), + icon: const Icon(Icons.manage_search)), + ) + ], + )) + ], rows: m[k]!); + + var seasonList = ExpansionTile( + tilePadding: const EdgeInsets.fromLTRB(10, 0, 10, 0), + //childrenPadding: const EdgeInsets.fromLTRB(50, 0, 50, 0), + initiallyExpanded: false, + title: k == 0 ? const Text("特别篇") : Text("第 $k 季"), + expandedCrossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + screenWidth < 600 + ? SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: seasonEpisodes, + ) + : seasonEpisodes + ], + ); + list.add(seasonList); + } + return ListView( + children: [ + DetailCard(details: details), + Column( + children: list, + ), + ], + ); + }, + error: (err, trace) { + return Text("$err"); + }, + loading: () => const MyProgressIndicator())); } Future showAvailableTorrents(String id, int season, int episode) { diff --git a/ui/lib/welcome_page.dart b/ui/lib/welcome_page.dart index e538423..4f110bd 100644 --- a/ui/lib/welcome_page.dart +++ b/ui/lib/welcome_page.dart @@ -38,24 +38,26 @@ class WelcomePageState extends ConsumerState { data = ref.watch(tvWatchlistDataProvider); } - return Stack( - //alignment: Alignment.bottomRight, - children: [ - () { - return switch (data) { - AsyncData(:final value) => SingleChildScrollView( - child: Wrap( - alignment: WrapAlignment.start, - spacing: isSmallScreen(context) ? 0 : 10, - runSpacing: isSmallScreen(context) ? 10 : 20, - children: getMediaAll(value), + return SelectionArea( + child: Stack( + //alignment: Alignment.bottomRight, + children: [ + () { + return switch (data) { + AsyncData(:final value) => SingleChildScrollView( + child: Wrap( + alignment: WrapAlignment.start, + spacing: isSmallScreen(context) ? 0 : 10, + runSpacing: isSmallScreen(context) ? 10 : 20, + children: getMediaAll(value), + ), ), - ), - _ => const MyProgressIndicator(), - }; - }(), - getMoreButtonAndActions(uri) - ], + _ => const MyProgressIndicator(), + }; + }(), + getMoreButtonAndActions(uri) + ], + ), ); }