Rebuilt base of nav graph. Added Settings page with setting for switching theme. Theme state saved out on switch.

This commit is contained in:
Azea 2024-11-26 14:42:28 -05:00
parent 6f6df29c4b
commit c85d5eb4d2
5 changed files with 273 additions and 35 deletions

View file

@ -3,21 +3,30 @@ package com.menagerie.ophelia
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.platform.LocalContext
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.stringPreferencesKey
import com.menagerie.ophelia.sensor.SensorDataManager
import com.menagerie.ophelia.sensor.SensorManagerImpl
import com.menagerie.ophelia.ui.theme.OpheliaTheme
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.receiveAsFlow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
enum class Theme {
Auto,
Light,
Dark
}
val themeKey = stringPreferencesKey("theme")
@Composable
fun MainView(
isLargeScreen: Boolean = false,
@ -46,7 +55,15 @@ fun MainView(
}
}
val currentTheme by rememberSaveable { mutableStateOf(Theme.Light) }
val currentThemeString by prefs
.data
.map {
it[themeKey] ?: Theme.Dark.name
}
.collectAsState(Theme.Dark.name)
val currentTheme = Theme.valueOf(currentThemeString)
val isDarkTheme: Boolean? = when (currentTheme) {
Theme.Dark -> true
Theme.Light -> false
@ -56,6 +73,7 @@ fun MainView(
App(
sensorManager = sensorManager,
isLarge = isLargeScreen,
prefs = prefs,
)
}
}

View file

@ -1,32 +1,32 @@
package com.menagerie.ophelia
import androidx.compose.animation.ExperimentalSharedTransitionApi
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.compose.runtime.setValue
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.menagerie.ophelia.HomeScreen.HomeScreen
import com.menagerie.ophelia.HomeScreen.MainMenu
import com.menagerie.ophelia.HomeScreen.Settings
import com.menagerie.ophelia.model.Recipe
import com.menagerie.ophelia.model.recipesList
import com.menagerie.ophelia.recipesdetails.RecipeDetails
import com.menagerie.ophelia.recipeslist.RecipesListScreen
import com.menagerie.ophelia.sensor.SensorManager
enum class Theme {
Auto,
Light,
Dark
}
val themeKey = stringPreferencesKey("theme")
enum class DetailListAppScreen {
List,
Details,
@ -37,13 +37,15 @@ enum class DetailListAppScreen {
fun App(
sensorManager: SensorManager?,
isLarge: Boolean = false,
prefs: DataStore<Preferences>,
) {
val navController = rememberNavController()
OpheliaNavHost(
navController = navController,
isLarge = isLarge,
sensorManager = sensorManager
sensorManager = sensorManager,
prefs = prefs
)
@ -53,25 +55,82 @@ fun App(
fun OpheliaNavHost(
navController: NavHostController,
isLarge: Boolean,
sensorManager: SensorManager?
sensorManager: SensorManager?,
prefs: DataStore<Preferences>
){
val items by remember { mutableStateOf(recipesList) }
var show by remember { mutableStateOf(false) }
NavHost(
navController = navController,
startDestination = "home"
){
polyculeGraph(navController)
welcomeGraph(navController)
recipeGraph(
navController = navController,
items = items,
isLarge = isLarge,
sensorManager = sensorManager
)
composable("home") {
HomeScreen() {
navController.navigate(DetailListAppScreen.List.name)
Scaffold {
Column {
//TODO : replace this with a composable task bar
if (show) {
Row {
Button(
onClick = {
navController.popBackStack()
}
) {
Text(text = "Back - TEMP")
}
Button(
onClick = {
navController.navigate("mainMenu")
}
) {
Text(text = "Home - TEMP")
}
Button(
onClick = {
navController.navigate("settings")
}
) {
Text(text = "Settings - TEMP")
}
Button(onClick = {
//TODO : This should take the user to their bio page
}){
Text(text = "You - TEMP")
}
}
}
NavHost(
navController = navController,
startDestination = "home"
) {
polyculeGraph(navController)
recipeGraph(
navController = navController,
items = items,
isLarge = isLarge,
sensorManager = sensorManager
)
welcomeGraph(navController)
composable("home") {
HomeScreen {
show = true
navController.navigate("mainMenu")
}
}
composable("mainMenu") {
MainMenu(
onPolyClick = {
//TODO : This should take the user to their polycule's main page
},
onUserBioClick = {
//TODO : This should take the user to their bio page
},
onCookBookClick = {
navController.navigate(DetailListAppScreen.List.name)
},
)
}
composable("settings") {
Settings(prefs)
}
}
}
@ -79,11 +138,63 @@ fun OpheliaNavHost(
}
fun NavGraphBuilder.welcomeGraph(navController: NavHostController) {
// composable("newUserStart") {
// NewUserStartScreen { navController.navigate("newUserName") }
// }
// composable("newUserName") {
// AddNameScreen { navController.navigate("newUserPronouns") }
// }
// composable("newUserPronouns") {
// AddPronounsScreen { navController.navigate("newUserTags") }
// }
// composable("newUserTags") {
// AddTagsScreen { navController.navigate("confirmBio") }
// }
// composable("confirmBio") {
// ConfirmBio {
// navController.popBackStack()
// navController.navigate("polyculeHome")
// }
// }
// composable("makePolycule") {
// AddPolyculeScreen()
// }
}
fun NavGraphBuilder.polyculeGraph(navController: NavHostController) {
// composable("polyculeHome") {
// PolyculeHomeView(
// onBioClick = {
// navController.navigate("bioDetail/${it.id}")
// },
// onAddClick = {
// navController.navigate("addBio") {}
// }
// )
// }
// composable(
// "bioDetail/{bioId}",
// arguments = listOf(navArgument("bioId") {
// type = NavType.LongType
// })
// ) {
// BioDetailsScreen(
// id = it.arguments?.getLong("bioId") ?: 0,
// onBackClick = { navController.navigateUp() },
// onEditClick = { id -> navController.navigate("editBio/${id}")}
// )
// }
// composable("addBio") {
// AddBiography()
// }
// composable(
// "editBio/{bioId}",
// arguments = listOf(navArgument("bioId") {
// type = NavType.LongType
// })
// ){
// EditBiography(bioId = it.arguments?.getLong("bioId") ?: 0) { navController.navigateUp() }
// }
}
fun NavGraphBuilder.recipeGraph(

View file

@ -0,0 +1,32 @@
package com.menagerie.ophelia.HomeScreen
import androidx.compose.foundation.layout.Column
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
@Composable
fun MainMenu(
modifier: Modifier = Modifier,
onPolyClick: () -> Unit,
onUserBioClick: () -> Unit,
onCookBookClick: () -> Unit,
) {
Scaffold {
Column {
Button(onClick = onPolyClick){
Text(text = "Your Polycule - TEMP")
}
Button(onClick = onCookBookClick){
Text(text = "Your Recipes - TEMP")
}
Button(onClick = onUserBioClick){
Text(text = "You - TEMP")
}
}
}
}

View file

@ -0,0 +1,60 @@
package com.menagerie.ophelia.HomeScreen
import androidx.compose.foundation.layout.Column
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.rememberCoroutineScope
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.stringPreferencesKey
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
val themeKey = stringPreferencesKey("theme")
enum class Theme {
Auto,
Light,
Dark
}
@Composable
fun Settings(prefs: DataStore<Preferences>) {
val currentThemeString by prefs
.data
.map {
it[themeKey] ?: Theme.Dark.name
}
.collectAsState(Theme.Dark.name)
var currentTheme = Theme.valueOf(currentThemeString)
val onThemeToggle = {
currentTheme = when (currentTheme) {
Theme.Auto -> Theme.Light
Theme.Light -> Theme.Dark
Theme.Dark -> Theme.Auto
}
}
val scope = rememberCoroutineScope()
Scaffold {
Column {
Button(onClick = {
scope.launch {
onThemeToggle.invoke()
prefs.edit {
it[themeKey] = currentTheme.name
}
}
}) {
Text(currentThemeString)
}
}
}
}

View file

@ -1,14 +1,23 @@
package com.menagerie.ophelia
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.application
import androidx.datastore.preferences.core.stringPreferencesKey
import com.menagerie.ophelia.ui.theme.OpheliaTheme
import kotlinx.coroutines.flow.map
import org.jetbrains.compose.resources.ExperimentalResourceApi
enum class Theme {
Auto,
Light,
Dark
}
val themeKey = stringPreferencesKey("theme")
@OptIn(ExperimentalResourceApi::class)
fun main() {
@ -21,7 +30,14 @@ fun main() {
title = "Ophelia",
) {
val currentTheme by rememberSaveable { mutableStateOf(Theme.Dark) }
val currentThemeString by prefs
.data
.map {
it[themeKey] ?: Theme.Dark.name
}
.collectAsState(Theme.Dark.name)
val currentTheme = Theme.valueOf(currentThemeString)
val isDarkTheme: Boolean? = when (currentTheme) {
Theme.Dark -> true
Theme.Light -> false
@ -31,6 +47,7 @@ fun main() {
App(
sensorManager = null,
isLarge = true,
prefs = prefs
)
}
}