ReadYou/app/src/main/java/me/ash/reader/ui/page/settings/color/reading/ReadingTextPage.kt

203 lines
7.8 KiB
Kotlin

package me.ash.reader.ui.page.settings.color.reading
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.rounded.ArrowBack
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.navigation.NavHostController
import me.ash.reader.R
import me.ash.reader.infrastructure.preference.*
import me.ash.reader.ui.component.base.*
import me.ash.reader.ui.page.settings.SettingItem
import me.ash.reader.ui.theme.palette.onLight
@Composable
fun ReadingTextPage(
navController: NavHostController,
) {
val context = LocalContext.current
val scope = rememberCoroutineScope()
val readingTheme = LocalReadingTheme.current
val fontSize = LocalReadingTextFontSize.current
val letterSpacing = LocalReadingLetterSpacing.current
val horizontalPadding = LocalReadingTextHorizontalPadding.current
val align = LocalReadingTextAlign.current
val bold = LocalReadingTextBold.current
var fontSizeDialogVisible by remember { mutableStateOf(false) }
var letterSpacingDialogVisible by remember { mutableStateOf(false) }
var horizontalPaddingDialogVisible by remember { mutableStateOf(false) }
var alignDialogVisible by remember { mutableStateOf(false) }
var fontSizeValue: Int? by remember { mutableStateOf(fontSize) }
var letterSpacingValue: String? by remember { mutableStateOf(letterSpacing.toString()) }
var horizontalPaddingValue: Int? by remember { mutableStateOf(horizontalPadding) }
RYScaffold(
containerColor = MaterialTheme.colorScheme.surface onLight MaterialTheme.colorScheme.inverseOnSurface,
navigationIcon = {
FeedbackIconButton(
imageVector = Icons.AutoMirrored.Rounded.ArrowBack,
contentDescription = stringResource(R.string.back),
tint = MaterialTheme.colorScheme.onSurface
) {
navController.popBackStack()
}
},
content = {
LazyColumn {
item {
DisplayText(text = stringResource(R.string.text), desc = "")
}
// Preview
item {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 24.dp)
.clip(RoundedCornerShape(24.dp))
.background(
MaterialTheme.colorScheme.inverseOnSurface
onLight MaterialTheme.colorScheme.surface.copy(0.7f)
)
.clickable { },
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically
) {
TitleAndTextPreview()
}
Spacer(modifier = Modifier.height(24.dp))
}
// Text
item {
Subtitle(
modifier = Modifier.padding(horizontal = 24.dp),
text = stringResource(R.string.text)
)
SettingItem(
title = stringResource(R.string.font_size),
desc = "${fontSize}sp",
onClick = { fontSizeDialogVisible = true },
) {}
SettingItem(
title = stringResource(R.string.bold),
onClick = {
(!bold).put(context, scope)
ReadingThemePreference.Custom.put(context, scope)
},
) {
RYSwitch(activated = bold.value) {
(!bold).put(context, scope)
ReadingThemePreference.Custom.put(context, scope)
}
}
SettingItem(
title = stringResource(R.string.letter_spacing),
desc = "${letterSpacing}sp",
onClick = { letterSpacingDialogVisible = true },
) {}
SettingItem(
title = stringResource(R.string.horizontal_padding),
desc = "${horizontalPadding}dp",
onClick = { horizontalPaddingDialogVisible = true },
) {}
SettingItem(
title = stringResource(R.string.alignment),
desc = align.toDesc(context),
onClick = { alignDialogVisible = true },
) {}
}
item {
Spacer(modifier = Modifier.height(24.dp))
Spacer(modifier = Modifier.windowInsetsBottomHeight(WindowInsets.navigationBars))
}
}
}
)
TextFieldDialog(
visible = fontSizeDialogVisible,
title = stringResource(R.string.font_size),
value = (fontSizeValue ?: "").toString(),
placeholder = stringResource(R.string.value),
onValueChange = {
fontSizeValue = it.filter { it.isDigit() }.toIntOrNull()
},
onDismissRequest = {
fontSizeDialogVisible = false
},
onConfirm = {
ReadingTextFontSizePreference.put(context, scope, fontSizeValue ?: 0)
ReadingThemePreference.Custom.put(context, scope)
fontSizeDialogVisible = false
}
)
TextFieldDialog(
visible = letterSpacingDialogVisible,
title = stringResource(R.string.letter_spacing),
value = (letterSpacingValue ?: "").toString(),
placeholder = stringResource(R.string.value),
onValueChange = {
letterSpacingValue = it
},
onDismissRequest = {
letterSpacingDialogVisible = false
},
onConfirm = {
ReadingLetterSpacingPreference.put(context, scope, letterSpacingValue?.toDoubleOrNull() ?: 0.0)
ReadingThemePreference.Custom.put(context, scope)
letterSpacingDialogVisible = false
}
)
TextFieldDialog(
visible = horizontalPaddingDialogVisible,
title = stringResource(R.string.horizontal_padding),
value = (horizontalPaddingValue ?: "").toString(),
placeholder = stringResource(R.string.value),
onValueChange = {
horizontalPaddingValue = it.filter { it.isDigit() }.toIntOrNull()
},
onDismissRequest = {
horizontalPaddingDialogVisible = false
},
onConfirm = {
ReadingTextHorizontalPaddingPreference.put(context, scope, horizontalPaddingValue ?: 0)
ReadingThemePreference.Custom.put(context, scope)
horizontalPaddingDialogVisible = false
}
)
RadioDialog(
visible = alignDialogVisible,
title = stringResource(R.string.alignment),
options = ReadingTextAlignPreference.values.map {
RadioDialogOption(
text = it.toDesc(context),
selected = it == align,
) {
it.put(context, scope)
ReadingThemePreference.Custom.put(context, scope)
}
}
) {
alignDialogVisible = false
}
}