Rebuilt base of nav graph. Added Settings page with setting for switching theme. Theme state saved out on switch.
This commit is contained in:
parent
6f6df29c4b
commit
c85d5eb4d2
5 changed files with 273 additions and 35 deletions
|
@ -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,
|
||||
)
|
||||
}
|
||||
}
|
|
@ -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(
|
||||
|
|
|
@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue