refactor: rename and refactor ButtonItem

This commit is contained in:
Acclorite 2025-07-23 18:43:36 +03:00
parent 69689b8be6
commit 0fa8041d5c
No known key found for this signature in database
GPG key ID: 6E54C611F6EE8593
40 changed files with 316 additions and 415 deletions

View file

@ -6,7 +6,11 @@
package ua.acclorite.book_story.presentation.browse.model package ua.acclorite.book_story.presentation.browse.model
import androidx.annotation.StringRes
import ua.acclorite.book_story.R
enum class BrowseLayout {
LIST, GRID enum class BrowseLayout(@StringRes val title: Int) {
LIST(R.string.layout_list),
GRID(R.string.layout_grid)
} }

View file

@ -6,7 +6,10 @@
package ua.acclorite.book_story.presentation.library.model package ua.acclorite.book_story.presentation.library.model
import androidx.annotation.StringRes
import ua.acclorite.book_story.R
enum class LibraryLayout { enum class LibraryLayout(@StringRes val title: Int) {
GRID, LIST GRID(R.string.layout_grid),
LIST(R.string.layout_list)
} }

View file

@ -6,7 +6,12 @@
package ua.acclorite.book_story.presentation.library.model package ua.acclorite.book_story.presentation.library.model
import androidx.annotation.StringRes
import ua.acclorite.book_story.R
enum class LibraryTitlePosition {
OFF, BELOW, INSIDE enum class LibraryTitlePosition(@StringRes val title: Int) {
OFF(R.string.library_title_position_off),
BELOW(R.string.library_title_position_below),
INSIDE(R.string.library_title_position_inside)
} }

View file

@ -6,10 +6,12 @@
package ua.acclorite.book_story.presentation.reader.model package ua.acclorite.book_story.presentation.reader.model
import androidx.annotation.StringRes
import ua.acclorite.book_story.R
enum class ReaderColorEffects { enum class ReaderColorEffects(@StringRes val title: Int) {
OFF, OFF(R.string.color_effects_off),
GRAYSCALE, GRAYSCALE(R.string.color_effects_grayscale),
FONT, FONT(R.string.color_effects_font),
BACKGROUND BACKGROUND(R.string.color_effects_background)
} }

View file

@ -6,12 +6,14 @@
package ua.acclorite.book_story.presentation.reader.model package ua.acclorite.book_story.presentation.reader.model
import androidx.annotation.StringRes
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import ua.acclorite.book_story.R
enum class ReaderFontThickness(val thickness: FontWeight) { enum class ReaderFontThickness(val thickness: FontWeight, @StringRes val title: Int) {
THIN(FontWeight.Thin), THIN(FontWeight.Thin, R.string.font_thickness_thin),
EXTRA_LIGHT(FontWeight.ExtraLight), EXTRA_LIGHT(FontWeight.ExtraLight, R.string.font_thickness_extra_light),
LIGHT(FontWeight.Light), LIGHT(FontWeight.Light, R.string.font_thickness_light),
NORMAL(FontWeight.Normal), NORMAL(FontWeight.Normal, R.string.font_thickness_normal),
MEDIUM(FontWeight.Medium) MEDIUM(FontWeight.Medium, R.string.font_thickness_medium)
} }

View file

@ -6,9 +6,11 @@
package ua.acclorite.book_story.presentation.reader.model package ua.acclorite.book_story.presentation.reader.model
import androidx.annotation.StringRes
import ua.acclorite.book_story.R
enum class ReaderHorizontalGesture { enum class ReaderHorizontalGesture(@StringRes val title: Int) {
OFF, OFF(R.string.horizontal_gesture_off),
ON, ON(R.string.horizontal_gesture_on),
INVERSE INVERSE(R.string.horizontal_gesture_inverse)
} }

View file

@ -6,8 +6,11 @@
package ua.acclorite.book_story.presentation.reader.model package ua.acclorite.book_story.presentation.reader.model
import androidx.annotation.StringRes
import ua.acclorite.book_story.R
enum class ReaderProgressCount {
PERCENTAGE, enum class ReaderProgressCount(@StringRes val title: Int) {
QUANTITY PERCENTAGE(R.string.progress_count_percentage),
QUANTITY(R.string.progress_count_quantity)
} }

View file

@ -7,12 +7,32 @@
package ua.acclorite.book_story.presentation.reader.model package ua.acclorite.book_story.presentation.reader.model
import android.content.pm.ActivityInfo import android.content.pm.ActivityInfo
import androidx.annotation.StringRes
import ua.acclorite.book_story.R
enum class ReaderScreenOrientation(val code: Int) { enum class ReaderScreenOrientation(val code: Int, @StringRes val title: Int) {
DEFAULT(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED), DEFAULT(
FREE(ActivityInfo.SCREEN_ORIENTATION_USER), ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED,
PORTRAIT(ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT), R.string.default_string
LANDSCAPE(ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE), ),
LOCKED_PORTRAIT(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT), FREE(
LOCKED_LANDSCAPE(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE), ActivityInfo.SCREEN_ORIENTATION_USER,
R.string.screen_orientation_free
),
PORTRAIT(
ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT,
R.string.screen_orientation_portrait
),
LANDSCAPE(
ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE,
R.string.screen_orientation_landscape
),
LOCKED_PORTRAIT(
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT,
R.string.screen_orientation_locked_portrait
),
LOCKED_LANDSCAPE(
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE,
R.string.screen_orientation_locked_landscape
)
} }

View file

@ -6,11 +6,13 @@
package ua.acclorite.book_story.presentation.reader.model package ua.acclorite.book_story.presentation.reader.model
import androidx.annotation.StringRes
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import ua.acclorite.book_story.R
enum class ReaderTextAlignment(val textAlignment: TextAlign) { enum class ReaderTextAlignment(val textAlignment: TextAlign, @StringRes val title: Int) {
START(TextAlign.Start), START(TextAlign.Start, R.string.alignment_start),
JUSTIFY(TextAlign.Justify), JUSTIFY(TextAlign.Justify, R.string.alignment_justify),
CENTER(TextAlign.Center), CENTER(TextAlign.Center, R.string.alignment_center),
END(TextAlign.End) END(TextAlign.End, R.string.alignment_end)
} }

View file

@ -12,7 +12,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.text.TextStyle
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import kotlinx.parcelize.IgnoredOnParcel import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
@ -25,7 +24,7 @@ import ua.acclorite.book_story.presentation.settings.SettingsEvent
import ua.acclorite.book_story.presentation.settings.SettingsModel import ua.acclorite.book_story.presentation.settings.SettingsModel
import ua.acclorite.book_story.ui.common.helpers.LocalActivity import ua.acclorite.book_story.ui.common.helpers.LocalActivity
import ua.acclorite.book_story.ui.common.helpers.LocalSettings import ua.acclorite.book_story.ui.common.helpers.LocalSettings
import ua.acclorite.book_story.ui.common.model.ButtonItem import ua.acclorite.book_story.ui.common.model.ListItem
import ua.acclorite.book_story.ui.navigator.LocalNavigator import ua.acclorite.book_story.ui.navigator.LocalNavigator
import ua.acclorite.book_story.ui.start.StartContent import ua.acclorite.book_story.ui.start.StartContent
@ -60,10 +59,9 @@ object StartScreen : Screen, Parcelable {
val languages = remember(settings.language.value) { val languages = remember(settings.language.value) {
CoreData.languages.sortedBy { it.second }.map { CoreData.languages.sortedBy { it.second }.map {
ButtonItem( ListItem(
id = it.first, item = it.first,
title = it.second, title = it.second,
textStyle = TextStyle(),
selected = it.first == settings.language.lastValue selected = it.first == settings.language.lastValue
) )
}.sortedBy { it.title } }.sortedBy { it.title }

View file

@ -19,20 +19,17 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import ua.acclorite.book_story.ui.common.components.common.StyledText import ua.acclorite.book_story.ui.common.components.common.StyledText
import ua.acclorite.book_story.ui.common.model.ButtonItem import ua.acclorite.book_story.ui.common.model.ListItem
import ua.acclorite.book_story.ui.settings.components.SettingsSubcategoryTitle import ua.acclorite.book_story.ui.settings.components.SettingsSubcategoryTitle
/**
* Chips with title. Use list of [ButtonItem]s to display chips.
*/
@Composable @Composable
fun ChipsWithTitle( fun <T> ChipsWithTitle(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
title: String, title: String,
chips: List<ButtonItem>, chips: List<ListItem<T>>,
horizontalPadding: Dp = 18.dp, horizontalPadding: Dp = 18.dp,
verticalPadding: Dp = 8.dp, verticalPadding: Dp = 8.dp,
onClick: (ButtonItem) -> Unit onClick: (T) -> Unit
) { ) {
Column( Column(
modifier modifier
@ -53,14 +50,14 @@ fun ChipsWithTitle(
label = { label = {
StyledText( StyledText(
text = item.title, text = item.title,
style = item.textStyle, style = item.textStyle(),
maxLines = 1 maxLines = 1
) )
}, },
onClick = { onClick(item) }, onClick = { onClick(item.item) },
) )
} }
}, }
) )
} }
} }

View file

@ -44,31 +44,18 @@ import androidx.compose.ui.unit.dp
import ua.acclorite.book_story.R import ua.acclorite.book_story.R
import ua.acclorite.book_story.ui.common.components.common.AnimatedVisibility import ua.acclorite.book_story.ui.common.components.common.AnimatedVisibility
import ua.acclorite.book_story.ui.common.components.common.StyledText import ua.acclorite.book_story.ui.common.components.common.StyledText
import ua.acclorite.book_story.ui.common.model.ButtonItem import ua.acclorite.book_story.ui.common.model.ListItem
import ua.acclorite.book_story.ui.settings.components.SettingsSubcategoryTitle import ua.acclorite.book_story.ui.settings.components.SettingsSubcategoryTitle
/**
* Segmented Button with Title.
* Uses custom implementation(material3 one has many flaws).
* Contains [buttons].
*
* @param modifier Modifier.
* @param title Title of the buttons.
* @param buttons [ButtonItem]s.
* @param enabled Whether button is enabled.
* @param horizontalPadding Horizontal item padding.
* @param verticalPadding Vertical item padding.
* @param onClick OnClick callback.
*/
@Composable @Composable
fun SegmentedButtonWithTitle( fun <T> SegmentedButtonWithTitle(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
title: String, title: String,
buttons: List<ButtonItem>, buttons: List<ListItem<T>>,
enabled: Boolean = true, enabled: Boolean = true,
horizontalPadding: Dp = 18.dp, horizontalPadding: Dp = 18.dp,
verticalPadding: Dp = 8.dp, verticalPadding: Dp = 8.dp,
onClick: (ButtonItem) -> Unit onClick: (T) -> Unit
) { ) {
Column( Column(
modifier modifier
@ -91,9 +78,9 @@ fun SegmentedButtonWithTitle(
) )
.padding(0.5.dp) .padding(0.5.dp)
) { ) {
buttons.forEachIndexed { index, buttonItem -> buttons.forEachIndexed { index, item ->
SegmentedButton( SegmentedButton(
button = buttonItem, button = item,
enabled = enabled, enabled = enabled,
shape = when (index) { shape = when (index) {
buttons.lastIndex -> RoundedCornerShape( buttons.lastIndex -> RoundedCornerShape(
@ -108,7 +95,7 @@ fun SegmentedButtonWithTitle(
else -> RoundedCornerShape(0) else -> RoundedCornerShape(0)
}, },
onClick = { onClick(buttonItem) } onClick = { onClick(item.item) }
) )
} }
} }
@ -117,19 +104,9 @@ fun SegmentedButtonWithTitle(
} }
} }
/**
* Custom Segmented button.
* Adjusts width based on component name.
*
* @param button [ButtonItem].
* @param enabled Whether can be clicked.
* @param shape Shape of the button. For proper implementation should have 100% corners on first and last buttons(start and end).
* @param colors [SegmentedButtonColors].
* @param onClick OnClick callback.
*/
@Composable @Composable
private fun SegmentedButton( private fun <T> SegmentedButton(
button: ButtonItem, button: ListItem<T>,
enabled: Boolean, enabled: Boolean,
shape: RoundedCornerShape, shape: RoundedCornerShape,
colors: SegmentedButtonColors = SegmentedButtonDefaults.colors(), colors: SegmentedButtonColors = SegmentedButtonDefaults.colors(),
@ -181,7 +158,7 @@ private fun SegmentedButton(
StyledText( StyledText(
text = button.title, text = button.title,
style = button.textStyle.copy( style = button.textStyle().copy(
color = if (button.selected) colors.activeContentColor color = if (button.selected) colors.activeContentColor
else colors.inactiveContentColor else colors.inactiveContentColor
) )

View file

@ -33,20 +33,6 @@ import ua.acclorite.book_story.ui.common.components.common.StyledText
import ua.acclorite.book_story.ui.settings.components.SettingsSubcategoryTitle import ua.acclorite.book_story.ui.settings.components.SettingsSubcategoryTitle
import kotlin.math.roundToInt import kotlin.math.roundToInt
/**
* Slider with title.
*
* @param modifier Modifier.
* @param value Value to be displayed, in pair with [String] which is the type of value(e.g. "pt")
* @param valuePlaceholder Placeholder of the value(e.g. "Default", instead of the "1pt")
* @param showPlaceholder Whether placeholder should be shown.
* @param fromValue From where user can pick value.
* @param toValue To where user can pick value.
* @param title Title of this slider.
* @param horizontalPadding Horizontal item padding.
* @param verticalPadding Vertical item padding.
* @param onValueChange Callback when value changes.
*/
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun SliderWithTitle( fun SliderWithTitle(
@ -127,19 +113,6 @@ fun SliderWithTitle(
} }
} }
/**
* Slider with title.
*
* @param modifier Modifier.
* @param value Value to be displayed, in pair with [String] which is the type of value(e.g. "pt")
* @param valuePlaceholder Placeholder of the value(e.g. "Default", instead of the "1pt")
* @param showPlaceholder Whether placeholder should be shown.
* @param toValue To where user can pick value.
* @param title Title of this slider.
* @param horizontalPadding Horizontal item padding.
* @param verticalPadding Vertical item padding.
* @param onValueChange Callback when value changes.
*/
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun SliderWithTitle( fun SliderWithTitle(

View file

@ -25,16 +25,6 @@ import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import ua.acclorite.book_story.ui.common.components.common.StyledText import ua.acclorite.book_story.ui.common.components.common.StyledText
/**
* Checkbox with title.
*
* @param selected Whether [Switch] has checked state.
* @param title Title.
* @param description Optional description.
* @param horizontalPadding Horizontal padding.
* @param verticalPadding Vertical padding.
* @param onClick Triggers when user clicks anywhere on this composable.
*/
@Composable @Composable
fun SwitchWithTitle( fun SwitchWithTitle(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,

View file

@ -6,13 +6,15 @@
package ua.acclorite.book_story.ui.common.model package ua.acclorite.book_story.ui.common.model
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Immutable import androidx.compose.runtime.Immutable
import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.TextStyle
@Immutable @Immutable
data class ButtonItem( data class ListItem<T>(
val id: String, val item: T,
val title: String, val title: String,
val textStyle: TextStyle, val textStyle: @Composable () -> TextStyle = { MaterialTheme.typography.labelLarge },
val selected: Boolean val selected: Boolean
) )

View file

@ -6,13 +6,12 @@
package ua.acclorite.book_story.ui.settings.appearance.theme_preferences.components package ua.acclorite.book_story.ui.settings.appearance.theme_preferences.components
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import ua.acclorite.book_story.R import ua.acclorite.book_story.R
import ua.acclorite.book_story.ui.common.components.settings.SegmentedButtonWithTitle import ua.acclorite.book_story.ui.common.components.settings.SegmentedButtonWithTitle
import ua.acclorite.book_story.ui.common.helpers.LocalSettings import ua.acclorite.book_story.ui.common.helpers.LocalSettings
import ua.acclorite.book_story.ui.common.model.ButtonItem import ua.acclorite.book_story.ui.common.model.ListItem
import ua.acclorite.book_story.ui.theme.model.DarkTheme import ua.acclorite.book_story.ui.theme.model.DarkTheme
@Composable @Composable
@ -21,19 +20,15 @@ fun DarkThemeOption() {
SegmentedButtonWithTitle( SegmentedButtonWithTitle(
title = stringResource(id = R.string.dark_theme_option), title = stringResource(id = R.string.dark_theme_option),
buttons = DarkTheme.entries.map { buttons = DarkTheme.entries.map { item ->
ButtonItem( ListItem(
it.name, item = item,
title = when (it) { title = stringResource(id = item.title),
DarkTheme.OFF -> stringResource(id = R.string.dark_theme_off) selected = item == settings.darkTheme.value
DarkTheme.ON -> stringResource(id = R.string.dark_theme_on)
DarkTheme.FOLLOW_SYSTEM -> stringResource(id = R.string.dark_theme_follow_system)
},
textStyle = MaterialTheme.typography.labelLarge,
selected = it == settings.darkTheme.value
) )
},
onClick = { item ->
settings.darkTheme.update(item)
} }
) { )
settings.darkTheme.update(DarkTheme.valueOf(it.id))
}
} }

View file

@ -6,13 +6,12 @@
package ua.acclorite.book_story.ui.settings.appearance.theme_preferences.components package ua.acclorite.book_story.ui.settings.appearance.theme_preferences.components
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import ua.acclorite.book_story.R import ua.acclorite.book_story.R
import ua.acclorite.book_story.ui.common.components.settings.SegmentedButtonWithTitle import ua.acclorite.book_story.ui.common.components.settings.SegmentedButtonWithTitle
import ua.acclorite.book_story.ui.common.helpers.LocalSettings import ua.acclorite.book_story.ui.common.helpers.LocalSettings
import ua.acclorite.book_story.ui.common.model.ButtonItem import ua.acclorite.book_story.ui.common.model.ListItem
import ua.acclorite.book_story.ui.theme.ExpandingTransition import ua.acclorite.book_story.ui.theme.ExpandingTransition
import ua.acclorite.book_story.ui.theme.model.PureDark import ua.acclorite.book_story.ui.theme.model.PureDark
@ -23,20 +22,16 @@ fun PureDarkOption() {
ExpandingTransition(visible = settings.darkTheme.value.isDark()) { ExpandingTransition(visible = settings.darkTheme.value.isDark()) {
SegmentedButtonWithTitle( SegmentedButtonWithTitle(
title = stringResource(id = R.string.pure_dark_option), title = stringResource(id = R.string.pure_dark_option),
buttons = PureDark.entries.map { buttons = PureDark.entries.map { item ->
ButtonItem( ListItem(
id = it.toString(), item = item,
title = when (it) { title = stringResource(id = item.title),
PureDark.OFF -> stringResource(id = R.string.pure_dark_off) selected = item == settings.pureDark.value
PureDark.ON -> stringResource(id = R.string.pure_dark_on) )
PureDark.SAVER -> stringResource(id = R.string.pure_dark_power_saver)
}, },
textStyle = MaterialTheme.typography.labelLarge, onClick = { item ->
selected = it == settings.pureDark.value settings.pureDark.update(item)
}
) )
} }
) {
settings.pureDark.update(PureDark.valueOf(it.id))
}
}
} }

View file

@ -6,7 +6,6 @@
package ua.acclorite.book_story.ui.settings.appearance.theme_preferences.components package ua.acclorite.book_story.ui.settings.appearance.theme_preferences.components
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
@ -16,7 +15,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.common.components.settings.SegmentedButtonWithTitle import ua.acclorite.book_story.ui.common.components.settings.SegmentedButtonWithTitle
import ua.acclorite.book_story.ui.common.helpers.LocalSettings import ua.acclorite.book_story.ui.common.helpers.LocalSettings
import ua.acclorite.book_story.ui.common.model.ButtonItem import ua.acclorite.book_story.ui.common.model.ListItem
import ua.acclorite.book_story.ui.theme.BookStoryTheme import ua.acclorite.book_story.ui.theme.BookStoryTheme
import ua.acclorite.book_story.ui.theme.ExpandingTransition import ua.acclorite.book_story.ui.theme.ExpandingTransition
import ua.acclorite.book_story.ui.theme.model.ThemeContrast import ua.acclorite.book_story.ui.theme.model.ThemeContrast
@ -42,21 +41,17 @@ fun ThemeContrastOption() {
SegmentedButtonWithTitle( SegmentedButtonWithTitle(
title = stringResource(id = R.string.theme_contrast_option), title = stringResource(id = R.string.theme_contrast_option),
enabled = settings.theme.value.hasThemeContrast, enabled = settings.theme.value.hasThemeContrast,
buttons = ThemeContrast.entries.map { buttons = ThemeContrast.entries.map { item ->
ButtonItem( ListItem(
id = it.toString(), item = item,
title = when (it) { title = stringResource(id = item.title),
ThemeContrast.STANDARD -> stringResource(id = R.string.theme_contrast_standard) selected = item == settings.themeContrast.value
ThemeContrast.MEDIUM -> stringResource(id = R.string.theme_contrast_medium)
ThemeContrast.HIGH -> stringResource(id = R.string.theme_contrast_high)
},
textStyle = MaterialTheme.typography.labelLarge,
selected = it == settings.themeContrast.value
) )
},
onClick = { item ->
settings.themeContrast.update(item)
} }
) { )
settings.themeContrast.update(ThemeContrast.valueOf(it.id))
}
} }
} }
} }

View file

@ -6,14 +6,13 @@
package ua.acclorite.book_story.ui.settings.browse.display.components package ua.acclorite.book_story.ui.settings.browse.display.components
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import ua.acclorite.book_story.R import ua.acclorite.book_story.R
import ua.acclorite.book_story.presentation.browse.model.BrowseLayout import ua.acclorite.book_story.presentation.browse.model.BrowseLayout
import ua.acclorite.book_story.ui.common.components.settings.SegmentedButtonWithTitle import ua.acclorite.book_story.ui.common.components.settings.SegmentedButtonWithTitle
import ua.acclorite.book_story.ui.common.helpers.LocalSettings import ua.acclorite.book_story.ui.common.helpers.LocalSettings
import ua.acclorite.book_story.ui.common.model.ButtonItem import ua.acclorite.book_story.ui.common.model.ListItem
@Composable @Composable
fun BrowseLayoutOption() { fun BrowseLayoutOption() {
@ -21,18 +20,15 @@ fun BrowseLayoutOption() {
SegmentedButtonWithTitle( SegmentedButtonWithTitle(
title = stringResource(id = R.string.layout_option), title = stringResource(id = R.string.layout_option),
buttons = BrowseLayout.entries.map { buttons = BrowseLayout.entries.map { item ->
ButtonItem( ListItem(
it.toString(), item = item,
when (it) { title = stringResource(id = item.title),
BrowseLayout.LIST -> stringResource(id = R.string.layout_list) selected = item == settings.browseLayout.value
BrowseLayout.GRID -> stringResource(id = R.string.layout_grid)
},
MaterialTheme.typography.labelLarge,
it == settings.browseLayout.value
) )
},
onClick = { item ->
settings.browseLayout.update(item)
} }
) { )
settings.browseLayout.update(BrowseLayout.valueOf(it.id))
}
} }

View file

@ -6,7 +6,6 @@
package ua.acclorite.book_story.ui.settings.general.components package ua.acclorite.book_story.ui.settings.general.components
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
@ -16,7 +15,7 @@ import ua.acclorite.book_story.presentation.settings.SettingsEvent
import ua.acclorite.book_story.presentation.settings.SettingsModel import ua.acclorite.book_story.presentation.settings.SettingsModel
import ua.acclorite.book_story.ui.common.components.settings.ChipsWithTitle import ua.acclorite.book_story.ui.common.components.settings.ChipsWithTitle
import ua.acclorite.book_story.ui.common.helpers.LocalSettings import ua.acclorite.book_story.ui.common.helpers.LocalSettings
import ua.acclorite.book_story.ui.common.model.ButtonItem import ua.acclorite.book_story.ui.common.model.ListItem
@Composable @Composable
fun AppLanguageOption() { fun AppLanguageOption() {
@ -25,15 +24,15 @@ fun AppLanguageOption() {
ChipsWithTitle( ChipsWithTitle(
title = stringResource(id = R.string.language_option), title = stringResource(id = R.string.language_option),
chips = CoreData.languages.sortedBy { it.second }.map { chips = CoreData.languages.sortedBy { it.second }.map { item ->
ButtonItem( ListItem(
it.first, item = item.first,
it.second, title = item.second,
MaterialTheme.typography.labelLarge, selected = item.first == settings.language.value
it.first == settings.language.value
) )
},
onClick = { item ->
settingsModel.onEvent(SettingsEvent.OnUpdateLanguage(item))
} }
) { )
settingsModel.onEvent(SettingsEvent.OnUpdateLanguage(it.id))
}
} }

View file

@ -6,14 +6,13 @@
package ua.acclorite.book_story.ui.settings.library.display.components package ua.acclorite.book_story.ui.settings.library.display.components
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import ua.acclorite.book_story.R import ua.acclorite.book_story.R
import ua.acclorite.book_story.presentation.library.model.LibraryLayout import ua.acclorite.book_story.presentation.library.model.LibraryLayout
import ua.acclorite.book_story.ui.common.components.settings.SegmentedButtonWithTitle import ua.acclorite.book_story.ui.common.components.settings.SegmentedButtonWithTitle
import ua.acclorite.book_story.ui.common.helpers.LocalSettings import ua.acclorite.book_story.ui.common.helpers.LocalSettings
import ua.acclorite.book_story.ui.common.model.ButtonItem import ua.acclorite.book_story.ui.common.model.ListItem
@Composable @Composable
fun LibraryLayoutOption() { fun LibraryLayoutOption() {
@ -21,18 +20,15 @@ fun LibraryLayoutOption() {
SegmentedButtonWithTitle( SegmentedButtonWithTitle(
title = stringResource(id = R.string.layout_option), title = stringResource(id = R.string.layout_option),
buttons = LibraryLayout.entries.map { buttons = LibraryLayout.entries.map { item ->
ButtonItem( ListItem(
it.toString(), item = item,
when (it) { title = stringResource(id = item.title),
LibraryLayout.LIST -> stringResource(id = R.string.layout_list) selected = item == settings.libraryLayout.value
LibraryLayout.GRID -> stringResource(id = R.string.layout_grid)
},
MaterialTheme.typography.labelLarge,
it == settings.libraryLayout.value
) )
},
onClick = { item ->
settings.libraryLayout.update(item)
} }
) { )
settings.libraryLayout.update(LibraryLayout.valueOf(it.id))
}
} }

View file

@ -6,7 +6,6 @@
package ua.acclorite.book_story.ui.settings.library.display.components package ua.acclorite.book_story.ui.settings.library.display.components
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import ua.acclorite.book_story.R import ua.acclorite.book_story.R
@ -14,7 +13,7 @@ import ua.acclorite.book_story.presentation.library.model.LibraryLayout
import ua.acclorite.book_story.presentation.library.model.LibraryTitlePosition import ua.acclorite.book_story.presentation.library.model.LibraryTitlePosition
import ua.acclorite.book_story.ui.common.components.settings.ChipsWithTitle import ua.acclorite.book_story.ui.common.components.settings.ChipsWithTitle
import ua.acclorite.book_story.ui.common.helpers.LocalSettings import ua.acclorite.book_story.ui.common.helpers.LocalSettings
import ua.acclorite.book_story.ui.common.model.ButtonItem import ua.acclorite.book_story.ui.common.model.ListItem
import ua.acclorite.book_story.ui.theme.ExpandingTransition import ua.acclorite.book_story.ui.theme.ExpandingTransition
@Composable @Composable
@ -24,20 +23,16 @@ fun LibraryTitlePositionOption() {
ExpandingTransition(visible = settings.libraryLayout.value == LibraryLayout.GRID) { ExpandingTransition(visible = settings.libraryLayout.value == LibraryLayout.GRID) {
ChipsWithTitle( ChipsWithTitle(
title = stringResource(id = R.string.title_position_option), title = stringResource(id = R.string.title_position_option),
chips = LibraryTitlePosition.entries.map { chips = LibraryTitlePosition.entries.map { item ->
ButtonItem( ListItem(
it.name, item = item,
when (it) { title = stringResource(id = item.title),
LibraryTitlePosition.OFF -> stringResource(id = R.string.library_title_position_off) selected = item == settings.libraryTitlePosition.value
LibraryTitlePosition.BELOW -> stringResource(id = R.string.library_title_position_below) )
LibraryTitlePosition.INSIDE -> stringResource(id = R.string.library_title_position_inside)
}, },
MaterialTheme.typography.labelLarge, onClick = { item ->
it == settings.libraryTitlePosition.value settings.libraryTitlePosition.update(item)
}
) )
} }
) {
settings.libraryTitlePosition.update(LibraryTitlePosition.valueOf(it.id))
}
}
} }

View file

@ -6,14 +6,13 @@
package ua.acclorite.book_story.ui.settings.reader.chapters.components package ua.acclorite.book_story.ui.settings.reader.chapters.components
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import ua.acclorite.book_story.R import ua.acclorite.book_story.R
import ua.acclorite.book_story.presentation.reader.model.ReaderTextAlignment import ua.acclorite.book_story.presentation.reader.model.ReaderTextAlignment
import ua.acclorite.book_story.ui.common.components.settings.SegmentedButtonWithTitle import ua.acclorite.book_story.ui.common.components.settings.SegmentedButtonWithTitle
import ua.acclorite.book_story.ui.common.helpers.LocalSettings import ua.acclorite.book_story.ui.common.helpers.LocalSettings
import ua.acclorite.book_story.ui.common.model.ButtonItem import ua.acclorite.book_story.ui.common.model.ListItem
@Composable @Composable
fun ChapterTitleAlignmentOption() { fun ChapterTitleAlignmentOption() {
@ -21,21 +20,15 @@ fun ChapterTitleAlignmentOption() {
SegmentedButtonWithTitle( SegmentedButtonWithTitle(
title = stringResource(id = R.string.chapter_title_alignment_option), title = stringResource(id = R.string.chapter_title_alignment_option),
buttons = ReaderTextAlignment.entries.map { buttons = ReaderTextAlignment.entries.map { item ->
ButtonItem( ListItem(
id = it.toString(), item = item,
title = when (it) { title = stringResource(id = item.title),
ReaderTextAlignment.START -> stringResource(id = R.string.alignment_start) selected = item == settings.chapterTitleAlignment.value
ReaderTextAlignment.JUSTIFY -> stringResource(id = R.string.alignment_justify)
ReaderTextAlignment.CENTER -> stringResource(id = R.string.alignment_center)
ReaderTextAlignment.END -> stringResource(id = R.string.alignment_end)
},
textStyle = MaterialTheme.typography.labelLarge,
selected = it == settings.chapterTitleAlignment.value
) )
}, },
onClick = { onClick = { item ->
settings.chapterTitleAlignment.update(ReaderTextAlignment.valueOf(it.id)) settings.chapterTitleAlignment.update(item)
} }
) )
} }

View file

@ -12,7 +12,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.common.components.settings.ChipsWithTitle import ua.acclorite.book_story.ui.common.components.settings.ChipsWithTitle
import ua.acclorite.book_story.ui.common.helpers.LocalSettings import ua.acclorite.book_story.ui.common.helpers.LocalSettings
import ua.acclorite.book_story.ui.common.model.ButtonItem import ua.acclorite.book_story.ui.common.model.ListItem
import ua.acclorite.book_story.ui.reader.data.ReaderData import ua.acclorite.book_story.ui.reader.data.ReaderData
@Composable @Composable
@ -21,21 +21,20 @@ fun FontFamilyOption() {
ChipsWithTitle( ChipsWithTitle(
title = stringResource(id = R.string.font_family_option), title = stringResource(id = R.string.font_family_option),
chips = ReaderData.fonts.map { chips = ReaderData.fonts.map { item ->
ButtonItem( ListItem(
id = it.id, item = item,
title = it.fontName.asString(), title = item.fontName.asString(),
textStyle = MaterialTheme.typography.labelLarge.copy( textStyle = {
fontFamily = it.font MaterialTheme.typography.labelLarge.copy(
), fontFamily = item.font
selected = it == settings.fontFamily.value
) )
}, },
onClick = { selected = item == settings.fontFamily.value
settings.fontFamily.update(
ReaderData.fonts.find { font -> font.id == it.id }
?: ReaderData.fonts[0]
) )
},
onClick = { item ->
settings.fontFamily.update(item)
} }
) )
} }

View file

@ -13,7 +13,7 @@ import androidx.compose.ui.text.font.FontStyle
import ua.acclorite.book_story.R import ua.acclorite.book_story.R
import ua.acclorite.book_story.ui.common.components.settings.SegmentedButtonWithTitle import ua.acclorite.book_story.ui.common.components.settings.SegmentedButtonWithTitle
import ua.acclorite.book_story.ui.common.helpers.LocalSettings import ua.acclorite.book_story.ui.common.helpers.LocalSettings
import ua.acclorite.book_story.ui.common.model.ButtonItem import ua.acclorite.book_story.ui.common.model.ListItem
@Composable @Composable
fun FontStyleOption() { fun FontStyleOption() {
@ -22,32 +22,31 @@ fun FontStyleOption() {
SegmentedButtonWithTitle( SegmentedButtonWithTitle(
title = stringResource(id = R.string.font_style_option), title = stringResource(id = R.string.font_style_option),
buttons = listOf( buttons = listOf(
ButtonItem( ListItem(
id = "normal", item = false,
title = stringResource(id = R.string.font_style_normal), title = stringResource(id = R.string.font_style_normal),
textStyle = MaterialTheme.typography.labelLarge.copy( textStyle = {
MaterialTheme.typography.labelLarge.copy(
fontFamily = settings.fontFamily.value.font, fontFamily = settings.fontFamily.value.font,
fontStyle = FontStyle.Normal fontStyle = FontStyle.Normal
), )
},
selected = !settings.italic.value selected = !settings.italic.value
), ),
ButtonItem( ListItem(
id = "italic", item = true,
title = stringResource(id = R.string.font_style_italic), title = stringResource(id = R.string.font_style_italic),
textStyle = MaterialTheme.typography.labelLarge.copy( textStyle = {
MaterialTheme.typography.labelLarge.copy(
fontFamily = settings.fontFamily.value.font, fontFamily = settings.fontFamily.value.font,
fontStyle = FontStyle.Italic fontStyle = FontStyle.Italic
), )
},
selected = settings.italic.value selected = settings.italic.value
) )
), ),
onClick = { onClick = { item ->
settings.italic.update( settings.italic.update(item)
when (it.id) {
"italic" -> true
else -> false
}
)
} }
) )
} }

View file

@ -13,7 +13,7 @@ import ua.acclorite.book_story.R
import ua.acclorite.book_story.presentation.reader.model.ReaderFontThickness import ua.acclorite.book_story.presentation.reader.model.ReaderFontThickness
import ua.acclorite.book_story.ui.common.components.settings.ChipsWithTitle import ua.acclorite.book_story.ui.common.components.settings.ChipsWithTitle
import ua.acclorite.book_story.ui.common.helpers.LocalSettings import ua.acclorite.book_story.ui.common.helpers.LocalSettings
import ua.acclorite.book_story.ui.common.model.ButtonItem import ua.acclorite.book_story.ui.common.model.ListItem
@Composable @Composable
fun FontThicknessOption() { fun FontThicknessOption() {
@ -21,25 +21,21 @@ fun FontThicknessOption() {
ChipsWithTitle( ChipsWithTitle(
title = stringResource(id = R.string.font_thickness_option), title = stringResource(id = R.string.font_thickness_option),
chips = ReaderFontThickness.entries.map { chips = ReaderFontThickness.entries.map { item ->
ButtonItem( ListItem(
id = it.toString(), item = item,
title = when (it) { title = stringResource(id = item.title),
ReaderFontThickness.THIN -> stringResource(id = R.string.font_thickness_thin) textStyle = {
ReaderFontThickness.EXTRA_LIGHT -> stringResource(id = R.string.font_thickness_extra_light) MaterialTheme.typography.labelLarge.copy(
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 = settings.fontFamily.value.font, fontFamily = settings.fontFamily.value.font,
fontWeight = it.thickness fontWeight = item.thickness
),
selected = it == settings.fontThickness.value
) )
}, },
onClick = { selected = item == settings.fontThickness.value
settings.fontThickness.update(ReaderFontThickness.valueOf(it.id)) )
},
onClick = { item ->
settings.fontThickness.update(item)
} }
) )
} }

View file

@ -6,13 +6,12 @@
package ua.acclorite.book_story.ui.settings.reader.images.components package ua.acclorite.book_story.ui.settings.reader.images.components
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import ua.acclorite.book_story.R import ua.acclorite.book_story.R
import ua.acclorite.book_story.ui.common.components.settings.SegmentedButtonWithTitle import ua.acclorite.book_story.ui.common.components.settings.SegmentedButtonWithTitle
import ua.acclorite.book_story.ui.common.helpers.LocalSettings import ua.acclorite.book_story.ui.common.helpers.LocalSettings
import ua.acclorite.book_story.ui.common.model.ButtonItem import ua.acclorite.book_story.ui.common.model.ListItem
import ua.acclorite.book_story.ui.theme.ExpandingTransition import ua.acclorite.book_story.ui.theme.ExpandingTransition
import ua.acclorite.book_story.ui.theme.model.HorizontalAlignment import ua.acclorite.book_story.ui.theme.model.HorizontalAlignment
@ -23,20 +22,15 @@ fun ImagesAlignmentOption() {
ExpandingTransition(visible = settings.images.value) { ExpandingTransition(visible = settings.images.value) {
SegmentedButtonWithTitle( SegmentedButtonWithTitle(
title = stringResource(id = R.string.images_alignment_option), title = stringResource(id = R.string.images_alignment_option),
buttons = HorizontalAlignment.entries.map { buttons = HorizontalAlignment.entries.map { item ->
ButtonItem( ListItem(
id = it.name, item = item,
title = when (it) { title = stringResource(id = item.title),
HorizontalAlignment.START -> stringResource(id = R.string.alignment_start) selected = item == settings.imagesAlignment.value
HorizontalAlignment.CENTER -> stringResource(id = R.string.alignment_center)
HorizontalAlignment.END -> stringResource(id = R.string.alignment_end)
},
textStyle = MaterialTheme.typography.labelLarge,
selected = it == settings.imagesAlignment.value
) )
}, },
onClick = { onClick = { item ->
settings.imagesAlignment.update(HorizontalAlignment.valueOf(it.id)) settings.imagesAlignment.update(item)
} }
) )
} }

View file

@ -6,14 +6,13 @@
package ua.acclorite.book_story.ui.settings.reader.images.components package ua.acclorite.book_story.ui.settings.reader.images.components
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import ua.acclorite.book_story.R import ua.acclorite.book_story.R
import ua.acclorite.book_story.presentation.reader.model.ReaderColorEffects import ua.acclorite.book_story.presentation.reader.model.ReaderColorEffects
import ua.acclorite.book_story.ui.common.components.settings.ChipsWithTitle import ua.acclorite.book_story.ui.common.components.settings.ChipsWithTitle
import ua.acclorite.book_story.ui.common.helpers.LocalSettings import ua.acclorite.book_story.ui.common.helpers.LocalSettings
import ua.acclorite.book_story.ui.common.model.ButtonItem import ua.acclorite.book_story.ui.common.model.ListItem
import ua.acclorite.book_story.ui.theme.ExpandingTransition import ua.acclorite.book_story.ui.theme.ExpandingTransition
@Composable @Composable
@ -23,21 +22,15 @@ fun ImagesColorEffectsOption() {
ExpandingTransition(visible = settings.images.value) { ExpandingTransition(visible = settings.images.value) {
ChipsWithTitle( ChipsWithTitle(
title = stringResource(id = R.string.images_color_effects_option), title = stringResource(id = R.string.images_color_effects_option),
chips = ReaderColorEffects.entries.map { chips = ReaderColorEffects.entries.map { item ->
ButtonItem( ListItem(
id = it.name, item = item,
title = when (it) { title = stringResource(id = item.title),
ReaderColorEffects.OFF -> stringResource(R.string.color_effects_off) selected = item == settings.imagesColorEffects.value
ReaderColorEffects.GRAYSCALE -> stringResource(R.string.color_effects_grayscale)
ReaderColorEffects.FONT -> stringResource(R.string.color_effects_font)
ReaderColorEffects.BACKGROUND -> stringResource(R.string.color_effects_background)
},
textStyle = MaterialTheme.typography.labelLarge,
selected = it == settings.imagesColorEffects.value
) )
}, },
onClick = { onClick = { item ->
settings.imagesColorEffects.update(ReaderColorEffects.valueOf(it.id)) settings.imagesColorEffects.update(item)
} }
) )
} }

View file

@ -6,13 +6,12 @@
package ua.acclorite.book_story.ui.settings.reader.progress.components package ua.acclorite.book_story.ui.settings.reader.progress.components
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import ua.acclorite.book_story.R import ua.acclorite.book_story.R
import ua.acclorite.book_story.ui.common.components.settings.SegmentedButtonWithTitle import ua.acclorite.book_story.ui.common.components.settings.SegmentedButtonWithTitle
import ua.acclorite.book_story.ui.common.helpers.LocalSettings import ua.acclorite.book_story.ui.common.helpers.LocalSettings
import ua.acclorite.book_story.ui.common.model.ButtonItem import ua.acclorite.book_story.ui.common.model.ListItem
import ua.acclorite.book_story.ui.theme.ExpandingTransition import ua.acclorite.book_story.ui.theme.ExpandingTransition
import ua.acclorite.book_story.ui.theme.model.HorizontalAlignment import ua.acclorite.book_story.ui.theme.model.HorizontalAlignment
@ -23,20 +22,15 @@ fun ProgressBarAlignmentOption() {
ExpandingTransition(visible = settings.progressBar.value) { ExpandingTransition(visible = settings.progressBar.value) {
SegmentedButtonWithTitle( SegmentedButtonWithTitle(
title = stringResource(id = R.string.progress_bar_alignment_option), title = stringResource(id = R.string.progress_bar_alignment_option),
buttons = HorizontalAlignment.entries.map { buttons = HorizontalAlignment.entries.map { item ->
ButtonItem( ListItem(
id = it.name, item = item,
title = when (it) { title = stringResource(id = item.title),
HorizontalAlignment.START -> stringResource(id = R.string.alignment_start) selected = item == settings.progressBarAlignment.value
HorizontalAlignment.CENTER -> stringResource(id = R.string.alignment_center)
HorizontalAlignment.END -> stringResource(id = R.string.alignment_end)
},
textStyle = MaterialTheme.typography.labelLarge,
selected = it == settings.progressBarAlignment.value
) )
}, },
onClick = { onClick = { item ->
settings.progressBarAlignment.update(HorizontalAlignment.valueOf(it.id)) settings.progressBarAlignment.update(item)
} }
) )
} }

View file

@ -6,14 +6,13 @@
package ua.acclorite.book_story.ui.settings.reader.progress.components package ua.acclorite.book_story.ui.settings.reader.progress.components
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import ua.acclorite.book_story.R import ua.acclorite.book_story.R
import ua.acclorite.book_story.presentation.reader.model.ReaderProgressCount import ua.acclorite.book_story.presentation.reader.model.ReaderProgressCount
import ua.acclorite.book_story.ui.common.components.settings.SegmentedButtonWithTitle import ua.acclorite.book_story.ui.common.components.settings.SegmentedButtonWithTitle
import ua.acclorite.book_story.ui.common.helpers.LocalSettings import ua.acclorite.book_story.ui.common.helpers.LocalSettings
import ua.acclorite.book_story.ui.common.model.ButtonItem import ua.acclorite.book_story.ui.common.model.ListItem
@Composable @Composable
fun ProgressCountOption() { fun ProgressCountOption() {
@ -21,19 +20,15 @@ fun ProgressCountOption() {
SegmentedButtonWithTitle( SegmentedButtonWithTitle(
title = stringResource(id = R.string.progress_count_option), title = stringResource(id = R.string.progress_count_option),
buttons = ReaderProgressCount.entries.map { buttons = ReaderProgressCount.entries.map { item ->
ButtonItem( ListItem(
id = it.name, item = item,
title = when (it) { title = stringResource(id = item.title),
ReaderProgressCount.PERCENTAGE -> stringResource(id = R.string.progress_count_percentage) selected = item == settings.progressCount.value
ReaderProgressCount.QUANTITY -> stringResource(id = R.string.progress_count_quantity)
},
textStyle = MaterialTheme.typography.labelLarge,
selected = it == settings.progressCount.value
) )
}, },
onClick = { onClick = { item ->
settings.progressCount.update(ReaderProgressCount.valueOf(it.id)) settings.progressCount.update(item)
} }
) )
} }

View file

@ -6,14 +6,13 @@
package ua.acclorite.book_story.ui.settings.reader.reading_mode.components package ua.acclorite.book_story.ui.settings.reader.reading_mode.components
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import ua.acclorite.book_story.R import ua.acclorite.book_story.R
import ua.acclorite.book_story.presentation.reader.model.ReaderHorizontalGesture import ua.acclorite.book_story.presentation.reader.model.ReaderHorizontalGesture
import ua.acclorite.book_story.ui.common.components.settings.ChipsWithTitle import ua.acclorite.book_story.ui.common.components.settings.ChipsWithTitle
import ua.acclorite.book_story.ui.common.helpers.LocalSettings import ua.acclorite.book_story.ui.common.helpers.LocalSettings
import ua.acclorite.book_story.ui.common.model.ButtonItem import ua.acclorite.book_story.ui.common.model.ListItem
@Composable @Composable
fun HorizontalGestureOption() { fun HorizontalGestureOption() {
@ -21,20 +20,15 @@ fun HorizontalGestureOption() {
ChipsWithTitle( ChipsWithTitle(
title = stringResource(id = R.string.horizontal_gesture_option), title = stringResource(id = R.string.horizontal_gesture_option),
chips = ReaderHorizontalGesture.entries.map { chips = ReaderHorizontalGesture.entries.map { item ->
ButtonItem( ListItem(
id = it.name, item = item,
title = when (it) { title = stringResource(id = item.title),
ReaderHorizontalGesture.OFF -> stringResource(R.string.horizontal_gesture_off) selected = item == settings.horizontalGesture.value
ReaderHorizontalGesture.ON -> stringResource(R.string.horizontal_gesture_on)
ReaderHorizontalGesture.INVERSE -> stringResource(R.string.horizontal_gesture_inverse)
},
textStyle = MaterialTheme.typography.labelLarge,
selected = it == settings.horizontalGesture.value
) )
}, },
onClick = { onClick = { item ->
settings.horizontalGesture.update(ReaderHorizontalGesture.valueOf(it.id)) settings.horizontalGesture.update(item)
} }
) )
} }

View file

@ -6,14 +6,13 @@
package ua.acclorite.book_story.ui.settings.reader.system.components package ua.acclorite.book_story.ui.settings.reader.system.components
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import ua.acclorite.book_story.R import ua.acclorite.book_story.R
import ua.acclorite.book_story.presentation.reader.model.ReaderScreenOrientation import ua.acclorite.book_story.presentation.reader.model.ReaderScreenOrientation
import ua.acclorite.book_story.ui.common.components.settings.ChipsWithTitle import ua.acclorite.book_story.ui.common.components.settings.ChipsWithTitle
import ua.acclorite.book_story.ui.common.helpers.LocalSettings import ua.acclorite.book_story.ui.common.helpers.LocalSettings
import ua.acclorite.book_story.ui.common.model.ButtonItem import ua.acclorite.book_story.ui.common.model.ListItem
@Composable @Composable
fun ScreenOrientationOption() { fun ScreenOrientationOption() {
@ -21,23 +20,15 @@ fun ScreenOrientationOption() {
ChipsWithTitle( ChipsWithTitle(
title = stringResource(id = R.string.screen_orientation_option), title = stringResource(id = R.string.screen_orientation_option),
chips = ReaderScreenOrientation.entries.map { chips = ReaderScreenOrientation.entries.map { item ->
ButtonItem( ListItem(
id = it.name, item = item,
title = when (it) { title = stringResource(id = item.title),
ReaderScreenOrientation.FREE -> stringResource(id = R.string.screen_orientation_free) selected = item == settings.screenOrientation.value
ReaderScreenOrientation.PORTRAIT -> stringResource(id = R.string.screen_orientation_portrait)
ReaderScreenOrientation.LANDSCAPE -> stringResource(id = R.string.screen_orientation_landscape)
ReaderScreenOrientation.LOCKED_PORTRAIT -> stringResource(id = R.string.screen_orientation_locked_portrait)
ReaderScreenOrientation.LOCKED_LANDSCAPE -> stringResource(id = R.string.screen_orientation_locked_landscape)
else -> stringResource(id = R.string.default_string)
},
textStyle = MaterialTheme.typography.labelLarge,
selected = it == settings.screenOrientation.value
) )
}, },
onClick = { onClick = { item ->
settings.screenOrientation.update(ReaderScreenOrientation.valueOf(it.id)) settings.screenOrientation.update(item)
} }
) )
} }

View file

@ -6,14 +6,13 @@
package ua.acclorite.book_story.ui.settings.reader.text.components package ua.acclorite.book_story.ui.settings.reader.text.components
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import ua.acclorite.book_story.R import ua.acclorite.book_story.R
import ua.acclorite.book_story.presentation.reader.model.ReaderTextAlignment import ua.acclorite.book_story.presentation.reader.model.ReaderTextAlignment
import ua.acclorite.book_story.ui.common.components.settings.SegmentedButtonWithTitle import ua.acclorite.book_story.ui.common.components.settings.SegmentedButtonWithTitle
import ua.acclorite.book_story.ui.common.helpers.LocalSettings import ua.acclorite.book_story.ui.common.helpers.LocalSettings
import ua.acclorite.book_story.ui.common.model.ButtonItem import ua.acclorite.book_story.ui.common.model.ListItem
@Composable @Composable
fun TextAlignmentOption() { fun TextAlignmentOption() {
@ -21,21 +20,15 @@ fun TextAlignmentOption() {
SegmentedButtonWithTitle( SegmentedButtonWithTitle(
title = stringResource(id = R.string.text_alignment_option), title = stringResource(id = R.string.text_alignment_option),
buttons = ReaderTextAlignment.entries.map { buttons = ReaderTextAlignment.entries.map { item ->
ButtonItem( ListItem(
id = it.toString(), item = item,
title = when (it) { title = stringResource(id = item.title),
ReaderTextAlignment.START -> stringResource(id = R.string.alignment_start) selected = item == settings.textAlignment.value
ReaderTextAlignment.JUSTIFY -> stringResource(id = R.string.alignment_justify)
ReaderTextAlignment.CENTER -> stringResource(id = R.string.alignment_center)
ReaderTextAlignment.END -> stringResource(id = R.string.alignment_end)
},
textStyle = MaterialTheme.typography.labelLarge,
selected = it == settings.textAlignment.value
) )
}, },
onClick = { onClick = { item ->
settings.textAlignment.update(ReaderTextAlignment.valueOf(it.id)) settings.textAlignment.update(item)
} }
) )
} }

View file

@ -12,13 +12,13 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import ua.acclorite.book_story.presentation.navigator.StackEvent import ua.acclorite.book_story.presentation.navigator.StackEvent
import ua.acclorite.book_story.presentation.start.StartScreen import ua.acclorite.book_story.presentation.start.StartScreen
import ua.acclorite.book_story.ui.common.model.ButtonItem import ua.acclorite.book_story.ui.common.model.ListItem
@Composable @Composable
fun StartContent( fun StartContent(
currentPage: Int, currentPage: Int,
stackEvent: StackEvent, stackEvent: StackEvent,
languages: List<ButtonItem>, languages: List<ListItem<String>>,
updateLanguage: (String) -> Unit, updateLanguage: (String) -> Unit,
navigateForward: () -> Unit, navigateForward: () -> Unit,
navigateBack: () -> Unit, navigateBack: () -> Unit,

View file

@ -9,13 +9,13 @@ package ua.acclorite.book_story.ui.start
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import ua.acclorite.book_story.presentation.navigator.StackEvent import ua.acclorite.book_story.presentation.navigator.StackEvent
import ua.acclorite.book_story.presentation.start.StartScreen import ua.acclorite.book_story.presentation.start.StartScreen
import ua.acclorite.book_story.ui.common.model.ButtonItem import ua.acclorite.book_story.ui.common.model.ListItem
@Composable @Composable
fun StartSettings( fun StartSettings(
currentPage: Int, currentPage: Int,
stackEvent: StackEvent, stackEvent: StackEvent,
languages: List<ButtonItem>, languages: List<ListItem<String>>,
updateLanguage: (String) -> Unit, updateLanguage: (String) -> Unit,
navigateForward: () -> Unit navigateForward: () -> Unit
) { ) {

View file

@ -18,11 +18,11 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import ua.acclorite.book_story.R import ua.acclorite.book_story.R
import ua.acclorite.book_story.ui.common.components.dialog.SelectableDialogItem import ua.acclorite.book_story.ui.common.components.dialog.SelectableDialogItem
import ua.acclorite.book_story.ui.common.model.ButtonItem import ua.acclorite.book_story.ui.common.model.ListItem
import ua.acclorite.book_story.ui.settings.components.SettingsSubcategoryTitle import ua.acclorite.book_story.ui.settings.components.SettingsSubcategoryTitle
fun LazyListScope.StartSettingsLayoutGeneral( fun LazyListScope.StartSettingsLayoutGeneral(
languages: List<ButtonItem>, languages: List<ListItem<String>>,
updateLanguage: (String) -> Unit, updateLanguage: (String) -> Unit,
) { ) {
item { item {
@ -34,13 +34,13 @@ fun LazyListScope.StartSettingsLayoutGeneral(
Spacer(modifier = Modifier.height(12.dp)) Spacer(modifier = Modifier.height(12.dp))
} }
items(languages, key = { it.id }) { items(languages, key = { it.item }) {
SelectableDialogItem( SelectableDialogItem(
selected = it.selected, selected = it.selected,
title = it.title, title = it.title,
horizontalPadding = 18.dp horizontalPadding = 18.dp
) { ) {
updateLanguage(it.id) updateLanguage(it.item)
} }
} }

View file

@ -6,13 +6,15 @@
package ua.acclorite.book_story.ui.theme.model package ua.acclorite.book_story.ui.theme.model
import androidx.annotation.StringRes
import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import ua.acclorite.book_story.R
enum class DarkTheme { enum class DarkTheme(@StringRes val title: Int) {
FOLLOW_SYSTEM, FOLLOW_SYSTEM(R.string.dark_theme_follow_system),
OFF, OFF(R.string.dark_theme_off),
ON; ON(R.string.dark_theme_on);
@Composable @Composable
fun isDark(): Boolean { fun isDark(): Boolean {

View file

@ -6,10 +6,12 @@
package ua.acclorite.book_story.ui.theme.model package ua.acclorite.book_story.ui.theme.model
import androidx.annotation.StringRes
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import ua.acclorite.book_story.R
enum class HorizontalAlignment(val alignment: Alignment) { enum class HorizontalAlignment(val alignment: Alignment, @StringRes val title: Int) {
START(Alignment.Companion.CenterStart), START(Alignment.Companion.CenterStart, R.string.alignment_start),
CENTER(Alignment.Companion.Center), CENTER(Alignment.Companion.Center, R.string.alignment_center),
END(Alignment.Companion.CenterEnd) END(Alignment.Companion.CenterEnd, R.string.alignment_end)
} }

View file

@ -8,12 +8,14 @@ package ua.acclorite.book_story.ui.theme.model
import android.content.Context import android.content.Context
import android.os.PowerManager import android.os.PowerManager
import androidx.annotation.StringRes
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import ua.acclorite.book_story.R
enum class PureDark { enum class PureDark(@StringRes val title: Int) {
OFF, OFF(R.string.pure_dark_off),
ON, ON(R.string.pure_dark_on),
SAVER; SAVER(R.string.pure_dark_power_saver);
@Composable @Composable
fun isPureDark(context: Context): Boolean { fun isPureDark(context: Context): Boolean {

View file

@ -6,9 +6,12 @@
package ua.acclorite.book_story.ui.theme.model package ua.acclorite.book_story.ui.theme.model
import androidx.annotation.StringRes
import ua.acclorite.book_story.R
enum class ThemeContrast {
STANDARD, enum class ThemeContrast(@StringRes val title: Int) {
MEDIUM, STANDARD(R.string.theme_contrast_standard),
HIGH MEDIUM(R.string.theme_contrast_medium),
HIGH(R.string.theme_contrast_high)
} }