import 'package:flutter/material.dart'; import 'package:mangayomi/eval/model/source_preference.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/modules/browse/extension/providers/extension_preferences_providers.dart'; import 'package:mangayomi/modules/manga/detail/widgets/chapter_filter_list_tile_widget.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; import 'package:super_sliver_list/super_sliver_list.dart'; class SourcePreferenceWidget extends StatefulWidget { final List sourcePreference; final Source source; const SourcePreferenceWidget({ super.key, required this.sourcePreference, required this.source, }); @override State createState() => _SourcePreferenceWidgetState(); } class _SourcePreferenceWidgetState extends State { @override Widget build(BuildContext context) { return Column( children: [ for (var index = 0; index < widget.sourcePreference.length; index++) Builder( builder: (context) { final preference = widget.sourcePreference[index]; Widget? w; if (preference.editTextPreference != null) { final pref = preference.editTextPreference!; w = ListTile( title: Text(pref.title!), subtitle: Text( pref.summary!, style: TextStyle( fontSize: 11, color: context.secondaryColor, ), ), onTap: () { showDialog( context: context, builder: (context) => EditTextDialogWidget( text: pref.value ?? "", onChanged: (value) { setState(() { pref.value = value; }); setPreferenceSetting(preference, widget.source); }, dialogTitle: pref.dialogTitle ?? "", dialogMessage: pref.dialogMessage ?? "", ), ); }, ); } else if (preference.checkBoxPreference != null) { final pref = preference.checkBoxPreference!; w = CheckboxListTile( title: Text(pref.title!), subtitle: Text( pref.summary!, style: TextStyle( fontSize: 11, color: context.secondaryColor, ), ), value: pref.value, onChanged: (value) { setState(() { pref.value = value; }); setPreferenceSetting(preference, widget.source); }, controlAffinity: ListTileControlAffinity.trailing, ); } else if (preference.switchPreferenceCompat != null) { final pref = preference.switchPreferenceCompat!; w = SwitchListTile( title: Text(pref.title!), subtitle: Text( pref.summary!, style: TextStyle( fontSize: 11, color: context.secondaryColor, ), ), value: pref.value!, onChanged: (value) { setState(() { pref.value = value; }); setPreferenceSetting(preference, widget.source); }, controlAffinity: ListTileControlAffinity.trailing, ); } else if (preference.listPreference != null) { final pref = preference.listPreference!; w = ListTile( title: Text(pref.title!), subtitle: Text( pref.entries![pref.valueIndex!], style: TextStyle( fontSize: 11, color: context.secondaryColor, ), ), onTap: () async { final res = await showDialog( context: context, builder: (context) => AlertDialog( title: Text.rich( TextSpan( children: [ TextSpan(text: pref.title!), if (pref.summary?.isNotEmpty ?? false) TextSpan( text: "\n\n${pref.summary!}", style: TextStyle(fontSize: 13), ), ], ), ), content: SizedBox( width: context.width(0.8), child: RadioGroup( groupValue: pref.valueIndex, onChanged: (value) { Navigator.pop(context, value); }, child: SuperListView.builder( shrinkWrap: true, itemCount: pref.entries!.length, itemBuilder: (context, index) { return RadioListTile( dense: true, contentPadding: const EdgeInsets.all(0), value: index, title: Row( children: [Text(pref.entries![index])], ), ); }, ), ), ), actions: [ Row( mainAxisAlignment: MainAxisAlignment.end, children: [ TextButton( onPressed: () async { Navigator.pop(context); }, child: Text( context.l10n.cancel, style: TextStyle(color: context.primaryColor), ), ), ], ), ], ), ); if (res != null) { setState(() { pref.valueIndex = res; }); } setPreferenceSetting(preference, widget.source); }, ); } else if (preference.multiSelectListPreference != null) { final pref = preference.multiSelectListPreference!; w = ListTile( title: Text(pref.title!), subtitle: Text( pref.summary!, style: TextStyle( fontSize: 11, color: context.secondaryColor, ), ), onTap: () { List indexList = []; indexList.addAll(pref.values!); showDialog( context: context, builder: (context) { return StatefulBuilder( builder: (context, setState) { return AlertDialog( title: Text(pref.title!), content: SizedBox( width: context.width(0.8), child: SuperListView.builder( shrinkWrap: true, itemCount: pref.entries!.length, itemBuilder: (context, index) { return ListTileChapterFilter( label: pref.entries![index], type: indexList.contains( pref.entryValues![index], ) ? 1 : 0, onTap: () { if (indexList.contains( pref.entryValues![index], )) { setState(() { indexList.remove( pref.entryValues![index], ); pref.values = indexList; }); } else { setState(() { indexList.add( pref.entryValues![index], ); pref.values = indexList; }); } setPreferenceSetting( preference, widget.source, ); }, ); }, ), ), actions: [ Row( mainAxisAlignment: MainAxisAlignment.end, children: [ TextButton( onPressed: () async { Navigator.pop(context); }, child: Text( context.l10n.cancel, style: TextStyle( color: context.primaryColor, ), ), ), TextButton( onPressed: () async { Navigator.pop(context); }, child: Text( context.l10n.ok, style: TextStyle( color: context.primaryColor, ), ), ), ], ), ], ); }, ); }, ); }, ); } return w ?? Container(); }, ), ], ); } } class EditTextDialogWidget extends StatefulWidget { final String text; final String dialogTitle; final String dialogMessage; final Function(String) onChanged; const EditTextDialogWidget({ super.key, required this.text, required this.onChanged, required this.dialogTitle, required this.dialogMessage, }); @override State createState() => _EditTextDialogWidgetState(); } class _EditTextDialogWidgetState extends State { late final _controller = TextEditingController(text: widget.text); @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return AlertDialog( title: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(widget.dialogTitle), Text(widget.dialogMessage, style: const TextStyle(fontSize: 13)), ], ), content: Padding( padding: const EdgeInsets.only(top: 20), child: Padding( padding: const EdgeInsets.all(8.0), child: TextField( controller: _controller, decoration: InputDecoration( isDense: true, filled: false, enabledBorder: OutlineInputBorder( borderSide: BorderSide(color: context.secondaryColor), ), focusedBorder: OutlineInputBorder( borderSide: BorderSide(color: context.primaryColor), ), border: const OutlineInputBorder(borderSide: BorderSide()), ), ), ), ), actions: [ Row( mainAxisAlignment: MainAxisAlignment.end, children: [ TextButton( onPressed: () { Navigator.pop(context); }, child: Text(context.l10n.cancel), ), const SizedBox(width: 15), TextButton( onPressed: () { widget.onChanged(_controller.text); Navigator.pop(context); }, child: Text(context.l10n.ok), ), ], ), ], ); } }