Allow disabling reader's zoom out (#302)

* Allow disabling reader's zoom out (#62)

* Renamed disable zoom out pref and string

* Zoom to default rate if the scale is inferior

* Fixed null value check and formatting

* Fixed detekt

(cherry picked from commit c15f3f2fd5b11cc9c2088ae2fa444f4fe35ea740)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonFrame.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonRecyclerView.kt
This commit is contained in:
Splintor 2024-02-24 21:40:06 +02:00 committed by Jobobby04
parent 133c34dee2
commit db99ab526a
8 changed files with 34 additions and 42 deletions

View File

@ -387,17 +387,16 @@ object SettingsReaderScreen : SearchableSettings {
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPreferences.webtoonDoubleTapZoomEnabled(), pref = readerPreferences.webtoonDoubleTapZoomEnabled(),
title = stringResource(MR.strings.pref_double_tap_zoom), title = stringResource(MR.strings.pref_double_tap_zoom),
enabled = true, ),
Preference.PreferenceItem.SwitchPreference(
pref = readerPreferences.webtoonDisableZoomOut(),
title = stringResource(MR.strings.pref_webtoon_disable_zoom_out),
), ),
// SY --> // SY -->
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = readerPreferences.pageTransitionsWebtoon(), pref = readerPreferences.pageTransitionsWebtoon(),
title = stringResource(MR.strings.pref_page_transitions), title = stringResource(MR.strings.pref_page_transitions),
), ),
Preference.PreferenceItem.SwitchPreference(
pref = readerPreferences.webtoonEnableZoomOut(),
title = stringResource(SYMR.strings.enable_zoom_out),
),
// SY <-- // SY <--
), ),
) )

View File

@ -217,11 +217,6 @@ private fun ColumnScope.WebtoonViewerSettings(screenModel: ReaderSettingsScreenM
label = stringResource(MR.strings.pref_page_transitions), label = stringResource(MR.strings.pref_page_transitions),
pref = screenModel.preferences.pageTransitionsWebtoon(), pref = screenModel.preferences.pageTransitionsWebtoon(),
) )
CheckboxItem(
label = stringResource(SYMR.strings.enable_zoom_out),
pref = screenModel.preferences.webtoonEnableZoomOut(),
)
// SY <-- // SY <--
val dualPageSplitWebtoon by screenModel.preferences.dualPageSplitWebtoon().collectAsState() val dualPageSplitWebtoon by screenModel.preferences.dualPageSplitWebtoon().collectAsState()
@ -254,6 +249,10 @@ private fun ColumnScope.WebtoonViewerSettings(screenModel: ReaderSettingsScreenM
label = stringResource(MR.strings.pref_double_tap_zoom), label = stringResource(MR.strings.pref_double_tap_zoom),
pref = screenModel.preferences.webtoonDoubleTapZoomEnabled(), pref = screenModel.preferences.webtoonDoubleTapZoomEnabled(),
) )
CheckboxItem(
label = stringResource(MR.strings.pref_webtoon_disable_zoom_out),
pref = screenModel.preferences.webtoonDisableZoomOut(),
)
} }
// SY --> // SY -->

View File

@ -78,7 +78,7 @@ class ReaderPreferences(
fun skipDupe() = preferenceStore.getBoolean("skip_dupe", false) fun skipDupe() = preferenceStore.getBoolean("skip_dupe", false)
fun markReadDupe() = preferenceStore.getBoolean("mark_read_dupe", false) fun webtoonDisableZoomOut() = preferenceStore.getBoolean("webtoon_disable_zoom_out", false)
// endregion // endregion
@ -162,8 +162,6 @@ class ReaderPreferences(
fun useAutoWebtoon() = preferenceStore.getBoolean("eh_use_auto_webtoon", true) fun useAutoWebtoon() = preferenceStore.getBoolean("eh_use_auto_webtoon", true)
fun webtoonEnableZoomOut() = preferenceStore.getBoolean("webtoon_enable_zoom_out", false)
fun continuousVerticalTappingByPage() = preferenceStore.getBoolean("continuous_vertical_tapping_by_page", false) fun continuousVerticalTappingByPage() = preferenceStore.getBoolean("continuous_vertical_tapping_by_page", false)
fun cropBordersContinuousVertical() = preferenceStore.getBoolean("crop_borders_continues_vertical", false) fun cropBordersContinuousVertical() = preferenceStore.getBoolean("crop_borders_continues_vertical", false)
@ -183,6 +181,8 @@ class ReaderPreferences(
fun centerMarginType() = preferenceStore.getInt("center_margin_type", PagerConfig.CenterMarginType.NONE) fun centerMarginType() = preferenceStore.getInt("center_margin_type", PagerConfig.CenterMarginType.NONE)
fun cacheArchiveMangaOnDisk() = preferenceStore.getBoolean("cache_archive_manga_on_disk", false) fun cacheArchiveMangaOnDisk() = preferenceStore.getBoolean("cache_archive_manga_on_disk", false)
fun markReadDupe() = preferenceStore.getBoolean("mark_read_dupe", false)
// SY <-- // SY <--
enum class TappingInvertMode( enum class TappingInvertMode(

View File

@ -29,6 +29,11 @@ class WebtoonConfig(
var imageCropBorders = false var imageCropBorders = false
private set private set
var zoomOutDisabled = false
private set
var zoomPropertyChangedListener: ((Boolean) -> Unit)? = null
var sidePadding = 0 var sidePadding = 0
private set private set
@ -42,14 +47,9 @@ class WebtoonConfig(
// SY --> // SY -->
var usePageTransitions = false var usePageTransitions = false
var enableZoomOut = false
private set
var continuousCropBorders = false var continuousCropBorders = false
private set private set
var zoomPropertyChangedListener: ((Boolean) -> Unit)? = null
// SY <-- // SY <--
init { init {
readerPreferences.cropBordersWebtoon() readerPreferences.cropBordersWebtoon()
@ -86,6 +86,12 @@ class WebtoonConfig(
{ imagePropertyChangedListener?.invoke() }, { imagePropertyChangedListener?.invoke() },
) )
readerPreferences.webtoonDisableZoomOut()
.register(
{ zoomOutDisabled = it },
{ zoomPropertyChangedListener?.invoke(it) }
)
readerPreferences.webtoonDoubleTapZoomEnabled() readerPreferences.webtoonDoubleTapZoomEnabled()
.register( .register(
{ doubleTapZoom = it }, { doubleTapZoom = it },
@ -99,9 +105,6 @@ class WebtoonConfig(
.launchIn(scope) .launchIn(scope)
// SY --> // SY -->
readerPreferences.webtoonEnableZoomOut()
.register({ enableZoomOut = it }, { zoomPropertyChangedListener?.invoke(it) })
readerPreferences.cropBordersContinuousVertical() readerPreferences.cropBordersContinuousVertical()
.register({ continuousCropBorders = it }, { imagePropertyChangedListener?.invoke() }) .register({ continuousCropBorders = it }, { imagePropertyChangedListener?.invoke() })

View File

@ -33,13 +33,11 @@ class WebtoonFrame(context: Context) : FrameLayout(context) {
scaleDetector.isQuickScaleEnabled = value scaleDetector.isQuickScaleEnabled = value
} }
// SY --> var zoomOutDisabled = false
var enableZoomOut = false
set(value) { set(value) {
field = value field = value
recycler?.canZoomOut = value recycler?.zoomOutDisabled = value
} }
// SY <--
/** /**
* Recycler view added in this frame. * Recycler view added in this frame.

View File

@ -33,19 +33,15 @@ class WebtoonRecyclerView @JvmOverloads constructor(
private var firstVisibleItemPosition = 0 private var firstVisibleItemPosition = 0
private var lastVisibleItemPosition = 0 private var lastVisibleItemPosition = 0
private var currentScale = DEFAULT_RATE private var currentScale = DEFAULT_RATE
var zoomOutDisabled = false
// SY -->
var canZoomOut = false
set(value) { set(value) {
field = value field = value
if (!value) { if (value && currentScale < DEFAULT_RATE) {
zoom(currentScale, DEFAULT_RATE, x, 0f, y, 0f) zoom(currentScale, DEFAULT_RATE, x, 0f, y, 0f)
} }
} }
private val minRate private val minRate
get() = if (canZoomOut) MIN_RATE else DEFAULT_RATE get() = if (zoomOutDisabled) DEFAULT_RATE else MIN_RATE
// SY <--
private val listener = GestureListener() private val listener = GestureListener()
private val detector = Detector() private val detector = Detector()
@ -179,9 +175,7 @@ class WebtoonRecyclerView @JvmOverloads constructor(
fun onScale(scaleFactor: Float) { fun onScale(scaleFactor: Float) {
currentScale *= scaleFactor currentScale *= scaleFactor
currentScale = currentScale.coerceIn( currentScale = currentScale.coerceIn(
// SY -->
minRate, minRate,
// SY <--
MAX_SCALE_RATE, MAX_SCALE_RATE,
) )
@ -208,8 +202,8 @@ class WebtoonRecyclerView @JvmOverloads constructor(
} }
fun onScaleEnd() { fun onScaleEnd() {
if (scaleX < /* SY --> */ minRate /* SY <-- */) { if (scaleX < minRate) {
zoom(currentScale, /* SY --> */ minRate /* SY <-- */, x, 0f, y, 0f) zoom(currentScale, minRate, x, 0f, y, 0f)
} }
} }

View File

@ -159,17 +159,15 @@ class WebtoonViewer(
frame.doubleTapZoom = it frame.doubleTapZoom = it
} }
config.zoomPropertyChangedListener = {
frame.zoomOutDisabled = it
}
config.navigationModeChangedListener = { config.navigationModeChangedListener = {
val showOnStart = config.navigationOverlayOnStart || config.forceNavigationOverlay val showOnStart = config.navigationOverlayOnStart || config.forceNavigationOverlay
activity.binding.navigationOverlay.setNavigation(config.navigator, showOnStart) activity.binding.navigationOverlay.setNavigation(config.navigator, showOnStart)
} }
// SY -->
config.zoomPropertyChangedListener = {
frame.enableZoomOut = it
}
// SY <--
frame.layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT) frame.layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)
frame.addView(recycler) frame.addView(recycler)
} }

View File

@ -458,6 +458,7 @@
<string name="pref_high">High</string> <string name="pref_high">High</string>
<string name="pref_low">Low</string> <string name="pref_low">Low</string>
<string name="pref_lowest">Lowest</string> <string name="pref_lowest">Lowest</string>
<string name="pref_webtoon_disable_zoom_out">Disable zoom out</string>
<!-- Downloads section --> <!-- Downloads section -->
<string name="pref_category_delete_chapters">Delete chapters</string> <string name="pref_category_delete_chapters">Delete chapters</string>