From 683bf172bf22ff8447d70bc195d800ee0c2fc08c Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Fri, 5 Sep 2025 01:23:35 +0700 Subject: [PATCH] feat(reader): Add zoom option for `Automatically zoom wide images` (#1124) * feat(reader): Add zoom option for `Automatically zoom wide images` * improve --- .../settings/screen/SettingsReaderScreen.kt | 17 +++++++++++++- .../reader/settings/ReadingModePage.kt | 17 ++++++++++---- .../ui/reader/setting/ReaderPreferences.kt | 22 +++++++++++++++++++ .../ui/reader/viewer/ReaderPageImageView.kt | 8 ++++++- .../ui/reader/viewer/pager/PagerConfig.kt | 10 +++++++++ .../ui/reader/viewer/pager/PagerPageHolder.kt | 1 + .../moko-resources/base/strings.xml | 2 ++ 7 files changed, 71 insertions(+), 6 deletions(-) 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 475adb565..4938a5352 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 @@ -10,6 +10,7 @@ import eu.kanade.presentation.more.settings.Preference import eu.kanade.tachiyomi.ui.reader.setting.ReaderBottomButton import eu.kanade.tachiyomi.ui.reader.setting.ReaderOrientation import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences +import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences.Companion.zoomWideImagesAllowedList import eu.kanade.tachiyomi.ui.reader.setting.ReadingMode import eu.kanade.tachiyomi.ui.reader.viewer.pager.PagerConfig import kotlinx.collections.immutable.persistentListOf @@ -258,6 +259,7 @@ object SettingsReaderScreen : SearchableSettings { // KMK --> val pagedDisableZoomIn by readerPreferences.pagedDisableZoomIn().collectAsState() + val landscapeZoom by readerPreferences.landscapeZoom().collectAsState() // KMK <-- return Preference.PreferenceGroup( @@ -313,9 +315,22 @@ object SettingsReaderScreen : SearchableSettings { Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.landscapeZoom(), title = stringResource(MR.strings.pref_landscape_zoom), - enabled = imageScaleType == 1, + // KMK --> + enabled = imageScaleType in zoomWideImagesAllowedList, + // KMK <-- ), // KMK --> + Preference.PreferenceItem.ListPreference( + preference = readerPreferences.landscapeZoomType(), + entries = persistentListOf( + ReaderPreferences.LandscapeZoomScaleType.FIT, + ReaderPreferences.LandscapeZoomScaleType.DOUBLE, + ) + .associateWith { stringResource(it.titleRes) } + .toImmutableMap(), + title = stringResource(KMR.strings.pref_landscape_zoom_type), + enabled = landscapeZoom && imageScaleType in zoomWideImagesAllowedList, + ), Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.pagedDisableZoomIn(), title = stringResource(KMR.strings.pref_paged_disable_zoom_in), 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 d9f0e1291..e7547dac4 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 @@ -7,6 +7,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember +import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView import eu.kanade.domain.manga.model.readerOrientation import eu.kanade.domain.manga.model.readingMode import eu.kanade.tachiyomi.ui.reader.setting.ReaderOrientation @@ -123,10 +124,18 @@ private fun PagerViewerSettings(screenModel: ReaderSettingsScreenModel) { pref = screenModel.preferences.cropBorders(), ) - CheckboxItem( - label = stringResource(MR.strings.pref_landscape_zoom), - pref = screenModel.preferences.landscapeZoom(), - ) + // KMK --> + if (imageScaleType in listOf( + SubsamplingScaleImageView.SCALE_TYPE_CENTER_INSIDE, + SubsamplingScaleImageView.SCALE_TYPE_ORIGINAL_SIZE, + ) + ) { + // KMK <-- + CheckboxItem( + label = stringResource(MR.strings.pref_landscape_zoom), + pref = screenModel.preferences.landscapeZoom(), + ) + } CheckboxItem( label = stringResource(MR.strings.pref_navigate_pan), 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 c5d130829..9d54ca49f 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 @@ -2,11 +2,13 @@ package eu.kanade.tachiyomi.ui.reader.setting import android.os.Build import androidx.compose.ui.graphics.BlendMode +import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.ui.reader.viewer.pager.PagerConfig import tachiyomi.core.common.preference.PreferenceStore import tachiyomi.core.common.preference.getEnum import tachiyomi.i18n.MR +import tachiyomi.i18n.kmk.KMR import tachiyomi.i18n.sy.SYMR class ReaderPreferences( @@ -73,6 +75,10 @@ class ReaderPreferences( fun landscapeZoom() = preferenceStore.getBoolean("landscape_zoom", true) + // KMK --> + fun landscapeZoomType() = preferenceStore.getEnum("landscape_zoom_type", LandscapeZoomScaleType.FIT) + // KMK <-- + fun cropBordersWebtoon() = preferenceStore.getBoolean("crop_borders_webtoon", false) fun webtoonSidePadding() = preferenceStore.getInt("webtoon_side_padding", WEBTOON_PADDING_MIN) @@ -224,6 +230,15 @@ class ReaderPreferences( LOWEST(47), } + // KMK --> + enum class LandscapeZoomScaleType( + val titleRes: StringResource, + ) { + FIT(MR.strings.scale_type_fit_screen), + DOUBLE(KMR.strings.scale_type_double), + } + // KMK <-- + object ArchiveReaderMode { const val LOAD_FROM_FILE = 0 const val LOAD_INTO_MEMORY = 1 @@ -261,6 +276,13 @@ class ReaderPreferences( MR.strings.zoom_start_center, ) + // KMK --> + val zoomWideImagesAllowedList = listOf( + SubsamplingScaleImageView.SCALE_TYPE_CENTER_INSIDE, + SubsamplingScaleImageView.SCALE_TYPE_ORIGINAL_SIZE, + ) + // KMK <-- + val ColorFilterMode = buildList { addAll( listOf( diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ReaderPageImageView.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ReaderPageImageView.kt index 61a3e91e5..98fd9051b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ReaderPageImageView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ReaderPageImageView.kt @@ -37,6 +37,7 @@ import com.github.chrisbanes.photoview.PhotoView import eu.kanade.domain.base.BasePreferences import eu.kanade.tachiyomi.data.coil.cropBorders import eu.kanade.tachiyomi.data.coil.customDecoder +import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences.LandscapeZoomScaleType import eu.kanade.tachiyomi.ui.reader.viewer.webtoon.WebtoonSubsamplingImageView import eu.kanade.tachiyomi.util.system.animatorDurationScale import eu.kanade.tachiyomi.util.view.isVisibleOnScreen @@ -138,7 +139,11 @@ open class ReaderPageImageView @JvmOverloads constructor( ZoomStartPosition.CENTER -> center } - val targetScale = height.toFloat() / sHeight.toFloat() + val targetScale = /* KMK --> */ when (config.landscapeZoomScaleType) { + LandscapeZoomScaleType.DOUBLE -> scale * 2 + // KMK <-- + else -> height.toFloat() / sHeight.toFloat() + } (animateScaleAndCenter(targetScale, point) ?: return@postDelayed) .withDuration(500) .withEasing(EASE_IN_OUT_QUAD) @@ -466,6 +471,7 @@ open class ReaderPageImageView @JvmOverloads constructor( // KMK --> val disableZoomIn: Boolean = false, val doubleTapZoom: Boolean = true, + val landscapeZoomScaleType: LandscapeZoomScaleType = LandscapeZoomScaleType.FIT, // KMK <-- ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerConfig.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerConfig.kt index 77fd32bde..0647abdeb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerConfig.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerConfig.kt @@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.ui.reader.viewer.pager import android.graphics.Color import androidx.annotation.ColorInt import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences +import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences.LandscapeZoomScaleType import eu.kanade.tachiyomi.ui.reader.viewer.ReaderPageImageView import eu.kanade.tachiyomi.ui.reader.viewer.ViewerConfig import eu.kanade.tachiyomi.ui.reader.viewer.ViewerNavigation @@ -55,6 +56,9 @@ class PagerConfig( var doubleTapZoom = true private set + + var landscapeZoomScaleType = LandscapeZoomScaleType.FIT + private set // KMK <-- // SY --> @@ -166,6 +170,12 @@ class PagerConfig( { doubleTapZoom = it }, { imagePropertyChangedListener?.invoke() }, ) + + readerPreferences.landscapeZoomType() + .register( + { landscapeZoomScaleType = it }, + { imagePropertyChangedListener?.invoke() }, + ) // KMK <-- // SY --> diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerPageHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerPageHolder.kt index 0e4a46154..d12cee69f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerPageHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerPageHolder.kt @@ -219,6 +219,7 @@ class PagerPageHolder( // KMK --> disableZoomIn = viewer.config.disableZoomIn, doubleTapZoom = viewer.config.doubleTapZoom, + landscapeZoomScaleType = viewer.config.landscapeZoomScaleType, // KMK <-- ), ) diff --git a/i18n-kmk/src/commonMain/moko-resources/base/strings.xml b/i18n-kmk/src/commonMain/moko-resources/base/strings.xml index 201f354b4..9c2b41d9d 100644 --- a/i18n-kmk/src/commonMain/moko-resources/base/strings.xml +++ b/i18n-kmk/src/commonMain/moko-resources/base/strings.xml @@ -27,6 +27,8 @@ Failed to open folder Pinch to zoom Disable zoom in + Wide images zoom mode + Double zoom