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 242f8a83..8924b849 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 @@ -47,6 +47,7 @@ object DataStoreConstants { val BOTTOM_BAR_PADDING = intPreferencesKey("bottom_bar_padding") val HIGHLIGHTED_READING = booleanPreferencesKey("highlighted_reading") val HIGHLIGHTED_READING_THICKNESS = intPreferencesKey("highlighted_reading_thickness") + val CHAPTER_TITLE_ALIGNMENT = stringPreferencesKey("chapter_title_alignment") // Browse settings val BROWSE_FILES_STRUCTURE = stringPreferencesKey("browse_files_structure") 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 bbe2249f..d4eb4a7d 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 @@ -58,6 +58,7 @@ fun ReaderContent( fontFamily: FontWithName, lineHeight: TextUnit, fontStyle: FontStyle, + chapterTitleAlignment: ReaderTextAlignment, textAlignment: ReaderTextAlignment, horizontalAlignment: Alignment.Horizontal, fontSize: TextUnit, @@ -122,6 +123,7 @@ fun ReaderContent( fontFamily = fontFamily, lineHeight = lineHeight, fontStyle = fontStyle, + chapterTitleAlignment = chapterTitleAlignment, textAlignment = textAlignment, horizontalAlignment = horizontalAlignment, fontSize = fontSize, 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 ad5352f4..ed54e5fc 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 @@ -51,6 +51,7 @@ fun ReaderLayout( fontFamily: FontWithName, lineHeight: TextUnit, fontStyle: FontStyle, + chapterTitleAlignment: ReaderTextAlignment, textAlignment: ReaderTextAlignment, horizontalAlignment: Alignment.Horizontal, fontSize: TextUnit, @@ -160,6 +161,7 @@ fun ReaderLayout( fontColor = fontColor, lineHeight = lineHeight, fontStyle = fontStyle, + chapterTitleAlignment = chapterTitleAlignment, textAlignment = textAlignment, horizontalAlignment = horizontalAlignment, fontSize = fontSize, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLayoutText.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLayoutText.kt index 01a8258a..fbd4124c 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLayoutText.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLayoutText.kt @@ -23,6 +23,7 @@ fun LazyItemScope.ReaderLayoutText( fontColor: Color, lineHeight: TextUnit, fontStyle: FontStyle, + chapterTitleAlignment: ReaderTextAlignment, textAlignment: ReaderTextAlignment, horizontalAlignment: Alignment.Horizontal, fontSize: TextUnit, @@ -48,6 +49,7 @@ fun LazyItemScope.ReaderLayoutText( is ReaderText.Chapter -> { ReaderLayoutTextChapter( chapter = textEntry, + chapterTitleAlignment = chapterTitleAlignment, fontColor = fontColor, sidePadding = sidePadding, highlightedReading = highlightedReading, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLayoutTextChapter.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLayoutTextChapter.kt index 61dc14ea..f6d0cfbe 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLayoutTextChapter.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLayoutTextChapter.kt @@ -1,6 +1,7 @@ package ua.acclorite.book_story.presentation.reader import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.material3.HorizontalDivider @@ -16,11 +17,13 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import ua.acclorite.book_story.domain.reader.ReaderText.Chapter +import ua.acclorite.book_story.domain.reader.ReaderTextAlignment import ua.acclorite.book_story.presentation.core.components.common.HighlightedText @Composable fun ReaderLayoutTextChapter( chapter: Chapter, + chapterTitleAlignment: ReaderTextAlignment, fontColor: Color, sidePadding: Dp, highlightedReading: Boolean, @@ -34,16 +37,22 @@ fun ReaderLayoutTextChapter( }, highlightThickness = highlightedReadingThickness, style = MaterialTheme.typography.headlineMedium.copy( - color = fontColor + color = fontColor, + textAlign = chapterTitleAlignment.textAlignment ), - modifier = Modifier.padding(horizontal = sidePadding) + modifier = Modifier + .padding(horizontal = sidePadding) + .fillMaxWidth() ) } else { Text( text = chapter.title, + textAlign = chapterTitleAlignment.textAlignment, style = MaterialTheme.typography.headlineMedium, color = fontColor, - modifier = Modifier.padding(horizontal = sidePadding) + modifier = Modifier + .padding(horizontal = sidePadding) + .fillMaxWidth() ) } Spacer(modifier = Modifier.height(16.dp)) 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 f88b5988..cf725857 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 @@ -62,6 +62,7 @@ fun ReaderScaffold( fontFamily: FontWithName, lineHeight: TextUnit, fontStyle: FontStyle, + chapterTitleAlignment: ReaderTextAlignment, textAlignment: ReaderTextAlignment, horizontalAlignment: Alignment.Horizontal, fontSize: TextUnit, @@ -153,6 +154,7 @@ fun ReaderScaffold( fontFamily = fontFamily, lineHeight = lineHeight, fontStyle = fontStyle, + chapterTitleAlignment = chapterTitleAlignment, textAlignment = textAlignment, horizontalAlignment = horizontalAlignment, fontSize = fontSize, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/text/TextSubcategory.kt b/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/text/TextSubcategory.kt index 2959f3cf..bde02ab4 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/text/TextSubcategory.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/text/TextSubcategory.kt @@ -9,6 +9,7 @@ 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.text.components.ChapterTitleAlignmentOption import ua.acclorite.book_story.presentation.settings.reader.text.components.LineHeightOption import ua.acclorite.book_story.presentation.settings.reader.text.components.ParagraphHeightOption import ua.acclorite.book_story.presentation.settings.reader.text.components.ParagraphIndentationOption @@ -30,6 +31,10 @@ fun LazyListScope.TextSubcategory( TextAlignmentOption() } + item { + ChapterTitleAlignmentOption() + } + item { LineHeightOption() } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/text/components/ChapterTitleAlignmentOption.kt b/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/text/components/ChapterTitleAlignmentOption.kt new file mode 100644 index 00000000..8430d44b --- /dev/null +++ b/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/text/components/ChapterTitleAlignmentOption.kt @@ -0,0 +1,43 @@ +package ua.acclorite.book_story.presentation.settings.reader.text.components + +import androidx.compose.material3.MaterialTheme +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.domain.reader.ReaderTextAlignment +import ua.acclorite.book_story.domain.ui.ButtonItem +import ua.acclorite.book_story.presentation.core.components.settings.SegmentedButtonWithTitle +import ua.acclorite.book_story.ui.main.MainEvent +import ua.acclorite.book_story.ui.main.MainModel + +@Composable +fun ChapterTitleAlignmentOption() { + val mainModel = hiltViewModel() + val state = mainModel.state.collectAsStateWithLifecycle() + + SegmentedButtonWithTitle( + title = stringResource(id = R.string.chapter_title_alignment_option), + buttons = ReaderTextAlignment.entries.map { + ButtonItem( + id = it.toString(), + title = when (it) { + ReaderTextAlignment.START -> stringResource(id = R.string.text_alignment_start) + ReaderTextAlignment.JUSTIFY -> stringResource(id = R.string.text_alignment_justify) + ReaderTextAlignment.CENTER -> stringResource(id = R.string.text_alignment_center) + ReaderTextAlignment.END -> stringResource(id = R.string.text_alignment_end) + }, + textStyle = MaterialTheme.typography.labelLarge, + selected = it == state.value.chapterTitleAlignment + ) + }, + onClick = { + mainModel.onEvent( + MainEvent.OnChangeChapterTitleAlignment( + it.id + ) + ) + } + ) +} \ 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 6259d34c..d1135adf 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 @@ -49,4 +49,5 @@ sealed class MainEvent { data class OnChangeBottomBarPadding(val value: Int) : MainEvent() data class OnChangeHighlightedReading(val value: Boolean) : MainEvent() data class OnChangeHighlightedReadingThickness(val value: Int) : MainEvent() + data class OnChangeChapterTitleAlignment(val value: String) : 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 197449be..eb435773 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 @@ -414,6 +414,14 @@ class MainModel @Inject constructor( it.copy(highlightedReadingThickness = this) } ) + + is MainEvent.OnChangeChapterTitleAlignment -> handleDatastoreUpdate( + key = DataStoreConstants.CHAPTER_TITLE_ALIGNMENT, + value = event.value, + updateState = { + it.copy(chapterTitleAlignment = toTextAlignment()) + } + ) } } 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 39973ebe..03557cc0 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 @@ -70,7 +70,7 @@ data class MainState( val verticalPadding: Int = provideDefaultValue { 0 }, val doubleClickTranslation: Boolean = provideDefaultValue { false }, val fastColorPresetChange: Boolean = provideDefaultValue { true }, - val textAlignment: ReaderTextAlignment = provideDefaultValue { ReaderTextAlignment.START }, + val textAlignment: ReaderTextAlignment = provideDefaultValue { ReaderTextAlignment.JUSTIFY }, val letterSpacing: Int = provideDefaultValue { 0 }, val cutoutPadding: Boolean = provideDefaultValue { false }, val fullscreen: Boolean = provideDefaultValue { true }, @@ -92,6 +92,7 @@ data class MainState( val bottomBarPadding: Int = provideDefaultValue { 0 }, val highlightedReading: Boolean = provideDefaultValue { false }, val highlightedReadingThickness: Int = provideDefaultValue { 2 }, + val chapterTitleAlignment: ReaderTextAlignment = provideDefaultValue { ReaderTextAlignment.JUSTIFY }, // Browse Settings val browseFilesStructure: BrowseFilesStructure = provideDefaultValue { @@ -305,6 +306,10 @@ data class MainState( highlightedReadingThickness = provideValue( HIGHLIGHTED_READING_THICKNESS ) { highlightedReadingThickness }, + + chapterTitleAlignment = provideValue( + CHAPTER_TITLE_ALIGNMENT, convert = { toTextAlignment() } + ) { chapterTitleAlignment }, ) } } 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 677c2a67..b5014df8 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 @@ -340,6 +340,7 @@ data class ReaderScreen(val bookId: Int) : Screen, Parcelable { fontFamily = fontFamily, lineHeight = lineHeight, fontStyle = fontStyle, + chapterTitleAlignment = mainState.value.chapterTitleAlignment, textAlignment = mainState.value.textAlignment, horizontalAlignment = horizontalAlignment, fontSize = mainState.value.fontSize.sp, diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 5a79edca..53b853fd 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -173,6 +173,7 @@ Швидка зміна пресета кольорів Проведіть верхню панель вліво або вправо, щоб змінити пресет кольорів Розташування текста + Розташування заголовка розділу Відстань між літерами Поле вирізу Додайте поле до області вирізу diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1f780e97..dba06544 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -226,6 +226,7 @@ Fast color preset change Swipe top bar left or right to change color preset Text alignment + Chapter\'s title alignment Letter spacing Cutout margin Apply margin to the cutout area