feat(reader): Add zoom option for Automatically zoom wide images (#1124)

* feat(reader): Add zoom option for `Automatically zoom wide images`

* improve
This commit is contained in:
Cuong-Tran 2025-09-05 01:23:35 +07:00 committed by GitHub
parent 9e5069a376
commit 683bf172bf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 71 additions and 6 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -219,6 +219,7 @@ class PagerPageHolder(
// KMK -->
disableZoomIn = viewer.config.disableZoomIn,
doubleTapZoom = viewer.config.doubleTapZoom,
landscapeZoomScaleType = viewer.config.landscapeZoomScaleType,
// KMK <--
),
)

View file

@ -27,6 +27,8 @@
<string name="error_opening_folder">Failed to open folder</string>
<string name="pref_pinch_to_zoom">Pinch to zoom</string>
<string name="pref_paged_disable_zoom_in">Disable zoom in</string>
<string name="pref_landscape_zoom_type">Wide images zoom mode</string>
<string name="scale_type_double">Double zoom</string>
<!-- Preferences -->
<!-- Appearance section -->