303 lines
13 KiB
Dart
303 lines
13 KiB
Dart
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> sourcePreference;
|
|
final Source source;
|
|
const SourcePreferenceWidget(
|
|
{super.key, required this.sourcePreference, required this.source});
|
|
|
|
@override
|
|
State<SourcePreferenceWidget> createState() => _SourcePreferenceWidgetState();
|
|
}
|
|
|
|
class _SourcePreferenceWidgetState extends State<SourcePreferenceWidget> {
|
|
@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: 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<String> 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<EditTextDialogWidget> createState() => _EditTextDialogWidgetState();
|
|
}
|
|
|
|
class _EditTextDialogWidgetState extends State<EditTextDialogWidget> {
|
|
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)),
|
|
],
|
|
)
|
|
],
|
|
);
|
|
}
|
|
}
|