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

281 lines
11 KiB
Kotlin

package me.ash.reader.ui.page.settings.color.reading
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.horizontalScroll
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Image
import androidx.compose.material.icons.outlined.Movie
import androidx.compose.material.icons.automirrored.rounded.ArrowBack
import androidx.compose.material.icons.rounded.Segment
import androidx.compose.material.icons.rounded.Title
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.text.TextStyle
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.ReadingThemePrev
import me.ash.reader.ui.component.base.*
import me.ash.reader.ui.ext.ExternalFonts
import me.ash.reader.ui.page.common.RouteName
import me.ash.reader.ui.page.settings.SettingItem
import me.ash.reader.ui.theme.palette.onLight
@Composable
fun ReadingStylePage(
navController: NavHostController,
) {
val context = LocalContext.current
val scope = rememberCoroutineScope()
val readingTheme = LocalReadingTheme.current
val darkTheme = LocalReadingDarkTheme.current
val darkThemeNot = !darkTheme
val tonalElevation = LocalReadingPageTonalElevation.current
val fonts = LocalReadingFonts.current
val autoHideToolbar = LocalReadingAutoHideToolbar.current
val pullToSwitchArticle = LocalPullToSwitchArticle.current
var tonalElevationDialogVisible by remember { mutableStateOf(false) }
var fontsDialogVisible by remember { mutableStateOf(false) }
val launcher = rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) { uri ->
uri?.let {
ExternalFonts(context, it, ExternalFonts.FontType.ReadingFont).copyToInternalStorage()
ReadingFontsPreference.External.put(context, scope)
}
}
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.reading_page), desc = "")
}
// Preview
item {
Row(modifier = Modifier.horizontalScroll(rememberScrollState())
) {
Spacer(modifier = Modifier.width(24.dp))
ReadingThemePreference.values.map {
if (readingTheme == ReadingThemePreference.Custom || it != ReadingThemePreference.Custom) {
ReadingThemePrev(selected = readingTheme, theme = it) {
it.put(context, scope)
it.applyTheme(context, scope)
}
} else {
Spacer(modifier = Modifier.width(150.dp))
}
Spacer(modifier = Modifier.width(8.dp))
}
Spacer(modifier = Modifier.width((24 - 8).dp))
}
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
) {
}
Spacer(modifier = Modifier.height(24.dp))
}
// General
item {
Subtitle(
modifier = Modifier.padding(horizontal = 24.dp),
text = stringResource(R.string.general)
)
SettingItem(
title = stringResource(R.string.reading_fonts),
desc = fonts.toDesc(context),
onClick = { fontsDialogVisible = true },
) {}
SettingItem(
title = stringResource(R.string.dark_reading_theme),
desc = darkTheme.toDesc(context),
separatedActions = true,
onClick = {
navController.navigate(RouteName.READING_DARK_THEME) {
launchSingleTop = true
}
},
) {
RYSwitch(
activated = darkTheme.isDarkTheme()
) {
darkThemeNot.put(context, scope)
}
}
SettingItem(
title = stringResource(R.string.bionic_reading),
separatedActions = true,
enabled = false,
onClick = {
// (!articleListDesc).put(context, scope)
},
) {
RYSwitch(
activated = false,
enable = false,
) {
// (!articleListDesc).put(context, scope)
}
}
SettingItem(
title = stringResource(R.string.auto_hide_toolbars),
onClick = {
(!autoHideToolbar).put(context, scope)
},
) {
RYSwitch(activated = autoHideToolbar.value) {
(!autoHideToolbar).put(context, scope)
}
}
SettingItem(
title = stringResource(R.string.rearrange_buttons),
enabled = false,
onClick = {},
) {}
SettingItem(
title = stringResource(id = R.string.pull_to_switch_article),
onClick = { pullToSwitchArticle.toggle(context, scope) }) {
RYSwitch(activated = pullToSwitchArticle.value)
}
SettingItem(
title = stringResource(R.string.tonal_elevation),
desc = "${tonalElevation.value}dp",
onClick = {
tonalElevationDialogVisible = true
},
) {}
Spacer(modifier = Modifier.height(24.dp))
}
// Advanced
item {
Subtitle(
modifier = Modifier.padding(horizontal = 24.dp),
text = stringResource(R.string.advanced)
)
SettingItem(
title = stringResource(R.string.title),
desc = stringResource(R.string.title_desc),
icon = Icons.Rounded.Title,
onClick = {
navController.navigate(RouteName.READING_PAGE_TITLE) {
launchSingleTop = true
}
},
) {}
SettingItem(
title = stringResource(R.string.text),
desc = stringResource(R.string.text_desc),
icon = Icons.Rounded.Segment,
onClick = {
navController.navigate(RouteName.READING_PAGE_TEXT) {
launchSingleTop = true
}
},
) {}
SettingItem(
title = stringResource(R.string.images),
desc = stringResource(R.string.images_desc),
icon = Icons.Outlined.Image,
onClick = {
navController.navigate(RouteName.READING_PAGE_IMAGE) {
launchSingleTop = true
}
},
) {}
SettingItem(
title = stringResource(R.string.videos),
desc = stringResource(R.string.videos_desc),
icon = Icons.Outlined.Movie,
enabled = false,
onClick = {
// navController.navigate(RouteName.READING_PAGE_VIDEO) {
// launchSingleTop = true
// }
},
) {}
}
item {
Spacer(modifier = Modifier.height(24.dp))
Spacer(modifier = Modifier.windowInsetsBottomHeight(WindowInsets.navigationBars))
}
}
}
)
RadioDialog(
visible = tonalElevationDialogVisible,
title = stringResource(R.string.tonal_elevation),
options = ReadingPageTonalElevationPreference.values.map {
RadioDialogOption(
text = it.toDesc(context),
selected = it == tonalElevation,
) {
it.put(context, scope)
}
}
) {
tonalElevationDialogVisible = false
}
RadioDialog(
visible = fontsDialogVisible,
title = stringResource(R.string.reading_fonts),
options = ReadingFontsPreference.values.map {
RadioDialogOption(
text = it.toDesc(context),
style = TextStyle(fontFamily = it.asFontFamily(context)),
selected = it == fonts,
) {
if (it.value == ReadingFontsPreference.External.value) {
launcher.launch("*/*")
} else {
it.put(context, scope)
}
}
}
) {
fontsDialogVisible = false
}
}