From fe269fd8a064f25f668dbb45256bf85dc0c28d09 Mon Sep 17 00:00:00 2001 From: Acclorite <140836141+Acclorite@users.noreply.github.com> Date: Sun, 19 Jan 2025 18:59:05 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=80=20Font=20thickness=20option?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Changes default font thickness Resolves: #150 --- .../domain/reader/ReaderFontThickness.kt | 17 ++++++ .../core/constants/DataStoreConstants.kt | 1 + .../presentation/reader/ReaderContent.kt | 3 + .../presentation/reader/ReaderLayout.kt | 3 + .../presentation/reader/ReaderLayoutText.kt | 3 + .../reader/ReaderLayoutTextParagraph.kt | 6 +- .../presentation/reader/ReaderScaffold.kt | 3 + .../settings/reader/font/FontSubcategory.kt | 5 ++ .../font/components/FontThicknessOption.kt | 58 +++++++++++++++++++ .../acclorite/book_story/ui/main/MainEvent.kt | 1 + .../acclorite/book_story/ui/main/MainModel.kt | 9 +++ .../acclorite/book_story/ui/main/MainState.kt | 7 +++ .../book_story/ui/reader/ReaderScreen.kt | 1 + app/src/main/res/values-uk/strings.xml | 8 +++ app/src/main/res/values/strings.xml | 8 +++ 15 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/ua/acclorite/book_story/domain/reader/ReaderFontThickness.kt create mode 100644 app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/font/components/FontThicknessOption.kt diff --git a/app/src/main/java/ua/acclorite/book_story/domain/reader/ReaderFontThickness.kt b/app/src/main/java/ua/acclorite/book_story/domain/reader/ReaderFontThickness.kt new file mode 100644 index 00000000..0b6ab981 --- /dev/null +++ b/app/src/main/java/ua/acclorite/book_story/domain/reader/ReaderFontThickness.kt @@ -0,0 +1,17 @@ +package ua.acclorite.book_story.domain.reader + +import androidx.compose.runtime.Immutable +import androidx.compose.ui.text.font.FontWeight + +@Immutable +enum class ReaderFontThickness(val thickness: FontWeight) { + THIN(FontWeight.Thin), + EXTRA_LIGHT(FontWeight.ExtraLight), + LIGHT(FontWeight.Light), + NORMAL(FontWeight.Normal), + MEDIUM(FontWeight.Medium) +} + +fun String.toFontThickness(): ReaderFontThickness { + return ReaderFontThickness.valueOf(this) +} \ No newline at end of file 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 e6209a83..bd797ccd 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 @@ -24,6 +24,7 @@ object DataStoreConstants { val SIDE_PADDING = intPreferencesKey("side_padding") val VERTICAL_PADDING = intPreferencesKey("vertical_padding") val FONT = stringPreferencesKey("font") + val FONT_THICKNESS = stringPreferencesKey("font_thickness") val IS_ITALIC = booleanPreferencesKey("font_style") val FONT_SIZE = intPreferencesKey("font_size") val LINE_HEIGHT = intPreferencesKey("line_height") 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 c428f035..95ca1b4e 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 @@ -15,6 +15,7 @@ import androidx.compose.ui.unit.TextUnit import ua.acclorite.book_story.domain.library.book.Book import ua.acclorite.book_story.domain.reader.Checkpoint import ua.acclorite.book_story.domain.reader.FontWithName +import ua.acclorite.book_story.domain.reader.ReaderFontThickness import ua.acclorite.book_story.domain.reader.ReaderHorizontalGesture import ua.acclorite.book_story.domain.reader.ReaderText import ua.acclorite.book_story.domain.reader.ReaderText.Chapter @@ -69,6 +70,7 @@ fun ReaderContent( imagesColorEffects: ColorFilter?, fontFamily: FontWithName, lineHeight: TextUnit, + fontThickness: ReaderFontThickness, fontStyle: FontStyle, chapterTitleAlignment: ReaderTextAlignment, textAlignment: ReaderTextAlignment, @@ -144,6 +146,7 @@ fun ReaderContent( imagesColorEffects = imagesColorEffects, fontFamily = fontFamily, lineHeight = lineHeight, + fontThickness = fontThickness, fontStyle = fontStyle, chapterTitleAlignment = chapterTitleAlignment, textAlignment = textAlignment, 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 0e251d3b..b1ae61d3 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 @@ -28,6 +28,7 @@ import androidx.compose.ui.unit.coerceAtLeast import androidx.compose.ui.unit.dp import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.reader.FontWithName +import ua.acclorite.book_story.domain.reader.ReaderFontThickness import ua.acclorite.book_story.domain.reader.ReaderHorizontalGesture import ua.acclorite.book_story.domain.reader.ReaderText import ua.acclorite.book_story.domain.reader.ReaderTextAlignment @@ -68,6 +69,7 @@ fun ReaderLayout( imagesColorEffects: ColorFilter?, fontFamily: FontWithName, lineHeight: TextUnit, + fontThickness: ReaderFontThickness, fontStyle: FontStyle, chapterTitleAlignment: ReaderTextAlignment, textAlignment: ReaderTextAlignment, @@ -193,6 +195,7 @@ fun ReaderLayout( fontFamily = fontFamily, fontColor = fontColor, lineHeight = lineHeight, + fontThickness = fontThickness, fontStyle = fontStyle, chapterTitleAlignment = chapterTitleAlignment, textAlignment = textAlignment, 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 17a7fcc7..b879e3e2 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 @@ -11,6 +11,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.TextUnit import ua.acclorite.book_story.domain.reader.FontWithName +import ua.acclorite.book_story.domain.reader.ReaderFontThickness import ua.acclorite.book_story.domain.reader.ReaderText import ua.acclorite.book_story.domain.reader.ReaderTextAlignment import ua.acclorite.book_story.domain.util.HorizontalAlignment @@ -28,6 +29,7 @@ fun LazyItemScope.ReaderLayoutText( fontFamily: FontWithName, fontColor: Color, lineHeight: TextUnit, + fontThickness: ReaderFontThickness, fontStyle: FontStyle, chapterTitleAlignment: ReaderTextAlignment, textAlignment: ReaderTextAlignment, @@ -82,6 +84,7 @@ fun LazyItemScope.ReaderLayoutText( fontFamily = fontFamily, fontColor = fontColor, lineHeight = lineHeight, + fontThickness = fontThickness, fontStyle = fontStyle, textAlignment = textAlignment, horizontalAlignment = horizontalAlignment, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLayoutTextParagraph.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLayoutTextParagraph.kt index d31f4b61..286b0cc2 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLayoutTextParagraph.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLayoutTextParagraph.kt @@ -13,13 +13,13 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontStyle -import androidx.compose.ui.text.font.FontSynthesis import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.LineBreak import androidx.compose.ui.text.style.TextIndent import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.TextUnit import ua.acclorite.book_story.domain.reader.FontWithName +import ua.acclorite.book_story.domain.reader.ReaderFontThickness import ua.acclorite.book_story.domain.reader.ReaderText.Text import ua.acclorite.book_story.domain.reader.ReaderTextAlignment import ua.acclorite.book_story.presentation.core.components.common.HighlightedText @@ -34,6 +34,7 @@ fun LazyItemScope.ReaderLayoutTextParagraph( fontFamily: FontWithName, fontColor: Color, lineHeight: TextUnit, + fontThickness: ReaderFontThickness, fontStyle: FontStyle, textAlignment: ReaderTextAlignment, horizontalAlignment: Alignment.Horizontal, @@ -88,7 +89,7 @@ fun LazyItemScope.ReaderLayoutTextParagraph( ), style = TextStyle( fontFamily = fontFamily.font, - fontSynthesis = FontSynthesis.All, + fontWeight = fontThickness.thickness, textAlign = textAlignment.textAlignment, textIndent = TextIndent(firstLine = paragraphIndentation), fontStyle = fontStyle, @@ -129,6 +130,7 @@ fun LazyItemScope.ReaderLayoutTextParagraph( ), style = TextStyle( fontFamily = fontFamily.font, + fontWeight = fontThickness.thickness, textAlign = textAlignment.textAlignment, textIndent = TextIndent(firstLine = paragraphIndentation), fontStyle = fontStyle, 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 cca94ad7..283a0f58 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 @@ -23,6 +23,7 @@ import androidx.compose.ui.unit.TextUnit import ua.acclorite.book_story.domain.library.book.Book import ua.acclorite.book_story.domain.reader.Checkpoint import ua.acclorite.book_story.domain.reader.FontWithName +import ua.acclorite.book_story.domain.reader.ReaderFontThickness import ua.acclorite.book_story.domain.reader.ReaderHorizontalGesture import ua.acclorite.book_story.domain.reader.ReaderText import ua.acclorite.book_story.domain.reader.ReaderText.Chapter @@ -73,6 +74,7 @@ fun ReaderScaffold( imagesColorEffects: ColorFilter?, fontFamily: FontWithName, lineHeight: TextUnit, + fontThickness: ReaderFontThickness, fontStyle: FontStyle, chapterTitleAlignment: ReaderTextAlignment, textAlignment: ReaderTextAlignment, @@ -174,6 +176,7 @@ fun ReaderScaffold( imagesColorEffects = imagesColorEffects, fontFamily = fontFamily, lineHeight = lineHeight, + fontThickness = fontThickness, fontStyle = fontStyle, chapterTitleAlignment = chapterTitleAlignment, textAlignment = textAlignment, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/font/FontSubcategory.kt b/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/font/FontSubcategory.kt index eddb7f3e..f4f866a1 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/font/FontSubcategory.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/font/FontSubcategory.kt @@ -12,6 +12,7 @@ import ua.acclorite.book_story.presentation.settings.components.SettingsSubcateg import ua.acclorite.book_story.presentation.settings.reader.font.components.FontFamilyOption import ua.acclorite.book_story.presentation.settings.reader.font.components.FontSizeOption import ua.acclorite.book_story.presentation.settings.reader.font.components.FontStyleOption +import ua.acclorite.book_story.presentation.settings.reader.font.components.FontThicknessOption import ua.acclorite.book_story.presentation.settings.reader.font.components.LetterSpacingOption fun LazyListScope.FontSubcategory( @@ -30,6 +31,10 @@ fun LazyListScope.FontSubcategory( FontFamilyOption() } + item { + FontThicknessOption() + } + item { FontStyleOption() } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/font/components/FontThicknessOption.kt b/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/font/components/FontThicknessOption.kt new file mode 100644 index 00000000..10c769ed --- /dev/null +++ b/app/src/main/java/ua/acclorite/book_story/presentation/settings/reader/font/components/FontThicknessOption.kt @@ -0,0 +1,58 @@ +package ua.acclorite.book_story.presentation.settings.reader.font.components + +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +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.ReaderFontThickness +import ua.acclorite.book_story.domain.ui.ButtonItem +import ua.acclorite.book_story.presentation.core.components.settings.ChipsWithTitle +import ua.acclorite.book_story.presentation.core.constants.Constants +import ua.acclorite.book_story.presentation.core.constants.provideFonts +import ua.acclorite.book_story.ui.main.MainEvent +import ua.acclorite.book_story.ui.main.MainModel + +@Composable +fun FontThicknessOption() { + val mainModel = hiltViewModel() + val state = mainModel.state.collectAsStateWithLifecycle() + + val fontFamily = remember(state.value.fontFamily) { + Constants.provideFonts().run { + find { + it.id == state.value.fontFamily + } ?: get(0) + } + } + + ChipsWithTitle( + title = stringResource(id = R.string.font_thickness_option), + chips = ReaderFontThickness.entries.map { + ButtonItem( + id = it.toString(), + title = when (it) { + ReaderFontThickness.THIN -> stringResource(id = R.string.font_thickness_thin) + ReaderFontThickness.EXTRA_LIGHT -> stringResource(id = R.string.font_thickness_extra_light) + ReaderFontThickness.LIGHT -> stringResource(id = R.string.font_thickness_light) + ReaderFontThickness.NORMAL -> stringResource(id = R.string.font_thickness_normal) + ReaderFontThickness.MEDIUM -> stringResource(id = R.string.font_thickness_medium) + }, + textStyle = MaterialTheme.typography.labelLarge.copy( + fontFamily = fontFamily.font, + fontWeight = it.thickness + ), + selected = it == state.value.fontThickness + ) + }, + onClick = { + mainModel.onEvent( + MainEvent.OnChangeFontThickness( + 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 01757894..3a4b9bbf 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 @@ -58,4 +58,5 @@ sealed class MainEvent { data class OnChangeProgressBarAlignment(val value: String) : MainEvent() data class OnChangeProgressBarFontSize(val value: Int) : MainEvent() data class OnChangeBrowsePinnedPaths(val value: String) : MainEvent() + data class OnChangeFontThickness(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 a063caa9..fde5f0b1 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 @@ -19,6 +19,7 @@ import kotlinx.coroutines.yield import ua.acclorite.book_story.domain.browse.toBrowseLayout import ua.acclorite.book_story.domain.browse.toBrowseSortOrder import ua.acclorite.book_story.domain.reader.toColorEffects +import ua.acclorite.book_story.domain.reader.toFontThickness import ua.acclorite.book_story.domain.reader.toHorizontalGesture import ua.acclorite.book_story.domain.reader.toReaderScreenOrientation import ua.acclorite.book_story.domain.reader.toTextAlignment @@ -485,6 +486,14 @@ class MainModel @Inject constructor( is MainEvent.OnChangeBrowsePinnedPaths -> handleBrowsePinnedPathsUpdate( event = event ) + + is MainEvent.OnChangeFontThickness -> handleDatastoreUpdate( + key = DataStoreConstants.FONT_THICKNESS, + value = event.value, + updateState = { + it.copy(fontThickness = this.toFontThickness()) + } + ) } } 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 13473944..30ff472a 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 @@ -12,10 +12,12 @@ import ua.acclorite.book_story.domain.browse.BrowseSortOrder import ua.acclorite.book_story.domain.browse.toBrowseLayout import ua.acclorite.book_story.domain.browse.toBrowseSortOrder import ua.acclorite.book_story.domain.reader.ReaderColorEffects +import ua.acclorite.book_story.domain.reader.ReaderFontThickness import ua.acclorite.book_story.domain.reader.ReaderHorizontalGesture import ua.acclorite.book_story.domain.reader.ReaderScreenOrientation import ua.acclorite.book_story.domain.reader.ReaderTextAlignment import ua.acclorite.book_story.domain.reader.toColorEffects +import ua.acclorite.book_story.domain.reader.toFontThickness import ua.acclorite.book_story.domain.reader.toHorizontalGesture import ua.acclorite.book_story.domain.reader.toReaderScreenOrientation import ua.acclorite.book_story.domain.reader.toTextAlignment @@ -63,6 +65,7 @@ data class MainState( // Reader Settings val fontFamily: String = provideDefaultValue { Constants.provideFonts()[0].id }, + val fontThickness: ReaderFontThickness = provideDefaultValue { ReaderFontThickness.NORMAL }, val isItalic: Boolean = provideDefaultValue { false }, val fontSize: Int = provideDefaultValue { 16 }, val lineHeight: Int = provideDefaultValue { 4 }, @@ -350,6 +353,10 @@ data class MainState( browsePinnedPaths = provideValue( BROWSE_PINNED_PATHS, convert = { toList() } ) { browsePinnedPaths }, + + fontThickness = provideValue( + FONT_THICKNESS, convert = { toFontThickness() } + ) { fontThickness }, ) } } 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 66cdc652..795572fd 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 @@ -414,6 +414,7 @@ data class ReaderScreen(val bookId: Int) : Screen, Parcelable { imagesColorEffects = imagesColorEffects, fontFamily = fontFamily, lineHeight = lineHeight, + fontThickness = mainState.value.fontThickness, fontStyle = fontStyle, chapterTitleAlignment = mainState.value.chapterTitleAlignment, textAlignment = mainState.value.textAlignment, diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 3f76cb59..55b5654a 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -159,6 +159,7 @@ Сімейство шрифтів + Товщина шрифта Стиль шрифта Розмір шрифта Висота рядка @@ -278,6 +279,13 @@ Колір шрифта Колір фона + + Тонка + Дуже мала + Мала + Звичайна + Середня + Меркурій Нептун diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dec1b1e2..02a9fc5d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -214,6 +214,7 @@ Font family + Font thickness Font style Font size Line height @@ -335,6 +336,13 @@ Font color Background color + + Thin + Extra light + Light + Normal + Medium + Mercury Neptune