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 <cuongtran.tm@gmail.com>
This commit is contained in:
Stefano Russo 2025-09-04 11:19:54 +02:00 committed by GitHub
parent 91a208ada2
commit 242b980e57
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 56 additions and 0 deletions

View file

@ -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),

View file

@ -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(),

View file

@ -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)

View file

@ -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()

View file

@ -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

View file

@ -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,

View file

@ -169,6 +169,12 @@ class WebtoonViewer(
frame.doubleTapZoom = it
}
// KMK -->
config.pinchToZoomChangedListener = {
frame.pinchToZoom = it
}
// KMK <--
config.zoomPropertyChangedListener = {
frame.zoomOutDisabled = it
}

View file

@ -25,6 +25,8 @@
<string name="action_copy_to_clipboard_combined_page">Copy combined page to clipboard</string>
<string name="pref_viewer_nav_smaller_tap_zone">Smaller tap zones</string>
<string name="error_opening_folder">Failed to open folder</string>
<string name="pref_pinch_to_zoom">Pinch to zoom</string>
<!-- Preferences -->
<!-- Appearance section -->
<string name="pref_custom_theme_style">Custom theme style</string>