From 1ca960995fed8e33d269dd2c029077c23fae7bec Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Wed, 1 Oct 2025 18:07:35 +0800 Subject: [PATCH] Use webtoon mode by default for webtoon galleries --- .../kotlin/com/hippo/ehviewer/Settings.kt | 4 ++-- .../ehviewer/ui/reader/ReaderModeSetting.kt | 16 ++++--------- .../hippo/ehviewer/ui/reader/ReaderScreen.kt | 11 +++++++-- .../hippo/ehviewer/ui/reader/SettingsPager.kt | 4 ++-- .../tachiyomi/ui/reader/BottomReaderBar.kt | 4 ++-- .../ui/reader/setting/OrientationType.kt | 21 +++++++--------- .../ui/reader/setting/PreferenceType.kt | 2 -- .../ui/reader/setting/ReadingModeType.kt | 24 ++++++------------- 8 files changed, 35 insertions(+), 51 deletions(-) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt b/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt index 515d7ff38..4fd4e7376 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt @@ -158,8 +158,8 @@ object Settings : DataStorePreferences(null) { val colorFilterMode = intPref("color_filter_mode", 0) val customBrightness = boolPref("pref_custom_brightness_key", false) val customBrightnessValue = intPref("custom_brightness_value", 0) - val readingMode = intPref("pref_default_reading_mode_key", ReadingModeType.LEFT_TO_RIGHT.flagValue) - val orientationMode = intPref("pref_default_orientation_type_key", OrientationType.FREE.flagValue) + val readingMode = intPref("pref_default_reading_mode_key", ReadingModeType.DEFAULT.prefValue) + val orientationMode = intPref("pref_default_orientation_type_key", OrientationType.DEFAULT.prefValue) val showReaderSeekbar = boolPref("pref_show_reader_seekbar", true) val showPageNumber = boolPref("pref_show_page_number_key", true) val readerTheme = intPref("pref_reader_theme_key", 1) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderModeSetting.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderModeSetting.kt index ee34dd9d6..1f601402a 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderModeSetting.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderModeSetting.kt @@ -12,7 +12,6 @@ import androidx.compose.foundation.verticalScroll import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringArrayResource import androidx.compose.ui.res.stringResource @@ -20,11 +19,9 @@ import androidx.compose.ui.unit.dp import com.ehviewer.core.i18n.R import com.hippo.ehviewer.Settings import com.hippo.ehviewer.asMutableState -import com.hippo.ehviewer.collectAsState -import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType @Composable -fun ReaderModeSetting() = Column(modifier = Modifier.verticalScroll(rememberScrollState()).navigationBarsPadding()) { +fun ReaderModeSetting(isWebtoon: Boolean) = Column(modifier = Modifier.verticalScroll(rememberScrollState()).navigationBarsPadding()) { SpinnerChoice( title = stringResource(id = R.string.pref_category_reading_mode), entries = stringArrayResource(id = com.hippo.ehviewer.R.array.viewers_selector), @@ -38,14 +35,11 @@ fun ReaderModeSetting() = Column(modifier = Modifier.verticalScroll(rememberScro field = Settings.orientationMode.asMutableState(), ) Spacer(modifier = Modifier.size(16.dp)) - val isPager by Settings.readingMode.collectAsState { value -> - ReadingModeType.isPagerType(value) - } - Crossfade(targetState = isPager, label = "Pager") { pager -> - if (pager) { - PagerSetting() - } else { + Crossfade(targetState = isWebtoon, label = "Setting") { webtoon -> + if (webtoon) { WebtoonSetting() + } else { + PagerSetting() } } } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderScreen.kt index 6e5322c1b..d9f37b160 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderScreen.kt @@ -199,8 +199,15 @@ fun ReaderScreen(pageLoader: PageLoader, info: BaseGalleryInfo?) { } } } + val defaultToWebtoon = remember(info) { + // Tags in database may or may not have the prefix "other:" + info?.simpleTags?.any { it.endsWith("webtoon") } == true + } val showSeekbar by Settings.showReaderSeekbar.collectAsState() - val readingMode by Settings.readingMode.collectAsState { ReadingModeType.fromPreference(it) } + val readingMode by Settings.readingMode.collectAsState { + val mode = ReadingModeType.fromPreference(it) + if (mode == ReadingModeType.DEFAULT && defaultToWebtoon) ReadingModeType.WEBTOON else mode + } val volumeKeysEnabled by Settings.readWithVolumeKeys.collectAsState() val volumeKeysInverted by Settings.readWithVolumeKeysInverted.collectAsState() val fullscreen by Settings.fullscreen.collectAsState() @@ -366,7 +373,7 @@ fun ReaderScreen(pageLoader: PageLoader, info: BaseGalleryInfo?) { dragHandle = null, contentWindowInsets = { WindowInsets() }, ) { - SettingsPager(modifier = Modifier.fillMaxSize()) { page -> + SettingsPager(isWebtoon = isWebtoon, modifier = Modifier.fillMaxSize()) { page -> isColorFilter = page == 2 appbarVisible = !isColorFilter } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/SettingsPager.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/SettingsPager.kt index af49e214d..197fbc668 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/SettingsPager.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/SettingsPager.kt @@ -25,7 +25,7 @@ private val tabs = intArrayOf( ) @Composable -fun SettingsPager(modifier: Modifier = Modifier, onPageSelected: (Int) -> Unit) { +fun SettingsPager(isWebtoon: Boolean, modifier: Modifier = Modifier, onPageSelected: (Int) -> Unit) { val pagerState = rememberPagerState { tabs.size } LaunchedEffect(onPageSelected) { snapshotFlow { pagerState.currentPage }.collect { page -> @@ -53,7 +53,7 @@ fun SettingsPager(modifier: Modifier = Modifier, onPageSelected: (Int) -> Unit) ) { page -> ProvideTextStyle(value = MaterialTheme.typography.labelLarge) { when (page) { - 0 -> ReaderModeSetting() + 0 -> ReaderModeSetting(isWebtoon) 1 -> ReaderGeneralSetting() 2 -> ColorFilterSetting() } diff --git a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/BottomReaderBar.kt b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/BottomReaderBar.kt index 796191a5e..adc5c82af 100644 --- a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/BottomReaderBar.kt +++ b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/BottomReaderBar.kt @@ -49,7 +49,7 @@ fun BottomReaderBar(onClickSettings: () -> Unit, containerColor: Color) = Flexib menuItems = ReadingModeType.entries, selectedItem = readingMode, onSelectedItemChange = { - Settings.readingMode.value = it.flagValue + Settings.readingMode.value = it.prefValue }, minMenuWidth = 192.dp, ) @@ -59,7 +59,7 @@ fun BottomReaderBar(onClickSettings: () -> Unit, containerColor: Color) = Flexib menuItems = OrientationType.entries, selectedItem = orientationMode, onSelectedItemChange = { - Settings.orientationMode.value = it.flagValue + Settings.orientationMode.value = it.prefValue }, minMenuWidth = 192.dp, ) diff --git a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/setting/OrientationType.kt b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/setting/OrientationType.kt index 5475d44a6..e3f2f2989 100644 --- a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/setting/OrientationType.kt +++ b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/setting/OrientationType.kt @@ -15,22 +15,17 @@ enum class OrientationType( val flag: Int, override val stringRes: Int, override val icon: ImageVector, - override val flagValue: Int, ) : PreferenceType { - DEFAULT(0, ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED, R.string.label_default, EhIcons.Reader.ScreenRotation, 0x00000000), - FREE(1, ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED, R.string.rotation_free, EhIcons.Reader.ScreenRotation, 0x00000008), - PORTRAIT(2, ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT, R.string.rotation_portrait, EhIcons.Reader.Portrait, 0x00000010), - LANDSCAPE(3, ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE, R.string.rotation_landscape, EhIcons.Reader.Landscape, 0x00000018), - LOCKED_PORTRAIT(4, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT, R.string.rotation_force_portrait, EhIcons.Reader.PortraitLocked, 0x00000020), - LOCKED_LANDSCAPE(5, ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE, R.string.rotation_force_landscape, EhIcons.Reader.LandscapeLocked, 0x00000028), - REVERSE_PORTRAIT(6, ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT, R.string.rotation_reverse_portrait, EhIcons.Reader.Portrait, 0x00000030), + DEFAULT(0, ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED, R.string.label_default, EhIcons.Reader.ScreenRotation), + FREE(1, ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED, R.string.rotation_free, EhIcons.Reader.ScreenRotation), + PORTRAIT(2, ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT, R.string.rotation_portrait, EhIcons.Reader.Portrait), + LANDSCAPE(3, ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE, R.string.rotation_landscape, EhIcons.Reader.Landscape), + LOCKED_PORTRAIT(4, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT, R.string.rotation_force_portrait, EhIcons.Reader.PortraitLocked), + LOCKED_LANDSCAPE(5, ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE, R.string.rotation_force_landscape, EhIcons.Reader.LandscapeLocked), + REVERSE_PORTRAIT(6, ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT, R.string.rotation_reverse_portrait, EhIcons.Reader.Portrait), ; companion object { - const val MASK = 0x00000038 - - fun fromPreference(preference: Int?): OrientationType = entries.find { it.flagValue == preference } ?: FREE - - fun fromSpinner(position: Int?) = entries.find { value -> value.prefValue == position } ?: DEFAULT + fun fromPreference(preference: Int): OrientationType = entries.find { it.prefValue == preference } ?: DEFAULT } } diff --git a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/setting/PreferenceType.kt b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/setting/PreferenceType.kt index 93c25fb07..f3d4f2bf9 100644 --- a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/setting/PreferenceType.kt +++ b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/setting/PreferenceType.kt @@ -10,6 +10,4 @@ interface PreferenceType { val stringRes: Int val icon: ImageVector - - val flagValue: Int } diff --git a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/setting/ReadingModeType.kt b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/setting/ReadingModeType.kt index f8ae41a80..7015864a8 100644 --- a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/setting/ReadingModeType.kt +++ b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/setting/ReadingModeType.kt @@ -16,14 +16,13 @@ enum class ReadingModeType( override val prefValue: Int, override val stringRes: Int, override val icon: ImageVector, - override val flagValue: Int, ) : PreferenceType { - DEFAULT(0, R.string.label_default, EhIcons.Reader.Default, 0x00000000), - LEFT_TO_RIGHT(1, R.string.left_to_right_viewer, EhIcons.Reader.LeftToRight, 0x00000001), - RIGHT_TO_LEFT(2, R.string.right_to_left_viewer, EhIcons.Reader.RightToLeft, 0x00000002), - VERTICAL(3, R.string.vertical_viewer, EhIcons.Reader.Vertical, 0x00000003), - WEBTOON(4, R.string.webtoon_viewer, EhIcons.Reader.Webtoon, 0x00000004), - CONTINUOUS_VERTICAL(5, R.string.vertical_plus_viewer, EhIcons.Reader.ContinuousVertical, 0x00000005), + DEFAULT(0, R.string.label_default, EhIcons.Reader.Default), + LEFT_TO_RIGHT(1, R.string.left_to_right_viewer, EhIcons.Reader.LeftToRight), + RIGHT_TO_LEFT(2, R.string.right_to_left_viewer, EhIcons.Reader.RightToLeft), + VERTICAL(3, R.string.vertical_viewer, EhIcons.Reader.Vertical), + WEBTOON(4, R.string.webtoon_viewer, EhIcons.Reader.Webtoon), + CONTINUOUS_VERTICAL(5, R.string.vertical_plus_viewer, EhIcons.Reader.ContinuousVertical), ; companion object { @@ -38,15 +37,6 @@ enum class ReadingModeType( VERTICAL, WEBTOON, CONTINUOUS_VERTICAL -> true } - const val MASK = 0x00000007 - - fun fromPreference(preference: Int?): ReadingModeType = entries.find { it.flagValue == preference } ?: DEFAULT - - fun isPagerType(preference: Int): Boolean { - val mode = fromPreference(preference) - return mode == LEFT_TO_RIGHT || mode == RIGHT_TO_LEFT || mode == VERTICAL || mode == DEFAULT - } - - fun fromSpinner(position: Int?) = entries.find { value -> value.prefValue == position } ?: DEFAULT + fun fromPreference(preference: Int): ReadingModeType = entries.find { it.prefValue == preference } ?: DEFAULT } }