Make SliderPreference support int
This commit is contained in:
@@ -22,14 +22,24 @@ import com.android.launcher3.InvariantDeviceProfile
|
||||
import com.android.launcher3.LauncherAppState
|
||||
import kotlin.reflect.KProperty
|
||||
|
||||
class PreferenceAdapter<T>(
|
||||
interface PreferenceAdapter<T> {
|
||||
val state: State<T>
|
||||
fun onChange(newValue: T)
|
||||
|
||||
operator fun getValue(thisObj: Any?, property: KProperty<*>): T = state.value
|
||||
operator fun setValue(thisObj: Any?, property: KProperty<*>, newValue: T) {
|
||||
onChange(newValue)
|
||||
}
|
||||
}
|
||||
|
||||
class PreferenceAdapterImpl<T>(
|
||||
private val get: () -> T,
|
||||
private val set: (T) -> Unit
|
||||
) : PreferenceChangeListener {
|
||||
) : PreferenceAdapter<T>, PreferenceChangeListener {
|
||||
private val stateInternal = mutableStateOf(get())
|
||||
val state: State<T> get() = stateInternal
|
||||
override val state: State<T> get() = stateInternal
|
||||
|
||||
fun onChange(newValue: T) {
|
||||
override fun onChange(newValue: T) {
|
||||
set(newValue)
|
||||
stateInternal.value = newValue
|
||||
}
|
||||
@@ -37,22 +47,17 @@ class PreferenceAdapter<T>(
|
||||
override fun onPreferenceChange() {
|
||||
stateInternal.value = get()
|
||||
}
|
||||
|
||||
operator fun getValue(thisObj: Any?, property: KProperty<*>): T = stateInternal.value
|
||||
operator fun setValue(thisObj: Any?, property: KProperty<*>, newValue: T) {
|
||||
onChange(newValue)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun BasePreferenceManager.IdpIntPref.getAdapter(): PreferenceAdapter<Float> {
|
||||
fun BasePreferenceManager.IdpIntPref.getAdapter(): PreferenceAdapter<Int> {
|
||||
val context = LocalContext.current
|
||||
val idp = remember { InvariantDeviceProfile.INSTANCE.get(context) }
|
||||
val defaultGrid = idp.closestProfile
|
||||
return getAdapter(
|
||||
this,
|
||||
{ get(defaultGrid).toFloat() },
|
||||
{ newValue -> set(newValue.toInt(), defaultGrid) }
|
||||
{ get(defaultGrid) },
|
||||
{ newValue -> set(newValue, defaultGrid) }
|
||||
)
|
||||
}
|
||||
|
||||
@@ -75,10 +80,33 @@ private fun <P, T> getAdapter(
|
||||
get: () -> T,
|
||||
set: (T) -> Unit
|
||||
): PreferenceAdapter<T> {
|
||||
val adapter = remember { PreferenceAdapter(get, set) }
|
||||
val adapter = remember { PreferenceAdapterImpl(get, set) }
|
||||
DisposableEffect(pref) {
|
||||
pref.addListener(adapter)
|
||||
onDispose { pref.removeListener(adapter) }
|
||||
}
|
||||
return adapter
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun <T, R>rememberTransformAdapter(
|
||||
adapter: PreferenceAdapter<T>,
|
||||
transformGet: (T) -> R,
|
||||
transformSet: (R) -> T
|
||||
): PreferenceAdapter<R> {
|
||||
return remember(adapter) {
|
||||
TransformPreferenceAdapter(adapter, transformGet, transformSet)
|
||||
}
|
||||
}
|
||||
|
||||
private class TransformPreferenceAdapter<T, R>(
|
||||
private val parent: PreferenceAdapter<T>,
|
||||
private val transformGet: (T) -> R,
|
||||
private val transformSet: (R) -> T
|
||||
) : PreferenceAdapter<R> {
|
||||
override val state = derivedStateOf { transformGet(parent.state.value) }
|
||||
|
||||
override fun onChange(newValue: R) {
|
||||
parent.onChange(transformSet(newValue))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -84,7 +84,7 @@ class PreferenceManager private constructor(private val context: Context) : Base
|
||||
val launcherTheme = StringPref("pref_launcherTheme", "system")
|
||||
val clearAllAsAction = BoolPref("pref_clearAllAsAction", false)
|
||||
val overrideWindowCornerRadius = BoolPref("pref_overrideWindowCornerRadius", false, recreate)
|
||||
val windowCornerRadius = FloatPref("pref_windowCornerRadius", 80f, recreate)
|
||||
val windowCornerRadius = IntPref("pref_windowCornerRadius", 80, recreate)
|
||||
val autoLaunchRoot = BoolPref("pref_autoLaunchRoot", false)
|
||||
val useSystemAccent = BoolPref("pref_useSystemAccent", Utilities.ATLEAST_S, recreate)
|
||||
val accentColor = IntPref("pref_accentColor", LAWNCHAIR_BLUE.toInt(), recreate)
|
||||
|
||||
@@ -67,8 +67,8 @@ fun AppDrawerPreferences() {
|
||||
SliderPreference(
|
||||
label = stringResource(id = R.string.app_drawer_columns),
|
||||
adapter = prefs.allAppsColumns.getAdapter(),
|
||||
step = 1f,
|
||||
valueRange = 3.0F..7.0F,
|
||||
step = 1,
|
||||
valueRange = 3..7,
|
||||
showDivider = false
|
||||
)
|
||||
}
|
||||
|
||||
@@ -49,8 +49,8 @@ fun DockPreferences() {
|
||||
SliderPreference(
|
||||
label = stringResource(id = R.string.dock_icons),
|
||||
adapter = prefs.hotseatColumns.getAdapter(),
|
||||
step = 1f,
|
||||
valueRange = 3.0F..7.0F,
|
||||
step = 1,
|
||||
valueRange = 3..7,
|
||||
showDivider = false
|
||||
)
|
||||
}
|
||||
|
||||
@@ -41,14 +41,14 @@ fun FolderPreferences() {
|
||||
SliderPreference(
|
||||
label = stringResource(id = R.string.max_folder_columns),
|
||||
adapter = prefs.folderColumns.getAdapter(),
|
||||
step = 1f,
|
||||
valueRange = 2.0F..5.0F
|
||||
step = 1,
|
||||
valueRange = 2..5
|
||||
)
|
||||
SliderPreference(
|
||||
label = stringResource(id = R.string.max_folder_rows),
|
||||
adapter = prefs.folderRows.getAdapter(),
|
||||
step = 1f,
|
||||
valueRange = 2.0F..5.0F,
|
||||
step = 1,
|
||||
valueRange = 2..5,
|
||||
showDivider = false
|
||||
)
|
||||
}
|
||||
|
||||
@@ -68,14 +68,14 @@ fun HomeScreenPreferences() {
|
||||
SliderPreference(
|
||||
label = stringResource(id = R.string.home_screen_columns),
|
||||
adapter = prefs.workspaceColumns.getAdapter(),
|
||||
step = 1f,
|
||||
valueRange = 3.0F..7.0F
|
||||
step = 1,
|
||||
valueRange = 3..7
|
||||
)
|
||||
SliderPreference(
|
||||
label = stringResource(id = R.string.home_screen_rows),
|
||||
adapter = prefs.workspaceRows.getAdapter(),
|
||||
step = 1f,
|
||||
valueRange = 3.0F..7.0F,
|
||||
step = 1,
|
||||
valueRange = 3..7,
|
||||
showDivider = false
|
||||
)
|
||||
}
|
||||
|
||||
@@ -46,8 +46,8 @@ fun QuickstepPreferences() {
|
||||
SliderPreference(
|
||||
label = stringResource(id = R.string.window_corner_radius_label),
|
||||
adapter = prefs.windowCornerRadius.getAdapter(),
|
||||
step = 0f,
|
||||
valueRange = 80f..150f,
|
||||
step = 0,
|
||||
valueRange = 80..150,
|
||||
showDivider = false
|
||||
)
|
||||
}
|
||||
|
||||
@@ -23,8 +23,35 @@ import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.unit.dp
|
||||
import app.lawnchair.preferences.PreferenceAdapter
|
||||
import app.lawnchair.preferences.rememberTransformAdapter
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
@Composable
|
||||
fun SliderPreference(
|
||||
label: String,
|
||||
adapter: PreferenceAdapter<Int>,
|
||||
valueRange: ClosedRange<Int>,
|
||||
step: Int,
|
||||
showAsPercentage: Boolean = false,
|
||||
showDivider: Boolean = true
|
||||
) {
|
||||
val transformedAdapter = rememberTransformAdapter(
|
||||
adapter = adapter,
|
||||
transformGet = { it.toFloat() },
|
||||
transformSet = { it.roundToInt() }
|
||||
)
|
||||
val start = valueRange.start.toFloat()
|
||||
val endInclusive = valueRange.endInclusive.toFloat()
|
||||
SliderPreference(
|
||||
label = label,
|
||||
adapter = transformedAdapter,
|
||||
valueRange = start..endInclusive,
|
||||
step = step.toFloat(),
|
||||
showAsPercentage = showAsPercentage,
|
||||
showDivider = showDivider
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun SliderPreference(
|
||||
label: String,
|
||||
|
||||
@@ -81,7 +81,7 @@ fun killLauncher() {
|
||||
fun getWindowCornerRadius(context: Context): Float {
|
||||
val prefs = PreferenceManager.getInstance(context)
|
||||
if (prefs.overrideWindowCornerRadius.get()) {
|
||||
return prefs.windowCornerRadius.get()
|
||||
return prefs.windowCornerRadius.get().toFloat()
|
||||
}
|
||||
return QuickStepContract.getWindowCornerRadius(context.resources)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user