diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt
index 98234c3420..4cbca1968a 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt
@@ -71,6 +71,8 @@ object PreferenceKeys {
const val pageLayout = "page_layout"
+ const val invertDoublePages = "invert_double_pages"
+
const val showNavigationOverlayNewUser = "reader_navigation_overlay_new_user"
const val showNavigationOverlayNewUserWebtoon = "reader_navigation_overlay_new_user_webtoon"
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt
index 06aeadcb2d..4e78d1a8cd 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt
@@ -154,6 +154,8 @@ class PreferencesHelper(val context: Context) {
fun pageLayout() = flowPrefs.getInt(Keys.pageLayout, PageLayout.AUTOMATIC)
+ fun invertDoublePages() = flowPrefs.getBoolean(Keys.invertDoublePages, false)
+
fun showNavigationOverlayNewUser() = flowPrefs.getBoolean(Keys.showNavigationOverlayNewUser, true)
fun showNavigationOverlayNewUserWebtoon() = flowPrefs.getBoolean(Keys.showNavigationOverlayNewUserWebtoon, true)
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/settings/ReaderPagedView.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/settings/ReaderPagedView.kt
index d00d58c95d..6190b1d3c4 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/settings/ReaderPagedView.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/settings/ReaderPagedView.kt
@@ -3,10 +3,12 @@ package eu.kanade.tachiyomi.ui.reader.settings
import android.app.Activity
import android.content.Context
import android.util.AttributeSet
+import androidx.core.view.isVisible
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.databinding.ReaderPagedLayoutBinding
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
+import eu.kanade.tachiyomi.ui.reader.viewer.pager.PageLayout
import eu.kanade.tachiyomi.util.bindToPreference
import eu.kanade.tachiyomi.util.lang.addBetaTag
import eu.kanade.tachiyomi.util.view.visibleIf
@@ -17,34 +19,44 @@ class ReaderPagedView @JvmOverloads constructor(context: Context, attrs: Attribu
override fun inflateBinding() = ReaderPagedLayoutBinding.bind(this)
override fun initGeneralPreferences() {
- binding.scaleType.bindToPreference(preferences.imageScaleType(), 1) {
+ with(binding) {
+ scaleType.bindToPreference(preferences.imageScaleType(), 1) {
+ val mangaViewer = (context as? ReaderActivity)?.presenter?.getMangaViewer() ?: 0
+ val isWebtoonView =
+ mangaViewer == ReaderActivity.WEBTOON || mangaViewer == ReaderActivity.VERTICAL_PLUS
+ updatePagedGroup(!isWebtoonView)
+ }
+ zoomStart.bindToPreference(preferences.zoomStart(), 1)
+ cropBorders.bindToPreference(preferences.cropBorders())
+ pageTransitions.bindToPreference(preferences.pageTransitions())
+ pagerNav.bindToPreference(preferences.navigationModePager())
+ pagerInvert.bindToPreference(preferences.pagerNavInverted())
+ extendPastCutout.bindToPreference(preferences.pagerCutoutBehavior())
+ pageLayout.bindToPreference(preferences.pageLayout()) {
+ val mangaViewer = (context as? ReaderActivity)?.presenter?.getMangaViewer() ?: 0
+ val isWebtoonView =
+ mangaViewer == ReaderActivity.WEBTOON || mangaViewer == ReaderActivity.VERTICAL_PLUS
+ updatePagedGroup(!isWebtoonView)
+ }
+ invertDoublePages.bindToPreference(preferences.invertDoublePages())
+
+ pageLayout.title = pageLayout.title.toString().addBetaTag(context)
+
val mangaViewer = (context as? ReaderActivity)?.presenter?.getMangaViewer() ?: 0
- val isWebtoonView = mangaViewer == ReaderActivity.WEBTOON || mangaViewer == ReaderActivity.VERTICAL_PLUS
+ val isWebtoonView =
+ mangaViewer == ReaderActivity.WEBTOON || mangaViewer == ReaderActivity.VERTICAL_PLUS
+ val hasMargins = mangaViewer == ReaderActivity.VERTICAL_PLUS
+ cropBordersWebtoon.bindToPreference(if (hasMargins) preferences.cropBorders() else preferences.cropBordersWebtoon())
+ webtoonSidePadding.bindToIntPreference(
+ preferences.webtoonSidePadding(),
+ R.array.webtoon_side_padding_values
+ )
+ webtoonEnableZoomOut.bindToPreference(preferences.webtoonEnableZoomOut())
+ webtoonNav.bindToPreference(preferences.navigationModeWebtoon())
+ webtoonInvert.bindToPreference(preferences.webtoonNavInverted())
+
updatePagedGroup(!isWebtoonView)
}
- binding.zoomStart.bindToPreference(preferences.zoomStart(), 1)
- binding.cropBorders.bindToPreference(preferences.cropBorders())
- binding.pageTransitions.bindToPreference(preferences.pageTransitions())
- binding.pagerNav.bindToPreference(preferences.navigationModePager())
- binding.pagerInvert.bindToPreference(preferences.pagerNavInverted())
- binding.extendPastCutout.bindToPreference(preferences.pagerCutoutBehavior())
- binding.pageLayout.bindToPreference(preferences.pageLayout())
-
- binding.pageLayout.title = binding.pageLayout.title.toString().addBetaTag(context)
-
- val mangaViewer = (context as? ReaderActivity)?.presenter?.getMangaViewer() ?: 0
- val isWebtoonView = mangaViewer == ReaderActivity.WEBTOON || mangaViewer == ReaderActivity.VERTICAL_PLUS
- val hasMargins = mangaViewer == ReaderActivity.VERTICAL_PLUS
- binding.cropBordersWebtoon.bindToPreference(if (hasMargins) preferences.cropBorders() else preferences.cropBordersWebtoon())
- binding.webtoonSidePadding.bindToIntPreference(
- preferences.webtoonSidePadding(),
- R.array.webtoon_side_padding_values
- )
- binding.webtoonEnableZoomOut.bindToPreference(preferences.webtoonEnableZoomOut())
- binding.webtoonNav.bindToPreference(preferences.navigationModeWebtoon())
- binding.webtoonInvert.bindToPreference(preferences.webtoonNavInverted())
-
- updatePagedGroup(!isWebtoonView)
}
fun updatePrefs() {
@@ -84,6 +96,7 @@ class ReaderPagedView @JvmOverloads constructor(context: Context, attrs: Attribu
} else {
false
}
- binding.extendPastCutout.visibleIf(show && isFullFit && hasCutout)
+ binding.extendPastCutout.isVisible = show && isFullFit && hasCutout
+ binding.invertDoublePages.isVisible = show && preferences.pageLayout().get() != PageLayout.SINGLE_PAGE
}
}
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 f1fd44c871..c03487ab00 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
@@ -48,6 +48,8 @@ class PagerConfig(private val viewer: PagerViewer, preferences: PreferencesHelpe
}
}
+ var invertDoublePages = false
+
var autoDoublePages = preferences.pageLayout().get() == PageLayout.AUTOMATIC
init {
@@ -87,6 +89,9 @@ class PagerConfig(private val viewer: PagerViewer, preferences: PreferencesHelpe
preferences.readerTheme()
.register({ readerTheme = it }, { imagePropertyChangedListener?.invoke() })
+ preferences.invertDoublePages()
+ .register({ invertDoublePages = it }, { imagePropertyChangedListener?.invoke() })
+
preferences.pageLayout()
.asFlow()
.drop(1)
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 017fde4ba5..f857ad3f1a 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
@@ -689,7 +689,7 @@ class PagerPageHolder(
val result = Bitmap.createBitmap(width + width2, max(height, height2), Bitmap.Config.ARGB_8888)
val canvas = Canvas(result)
canvas.drawColor(if (viewer.config.readerTheme >= 2 || viewer.config.readerTheme == 0) Color.WHITE else Color.BLACK)
- val isLTR = viewer !is R2LPagerViewer
+ val isLTR = (viewer !is R2LPagerViewer).xor(viewer.config.invertDoublePages)
val upperPart = Rect(
if (isLTR) 0 else width2,
(maxHeight - imageBitmap.height) / 2,
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsReaderController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsReaderController.kt
index a6f91fe1d9..8f4a002df0 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsReaderController.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsReaderController.kt
@@ -244,6 +244,11 @@ class SettingsReaderController : SettingsController() {
infoPreference(R.string.automatic_can_still_switch).apply {
preferences.pageLayout().asImmediateFlow { isVisible = it == PageLayout.AUTOMATIC }.launchIn(viewScope)
}
+ switchPreference {
+ key = Keys.invertDoublePages
+ titleRes = R.string.invert_double_pages
+ defaultValue = false
+ }
}
preferenceCategory {
titleRes = R.string.webtoon
diff --git a/app/src/main/res/layout/reader_paged_layout.xml b/app/src/main/res/layout/reader_paged_layout.xml
index adcd858b5c..90321be092 100644
--- a/app/src/main/res/layout/reader_paged_layout.xml
+++ b/app/src/main/res/layout/reader_paged_layout.xml
@@ -64,6 +64,14 @@
app:title="@string/zoom_start_position"
android:entries="@array/zoom_start" />
+
+
The amount of pages to preload when reading. Higher values will result in a smoother reading experience, at the cost of higher cache and network usage.
Reduces banding, but impacts
performance
+ Invert double pages
Crop borders
Use custom brightness
Use custom color filter