~repos /only-bible-app
git clone
https://pyrossh.dev/repos/only-bible-app.git
The only bible app you will ever need. No ads. No in-app purchases. No distractions.
file:
composeApp/src/commonMain/kotlin/dev/pyrossh/onlyBible/composables/TextSettingsBottomSheet.kt
package dev.pyrossh.onlyBible.composables
import dev.pyrossh.onlyBible.AppViewModelimport dev.pyrossh.onlyBible.FontTypeimport dev.pyrossh.onlyBible.ThemeTypeimport androidx.compose.foundation.BorderStrokeimport androidx.compose.foundation.backgroundimport androidx.compose.foundation.layout.Arrangementimport androidx.compose.foundation.layout.Columnimport androidx.compose.foundation.layout.Rowimport androidx.compose.foundation.layout.fillMaxSizeimport androidx.compose.foundation.layout.fillMaxWidthimport androidx.compose.foundation.layout.heightimport androidx.compose.foundation.layout.paddingimport androidx.compose.foundation.layout.sizeimport androidx.compose.foundation.shape.RoundedCornerShapeimport androidx.compose.material.icons.Iconsimport androidx.compose.material.icons.filled.Closeimport androidx.compose.material.icons.filled.DarkModeimport androidx.compose.material.icons.filled.FormatBoldimport androidx.compose.material.icons.filled.FormatLineSpacingimport androidx.compose.material.icons.filled.FormatSizeimport androidx.compose.material.icons.filled.LightModeimport androidx.compose.material3.ExperimentalMaterial3Apiimport androidx.compose.material3.HorizontalDividerimport androidx.compose.material3.Iconimport androidx.compose.material3.IconButtonimport androidx.compose.material3.MaterialThemeimport androidx.compose.material3.ModalBottomSheetimport androidx.compose.material3.Surfaceimport androidx.compose.material3.Textimport androidx.compose.runtime.Composableimport androidx.compose.runtime.rememberCoroutineScopeimport androidx.compose.ui.Alignmentimport androidx.compose.ui.Modifierimport androidx.compose.ui.text.TextStyleimport androidx.compose.ui.text.font.FontWeightimport androidx.compose.ui.unit.dpimport androidx.compose.ui.unit.spimport kotlinx.coroutines.launch
@Composable@OptIn(ExperimentalMaterial3Api::class)fun TextSettingsBottomSheet( model: AppViewModel, onDismiss: () -> Unit,) { val scope = rememberCoroutineScope() return ModalBottomSheet( tonalElevation = 2.dp, onDismissRequest = { onDismiss() }, ) { Column( modifier = Modifier .fillMaxSize() .padding(horizontal = 16.dp), ) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, ) { Text( text = model.bible.tSettings, style = TextStyle( fontSize = 18.sp, fontWeight = FontWeight.W600, color = MaterialTheme.colorScheme.onBackground, ) ) Row(horizontalArrangement = Arrangement.End) { IconButton(onClick = {// view.playSoundEffect(SoundEffectConstants.CLICK) onDismiss() }) { Icon(Icons.Filled.Close, "Close") } } } HorizontalDivider() Row( modifier = Modifier .fillMaxWidth() .padding(top = 16.dp), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, ) { Surface(shape = RoundedCornerShape(8.dp), modifier = Modifier .fillMaxWidth() .height(60.dp) .padding(end = 16.dp) .weight(1f), onClick = {// view.playSoundEffect(SoundEffectConstants.CLICK) model.fontSizeDelta -= 1 }) { Column( modifier = Modifier.background(MaterialTheme.colorScheme.background), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { Icon( imageVector = Icons.Filled.FormatSize, contentDescription = "Decrease Font Size", modifier = Modifier.size(14.dp), ) } } Surface(shape = RoundedCornerShape(8.dp), modifier = Modifier .fillMaxWidth() .height(60.dp) .padding(end = 16.dp) .weight(1f), onClick = {// view.playSoundEffect(SoundEffectConstants.CLICK) model.fontSizeDelta += 1 }) { Column( modifier = Modifier.background(MaterialTheme.colorScheme.background), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { Icon( imageVector = Icons.Filled.FormatSize, contentDescription = "Increase Font size" ) } } Surface(shape = RoundedCornerShape(8.dp), modifier = Modifier .fillMaxWidth() .height(60.dp) .padding(end = 16.dp) .weight(1f), onClick = {// view.playSoundEffect(SoundEffectConstants.CLICK) model.fontBoldEnabled = !model.fontBoldEnabled }) { Column( modifier = Modifier.background(MaterialTheme.colorScheme.background), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { Icon( imageVector = Icons.Filled.FormatBold, contentDescription = "Bold",// tint = if (settings.boldEnabled) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onBackground, ) } } Surface(shape = RoundedCornerShape(8.dp), modifier = Modifier .fillMaxWidth() .height(60.dp) .padding(end = 16.dp) .weight(1f), onClick = {// view.playSoundEffect(SoundEffectConstants.CLICK) if (model.lineSpacingDelta > 5) { model.lineSpacingDelta = 0 } else { model.lineSpacingDelta += 1 } }) { Column( modifier = Modifier.background(MaterialTheme.colorScheme.background), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { Icon( imageVector = Icons.Filled.FormatLineSpacing, contentDescription = "Line Spacing" ) } } } Row( modifier = Modifier .fillMaxWidth() .padding(top = 16.dp), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, ) { FontType.entries.map { Surface( shape = RoundedCornerShape(8.dp), border = if (model.fontType == it) BorderStroke( 2.dp, MaterialTheme.colorScheme.primary ) else null, modifier = Modifier .fillMaxWidth() .height(60.dp) .padding(end = 16.dp) .weight(1f), onClick = {// view.playSoundEffect(SoundEffectConstants.CLICK) model.fontType = it }) { Column( modifier = Modifier.background( MaterialTheme.colorScheme.background ), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { Text( text = it.name, style = TextStyle( fontFamily = it.family(), fontSize = 18.sp, fontWeight = FontWeight.W600, color = if (model.fontType == it) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurface, ) ) } } } } Row( modifier = Modifier .fillMaxWidth() .padding(top = 16.dp), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, ) { ThemeType.entries.map { Surface( shape = RoundedCornerShape(8.dp), border = if (model.themeType == it) BorderStroke( 2.dp, MaterialTheme.colorScheme.primary ) else null, color = if (model.themeType == it) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurface, contentColor = if (model.themeType == it) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurface, modifier = Modifier .fillMaxWidth() .height(60.dp) .padding(end = 16.dp) .weight(1f), onClick = {// view.playSoundEffect(SoundEffectConstants.CLICK) scope.launch { onDismiss() model.themeType = it } } ) { when (it) { ThemeType.Light -> Icon( imageVector = Icons.Filled.LightMode, contentDescription = "Light", modifier = Modifier .background(MaterialTheme.colorScheme.background) .padding(12.dp) )
ThemeType.Dark -> Icon( imageVector = Icons.Filled.DarkMode, contentDescription = "Dark", modifier = Modifier .background(MaterialTheme.colorScheme.background) .padding(12.dp) )
ThemeType.Auto -> Column( modifier = Modifier.background( color = MaterialTheme.colorScheme.background, ), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { Text( text = "Auto", style = TextStyle( fontSize = 18.sp, fontWeight = FontWeight.Medium, ), ) } } } } } } }}