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:
parent
9e5069a376
commit
683bf172bf
7 changed files with 71 additions and 6 deletions
|
|
@ -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.ReaderBottomButton
|
||||||
import eu.kanade.tachiyomi.ui.reader.setting.ReaderOrientation
|
import eu.kanade.tachiyomi.ui.reader.setting.ReaderOrientation
|
||||||
import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences
|
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.setting.ReadingMode
|
||||||
import eu.kanade.tachiyomi.ui.reader.viewer.pager.PagerConfig
|
import eu.kanade.tachiyomi.ui.reader.viewer.pager.PagerConfig
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
|
|
@ -258,6 +259,7 @@ object SettingsReaderScreen : SearchableSettings {
|
||||||
|
|
||||||
// KMK -->
|
// KMK -->
|
||||||
val pagedDisableZoomIn by readerPreferences.pagedDisableZoomIn().collectAsState()
|
val pagedDisableZoomIn by readerPreferences.pagedDisableZoomIn().collectAsState()
|
||||||
|
val landscapeZoom by readerPreferences.landscapeZoom().collectAsState()
|
||||||
// KMK <--
|
// KMK <--
|
||||||
|
|
||||||
return Preference.PreferenceGroup(
|
return Preference.PreferenceGroup(
|
||||||
|
|
@ -313,9 +315,22 @@ object SettingsReaderScreen : SearchableSettings {
|
||||||
Preference.PreferenceItem.SwitchPreference(
|
Preference.PreferenceItem.SwitchPreference(
|
||||||
preference = readerPreferences.landscapeZoom(),
|
preference = readerPreferences.landscapeZoom(),
|
||||||
title = stringResource(MR.strings.pref_landscape_zoom),
|
title = stringResource(MR.strings.pref_landscape_zoom),
|
||||||
enabled = imageScaleType == 1,
|
// KMK -->
|
||||||
|
enabled = imageScaleType in zoomWideImagesAllowedList,
|
||||||
|
// KMK <--
|
||||||
),
|
),
|
||||||
// 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.PreferenceItem.SwitchPreference(
|
||||||
preference = readerPreferences.pagedDisableZoomIn(),
|
preference = readerPreferences.pagedDisableZoomIn(),
|
||||||
title = stringResource(KMR.strings.pref_paged_disable_zoom_in),
|
title = stringResource(KMR.strings.pref_paged_disable_zoom_in),
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.collectAsState
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
|
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
|
||||||
import eu.kanade.domain.manga.model.readerOrientation
|
import eu.kanade.domain.manga.model.readerOrientation
|
||||||
import eu.kanade.domain.manga.model.readingMode
|
import eu.kanade.domain.manga.model.readingMode
|
||||||
import eu.kanade.tachiyomi.ui.reader.setting.ReaderOrientation
|
import eu.kanade.tachiyomi.ui.reader.setting.ReaderOrientation
|
||||||
|
|
@ -123,10 +124,18 @@ private fun PagerViewerSettings(screenModel: ReaderSettingsScreenModel) {
|
||||||
pref = screenModel.preferences.cropBorders(),
|
pref = screenModel.preferences.cropBorders(),
|
||||||
)
|
)
|
||||||
|
|
||||||
CheckboxItem(
|
// KMK -->
|
||||||
label = stringResource(MR.strings.pref_landscape_zoom),
|
if (imageScaleType in listOf(
|
||||||
pref = screenModel.preferences.landscapeZoom(),
|
SubsamplingScaleImageView.SCALE_TYPE_CENTER_INSIDE,
|
||||||
)
|
SubsamplingScaleImageView.SCALE_TYPE_ORIGINAL_SIZE,
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
// KMK <--
|
||||||
|
CheckboxItem(
|
||||||
|
label = stringResource(MR.strings.pref_landscape_zoom),
|
||||||
|
pref = screenModel.preferences.landscapeZoom(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
CheckboxItem(
|
CheckboxItem(
|
||||||
label = stringResource(MR.strings.pref_navigate_pan),
|
label = stringResource(MR.strings.pref_navigate_pan),
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,13 @@ package eu.kanade.tachiyomi.ui.reader.setting
|
||||||
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import androidx.compose.ui.graphics.BlendMode
|
import androidx.compose.ui.graphics.BlendMode
|
||||||
|
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
|
||||||
import dev.icerock.moko.resources.StringResource
|
import dev.icerock.moko.resources.StringResource
|
||||||
import eu.kanade.tachiyomi.ui.reader.viewer.pager.PagerConfig
|
import eu.kanade.tachiyomi.ui.reader.viewer.pager.PagerConfig
|
||||||
import tachiyomi.core.common.preference.PreferenceStore
|
import tachiyomi.core.common.preference.PreferenceStore
|
||||||
import tachiyomi.core.common.preference.getEnum
|
import tachiyomi.core.common.preference.getEnum
|
||||||
import tachiyomi.i18n.MR
|
import tachiyomi.i18n.MR
|
||||||
|
import tachiyomi.i18n.kmk.KMR
|
||||||
import tachiyomi.i18n.sy.SYMR
|
import tachiyomi.i18n.sy.SYMR
|
||||||
|
|
||||||
class ReaderPreferences(
|
class ReaderPreferences(
|
||||||
|
|
@ -73,6 +75,10 @@ class ReaderPreferences(
|
||||||
|
|
||||||
fun landscapeZoom() = preferenceStore.getBoolean("landscape_zoom", true)
|
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 cropBordersWebtoon() = preferenceStore.getBoolean("crop_borders_webtoon", false)
|
||||||
|
|
||||||
fun webtoonSidePadding() = preferenceStore.getInt("webtoon_side_padding", WEBTOON_PADDING_MIN)
|
fun webtoonSidePadding() = preferenceStore.getInt("webtoon_side_padding", WEBTOON_PADDING_MIN)
|
||||||
|
|
@ -224,6 +230,15 @@ class ReaderPreferences(
|
||||||
LOWEST(47),
|
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 {
|
object ArchiveReaderMode {
|
||||||
const val LOAD_FROM_FILE = 0
|
const val LOAD_FROM_FILE = 0
|
||||||
const val LOAD_INTO_MEMORY = 1
|
const val LOAD_INTO_MEMORY = 1
|
||||||
|
|
@ -261,6 +276,13 @@ class ReaderPreferences(
|
||||||
MR.strings.zoom_start_center,
|
MR.strings.zoom_start_center,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// KMK -->
|
||||||
|
val zoomWideImagesAllowedList = listOf(
|
||||||
|
SubsamplingScaleImageView.SCALE_TYPE_CENTER_INSIDE,
|
||||||
|
SubsamplingScaleImageView.SCALE_TYPE_ORIGINAL_SIZE,
|
||||||
|
)
|
||||||
|
// KMK <--
|
||||||
|
|
||||||
val ColorFilterMode = buildList {
|
val ColorFilterMode = buildList {
|
||||||
addAll(
|
addAll(
|
||||||
listOf(
|
listOf(
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ import com.github.chrisbanes.photoview.PhotoView
|
||||||
import eu.kanade.domain.base.BasePreferences
|
import eu.kanade.domain.base.BasePreferences
|
||||||
import eu.kanade.tachiyomi.data.coil.cropBorders
|
import eu.kanade.tachiyomi.data.coil.cropBorders
|
||||||
import eu.kanade.tachiyomi.data.coil.customDecoder
|
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.ui.reader.viewer.webtoon.WebtoonSubsamplingImageView
|
||||||
import eu.kanade.tachiyomi.util.system.animatorDurationScale
|
import eu.kanade.tachiyomi.util.system.animatorDurationScale
|
||||||
import eu.kanade.tachiyomi.util.view.isVisibleOnScreen
|
import eu.kanade.tachiyomi.util.view.isVisibleOnScreen
|
||||||
|
|
@ -138,7 +139,11 @@ open class ReaderPageImageView @JvmOverloads constructor(
|
||||||
ZoomStartPosition.CENTER -> center
|
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)
|
(animateScaleAndCenter(targetScale, point) ?: return@postDelayed)
|
||||||
.withDuration(500)
|
.withDuration(500)
|
||||||
.withEasing(EASE_IN_OUT_QUAD)
|
.withEasing(EASE_IN_OUT_QUAD)
|
||||||
|
|
@ -466,6 +471,7 @@ open class ReaderPageImageView @JvmOverloads constructor(
|
||||||
// KMK -->
|
// KMK -->
|
||||||
val disableZoomIn: Boolean = false,
|
val disableZoomIn: Boolean = false,
|
||||||
val doubleTapZoom: Boolean = true,
|
val doubleTapZoom: Boolean = true,
|
||||||
|
val landscapeZoomScaleType: LandscapeZoomScaleType = LandscapeZoomScaleType.FIT,
|
||||||
// KMK <--
|
// KMK <--
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.ui.reader.viewer.pager
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import androidx.annotation.ColorInt
|
import androidx.annotation.ColorInt
|
||||||
import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences
|
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.ReaderPageImageView
|
||||||
import eu.kanade.tachiyomi.ui.reader.viewer.ViewerConfig
|
import eu.kanade.tachiyomi.ui.reader.viewer.ViewerConfig
|
||||||
import eu.kanade.tachiyomi.ui.reader.viewer.ViewerNavigation
|
import eu.kanade.tachiyomi.ui.reader.viewer.ViewerNavigation
|
||||||
|
|
@ -55,6 +56,9 @@ class PagerConfig(
|
||||||
|
|
||||||
var doubleTapZoom = true
|
var doubleTapZoom = true
|
||||||
private set
|
private set
|
||||||
|
|
||||||
|
var landscapeZoomScaleType = LandscapeZoomScaleType.FIT
|
||||||
|
private set
|
||||||
// KMK <--
|
// KMK <--
|
||||||
|
|
||||||
// SY -->
|
// SY -->
|
||||||
|
|
@ -166,6 +170,12 @@ class PagerConfig(
|
||||||
{ doubleTapZoom = it },
|
{ doubleTapZoom = it },
|
||||||
{ imagePropertyChangedListener?.invoke() },
|
{ imagePropertyChangedListener?.invoke() },
|
||||||
)
|
)
|
||||||
|
|
||||||
|
readerPreferences.landscapeZoomType()
|
||||||
|
.register(
|
||||||
|
{ landscapeZoomScaleType = it },
|
||||||
|
{ imagePropertyChangedListener?.invoke() },
|
||||||
|
)
|
||||||
// KMK <--
|
// KMK <--
|
||||||
|
|
||||||
// SY -->
|
// SY -->
|
||||||
|
|
|
||||||
|
|
@ -219,6 +219,7 @@ class PagerPageHolder(
|
||||||
// KMK -->
|
// KMK -->
|
||||||
disableZoomIn = viewer.config.disableZoomIn,
|
disableZoomIn = viewer.config.disableZoomIn,
|
||||||
doubleTapZoom = viewer.config.doubleTapZoom,
|
doubleTapZoom = viewer.config.doubleTapZoom,
|
||||||
|
landscapeZoomScaleType = viewer.config.landscapeZoomScaleType,
|
||||||
// KMK <--
|
// KMK <--
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,8 @@
|
||||||
<string name="error_opening_folder">Failed to open folder</string>
|
<string name="error_opening_folder">Failed to open folder</string>
|
||||||
<string name="pref_pinch_to_zoom">Pinch to zoom</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_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 -->
|
<!-- Preferences -->
|
||||||
<!-- Appearance section -->
|
<!-- Appearance section -->
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue