🚀 Font thickness option

* Changes default font thickness

Resolves: #150
This commit is contained in:
Acclorite 2025-01-19 18:59:05 +02:00
parent bd6d64a3cd
commit fe269fd8a0
15 changed files with 131 additions and 2 deletions

View file

@ -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)
}

View file

@ -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")

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -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()
}

View file

@ -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<MainModel>()
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
)
)
}
)
}

View file

@ -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()
}

View file

@ -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())
}
)
}
}

View file

@ -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 },
)
}
}

View file

@ -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,

View file

@ -159,6 +159,7 @@
<!-- Reader -->
<string name="font_family_option">Сімейство шрифтів</string>
<string name="font_thickness_option">Товщина шрифта</string>
<string name="font_style_option">Стиль шрифта</string>
<string name="font_size_option">Розмір шрифта</string>
<string name="line_height_option">Висота рядка</string>
@ -278,6 +279,13 @@
<string name="color_effects_font">Колір шрифта</string>
<string name="color_effects_background">Колір фона</string>
<!-- Font Thickness properties -->
<string name="font_thickness_thin">Тонка</string>
<string name="font_thickness_extra_light">Дуже мала</string>
<string name="font_thickness_light">Мала</string>
<string name="font_thickness_normal">Звичайна</string>
<string name="font_thickness_medium">Середня</string>
<!-- Themes -->
<string name="dynamic_theme">Меркурій</string>
<string name="blue_theme">Нептун</string>

View file

@ -214,6 +214,7 @@
<!-- Reader -->
<string name="font_family_option">Font family</string>
<string name="font_thickness_option">Font thickness</string>
<string name="font_style_option">Font style</string>
<string name="font_size_option">Font size</string>
<string name="line_height_option">Line height</string>
@ -335,6 +336,13 @@
<string name="color_effects_font">Font color</string>
<string name="color_effects_background">Background color</string>
<!-- Font Thickness properties -->
<string name="font_thickness_thin">Thin</string>
<string name="font_thickness_extra_light">Extra light</string>
<string name="font_thickness_light">Light</string>
<string name="font_thickness_normal">Normal</string>
<string name="font_thickness_medium">Medium</string>
<!-- Themes -->
<string name="dynamic_theme">Mercury</string>
<string name="blue_theme">Neptune</string>