Files
venera/lib/pages/settings/reader.dart

276 lines
8.9 KiB
Dart

part of 'settings_page.dart';
class ReaderSettings extends StatefulWidget {
const ReaderSettings({super.key, this.onChanged});
final void Function(String key)? onChanged;
@override
State<ReaderSettings> createState() => _ReaderSettingsState();
}
class _ReaderSettingsState extends State<ReaderSettings> {
@override
Widget build(BuildContext context) {
return SmoothCustomScrollView(
slivers: [
SliverAppbar(title: Text("Reading".tl)),
_SwitchSetting(
title: "Tap to turn Pages".tl,
settingKey: "enableTapToTurnPages",
onChanged: () {
widget.onChanged?.call("enableTapToTurnPages");
},
).toSliver(),
_SwitchSetting(
title: "Reverse tap to turn Pages".tl,
settingKey: "reverseTapToTurnPages",
onChanged: () {
widget.onChanged?.call("reverseTapToTurnPages");
},
).toSliver(),
_SwitchSetting(
title: "Page animation".tl,
settingKey: "enablePageAnimation",
onChanged: () {
widget.onChanged?.call("enablePageAnimation");
},
).toSliver(),
SelectSetting(
title: "Reading mode".tl,
settingKey: "readerMode",
optionTranslation: {
"galleryLeftToRight": "Gallery (Left to Right)".tl,
"galleryRightToLeft": "Gallery (Right to Left)".tl,
"galleryTopToBottom": "Gallery (Top to Bottom)".tl,
"continuousLeftToRight": "Continuous (Left to Right)".tl,
"continuousRightToLeft": "Continuous (Right to Left)".tl,
"continuousTopToBottom": "Continuous (Top to Bottom)".tl,
},
onChanged: () {
setState(() {});
var readerMode = appdata.settings['readerMode'];
if (readerMode?.toLowerCase().startsWith('continuous') ?? false) {
appdata.settings['readerScreenPicNumberForLandscape'] = 1;
widget.onChanged?.call('readerScreenPicNumberForLandscape');
appdata.settings['readerScreenPicNumberForPortrait'] = 1;
widget.onChanged?.call('readerScreenPicNumberForPortrait');
}
widget.onChanged?.call("readerMode");
},
).toSliver(),
_SliderSetting(
title: "Auto page turning interval".tl,
settingsIndex: "autoPageTurningInterval",
interval: 1,
min: 1,
max: 20,
onChanged: () {
setState(() {});
widget.onChanged?.call("autoPageTurningInterval");
},
).toSliver(),
SliverAnimatedVisibility(
visible: appdata.settings['readerMode']!.startsWith('gallery'),
child: _SliderSetting(
title:
"The number of pic in screen for landscape (Only Gallery Mode)"
.tl,
settingsIndex: "readerScreenPicNumberForLandscape",
interval: 1,
min: 1,
max: 5,
onChanged: () {
setState(() {});
widget.onChanged?.call("readerScreenPicNumberForLandscape");
},
),
),
SliverAnimatedVisibility(
visible: appdata.settings['readerMode']!.startsWith('gallery'),
child: _SliderSetting(
title:
"The number of pic in screen for portrait (Only Gallery Mode)"
.tl,
settingsIndex: "readerScreenPicNumberForPortrait",
interval: 1,
min: 1,
max: 5,
onChanged: () {
widget.onChanged?.call("readerScreenPicNumberForPortrait");
},
),
),
SliverAnimatedVisibility(
visible: appdata.settings['readerMode']!.startsWith('gallery') &&
(appdata.settings['readerScreenPicNumberForLandscape'] > 1 ||
appdata.settings['readerScreenPicNumberForPortrait'] > 1),
child: _SwitchSetting(
title: "Show single image on first page".tl,
settingKey: "showSingleImageOnFirstPage",
onChanged: () {
widget.onChanged?.call("showSingleImageOnFirstPage");
},
),
),
_SwitchSetting(
title: 'Double tap to zoom'.tl,
settingKey: 'enableDoubleTapToZoom',
onChanged: () {
setState(() {});
widget.onChanged?.call('enableDoubleTapToZoom');
},
).toSliver(),
_SwitchSetting(
title: 'Long press to zoom'.tl,
settingKey: 'enableLongPressToZoom',
onChanged: () {
setState(() {});
widget.onChanged?.call('enableLongPressToZoom');
},
).toSliver(),
SliverAnimatedVisibility(
visible: appdata.settings['enableLongPressToZoom'] == true,
child: SelectSetting(
title: "Long press zoom position".tl,
settingKey: "longPressZoomPosition",
optionTranslation: {
"press": "Press position".tl,
"center": "Screen center".tl,
},
),
),
_SwitchSetting(
title: 'Limit image width'.tl,
subtitle: 'When using Continuous(Top to Bottom) mode'.tl,
settingKey: 'limitImageWidth',
onChanged: () {
widget.onChanged?.call('limitImageWidth');
},
).toSliver(),
if (App.isAndroid)
_SwitchSetting(
title: 'Turn page by volume keys'.tl,
settingKey: 'enableTurnPageByVolumeKey',
onChanged: () {
widget.onChanged?.call('enableTurnPageByVolumeKey');
},
).toSliver(),
_SwitchSetting(
title: "Display time & battery info in reader".tl,
settingKey: "enableClockAndBatteryInfoInReader",
onChanged: () {
widget.onChanged?.call("enableClockAndBatteryInfoInReader");
},
).toSliver(),
SelectSetting(
title: "Quick collect image".tl,
settingKey: "quickCollectImage",
optionTranslation: {
"No": "Not enable".tl,
"DoubleTap": "Double Tap".tl,
"Swipe": "Swipe".tl,
},
onChanged: () {
widget.onChanged?.call("quickCollectImage");
},
help:
"On the image browsing page, you can quickly collect images by sliding horizontally or vertically according to your reading mode"
.tl,
).toSliver(),
_CallbackSetting(
title: "Custom Image Processing".tl,
callback: () => context.to(() => _CustomImageProcessing()),
actionTitle: "Edit".tl,
).toSliver(),
_SliderSetting(
title: "Number of images preloaded".tl,
settingsIndex: "preloadImageCount",
interval: 1,
min: 1,
max: 16,
).toSliver(),
_SwitchSetting(
title: "Show Page Number".tl,
settingKey: "showPageNumberInReader",
onChanged: () {
widget.onChanged?.call("showPageNumberInReader");
},
).toSliver(),
],
);
}
}
class _CustomImageProcessing extends StatefulWidget {
const _CustomImageProcessing();
@override
State<_CustomImageProcessing> createState() => __CustomImageProcessingState();
}
class __CustomImageProcessingState extends State<_CustomImageProcessing> {
var current = '';
@override
void initState() {
super.initState();
current = appdata.settings['customImageProcessing'];
}
@override
void dispose() {
appdata.settings['customImageProcessing'] = current;
appdata.saveData();
super.dispose();
}
int resetKey = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: Appbar(
title: Text("Custom Image Processing".tl),
actions: [
TextButton(
onPressed: () {
current = defaultCustomImageProcessing;
appdata.settings['customImageProcessing'] = current;
resetKey++;
setState(() {});
},
child: Text("Reset".tl),
)
],
),
body: Column(
children: [
_SwitchSetting(
title: "Enable".tl,
settingKey: "enableCustomImageProcessing",
),
Expanded(
child: Container(
margin: EdgeInsets.all(8),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
border: Border.all(color: context.colorScheme.outlineVariant),
),
child: SizedBox.expand(
child: CodeEditor(
key: ValueKey(resetKey),
initialValue: appdata.settings['customImageProcessing'],
onChanged: (value) {
current = value;
},
),
),
),
)
],
),
);
}
}