From 242b980e57a84b43204a9403acf33d19f7edfc4c Mon Sep 17 00:00:00 2001 From: Stefano Russo Date: Thu, 4 Sep 2025 11:19:54 +0200 Subject: [PATCH] feat(webtoon): Add option to enable/disable pinch to zoom in webtoon viewer (#1101) * feat: Add option to disable pinch to zoom in webtoon viewer * Change default settings & also include settings for Paged mode * refactor webtoon --------- Co-authored-by: Cuong-Tran --- .../more/settings/screen/SettingsReaderScreen.kt | 7 +++++++ .../reader/settings/ReadingModePage.kt | 6 ++++++ .../ui/reader/setting/ReaderPreferences.kt | 4 ++++ .../ui/reader/viewer/webtoon/WebtoonConfig.kt | 15 +++++++++++++++ .../ui/reader/viewer/webtoon/WebtoonFrame.kt | 8 ++++++++ .../reader/viewer/webtoon/WebtoonRecyclerView.kt | 8 ++++++++ .../ui/reader/viewer/webtoon/WebtoonViewer.kt | 6 ++++++ .../commonMain/moko-resources/base/strings.xml | 2 ++ 8 files changed, 56 insertions(+) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsReaderScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsReaderScreen.kt index a1a8af978..2890b9487 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsReaderScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsReaderScreen.kt @@ -25,6 +25,7 @@ import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.text.NumberFormat +@Suppress("unused") object SettingsReaderScreen : SearchableSettings { private fun readResolve(): Any = SettingsReaderScreen @@ -441,6 +442,12 @@ object SettingsReaderScreen : SearchableSettings { preference = readerPreferences.webtoonDoubleTapZoomEnabled(), title = stringResource(MR.strings.pref_double_tap_zoom), ), + // KMK --> + Preference.PreferenceItem.SwitchPreference( + preference = readerPreferences.webtoonPinchToZoomEnabled(), + title = stringResource(KMR.strings.pref_pinch_to_zoom), + ), + // KMK <-- Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.webtoonDisableZoomOut(), title = stringResource(MR.strings.pref_webtoon_disable_zoom_out), diff --git a/app/src/main/java/eu/kanade/presentation/reader/settings/ReadingModePage.kt b/app/src/main/java/eu/kanade/presentation/reader/settings/ReadingModePage.kt index 64d4b01a2..a05769911 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/settings/ReadingModePage.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/settings/ReadingModePage.kt @@ -265,6 +265,12 @@ private fun ColumnScope.WebtoonViewerSettings(screenModel: ReaderSettingsScreenM label = stringResource(MR.strings.pref_double_tap_zoom), pref = screenModel.preferences.webtoonDoubleTapZoomEnabled(), ) + // KMK --> + CheckboxItem( + label = stringResource(KMR.strings.pref_pinch_to_zoom), + pref = screenModel.preferences.webtoonPinchToZoomEnabled(), + ) + // KMK <-- CheckboxItem( label = stringResource(MR.strings.pref_webtoon_disable_zoom_out), pref = screenModel.preferences.webtoonDisableZoomOut(), diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt index 5885b0cad..6af0b0b05 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt @@ -53,6 +53,10 @@ class ReaderPreferences( fun webtoonDoubleTapZoomEnabled() = preferenceStore.getBoolean("pref_enable_double_tap_zoom_webtoon", true) + // KMK --> + fun webtoonPinchToZoomEnabled() = preferenceStore.getBoolean("pref_enable_pinch_to_zoom_webtoon", true) + // KMK <-- + fun imageScaleType() = preferenceStore.getInt("pref_image_scale_type_key", 1) fun zoomStart() = preferenceStore.getInt("pref_zoom_start_key", 1) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonConfig.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonConfig.kt index 2a9d6afd2..45bf57032 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonConfig.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonConfig.kt @@ -42,6 +42,13 @@ class WebtoonConfig( var doubleTapZoomChangedListener: ((Boolean) -> Unit)? = null + // KMK --> + var pinchToZoom = true + private set + + var pinchToZoomChangedListener: ((Boolean) -> Unit)? = null + // KMK <-- + // SY --> var usePageTransitions = false @@ -102,6 +109,14 @@ class WebtoonConfig( { doubleTapZoomChangedListener?.invoke(it) }, ) + // KMK --> + readerPreferences.webtoonPinchToZoomEnabled() + .register( + { pinchToZoom = it }, + { pinchToZoomChangedListener?.invoke(it) }, + ) + // KMK <-- + readerPreferences.readerTheme().changes() .drop(1) .distinctUntilChanged() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonFrame.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonFrame.kt index 17aafc6fd..69e33358d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonFrame.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonFrame.kt @@ -33,6 +33,14 @@ class WebtoonFrame(context: Context) : FrameLayout(context) { scaleDetector.isQuickScaleEnabled = value } + // KMK --> + var pinchToZoom = true + set(value) { + field = value + recycler?.pinchToZoom = value + } + // KMK <-- + var zoomOutDisabled = false set(value) { field = value diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonRecyclerView.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonRecyclerView.kt index 95cef7345..8624d51be 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonRecyclerView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonRecyclerView.kt @@ -49,6 +49,10 @@ class WebtoonRecyclerView @JvmOverloads constructor( var doubleTapZoom = true + // KMK --> + var pinchToZoom = true + // KMK <-- + var tapListener: ((MotionEvent) -> Unit)? = null var longTapListener: ((MotionEvent) -> Boolean)? = null @@ -174,6 +178,10 @@ class WebtoonRecyclerView @JvmOverloads constructor( } fun onScale(scaleFactor: Float) { + // KMK -> + if (!detector.isQuickScaling && !pinchToZoom) return + // KMK <-- + currentScale *= scaleFactor currentScale = currentScale.coerceIn( minRate, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt index 532447c6c..86d29399b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt @@ -169,6 +169,12 @@ class WebtoonViewer( frame.doubleTapZoom = it } + // KMK --> + config.pinchToZoomChangedListener = { + frame.pinchToZoom = it + } + // KMK <-- + config.zoomPropertyChangedListener = { frame.zoomOutDisabled = it } diff --git a/i18n-kmk/src/commonMain/moko-resources/base/strings.xml b/i18n-kmk/src/commonMain/moko-resources/base/strings.xml index 7f6baff6d..6b7fef106 100644 --- a/i18n-kmk/src/commonMain/moko-resources/base/strings.xml +++ b/i18n-kmk/src/commonMain/moko-resources/base/strings.xml @@ -25,6 +25,8 @@ Copy combined page to clipboard Smaller tap zones Failed to open folder + Pinch to zoom + Custom theme style