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'; 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(pref.title!), content: SizedBox( width: context.width(0.8), child: ListView.builder( shrinkWrap: true, itemCount: pref.entries!.length, itemBuilder: (context, index) { return RadioListTile( dense: true, contentPadding: const EdgeInsets.all(0), value: index, groupValue: pref.valueIndex, onChanged: (value) { Navigator.pop(context, 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: ListView.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 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)), ], ) ], ); } }