everything works now, look at how we pull in the enum, I think that's where we went wrong before.

This commit is contained in:
Azea 2024-11-11 20:39:18 -05:00
parent 6742a627b1
commit 0753cfefe6
7 changed files with 81 additions and 18 deletions

View file

@ -36,6 +36,8 @@ kotlin {
implementation(libs.androidx.lifecycle.viewmodel)
implementation(libs.androidx.lifecycle.runtime.compose)
implementation("org.jetbrains.compose.material3:material3:1.7.0")
api(libs.datastore.preferences)
api(libs.datastore)
}
desktopMain.dependencies {
implementation(compose.desktop.currentOs)

View file

@ -3,21 +3,18 @@ package com.menagerie.themeswitcher
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.runtime.remember
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
App()
App(
prefs = remember {
createDataStore(application)
}
)
}
}
}
@Preview
@Composable
fun AppAndroidPreview() {
App()
}

View file

@ -0,0 +1,11 @@
package com.menagerie.themeswitcher
import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
fun createDataStore(context: Context): DataStore<Preferences> {
return createDataStore {
context.filesDir.resolve(DATA_STORE_FILE_NAME).absolutePath
}
}

View file

@ -10,8 +10,16 @@ import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.booleanPreferencesKey
import androidx.datastore.preferences.core.byteArrayPreferencesKey
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.stringPreferencesKey
import org.jetbrains.compose.ui.tooling.preview.Preview
import com.menagerie.themeswitcher.ui.theme.*
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
enum class Theme {
Auto,
@ -19,12 +27,25 @@ enum class Theme {
Dark
}
val themeKey = stringPreferencesKey("theme")
@Composable
@Preview
fun App() {
fun App(
prefs: DataStore<Preferences>
) {
var currentTheme by rememberSaveable { mutableStateOf(Theme.Light)}
val currentThemeString by prefs
.data
.map {
it[themeKey] ?: Theme.Dark.name
}
.collectAsState(Theme.Dark.name)
var currentTheme = Theme.valueOf(currentThemeString)
val scope = rememberCoroutineScope()
val isDarkTheme: Boolean? = when (currentTheme) {
Theme.Dark -> true
Theme.Light -> false
@ -41,7 +62,14 @@ fun App() {
MainTheme(isDarkTheme ?: isSystemInDarkTheme()) {
Scaffold {
Column(Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) {
Button(onClick = onThemeToggle) {
Button(onClick = {
scope.launch {
onThemeToggle.invoke()
prefs.edit {
it[themeKey] = currentTheme.name
}
}
}) {
val text: String = currentTheme.name
Text(text)
}

View file

@ -0,0 +1,14 @@
package com.menagerie.themeswitcher
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.PreferenceDataStoreFactory
import androidx.datastore.preferences.core.Preferences
import okio.Path.Companion.toPath
fun createDataStore(producePath: () -> String): DataStore<Preferences> {
return PreferenceDataStoreFactory.createWithPath(
produceFile = { producePath().toPath() }
)
}
internal const val DATA_STORE_FILE_NAME = "prefs.preferences_pb"

View file

@ -3,11 +3,19 @@ package com.menagerie.themeswitcher
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.application
fun main() = application {
Window(
onCloseRequest = ::exitApplication,
title = "ThemeSwitcher",
) {
App()
fun main() {
val prefs = createDataStore{
"settings/files/stuff/{$DATA_STORE_FILE_NAME}"
}
application {
Window(
onCloseRequest = ::exitApplication,
title = "ThemeSwitcher",
) {
App(
prefs = prefs
)
}
}
}

View file

@ -15,6 +15,7 @@ compose-multiplatform = "1.7.0"
junit = "4.13.2"
kotlin = "2.0.21"
kotlinx-coroutines = "1.9.0"
datastore = "1.1.1"
[libraries]
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }
@ -30,6 +31,8 @@ androidx-activity-compose = { module = "androidx.activity:activity-compose", ver
androidx-lifecycle-viewmodel = { group = "org.jetbrains.androidx.lifecycle", name = "lifecycle-viewmodel", version.ref = "androidx-lifecycle" }
androidx-lifecycle-runtime-compose = { group = "org.jetbrains.androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "androidx-lifecycle" }
kotlinx-coroutines-swing = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-swing", version.ref = "kotlinx-coroutines" }
datastore = { module = "androidx.datastore:datastore", version.ref = "datastore" }
datastore-preferences = { module = "androidx.datastore:datastore-preferences", version.ref = "datastore" }
[plugins]
androidApplication = { id = "com.android.application", version.ref = "agp" }