feat: option to disable scrolling in the Reader

* Appears after enabling horizontal gesture

Resolves: #186
This commit is contained in:
Acclorite 2025-10-25 15:24:18 +03:00
parent 5ba036fafb
commit 24d3e3ba0a
No known key found for this signature in database
GPG key ID: 6E54C611F6EE8593
10 changed files with 62 additions and 3 deletions

View file

@ -4,6 +4,8 @@
* SPDX-License-Identifier: GPL-3.0-only * SPDX-License-Identifier: GPL-3.0-only
*/ */
@file:Suppress("RemoveExplicitTypeArguments")
package ua.acclorite.book_story.data.settings package ua.acclorite.book_story.data.settings
import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.Preferences
@ -82,7 +84,7 @@ class SettingsManager @Inject constructor(
} }
) )
val theme = setting<Theme, String>( val theme = setting<Theme, String>(
key = stringPreferencesKey("theme"), default = Theme.Companion.entries().first(), key = stringPreferencesKey("theme"), default = Theme.entries().first(),
serialize = { it.name }, deserialize = { Theme.valueOf(it) } serialize = { it.name }, deserialize = { Theme.valueOf(it) }
) )
val darkTheme = setting<DarkTheme, String>( val darkTheme = setting<DarkTheme, String>(
@ -205,6 +207,9 @@ class SettingsManager @Inject constructor(
val horizontalGesturePullAnim = setting<Boolean, Boolean>( val horizontalGesturePullAnim = setting<Boolean, Boolean>(
key = booleanPreferencesKey("horizontal_gesture_pull_anim"), default = true key = booleanPreferencesKey("horizontal_gesture_pull_anim"), default = true
) )
val horizontalGestureDisableScrolling = setting<Boolean, Boolean>(
key = booleanPreferencesKey("horizontal_gesture_disable_scrolling"), default = false
)
val bottomBarPadding = setting<Int, Int>( val bottomBarPadding = setting<Int, Int>(
key = intPreferencesKey("bottom_bar_padding"), default = 0 key = intPreferencesKey("bottom_bar_padding"), default = 0
) )

View file

@ -408,6 +408,7 @@ data class ReaderScreen(val bookId: Int) : Screen, Parcelable {
horizontalGestureSensitivity = horizontalGestureSensitivity, horizontalGestureSensitivity = horizontalGestureSensitivity,
horizontalGestureAlphaAnim = settings.horizontalGestureAlphaAnim.value, horizontalGestureAlphaAnim = settings.horizontalGestureAlphaAnim.value,
horizontalGesturePullAnim = settings.horizontalGesturePullAnim.value, horizontalGesturePullAnim = settings.horizontalGesturePullAnim.value,
horizontalGestureDisableScrolling = settings.horizontalGestureDisableScrolling.value,
highlightedReading = settings.highlightedReading.value, highlightedReading = settings.highlightedReading.value,
highlightedReadingThickness = highlightedReadingThickness, highlightedReadingThickness = highlightedReadingThickness,
progress = progress, progress = progress,

View file

@ -29,8 +29,9 @@ fun LazyColumnWithScrollbar(
state: LazyListState = rememberLazyListState(), state: LazyListState = rememberLazyListState(),
scrollbarSettings: ScrollbarSettings = ScrollbarData.secondaryScrollbar, scrollbarSettings: ScrollbarSettings = ScrollbarData.secondaryScrollbar,
enableScrollbar: Boolean = true, enableScrollbar: Boolean = true,
contentPadding: PaddingValues = PaddingValues(0.dp),
verticalArrangement: Arrangement.Vertical = Arrangement.Top, verticalArrangement: Arrangement.Vertical = Arrangement.Top,
contentPadding: PaddingValues = PaddingValues(0.dp),
userScrollEnabled: Boolean = true,
content: LazyListScope.() -> Unit content: LazyListScope.() -> Unit
) { ) {
val enabled = remember { val enabled = remember {
@ -44,7 +45,8 @@ fun LazyColumnWithScrollbar(
modifier = modifier, modifier = modifier,
state = state, state = state,
verticalArrangement = verticalArrangement, verticalArrangement = verticalArrangement,
contentPadding = contentPadding contentPadding = contentPadding,
userScrollEnabled = userScrollEnabled
) { ) {
content() content()
} }

View file

@ -59,6 +59,7 @@ fun ReaderContent(
horizontalGestureSensitivity: Dp, horizontalGestureSensitivity: Dp,
horizontalGestureAlphaAnim: Boolean, horizontalGestureAlphaAnim: Boolean,
horizontalGesturePullAnim: Boolean, horizontalGesturePullAnim: Boolean,
horizontalGestureDisableScrolling: Boolean,
highlightedReading: Boolean, highlightedReading: Boolean,
highlightedReadingThickness: FontWeight, highlightedReadingThickness: FontWeight,
progress: String, progress: String,
@ -135,6 +136,7 @@ fun ReaderContent(
horizontalGestureSensitivity = horizontalGestureSensitivity, horizontalGestureSensitivity = horizontalGestureSensitivity,
horizontalGestureAlphaAnim = horizontalGestureAlphaAnim, horizontalGestureAlphaAnim = horizontalGestureAlphaAnim,
horizontalGesturePullAnim = horizontalGesturePullAnim, horizontalGesturePullAnim = horizontalGesturePullAnim,
horizontalGestureDisableScrolling = horizontalGestureDisableScrolling,
highlightedReading = highlightedReading, highlightedReading = highlightedReading,
highlightedReadingThickness = highlightedReadingThickness, highlightedReadingThickness = highlightedReadingThickness,
progress = progress, progress = progress,

View file

@ -59,6 +59,7 @@ fun ReaderLayout(
horizontalGestureSensitivity: Dp, horizontalGestureSensitivity: Dp,
horizontalGestureAlphaAnim: Boolean, horizontalGestureAlphaAnim: Boolean,
horizontalGesturePullAnim: Boolean, horizontalGesturePullAnim: Boolean,
horizontalGestureDisableScrolling: Boolean,
highlightedReading: Boolean, highlightedReading: Boolean,
highlightedReadingThickness: FontWeight, highlightedReadingThickness: FontWeight,
progress: String, progress: String,
@ -168,6 +169,7 @@ fun ReaderLayout(
enableScrollbar = false, enableScrollbar = false,
parentModifier = Modifier.weight(1f), parentModifier = Modifier.weight(1f),
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
userScrollEnabled = !horizontalGestureDisableScrolling,
contentPadding = PaddingValues( contentPadding = PaddingValues(
top = (WindowInsets.displayCutout.asPaddingValues() top = (WindowInsets.displayCutout.asPaddingValues()
.calculateTopPadding() + paragraphHeight) .calculateTopPadding() + paragraphHeight)

View file

@ -63,6 +63,7 @@ fun ReaderScaffold(
horizontalGestureSensitivity: Dp, horizontalGestureSensitivity: Dp,
horizontalGestureAlphaAnim: Boolean, horizontalGestureAlphaAnim: Boolean,
horizontalGesturePullAnim: Boolean, horizontalGesturePullAnim: Boolean,
horizontalGestureDisableScrolling: Boolean,
highlightedReading: Boolean, highlightedReading: Boolean,
highlightedReadingThickness: FontWeight, highlightedReadingThickness: FontWeight,
progress: String, progress: String,
@ -166,6 +167,7 @@ fun ReaderScaffold(
horizontalGestureSensitivity = horizontalGestureSensitivity, horizontalGestureSensitivity = horizontalGestureSensitivity,
horizontalGestureAlphaAnim = horizontalGestureAlphaAnim, horizontalGestureAlphaAnim = horizontalGestureAlphaAnim,
horizontalGesturePullAnim = horizontalGesturePullAnim, horizontalGesturePullAnim = horizontalGesturePullAnim,
horizontalGestureDisableScrolling = horizontalGestureDisableScrolling,
highlightedReading = highlightedReading, highlightedReading = highlightedReading,
highlightedReadingThickness = highlightedReadingThickness, highlightedReadingThickness = highlightedReadingThickness,
progress = progress, progress = progress,

View file

@ -16,6 +16,7 @@ import androidx.compose.ui.res.stringResource
import ua.acclorite.book_story.R import ua.acclorite.book_story.R
import ua.acclorite.book_story.ui.settings.components.SettingsSubcategory import ua.acclorite.book_story.ui.settings.components.SettingsSubcategory
import ua.acclorite.book_story.ui.settings.reader.reading_mode.components.HorizontalGestureAlphaAnimOption import ua.acclorite.book_story.ui.settings.reader.reading_mode.components.HorizontalGestureAlphaAnimOption
import ua.acclorite.book_story.ui.settings.reader.reading_mode.components.HorizontalGestureDisableScrollingOption
import ua.acclorite.book_story.ui.settings.reader.reading_mode.components.HorizontalGestureOption import ua.acclorite.book_story.ui.settings.reader.reading_mode.components.HorizontalGestureOption
import ua.acclorite.book_story.ui.settings.reader.reading_mode.components.HorizontalGesturePullAnimOption import ua.acclorite.book_story.ui.settings.reader.reading_mode.components.HorizontalGesturePullAnimOption
import ua.acclorite.book_story.ui.settings.reader.reading_mode.components.HorizontalGestureScrollOption import ua.acclorite.book_story.ui.settings.reader.reading_mode.components.HorizontalGestureScrollOption
@ -52,5 +53,9 @@ fun LazyListScope.ReadingModeSubcategory(
item { item {
HorizontalGestureAlphaAnimOption() HorizontalGestureAlphaAnimOption()
} }
item {
HorizontalGestureDisableScrollingOption()
}
} }
} }

View file

@ -0,0 +1,36 @@
/*
* Book's Story free and open-source Material You eBook reader.
* Copyright (C) 2024-2025 Acclorite
* SPDX-License-Identifier: GPL-3.0-only
*/
package ua.acclorite.book_story.ui.settings.reader.reading_mode.components
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import ua.acclorite.book_story.R
import ua.acclorite.book_story.presentation.reader.model.ReaderHorizontalGesture
import ua.acclorite.book_story.ui.common.components.settings.SwitchWithTitle
import ua.acclorite.book_story.ui.common.helpers.LocalSettings
import ua.acclorite.book_story.ui.theme.ExpandingTransition
@Composable
fun HorizontalGestureDisableScrollingOption() {
val settings = LocalSettings.current
ExpandingTransition(
visible = when (settings.horizontalGesture.value) {
ReaderHorizontalGesture.OFF -> false
else -> true
}
) {
SwitchWithTitle(
selected = settings.horizontalGestureDisableScrolling.value,
title = stringResource(id = R.string.horizontal_gesture_disable_scrolling_option),
description = stringResource(id = R.string.horizontal_gesture_disable_scrolling_option_desc),
onClick = {
settings.horizontalGestureDisableScrolling.update(!settings.horizontalGestureDisableScrolling.lastValue)
}
)
}
}

View file

@ -211,6 +211,8 @@
<string name="horizontal_gesture_pull_anim_option_desc"> <string name="horizontal_gesture_pull_anim_option_desc">
Увімкнути анімацію тягнення під час використання горизонтального жесту Увімкнути анімацію тягнення під час використання горизонтального жесту
</string> </string>
<string name="horizontal_gesture_disable_scrolling_option">Вимкнути гортання</string>
<string name="horizontal_gesture_disable_scrolling_option_desc">Повністю вимкнути гортання читача</string>
<string name="bottom_bar_padding_option">Відступ нижньої панелі</string> <string name="bottom_bar_padding_option">Відступ нижньої панелі</string>
<string name="highlighted_reading_option">Підсвічування слів</string> <string name="highlighted_reading_option">Підсвічування слів</string>
<string name="highlighted_reading_option_desc">Підсвічувати початок кожного слова</string> <string name="highlighted_reading_option_desc">Підсвічувати початок кожного слова</string>

View file

@ -235,6 +235,8 @@
<string name="horizontal_gesture_pull_anim_option_desc"> <string name="horizontal_gesture_pull_anim_option_desc">
Enable pull animation when using horizontal gesture Enable pull animation when using horizontal gesture
</string> </string>
<string name="horizontal_gesture_disable_scrolling_option">Disable scrolling</string>
<string name="horizontal_gesture_disable_scrolling_option_desc">Completely disable reader scrolling</string>
<string name="bottom_bar_padding_option">Bottom bar margin</string> <string name="bottom_bar_padding_option">Bottom bar margin</string>
<string name="highlighted_reading_option">Highlight words</string> <string name="highlighted_reading_option">Highlight words</string>
<string name="highlighted_reading_option_desc">Highlight the beginning of each word</string> <string name="highlighted_reading_option_desc">Highlight the beginning of each word</string>