part of 'settings_page.dart'; class ReaderSettings extends StatefulWidget { const ReaderSettings({ super.key, this.onChanged, this.comicId, this.comicSource, }); final void Function(String key)? onChanged; final String? comicId; final String? comicSource; @override State createState() => _ReaderSettingsState(); } class _ReaderSettingsState extends State { @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"); }, comicId: widget.comicId, comicSource: widget.comicSource, ).toSliver(), _SwitchSetting( title: "Reverse tap to turn Pages".tl, settingKey: "reverseTapToTurnPages", onChanged: () { widget.onChanged?.call("reverseTapToTurnPages"); }, comicId: widget.comicId, comicSource: widget.comicSource, ).toSliver(), _SwitchSetting( title: "Page animation".tl, settingKey: "enablePageAnimation", onChanged: () { widget.onChanged?.call("enablePageAnimation"); }, comicId: widget.comicId, comicSource: widget.comicSource, ).toSliver(), _SwitchSetting( title: "Enable comic specific settings".tl, settingKey: "enableComicSpecificSettings", onChanged: () { widget.onChanged?.call("enableComicSpecificSettings"); }, ).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"); }, comicId: widget.comicId, comicSource: widget.comicSource, ).toSliver(), _SliderSetting( title: "Auto page turning interval".tl, settingsIndex: "autoPageTurningInterval", interval: 1, min: 1, max: 20, onChanged: () { setState(() {}); widget.onChanged?.call("autoPageTurningInterval"); }, comicId: widget.comicId, comicSource: widget.comicSource, ).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"); }, comicId: widget.comicId, comicSource: widget.comicSource, ), ), 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"); }, comicId: widget.comicId, comicSource: widget.comicSource, ), ), 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"); }, comicId: widget.comicId, comicSource: widget.comicSource, ), ), _SwitchSetting( title: 'Double tap to zoom'.tl, settingKey: 'enableDoubleTapToZoom', onChanged: () { setState(() {}); widget.onChanged?.call('enableDoubleTapToZoom'); }, comicId: widget.comicId, comicSource: widget.comicSource, ).toSliver(), _SwitchSetting( title: 'Long press to zoom'.tl, settingKey: 'enableLongPressToZoom', onChanged: () { setState(() {}); widget.onChanged?.call('enableLongPressToZoom'); }, comicId: widget.comicId, comicSource: widget.comicSource, ).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, }, comicId: widget.comicId, comicSource: widget.comicSource, ), ), _SwitchSetting( title: 'Limit image width'.tl, subtitle: 'When using Continuous(Top to Bottom) mode'.tl, settingKey: 'limitImageWidth', onChanged: () { widget.onChanged?.call('limitImageWidth'); }, comicId: widget.comicId, comicSource: widget.comicSource, ).toSliver(), if (App.isAndroid) _SwitchSetting( title: 'Turn page by volume keys'.tl, settingKey: 'enableTurnPageByVolumeKey', onChanged: () { widget.onChanged?.call('enableTurnPageByVolumeKey'); }, comicId: widget.comicId, comicSource: widget.comicSource, ).toSliver(), _SwitchSetting( title: "Display time & battery info in reader".tl, settingKey: "enableClockAndBatteryInfoInReader", onChanged: () { widget.onChanged?.call("enableClockAndBatteryInfoInReader"); }, comicId: widget.comicId, comicSource: widget.comicSource, ).toSliver(), _SwitchSetting( title: "Show system status bar".tl, settingKey: "showSystemStatusBar", onChanged: () { widget.onChanged?.call("showSystemStatusBar"); }, comicId: widget.comicId, comicSource: widget.comicSource, ).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, comicId: widget.comicId, comicSource: widget.comicSource, ).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, comicId: widget.comicId, comicSource: widget.comicSource, ).toSliver(), _SwitchSetting( title: "Show Page Number".tl, settingKey: "showPageNumberInReader", onChanged: () { widget.onChanged?.call("showPageNumberInReader"); }, comicId: widget.comicId, comicSource: widget.comicSource, ).toSliver(), // reset button SliverToBoxAdapter( child: TextButton( onPressed: () { if (widget.comicId == null) { appdata.settings.resetAllComicReaderSettings(); } else { var keys = appdata .settings['comicSpecificSettings']["${widget.comicId}@${widget.comicSource}"] ?.keys; appdata.settings.resetComicReaderSettings( widget.comicId!, widget.comicSource!, ); if (keys != null) { setState(() {}); for (var key in keys) { widget.onChanged?.call(key); } } } }, child: Text( (widget.comicId == null ? "Clear specific reader settings for all comics" : "Clear specific reader settings for this comic") .tl, ), ), ), ], ); } } 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; }, ), ), ), ), ], ), ); } }