From 499e5dae7f41cde07b09fce9c25c72bb9c922d4e Mon Sep 17 00:00:00 2001 From: Acclorite <140836141+Acclorite@users.noreply.github.com> Date: Sat, 11 Jan 2025 20:58:29 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=80=20Progress=20bar=20in=20Reader?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added compact progress bar that always shows current progress Resolves: #148 --- .../components/common/SelectionContainer.kt | 4 +- .../core/constants/DataStoreConstants.kt | 1 + .../presentation/reader/ReaderBottomBar.kt | 24 +--- .../presentation/reader/ReaderContent.kt | 4 + .../presentation/reader/ReaderLayout.kt | 126 +++++++++++------- .../presentation/reader/ReaderProgressBar.kt | 36 +++++ .../presentation/reader/ReaderScaffold.kt | 7 +- .../reader/ReaderSettingsBottomSheet.kt | 4 + .../settings/reader/ReaderSettingsCategory.kt | 4 + .../reader/progress/ProgressSubcategory.kt | 30 +++++ .../progress/components/ProgressBarOption.kt | 28 ++++ .../acclorite/book_story/ui/main/MainEvent.kt | 1 + .../acclorite/book_story/ui/main/MainModel.kt | 8 ++ .../acclorite/book_story/ui/main/MainState.kt | 5 + .../book_story/ui/reader/ReaderScreen.kt | 23 ++++ app/src/main/res/values-uk/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + 17 files changed, 231 insertions(+), 78 deletions(-) create mode 100644 app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderProgressBar.kt create mode 100644 app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/progress/ProgressSubcategory.kt create mode 100644 app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/progress/components/ProgressBarOption.kt diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/core/components/common/SelectionContainer.kt b/app/src/main/java/ua/acclorite/book_story/presentation/core/components/common/SelectionContainer.kt index dc8f5aa0..acc56d2d 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/core/components/common/SelectionContainer.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/core/components/common/SelectionContainer.kt @@ -9,7 +9,6 @@ import android.view.ActionMode import android.view.Menu import android.view.MenuItem import android.view.View -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider @@ -18,7 +17,6 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Rect import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalTextToolbar @@ -295,7 +293,7 @@ fun SelectionContainer( CompositionLocalProvider( LocalTextToolbar provides selectionToolbar ) { - SelectionContainer(Modifier.fillMaxSize()) { + SelectionContainer { content(isToolbarHidden.value) } } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/DataStoreConstants.kt b/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/DataStoreConstants.kt index 8e4a6c80..539005c2 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/DataStoreConstants.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/DataStoreConstants.kt @@ -53,6 +53,7 @@ object DataStoreConstants { val IMAGES_ALIGNMENT = stringPreferencesKey("images_alignment") val IMAGES_WIDTH = doublePreferencesKey("images_width") val IMAGES_COLOR_EFFECTS = stringPreferencesKey("images_color_effects") + val PROGRESS_BAR = booleanPreferencesKey("progress_bar") // Browse settings val BROWSE_FILES_STRUCTURE = stringPreferencesKey("browse_files_structure") diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderBottomBar.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderBottomBar.kt index 2d96408a..540bc4de 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderBottomBar.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderBottomBar.kt @@ -28,10 +28,8 @@ import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.library.book.Book import ua.acclorite.book_story.domain.reader.Checkpoint import ua.acclorite.book_story.domain.reader.ReaderText -import ua.acclorite.book_story.domain.reader.ReaderText.Chapter import ua.acclorite.book_story.domain.util.Direction import ua.acclorite.book_story.presentation.core.components.common.IconButton -import ua.acclorite.book_story.presentation.core.util.calculateProgress import ua.acclorite.book_story.presentation.core.util.noRippleClickable import ua.acclorite.book_story.ui.reader.ReaderEvent import ua.acclorite.book_story.ui.theme.Colors @@ -40,34 +38,16 @@ import ua.acclorite.book_story.ui.theme.HorizontalExpandingTransition @Composable fun ReaderBottomBar( book: Book, + progress: String, text: List, listState: LazyListState, lockMenu: Boolean, - currentChapter: Chapter?, - currentChapterProgress: Float, checkpoint: Checkpoint, bottomBarPadding: Dp, restoreCheckpoint: (ReaderEvent.OnRestoreCheckpoint) -> Unit, scroll: (ReaderEvent.OnScroll) -> Unit, changeProgress: (ReaderEvent.OnChangeProgress) -> Unit ) { - val bookProgress = remember(book.progress) { - derivedStateOf { - "${book.progress.calculateProgress(2)}%" - } - } - val chapterProgress = remember(currentChapter, currentChapterProgress) { - derivedStateOf { - if (currentChapter == null) return@derivedStateOf "" - " (${currentChapterProgress.calculateProgress(2)}%)" - } - } - val progress = remember(bookProgress.value, chapterProgress.value) { - derivedStateOf { - "${bookProgress.value}${chapterProgress.value}" - } - } - val arrowDirection = remember(checkpoint.index, listState.firstVisibleItemIndex) { derivedStateOf { val checkpointIndex = checkpoint.index @@ -99,7 +79,7 @@ fun ReaderBottomBar( Spacer(Modifier.height(16.dp)) Text( - text = progress.value, + text = progress, color = MaterialTheme.colorScheme.onSurface, style = MaterialTheme.typography.titleLarge ) diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderContent.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderContent.kt index c2c4e6b9..868d3863 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderContent.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderContent.kt @@ -52,6 +52,8 @@ fun ReaderContent( horizontalGestureSensitivity: Dp, highlightedReading: Boolean, highlightedReadingThickness: FontWeight, + progress: String, + progressBar: Boolean, paragraphHeight: Dp, sidePadding: Dp, bottomBarPadding: Dp, @@ -122,6 +124,8 @@ fun ReaderContent( horizontalGestureSensitivity = horizontalGestureSensitivity, highlightedReading = highlightedReading, highlightedReadingThickness = highlightedReadingThickness, + progress = progress, + progressBar = progressBar, paragraphHeight = paragraphHeight, sidePadding = sidePadding, bottomBarPadding = bottomBarPadding, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLayout.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLayout.kt index a9d97380..af8c6321 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLayout.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLayout.kt @@ -1,7 +1,12 @@ package ua.acclorite.book_story.presentation.reader import android.os.Build +import androidx.compose.animation.expandVertically +import androidx.compose.animation.shrinkVertically +import androidx.compose.animation.slideInVertically +import androidx.compose.animation.slideOutVertically import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.asPaddingValues @@ -27,6 +32,7 @@ import ua.acclorite.book_story.domain.reader.ReaderHorizontalGesture import ua.acclorite.book_story.domain.reader.ReaderImagesAlignment import ua.acclorite.book_story.domain.reader.ReaderText import ua.acclorite.book_story.domain.reader.ReaderTextAlignment +import ua.acclorite.book_story.presentation.core.components.common.AnimatedVisibility import ua.acclorite.book_story.presentation.core.components.common.LazyColumnWithScrollbar import ua.acclorite.book_story.presentation.core.components.common.SelectionContainer import ua.acclorite.book_story.presentation.core.components.common.SpacedItem @@ -46,6 +52,8 @@ fun ReaderLayout( horizontalGestureSensitivity: Dp, highlightedReading: Boolean, highlightedReadingThickness: FontWeight, + progress: String, + progressBar: Boolean, paragraphHeight: Dp, sidePadding: Dp, backgroundColor: Color, @@ -116,10 +124,8 @@ fun ReaderLayout( ) } ) { toolbarHidden -> - LazyColumnWithScrollbar( - state = listState, - enableScrollbar = false, - modifier = Modifier + Column( + Modifier .fillMaxSize() .background(backgroundColor) .then( @@ -146,58 +152,76 @@ fun ReaderLayout( horizontalGestureScroll = horizontalGestureScroll, horizontalGestureSensitivity = horizontalGestureSensitivity, isLoading = isLoading - ), - contentPadding = PaddingValues( - top = (WindowInsets.displayCutout.asPaddingValues() - .calculateTopPadding() + paragraphHeight) - .coerceAtLeast(18.dp), - bottom = (WindowInsets.displayCutout.asPaddingValues() - .calculateBottomPadding() + paragraphHeight) - .coerceAtLeast(18.dp), - ) + ) ) { - itemsIndexed( - text, - key = { index, entry -> index } - ) { index, entry -> - when { - !images && entry is ReaderText.Image -> return@itemsIndexed - else -> { - SpacedItem( - index = index, - spacing = paragraphHeight - ) { - ReaderLayoutText( - activity = activity, - showMenu = showMenu, - entry = entry, - imagesCornersRoundness = imagesCornersRoundness, - imagesAlignment = imagesAlignment, - imagesWidth = imagesWidth, - imagesColorEffects = imagesColorEffects, - fontFamily = fontFamily, - fontColor = fontColor, - lineHeight = lineHeight, - fontStyle = fontStyle, - chapterTitleAlignment = chapterTitleAlignment, - textAlignment = textAlignment, - horizontalAlignment = horizontalAlignment, - fontSize = fontSize, - letterSpacing = letterSpacing, - sidePadding = sidePadding, - paragraphIndentation = paragraphIndentation, - fullscreenMode = fullscreenMode, - doubleClickTranslation = doubleClickTranslation, - highlightedReading = highlightedReading, - highlightedReadingThickness = highlightedReadingThickness, - toolbarHidden = toolbarHidden, - openTranslator = openTranslator, - menuVisibility = menuVisibility - ) + LazyColumnWithScrollbar( + state = listState, + enableScrollbar = false, + parentModifier = Modifier.weight(1f), + modifier = Modifier.fillMaxSize(), + contentPadding = PaddingValues( + top = (WindowInsets.displayCutout.asPaddingValues() + .calculateTopPadding() + paragraphHeight) + .coerceAtLeast(18.dp), + bottom = (WindowInsets.displayCutout.asPaddingValues() + .calculateBottomPadding() + paragraphHeight) + .coerceAtLeast(18.dp), + ) + ) { + itemsIndexed( + text, + key = { index, entry -> index } + ) { index, entry -> + when { + !images && entry is ReaderText.Image -> return@itemsIndexed + else -> { + SpacedItem( + index = index, + spacing = paragraphHeight + ) { + ReaderLayoutText( + activity = activity, + showMenu = showMenu, + entry = entry, + imagesCornersRoundness = imagesCornersRoundness, + imagesAlignment = imagesAlignment, + imagesWidth = imagesWidth, + imagesColorEffects = imagesColorEffects, + fontFamily = fontFamily, + fontColor = fontColor, + lineHeight = lineHeight, + fontStyle = fontStyle, + chapterTitleAlignment = chapterTitleAlignment, + textAlignment = textAlignment, + horizontalAlignment = horizontalAlignment, + fontSize = fontSize, + letterSpacing = letterSpacing, + sidePadding = sidePadding, + paragraphIndentation = paragraphIndentation, + fullscreenMode = fullscreenMode, + doubleClickTranslation = doubleClickTranslation, + highlightedReading = highlightedReading, + highlightedReadingThickness = highlightedReadingThickness, + toolbarHidden = toolbarHidden, + openTranslator = openTranslator, + menuVisibility = menuVisibility + ) + } } } } } + + AnimatedVisibility( + visible = !showMenu && progressBar, + enter = slideInVertically { it } + expandVertically(), + exit = slideOutVertically { it } + shrinkVertically() + ) { + ReaderProgressBar( + progress = progress, + fontColor = fontColor + ) + } } } } \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderProgressBar.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderProgressBar.kt new file mode 100644 index 00000000..312fa218 --- /dev/null +++ b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderProgressBar.kt @@ -0,0 +1,36 @@ +package ua.acclorite.book_story.presentation.reader + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.text.selection.DisableSelection +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp + +@Composable +fun ReaderProgressBar( + progress: String, + fontColor: Color +) { + Box( + Modifier + .fillMaxWidth() + .padding(14.dp), + contentAlignment = Alignment.Center + ) { + DisableSelection { + Text( + progress, + style = MaterialTheme.typography.bodyLarge, + color = fontColor, + overflow = TextOverflow.Ellipsis + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderScaffold.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderScaffold.kt index 0db920b1..c48aeba7 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderScaffold.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderScaffold.kt @@ -56,6 +56,8 @@ fun ReaderScaffold( horizontalGestureSensitivity: Dp, highlightedReading: Boolean, highlightedReadingThickness: FontWeight, + progress: String, + progressBar: Boolean, paragraphHeight: Dp, sidePadding: Dp, bottomBarPadding: Dp, @@ -130,11 +132,10 @@ fun ReaderScaffold( ) { ReaderBottomBar( book = book, + progress = progress, text = text, listState = listState, lockMenu = lockMenu, - currentChapter = currentChapter, - currentChapterProgress = currentChapterProgress, checkpoint = checkpoint, bottomBarPadding = bottomBarPadding, restoreCheckpoint = restoreCheckpoint, @@ -154,6 +155,8 @@ fun ReaderScaffold( horizontalGestureSensitivity = horizontalGestureSensitivity, highlightedReading = highlightedReading, highlightedReadingThickness = highlightedReadingThickness, + progress = progress, + progressBar = progressBar, paragraphHeight = paragraphHeight, sidePadding = sidePadding, backgroundColor = backgroundColor, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderSettingsBottomSheet.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderSettingsBottomSheet.kt index fffd4839..cc970dd4 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderSettingsBottomSheet.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderSettingsBottomSheet.kt @@ -28,6 +28,7 @@ import ua.acclorite.book_story.presentation.settings.reader.font.FontSubcategory import ua.acclorite.book_story.presentation.settings.reader.images.ImagesSubcategory import ua.acclorite.book_story.presentation.settings.reader.misc.MiscSubcategory import ua.acclorite.book_story.presentation.settings.reader.padding.PaddingSubcategory +import ua.acclorite.book_story.presentation.settings.reader.progress.ProgressSubcategory import ua.acclorite.book_story.presentation.settings.reader.reading_mode.ReadingModeSubcategory import ua.acclorite.book_story.presentation.settings.reader.reading_speed.ReadingSpeedSubcategory import ua.acclorite.book_story.presentation.settings.reader.system.SystemSubcategory @@ -128,6 +129,9 @@ fun ReaderSettingsBottomSheet( ChaptersSubcategory( titleColor = { MaterialTheme.colorScheme.onSurface } ) + ProgressSubcategory( + titleColor = { MaterialTheme.colorScheme.onSurface } + ) TranslatorSubcategory( titleColor = { MaterialTheme.colorScheme.onSurface }, showDivider = false diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/ReaderSettingsCategory.kt b/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/ReaderSettingsCategory.kt index 850af2ba..cd51f8df 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/ReaderSettingsCategory.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/ReaderSettingsCategory.kt @@ -11,6 +11,7 @@ import ua.acclorite.book_story.presentation.settings.reader.font.FontSubcategory import ua.acclorite.book_story.presentation.settings.reader.images.ImagesSubcategory import ua.acclorite.book_story.presentation.settings.reader.misc.MiscSubcategory import ua.acclorite.book_story.presentation.settings.reader.padding.PaddingSubcategory +import ua.acclorite.book_story.presentation.settings.reader.progress.ProgressSubcategory import ua.acclorite.book_story.presentation.settings.reader.reading_mode.ReadingModeSubcategory import ua.acclorite.book_story.presentation.settings.reader.reading_speed.ReadingSpeedSubcategory import ua.acclorite.book_story.presentation.settings.reader.system.SystemSubcategory @@ -44,6 +45,9 @@ fun LazyListScope.ReaderSettingsCategory( ReadingSpeedSubcategory( titleColor = titleColor ) + ProgressSubcategory( + titleColor = titleColor + ) TranslatorSubcategory( titleColor = titleColor ) diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/progress/ProgressSubcategory.kt b/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/progress/ProgressSubcategory.kt new file mode 100644 index 00000000..b0121676 --- /dev/null +++ b/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/progress/ProgressSubcategory.kt @@ -0,0 +1,30 @@ +@file:Suppress("FunctionName") + +package ua.acclorite.book_story.presentation.settings.reader.progress + +import androidx.compose.foundation.lazy.LazyListScope +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import ua.acclorite.book_story.R +import ua.acclorite.book_story.presentation.settings.components.SettingsSubcategory +import ua.acclorite.book_story.presentation.settings.reader.progress.components.ProgressBarOption + +fun LazyListScope.ProgressSubcategory( + titleColor: @Composable () -> Color = { MaterialTheme.colorScheme.primary }, + title: @Composable () -> String = { stringResource(id = R.string.progress_reader_settings) }, + showTitle: Boolean = true, + showDivider: Boolean = true +) { + SettingsSubcategory( + titleColor = titleColor, + title = title, + showTitle = showTitle, + showDivider = showDivider, + ) { + item { + ProgressBarOption() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/progress/components/ProgressBarOption.kt b/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/progress/components/ProgressBarOption.kt new file mode 100644 index 00000000..cbff59ef --- /dev/null +++ b/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/progress/components/ProgressBarOption.kt @@ -0,0 +1,28 @@ +package ua.acclorite.book_story.presentation.settings.reader.progress.components + +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import ua.acclorite.book_story.R +import ua.acclorite.book_story.presentation.core.components.settings.SwitchWithTitle +import ua.acclorite.book_story.ui.main.MainEvent +import ua.acclorite.book_story.ui.main.MainModel + +@Composable +fun ProgressBarOption() { + val mainModel = hiltViewModel() + val state = mainModel.state.collectAsStateWithLifecycle() + + SwitchWithTitle( + selected = state.value.progressBar, + title = stringResource(id = R.string.progress_bar_option), + onClick = { + mainModel.onEvent( + MainEvent.OnChangeProgressBar( + !state.value.progressBar + ) + ) + } + ) +} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/ui/main/MainEvent.kt b/app/src/main/java/ua/acclorite/book_story/ui/main/MainEvent.kt index e3a82e72..95067b26 100644 --- a/app/src/main/java/ua/acclorite/book_story/ui/main/MainEvent.kt +++ b/app/src/main/java/ua/acclorite/book_story/ui/main/MainEvent.kt @@ -55,4 +55,5 @@ sealed class MainEvent { data class OnChangeImagesAlignment(val value: String) : MainEvent() data class OnChangeImagesWidth(val value: Float) : MainEvent() data class OnChangeImagesColorEffects(val value: String) : MainEvent() + data class OnChangeProgressBar(val value: Boolean) : MainEvent() } \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/ui/main/MainModel.kt b/app/src/main/java/ua/acclorite/book_story/ui/main/MainModel.kt index 458efcc3..55c476ee 100644 --- a/app/src/main/java/ua/acclorite/book_story/ui/main/MainModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/ui/main/MainModel.kt @@ -464,6 +464,14 @@ class MainModel @Inject constructor( it.copy(imagesColorEffects = this.toColorEffects()) } ) + + is MainEvent.OnChangeProgressBar -> handleDatastoreUpdate( + key = DataStoreConstants.PROGRESS_BAR, + value = event.value, + updateState = { + it.copy(progressBar = this) + } + ) } } diff --git a/app/src/main/java/ua/acclorite/book_story/ui/main/MainState.kt b/app/src/main/java/ua/acclorite/book_story/ui/main/MainState.kt index bd01b485..4fa4a4f5 100644 --- a/app/src/main/java/ua/acclorite/book_story/ui/main/MainState.kt +++ b/app/src/main/java/ua/acclorite/book_story/ui/main/MainState.kt @@ -102,6 +102,7 @@ data class MainState( val imagesAlignment: ReaderImagesAlignment = provideDefaultValue { ReaderImagesAlignment.START }, val imagesWidth: Float = provideDefaultValue { 0.8f }, val imagesColorEffects: ReaderColorEffects = provideDefaultValue { ReaderColorEffects.OFF }, + val progressBar: Boolean = provideDefaultValue { false }, // Browse Settings val browseFilesStructure: BrowseFilesStructure = provideDefaultValue { @@ -339,6 +340,10 @@ data class MainState( imagesColorEffects = provideValue( IMAGES_COLOR_EFFECTS, convert = { toColorEffects() } ) { imagesColorEffects }, + + progressBar = provideValue( + PROGRESS_BAR + ) { progressBar }, ) } } diff --git a/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderScreen.kt b/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderScreen.kt index be38d376..c70448a7 100644 --- a/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderScreen.kt +++ b/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderScreen.kt @@ -44,6 +44,7 @@ import ua.acclorite.book_story.domain.reader.ReaderTextAlignment import ua.acclorite.book_story.presentation.core.constants.Constants import ua.acclorite.book_story.presentation.core.constants.provideFonts import ua.acclorite.book_story.presentation.core.util.LocalActivity +import ua.acclorite.book_story.presentation.core.util.calculateProgress import ua.acclorite.book_story.presentation.core.util.setBrightness import ua.acclorite.book_story.presentation.navigator.LocalNavigator import ua.acclorite.book_story.presentation.reader.ReaderContent @@ -280,6 +281,26 @@ data class ReaderScreen(val bookId: Int) : Screen, Parcelable { (mainState.value.bottomBarPadding * 4f).dp } + val bookProgress = remember(state.value.book.progress) { + derivedStateOf { + "${state.value.book.progress.calculateProgress(2)}%" + } + } + val chapterProgress = remember( + state.value.currentChapter, + state.value.currentChapterProgress + ) { + derivedStateOf { + if (state.value.currentChapter == null) return@derivedStateOf "" + " (${state.value.currentChapterProgress.calculateProgress(2)}%)" + } + } + val progress = remember(bookProgress.value, chapterProgress.value) { + derivedStateOf { + "${bookProgress.value}${chapterProgress.value}" + } + } + LaunchedEffect(Unit) { screenModel.init( bookId = bookId, @@ -368,6 +389,8 @@ data class ReaderScreen(val bookId: Int) : Screen, Parcelable { horizontalGestureSensitivity = horizontalGestureSensitivity, highlightedReading = mainState.value.highlightedReading, highlightedReadingThickness = highlightedReadingThickness, + progress = progress.value, + progressBar = mainState.value.progressBar, paragraphHeight = paragraphHeight, sidePadding = sidePadding, bottomBarPadding = bottomBarPadding, diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 135907f3..19a3e0a7 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -138,6 +138,7 @@ Система Розділи Зображення + Прогрес Налаштування теми Кольори Головні @@ -203,6 +204,7 @@ Розташування Розмір Ефекти кольору + Панель прогресу Структура файлів diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 96ef64e0..365e221e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -191,6 +191,7 @@ System Chapters Images + Progress Theme preferences Colors General @@ -258,6 +259,7 @@ Alignment Size Color effects + Progress bar Files structure