From 2da02fa7062f996c932f05b2cf31ac0ca86edef3 Mon Sep 17 00:00:00 2001 From: Simon Ding Date: Fri, 1 Nov 2024 18:14:32 +0800 Subject: [PATCH] ui: add filter option --- ui/lib/welcome_page.dart | 135 +++++++++++++++++++++++++++++++-------- 1 file changed, 108 insertions(+), 27 deletions(-) diff --git a/ui/lib/welcome_page.dart b/ui/lib/welcome_page.dart index ebc56ab..2bb3a29 100644 --- a/ui/lib/welcome_page.dart +++ b/ui/lib/welcome_page.dart @@ -7,53 +7,134 @@ import 'package:ui/providers/welcome_data.dart'; import 'package:ui/tv_details.dart'; import 'package:ui/widgets/progress_indicator.dart'; -class WelcomePage extends ConsumerWidget { +class WelcomePage extends ConsumerStatefulWidget { + const WelcomePage({super.key}); static const routeTv = "/series"; static const routeMoivie = "/movies"; - const WelcomePage({super.key}); + @override + ConsumerState createState() { + return WelcomePageState(); + } +} + +class WelcomePageState extends ConsumerState { + //WelcomePageState({super.key}); + + bool onlyShowUnfinished = false; @override - Widget build(BuildContext context, WidgetRef ref) { + Widget build(BuildContext context) { var uri = GoRouterState.of(context).uri.toString(); AsyncValue> data; - if (uri == routeMoivie) { + if (uri == WelcomePage.routeMoivie) { data = ref.watch(movieWatchlistDataProvider); } else { data = ref.watch(tvWatchlistDataProvider); } - return switch (data) { - AsyncData(:final value) => SingleChildScrollView( - child: Wrap( - alignment: WrapAlignment.start, - spacing: isSmallScreen(context) ? 0 : 10, - runSpacing: isSmallScreen(context) ? 10 : 20, - children: value.isEmpty - ? [ - Container( - height: MediaQuery.of(context).size.height * 0.6, - alignment: Alignment.center, - child: const Text( - "啥都没有...", - style: TextStyle(fontSize: 16), - )) - ] - : List.generate(value.length, (i) { - final item = value[i]; - return MediaCard(item: item); - }), - ), + 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), + ), + ), + _ => const MyProgressIndicator(), + }; + }(), + Row( + children: [ + Expanded(child: Container()), + Column( + children: [ + Expanded(child: Container()), + Padding( + padding: EdgeInsets.all(20), + child: MenuAnchor( + style: MenuStyle( + //minimumSize: WidgetStatePropertyAll(Size(400, 300)), + + backgroundColor: WidgetStatePropertyAll(Theme.of(context) + .colorScheme + .inversePrimary + .withOpacity(0.9)), + ), + menuChildren: [ + MenuItemButton( + onPressed: null, + child: CheckboxListTile( + value: onlyShowUnfinished, + onChanged: (b) { + setState(() { + onlyShowUnfinished = b!; + }); + }, + title: const Text( + "未完成", + style: TextStyle(fontSize: 16), + softWrap: false, + ), + controlAffinity: ListTileControlAffinity.leading, + ), + ), + ], + builder: (context, controller, child) { + return Opacity( + opacity: 0.7, + child: FloatingActionButton( + onPressed: () { + if (controller.isOpen) { + controller.close(); + } else { + controller.open(); + } + }, + child: const Icon(Icons.more_horiz), + )); + }, + ), + ), + ], + ) + ], ), - _ => const MyProgressIndicator(), - }; + ], + ); } bool isSmallScreen(BuildContext context) { final screenWidth = MediaQuery.of(context).size.width; return screenWidth < 600; } + + List getMediaAll(List list) { + if (list.isEmpty) { + return [ + Container( + height: MediaQuery.of(context).size.height * 0.6, + alignment: Alignment.center, + child: const Text( + "啥都没有...", + style: TextStyle(fontSize: 16), + )) + ]; + } + if (onlyShowUnfinished) { + list = list.where((v) => v.downloadedNum != v.monitoredNum).toList(); + } + return List.generate(list.length, (i) { + final item = list[i]; + return MediaCard(item: item); + }); + } } class MediaCard extends StatelessWidget {