mirror of https://github.com/Ashinch/ReadYou.git
203 lines
7.8 KiB
Kotlin
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
|
|
}
|
|
}
|