Skip to content

Commit

Permalink
Add Settings() remembers
Browse files Browse the repository at this point in the history
  • Loading branch information
alorma committed Dec 15, 2023
1 parent d7bc0c5 commit 10b5242
Show file tree
Hide file tree
Showing 6 changed files with 194 additions and 3 deletions.
8 changes: 5 additions & 3 deletions compose-settings-storage-disk/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ kotlin {
}
}

/*
jvm("desktop")

listOf(
iosX64(),
iosArm64(),
Expand All @@ -35,17 +35,19 @@ kotlin {
binaryOption("bundleId", libs.versions.namespace.get() + ".disk")
}
}
*/

sourceSets {
androidMain.dependencies {
implementation(libs.androidx.preference.preference)
implementation(libs.androidx.preference.ktx)
}


commonMain.dependencies {
api(projects.composeSettingsStorageBase)

implementation(libs.multiplatform.settings)
implementation(libs.multiplatform.settings.noArg)

implementation(compose.runtime)
implementation(compose.foundation)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.alorma.compose.settings.storage.disk

import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import com.alorma.compose.settings.storage.base.SettingValueState
import com.russhwolf.settings.Settings

@Composable
fun rememberBooleanSettingState(
key: String,
defaultValue: Boolean,
settings: Settings = Settings()
): BooleanSettingValueState {
return remember {
BooleanSettingValueState(
settings = settings,
key = key,
defaultValue = defaultValue,
)
}
}

class BooleanSettingValueState(
private val settings: Settings,
val key: String,
val defaultValue: Boolean = false,
) : SettingValueState<Boolean> {

private var _value by mutableStateOf(settings.getBoolean(key, defaultValue))

override var value: Boolean
set(value) {
_value = value
settings.putBoolean(key, value)
}
get() = _value

override fun reset() {
value = defaultValue
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.alorma.compose.settings.storage.disk

import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import com.alorma.compose.settings.storage.base.SettingValueState
import com.russhwolf.settings.Settings

@Composable
fun rememberFloatSettingState(
key: String,
defaultValue: Float = 0f,
settings: Settings = Settings()
): FloatSettingValueState {
return remember {
FloatSettingValueState(
settings = settings,
key = key,
defaultValue = defaultValue,
)
}
}

class FloatSettingValueState(
private val settings: Settings,
val key: String,
val defaultValue: Float = 0f,
) : SettingValueState<Float> {

private var _value by mutableStateOf(settings.getFloat(key, defaultValue))

override var value: Float
set(value) {
_value = value
settings.putFloat(key, value)
}
get() = _value

override fun reset() {
value = defaultValue
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package com.alorma.compose.settings.storage.disk

import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import com.alorma.compose.settings.storage.base.SettingValueState
import com.russhwolf.settings.Settings

@Composable
fun rememberIntSetSettingState(
key: String,
defaultValue: Set<Int> = emptySet(),
delimiter: String = "|",
settings: Settings = Settings()
): IntSetSettingValueState {
return remember {
IntSetSettingValueState(
settings = settings,
key = key,
defaultValue = defaultValue,
delimiter = delimiter,
)
}
}

class IntSetSettingValueState(
private val settings: Settings,
val key: String,
val defaultValue: Set<Int> = emptySet(),
val delimiter: String = "|",
) : SettingValueState<Set<Int>> {

private var _value by mutableStateOf(
settings.getString(key, defaultValue.toPrefString(delimiter))
.split(delimiter)
.filter { it.isNotEmpty() }
.map { it.toInt() }
.toSet(),
)

override var value: Set<Int>
set(value) {
_value = value.sorted().toSet()
settings.putString(key, value.toPrefString(delimiter))
}
get() = _value

private fun Set<Int>.toPrefString(delimiter: String) =
joinToString(separator = delimiter) { it.toString() }

override fun reset() {
value = defaultValue
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.alorma.compose.settings.storage.disk

import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import com.alorma.compose.settings.storage.base.SettingValueState
import com.russhwolf.settings.Settings

@Composable
fun rememberIntSettingState(
key: String,
defaultValue: Int = -1,
settings: Settings = Settings()
): IntSettingValueState {
return remember {
IntSettingValueState(
settings = settings,
key = key,
defaultValue = defaultValue,
)
}
}

class IntSettingValueState(
private val settings: Settings,
val key: String,
val defaultValue: Int = 0,
) : SettingValueState<Int> {

private var _value by mutableStateOf(settings.getInt(key, defaultValue))

override var value: Int
set(value) {
_value = value
settings.putInt(key, value)
}
get() = _value

override fun reset() {
value = defaultValue
}
}
1 change: 1 addition & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ plugin-gradle-nexus-staging = { module = "io.codearte.gradle.nexus:gradle-nexus-
plugin-gradle-publish = { module = "io.github.gradle-nexus:publish-plugin", version.ref = "publishPlugin" }

multiplatform-settings = { module = "com.russhwolf:multiplatform-settings", version.ref = "multiplatformSettings" }
multiplatform-settings-noArg = { module = "com.russhwolf:multiplatform-settings-no-arg", version.ref = "multiplatformSettings" }

[plugins]
androidApplication = { id = "com.android.application", version.ref = "agp" }
Expand Down

0 comments on commit 10b5242

Please sign in to comment.