diff --git a/ui/lib/tv_details.dart b/ui/lib/tv_details.dart index 7e05717..e912f3b 100644 --- a/ui/lib/tv_details.dart +++ b/ui/lib/tv_details.dart @@ -32,6 +32,7 @@ class _TvDetailsPageState extends ConsumerState { @override Widget build(BuildContext context) { + final screenWidth = MediaQuery.of(context).size.width; var seriesDetails = ref.watch(mediaDetailsProvider(widget.seriesId)); return seriesDetails.when( data: (details) { @@ -118,6 +119,41 @@ class _TvDetailsPageState extends ConsumerState { } 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), @@ -125,40 +161,12 @@ class _TvDetailsPageState extends ConsumerState { title: k == 0 ? const Text("特别篇") : Text("第 $k 季"), expandedCrossAxisAlignment: CrossAxisAlignment.stretch, children: [ - 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)), + screenWidth < 600 + ? SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: seasonEpisodes, ) - ], - )) - ], rows: m[k]!), + : seasonEpisodes ], ); list.add(seasonList); diff --git a/ui/lib/welcome_page.dart b/ui/lib/welcome_page.dart index fc8561b..f36ad54 100644 --- a/ui/lib/welcome_page.dart +++ b/ui/lib/welcome_page.dart @@ -52,10 +52,13 @@ class WelcomePage extends ConsumerWidget { class MediaCard extends StatelessWidget { final MediaDetail item; + static const double smallWidth = 110; + static const double largeWidth = 140; const MediaCard({super.key, required this.item}); @override Widget build(BuildContext context) { + return Card( shape: ContinuousRectangleBorder( borderRadius: BorderRadius.circular(10.0), @@ -75,8 +78,8 @@ class MediaCard extends StatelessWidget { child: Column( children: [ SizedBox( - width: 140, - height: 210, + width: cardWidth(context), + height: cardWidth(context) / 2 * 3, child: Ink.image( fit: BoxFit.cover, image: NetworkImage( @@ -84,7 +87,7 @@ class MediaCard extends StatelessWidget { )), ), SizedBox( - width: 140, + width: cardWidth(context), child: Column( children: [ LinearProgressIndicator( @@ -107,4 +110,12 @@ class MediaCard extends StatelessWidget { ), )); } + + double cardWidth(BuildContext context) { + final screenWidth = MediaQuery.of(context).size.width; + if (screenWidth < 600) { + return smallWidth; + } + return largeWidth; + } } diff --git a/ui/lib/widgets/utils.dart b/ui/lib/widgets/utils.dart index fed9871..9323b3b 100644 --- a/ui/lib/widgets/utils.dart +++ b/ui/lib/widgets/utils.dart @@ -3,6 +3,7 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:ui/providers/APIs.dart'; +import 'dart:io' show Platform; class Utils { static Future showAlertDialog(BuildContext context, String msg) async { @@ -31,18 +32,17 @@ class Utils { }, ); } - } - showSnakeBar(String msg) { - final context = APIs.navigatorKey.currentContext; - if (context != null) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(msg), - showCloseIcon: true, - )); - } +showSnakeBar(String msg) { + final context = APIs.navigatorKey.currentContext; + if (context != null) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(msg), + showCloseIcon: true, + )); } +} extension FileFormatter on num { String readableFileSize({bool base1024 = false}) { @@ -53,3 +53,8 @@ extension FileFormatter on num { return "${NumberFormat("#,##0.#").format(this / pow(base, digitGroups))} ${units[digitGroups]}"; } } + +bool isDesktop() { + return Platform.isLinux || Platform.isWindows || Platform.isMacOS; +} +