From 94eb3632458a464f54cf982a4a8184cb3a8a5b4e Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Fri, 3 Jan 2025 19:30:01 -0500 Subject: [PATCH] SelectButton --- lib/helpers/extension_helper.dart | 5 +++++ lib/models/search_type.dart | 8 ++++++++ lib/screens/tabs/search.dart | 18 ++++++++--------- lib/widgets/select_button.dart | 32 +++++++++++++++++++++++++++++++ 4 files changed, 53 insertions(+), 10 deletions(-) create mode 100644 lib/models/search_type.dart create mode 100644 lib/widgets/select_button.dart diff --git a/lib/helpers/extension_helper.dart b/lib/helpers/extension_helper.dart index 8e22c35..4e0906f 100644 --- a/lib/helpers/extension_helper.dart +++ b/lib/helpers/extension_helper.dart @@ -15,3 +15,8 @@ extension BetterWhen on AsyncValue { skipLoadingOnRefresh: false, ); } + +extension Capitalize on String { + String toCapitalized() => + length > 0 ? "${this[0].toUpperCase()}${substring(1).toLowerCase()}" : ""; +} diff --git a/lib/models/search_type.dart b/lib/models/search_type.dart new file mode 100644 index 0000000..fa60af8 --- /dev/null +++ b/lib/models/search_type.dart @@ -0,0 +1,8 @@ +enum SearchType { + any, + songs, + videos, + artists, + albums, + playlists, +} diff --git a/lib/screens/tabs/search.dart b/lib/screens/tabs/search.dart index c352691..e206364 100644 --- a/lib/screens/tabs/search.dart +++ b/lib/screens/tabs/search.dart @@ -1,8 +1,10 @@ +import 'package:canal/models/search_type.dart'; +import 'package:canal/widgets/select_button.dart'; import 'package:flutter/material.dart'; import 'package:canal/models/tab.dart'; -import 'package:yaru/yaru.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; -class SearchTab extends StatelessWidget implements TabPage { +class SearchTab extends HookWidget implements TabPage { const SearchTab({super.key}); @override @@ -13,15 +15,11 @@ class SearchTab extends StatelessWidget implements TabPage { @override Widget build(BuildContext context) => ListView( - padding: EdgeInsets.symmetric(horizontal: 8, vertical: 4), + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 4), children: [ - SegmentedButton( - segments: [ - ButtonSegment(value: 0, label: Text("Foo")), - ButtonSegment(value: 1, label: Text("Bar")), - ButtonSegment(value: 2, label: Text("Foobar")) - ], - selected: {0}, + SelectButton( + values: SearchType.values, + defaultValue: SearchType.any, ) ], ); diff --git a/lib/widgets/select_button.dart b/lib/widgets/select_button.dart new file mode 100644 index 0000000..32bfb98 --- /dev/null +++ b/lib/widgets/select_button.dart @@ -0,0 +1,32 @@ +import 'package:canal/helpers/extension_helper.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; + +class SelectButton extends HookWidget { + final T defaultValue; + final List values; + const SelectButton({ + required this.defaultValue, + required this.values, + super.key, + }); + + @override + Widget build(BuildContext context) { + final selected = useState(defaultValue); + final oldValue = useState({}); + return SegmentedButton( + segments: values + .map((value) => ButtonSegment( + value: value, + label: Text(value.name.toCapitalized()), + )) + .toList(), + onSelectionChanged: (newValue) { + selected.value = newValue.difference(oldValue.value).first; + oldValue.value = newValue; + }, + selected: {selected.value}, + ); + } +}