ui: add filter option

This commit is contained in:
Simon Ding
2024-11-01 18:14:32 +08:00
parent bc50dd888a
commit 2da02fa706

View File

@@ -7,53 +7,134 @@ import 'package:ui/providers/welcome_data.dart';
import 'package:ui/tv_details.dart'; import 'package:ui/tv_details.dart';
import 'package:ui/widgets/progress_indicator.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 routeTv = "/series";
static const routeMoivie = "/movies"; static const routeMoivie = "/movies";
const WelcomePage({super.key}); @override
ConsumerState<ConsumerStatefulWidget> createState() {
return WelcomePageState();
}
}
class WelcomePageState extends ConsumerState<WelcomePage> {
//WelcomePageState({super.key});
bool onlyShowUnfinished = false;
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context) {
var uri = GoRouterState.of(context).uri.toString(); var uri = GoRouterState.of(context).uri.toString();
AsyncValue<List<MediaDetail>> data; AsyncValue<List<MediaDetail>> data;
if (uri == routeMoivie) { if (uri == WelcomePage.routeMoivie) {
data = ref.watch(movieWatchlistDataProvider); data = ref.watch(movieWatchlistDataProvider);
} else { } else {
data = ref.watch(tvWatchlistDataProvider); data = ref.watch(tvWatchlistDataProvider);
} }
return switch (data) { return Stack(
AsyncData(:final value) => SingleChildScrollView( //alignment: Alignment.bottomRight,
child: Wrap( children: [
alignment: WrapAlignment.start, () {
spacing: isSmallScreen(context) ? 0 : 10, return switch (data) {
runSpacing: isSmallScreen(context) ? 10 : 20, AsyncData(:final value) => SingleChildScrollView(
children: value.isEmpty child: Wrap(
? [ alignment: WrapAlignment.start,
Container( spacing: isSmallScreen(context) ? 0 : 10,
height: MediaQuery.of(context).size.height * 0.6, runSpacing: isSmallScreen(context) ? 10 : 20,
alignment: Alignment.center, children: getMediaAll(value),
child: const Text( ),
"啥都没有...", ),
style: TextStyle(fontSize: 16), _ => const MyProgressIndicator(),
)) };
] }(),
: List.generate(value.length, (i) { Row(
final item = value[i]; children: [
return MediaCard(item: item); 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) { bool isSmallScreen(BuildContext context) {
final screenWidth = MediaQuery.of(context).size.width; final screenWidth = MediaQuery.of(context).size.width;
return screenWidth < 600; return screenWidth < 600;
} }
List<Widget> getMediaAll(List<MediaDetail> 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 { class MediaCard extends StatelessWidget {