diff --git a/lib/models/setting.dart b/lib/models/setting.dart index 9d355b1..6a49845 100644 --- a/lib/models/setting.dart +++ b/lib/models/setting.dart @@ -3,11 +3,14 @@ import "package:flutter/material.dart"; class Setting { final String title; final String description; - final Widget Function(String title, String description) builder; + final IconData icon; + final Widget Function(String title, String description, IconData icon) + builder; Setting({ required this.title, required this.description, required this.builder, + required this.icon, }); } diff --git a/lib/pages/settings_page.dart b/lib/pages/settings_page.dart index 216bc0b..9f0e394 100644 --- a/lib/pages/settings_page.dart +++ b/lib/pages/settings_page.dart @@ -37,27 +37,31 @@ class SettingsPage extends ConsumerWidget { title: "Theme", description: "Toggle between Light Mode, Dark Mode, and System themes.", - builder: (title, description) => DialogListTile( - icon: Icon(Icons.contrast), - title: title, - subtitle: Text(description), - initialValue: settings.theme, - options: ThemeMode.values, - getName: (option) => toBeginningOfSentenceCase(option.name), - onChanged: (value) => ref - .watch(SettingsController.provider.notifier) - .set(settings.copyWith(theme: value)) - .onError(showError), - ), + icon: Icons.contrast, + builder: (title, description, icon) => + DialogListTile( + icon: Icon(icon), + title: title, + subtitle: Text(description), + initialValue: settings.theme, + options: ThemeMode.values, + getName: (option) => + toBeginningOfSentenceCase(option.name), + onChanged: (value) => ref + .watch(SettingsController.provider.notifier) + .set(settings.copyWith(theme: value)) + .onError(showError), + ), ), Setting( title: "Use Dynamic Theme", + icon: Icons.palette, description: "Toggle on or off Dynamic Theme. Only available on Android, Linux, Windows, or MacOS.", - builder: (title, description) => SwitchListTile( + builder: (title, description, icon) => SwitchListTile( title: Text(title), subtitle: Text(description), - secondary: Icon(Icons.palette), + secondary: Icon(icon), value: settings.useDynamicTheming, onChanged: (Platform.isAndroid || @@ -73,12 +77,13 @@ class SettingsPage extends ConsumerWidget { ), Setting( title: "Use System Font", + icon: Icons.abc, description: "Use the system's sans and emoji fonts, instead of Flutter's bundled fonts. Turn this off if you are having issues rendering emoji.", - builder: (title, description) => SwitchListTile( + builder: (title, description, icon) => SwitchListTile( title: Text(title), subtitle: Text(description), - secondary: Icon(Icons.abc), + secondary: Icon(icon), value: settings.useSystemFont, onChanged: (value) => ref .watch(SettingsController.provider.notifier) @@ -98,8 +103,40 @@ class SettingsPage extends ConsumerWidget { final searchBar = SearchAnchor.bar( barHintText: "Search...", suggestionsBuilder: (context, controller) { - // TODO - return []; + final categories = buildCategories(Settings()); + final query = controller.text.toLowerCase(); + + final matches = categories.values + .expand((categoryList) => categoryList.asMap().entries) + .expand( + (categoryEntry) => categoryEntry.value.settings + .asMap() + .entries + .where( + (settingEntry) => + settingEntry.value.title.toLowerCase().contains( + query, + ) || + settingEntry.value.description + .toLowerCase() + .contains(query), + ) + .map( + (settingEntry) => ( + (categoryEntry.key, settingEntry.key), + settingEntry.value, + ), + ), + ) + .toIList(); + + return matches.map( + (match) => ListTile( + leading: Icon(match.$2.icon), + title: Text(match.$2.title), + subtitle: Text(match.$2.description), + ), + ); }, ); @@ -164,6 +201,7 @@ class SettingsPage extends ConsumerWidget { child: setting.builder( setting.title, setting.description, + setting.icon, ), ), ) @@ -223,6 +261,7 @@ class SettingsPage extends ConsumerWidget { child: setting.builder( setting.title, setting.description, + setting.icon, ), ), )