feat: Toggle for double tap to zoom

Closes GH-161
This commit is contained in:
Ahmad Ansori Palembani 2024-08-18 10:10:21 +07:00
parent c7eed6d2d3
commit 7fc73ddcdc
Signed by: null2264
GPG key ID: BA64F8B60AF3EFB6
10 changed files with 60 additions and 25 deletions

View file

@ -11,6 +11,7 @@
-->
## Additions
- Add toggle to enable/disable chapter swipe action(s)
- Add toggle to enable/disable webtoon double tap to zoom
## Fixes
- Fixed chapter number parsing (@Naputt1)

View file

@ -7,15 +7,14 @@ import android.util.AttributeSet
import androidx.core.view.isVisible
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
import eu.kanade.tachiyomi.R
import yokai.i18n.MR
import yokai.util.lang.getString
import dev.icerock.moko.resources.compose.stringResource
import eu.kanade.tachiyomi.databinding.ReaderPagedLayoutBinding
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
import eu.kanade.tachiyomi.util.bindToPreference
import eu.kanade.tachiyomi.util.lang.addBetaTag
import eu.kanade.tachiyomi.util.system.DeviceUtil
import eu.kanade.tachiyomi.widget.BaseReaderSettingsView
import yokai.i18n.MR
import yokai.util.lang.getString
class ReaderPagedView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
BaseReaderSettingsView<ReaderPagedLayoutBinding>(context, attrs) {
@ -61,6 +60,7 @@ class ReaderPagedView @JvmOverloads constructor(context: Context, attrs: Attribu
R.array.webtoon_side_padding_values,
)
webtoonEnableZoomOut.bindToPreference(preferences.webtoonEnableZoomOut())
webtoonEnableDoubleTapZoom.bindToPreference(readerPreferences.webtoonDoubleTapZoomEnabled())
webtoonNav.bindToPreference(preferences.navigationModeWebtoon())
webtoonInvert.bindToPreference(preferences.webtoonNavInverted())
webtoonPageLayout.bindToPreference(preferences.webtoonPageLayout())
@ -94,6 +94,7 @@ class ReaderPagedView @JvmOverloads constructor(context: Context, attrs: Attribu
binding.cropBordersWebtoon,
binding.webtoonSidePadding,
binding.webtoonEnableZoomOut,
binding.webtoonEnableDoubleTapZoom,
binding.webtoonNav,
binding.webtoonInvert,
binding.webtoonPageLayout,

View file

@ -16,6 +16,7 @@ import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import yokai.domain.ui.settings.ReaderPreferences
/**
* Configuration used by webtoon viewers.
@ -23,6 +24,7 @@ import uy.kohesive.injekt.api.get
class WebtoonConfig(
scope: CoroutineScope,
preferences: PreferencesHelper = Injekt.get(),
readerPreferences: ReaderPreferences = Injekt.get(),
) : ViewerConfig(preferences, scope) {
var webtoonCropBorders = false
@ -39,6 +41,11 @@ class WebtoonConfig(
var zoomPropertyChangedListener: ((Boolean) -> Unit)? = null
var doubleTapZoom = true
private set
var doubleTapZoomChangedListener: ((Boolean) -> Unit)? = null
var splitPages = preferences.webtoonPageLayout().get() == PageLayout.SPLIT_PAGES.webtoonValue
var invertDoublePages = false
@ -79,6 +86,9 @@ class WebtoonConfig(
preferences.webtoonEnableZoomOut()
.register({ enableZoomOut = it }, { zoomPropertyChangedListener?.invoke(it) })
readerPreferences.webtoonDoubleTapZoomEnabled()
.register({ doubleTapZoom = it }, { doubleTapZoomChangedListener?.invoke(it) })
preferences.webtoonPageLayout()
.register(
{ splitPages = it == PageLayout.SPLIT_PAGES.webtoonValue },

View file

@ -31,6 +31,13 @@ class WebtoonFrame(context: Context) : FrameLayout(context) {
recycler?.canZoomOut = value
}
var doubleTapZoom = true
set(value) {
field = value
recycler?.doubleTapZoom = value
scaleDetector.isQuickScaleEnabled = value
}
/**
* Recycler view added in this frame.
*/

View file

@ -40,6 +40,7 @@ open class WebtoonRecyclerView @JvmOverloads constructor(
zoom(currentScale, DEFAULT_RATE, x, 0f, y, 0f)
}
}
var doubleTapZoom = true
private val minRate
get() = if (canZoomOut) MIN_RATE else DEFAULT_RATE
@ -231,7 +232,7 @@ open class WebtoonRecyclerView @JvmOverloads constructor(
}
fun onDoubleTapConfirmed(ev: MotionEvent) {
if (!isZooming) {
if (!isZooming && doubleTapZoom) {
if (scaleX != DEFAULT_RATE) {
zoom(currentScale, DEFAULT_RATE, x, 0f, y, 0f)
} else {

View file

@ -19,11 +19,11 @@ import eu.kanade.tachiyomi.ui.reader.model.ReaderPage
import eu.kanade.tachiyomi.ui.reader.model.ViewerChapters
import eu.kanade.tachiyomi.ui.reader.viewer.BaseViewer
import eu.kanade.tachiyomi.ui.reader.viewer.ViewerNavigation
import kotlin.math.max
import kotlin.math.min
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.cancel
import uy.kohesive.injekt.injectLazy
import kotlin.math.max
import kotlin.math.min
/**
* Implementation of a [BaseViewer] to display pages with a [RecyclerView].
@ -139,6 +139,10 @@ class WebtoonViewer(val activity: ReaderActivity, val hasMargins: Boolean = fals
frame.enableZoomOut = it
}
config.doubleTapZoomChangedListener = {
frame.doubleTapZoom = it
}
config.navigationModeChangedListener = {
val showOnStart = config.navigationOverlayForNewUser
activity.binding.navigationOverlay.setNavigation(config.navigator, showOnStart)

View file

@ -4,9 +4,6 @@ import android.content.ComponentName
import android.content.Intent
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.R
import yokai.i18n.MR
import yokai.util.lang.getString
import dev.icerock.moko.resources.compose.stringResource
import eu.kanade.tachiyomi.data.preference.PreferenceValues
import eu.kanade.tachiyomi.data.preference.changesIn
import eu.kanade.tachiyomi.ui.reader.settings.OrientationType
@ -25,9 +22,7 @@ import eu.kanade.tachiyomi.ui.setting.multiSelectListPreferenceMat
import eu.kanade.tachiyomi.ui.setting.onClick
import eu.kanade.tachiyomi.ui.setting.preference
import eu.kanade.tachiyomi.ui.setting.preferenceCategory
import eu.kanade.tachiyomi.ui.setting.summaryMRes as summaryRes
import eu.kanade.tachiyomi.ui.setting.switchPreference
import eu.kanade.tachiyomi.ui.setting.titleMRes as titleRes
import eu.kanade.tachiyomi.util.lang.addBetaTag
import eu.kanade.tachiyomi.util.system.DeviceUtil
import eu.kanade.tachiyomi.util.system.isTablet
@ -36,7 +31,11 @@ import uy.kohesive.injekt.injectLazy
import yokai.domain.ui.settings.ReaderPreferences
import yokai.domain.ui.settings.ReaderPreferences.CutoutBehaviour
import yokai.domain.ui.settings.ReaderPreferences.LandscapeCutoutBehaviour
import yokai.i18n.MR
import yokai.util.lang.getString
import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys
import eu.kanade.tachiyomi.ui.setting.summaryMRes as summaryRes
import eu.kanade.tachiyomi.ui.setting.titleMRes as titleRes
class SettingsReaderController : SettingsLegacyController() {
@ -375,15 +374,18 @@ class SettingsReaderController : SettingsLegacyController() {
}
switchPreference {
key = Keys.webtoonInvertDoublePages
bindTo(preferences.webtoonInvertDoublePages())
titleRes = MR.strings.invert_double_pages
defaultValue = false
}
switchPreference {
key = Keys.webtoonEnableZoomOut
bindTo(preferences.webtoonEnableZoomOut())
titleRes = MR.strings.enable_zoom_out
defaultValue = false
}
switchPreference {
bindTo(readerPreferences.webtoonDoubleTapZoomEnabled())
titleRes = MR.strings.pref_double_tap_zoom
}
}
preferenceCategory {

View file

@ -43,4 +43,6 @@ class ReaderPreferences(private val preferenceStore: PreferenceStore) {
}
}
}
fun webtoonDoubleTapZoomEnabled() = preferenceStore.getBoolean("pref_enable_double_tap_zoom_webtoon", true)
}

View file

@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<eu.kanade.tachiyomi.ui.reader.settings.ReaderPagedView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/filter_bottom_sheet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -153,8 +152,15 @@
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/enable_zoom_out"
android:textColor="?attr/colorOnBackground"
app:layout_constraintTop_toBottomOf="@id/webtoon_side_padding" />
android:textColor="?attr/colorOnBackground" />
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/webtoon_enable_double_tap_zoom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/pref_double_tap_zoom"
android:textColor="?attr/colorOnBackground" />
<eu.kanade.tachiyomi.widget.MaterialSpinnerView
android:id="@+id/webtoon_page_layout"

View file

@ -511,6 +511,7 @@
<string name="pref_low">Low</string>
<string name="pref_lowest">Lowest</string>
<string name="pref_display_profile">Custom display profile</string>
<string name="pref_double_tap_zoom">Double tap to zoom</string>
<!-- Manga details -->
<string name="about_this_">About this %1$s</string>