Use webtoon mode by default for webtoon galleries

This commit is contained in:
FooIbar committed 2025-10-01 21:08:28 +08:00
1 parent 31be34f551
commit 1ca960995f
8 files changed
+35 -51

No files matched your search

@@ -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)
@@ -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()
}
}
}
@@ -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
}
@@ -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()
}
@@ -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,
)
@@ -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
}
}
@@ -10,6 +10,4 @@ interface PreferenceType {
val stringRes: Int
val icon: ImageVector
val flagValue: Int
}
@@ -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
}
}