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:
parent
6742a627b1
commit
0753cfefe6
7 changed files with 81 additions and 18 deletions
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
}
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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"
|
|
@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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" }
|
||||
|
|
Loading…
Add table
Reference in a new issue