import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/dialogs/aves_selection_dialog.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class SettingsSubPageTile extends StatelessWidget { final String title, routeName; final WidgetBuilder builder; const SettingsSubPageTile({ super.key, required this.title, required this.routeName, required this.builder, }); @override Widget build(BuildContext context) { return ListTile( title: Text(title), onTap: () { Navigator.push( context, MaterialPageRoute( settings: RouteSettings(name: routeName), builder: builder, ), ); }, ); } } class SettingsSwitchListTile extends StatelessWidget { final bool Function(BuildContext, Settings) selector; final ValueChanged onChanged; final String title; final String? subtitle; final Widget? trailing; const SettingsSwitchListTile({ super.key, required this.selector, required this.onChanged, required this.title, this.subtitle, this.trailing, }); @override Widget build(BuildContext context) { return Selector( selector: selector, builder: (context, current, child) { Widget titleWidget = Text(title); if (trailing != null) { titleWidget = Row( children: [ Expanded(child: titleWidget), AnimatedOpacity( opacity: current ? 1 : .2, duration: Durations.toggleableTransitionAnimation, child: trailing, ), ], ); } return SwitchListTile( value: current, onChanged: onChanged, title: titleWidget, subtitle: subtitle != null ? Text(subtitle!) : null, ); }, ); } } class SettingsSelectionListTile extends StatelessWidget { final List values; final String Function(BuildContext, T) getName; final T Function(BuildContext, Settings) selector; final ValueChanged onSelection; final String tileTitle, dialogTitle; final TextBuilder? optionSubtitleBuilder; const SettingsSelectionListTile({ super.key, required this.values, required this.getName, required this.selector, required this.onSelection, required this.tileTitle, required this.dialogTitle, this.optionSubtitleBuilder, }); @override Widget build(BuildContext context) { return Selector( selector: selector, builder: (context, current, child) => ListTile( title: Text(tileTitle), subtitle: Text(getName(context, current)), onTap: () => showSelectionDialog( context: context, builder: (context) => AvesSelectionDialog( initialValue: current, options: Map.fromEntries(values.map((v) => MapEntry(v, getName(context, v)))), optionSubtitleBuilder: optionSubtitleBuilder, title: dialogTitle, ), onSelection: onSelection, ), ), ); } }