mirror of
https://github.com/Helium314/HeliBoard.git
synced 2025-04-20 06:09:09 +00:00
allow renaming user themes
This commit is contained in:
parent
bd7e92bcf8
commit
1484d7021e
5 changed files with 77 additions and 5 deletions
|
@ -12,6 +12,7 @@ import android.os.Build
|
|||
import android.util.TypedValue
|
||||
import android.view.ContextThemeWrapper
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.content.edit
|
||||
import helium314.keyboard.latin.R
|
||||
import helium314.keyboard.latin.common.AllColors
|
||||
import helium314.keyboard.latin.common.ColorType
|
||||
|
@ -373,6 +374,41 @@ private constructor(val themeId: Int, @JvmField val mStyleId: Int) {
|
|||
return colorMap
|
||||
}
|
||||
|
||||
// returns false if not renamed due to invalid name or collision
|
||||
fun renameUserColors(from: String, to: String, prefs: SharedPreferences): Boolean {
|
||||
if (to.isBlank()) return false // don't want that
|
||||
if (to == from) return true // nothing to do
|
||||
val existingNames = prefs.all.keys.mapNotNull {
|
||||
when {
|
||||
it.startsWith(Settings.PREF_USER_COLORS_PREFIX) -> it.substringAfter(Settings.PREF_USER_COLORS_PREFIX)
|
||||
it.startsWith(Settings.PREF_USER_ALL_COLORS_PREFIX) -> it.substringAfter(Settings.PREF_USER_ALL_COLORS_PREFIX)
|
||||
it.startsWith(Settings.PREF_USER_MORE_COLORS_PREFIX) -> it.substringAfter(Settings.PREF_USER_MORE_COLORS_PREFIX)
|
||||
else -> null
|
||||
}
|
||||
}.toSortedSet()
|
||||
if (to in existingNames) return false
|
||||
// all good, now rename
|
||||
prefs.edit {
|
||||
if (prefs.contains(Settings.PREF_USER_COLORS_PREFIX + from)) {
|
||||
putString(Settings.PREF_USER_COLORS_PREFIX + to, prefs.getString(Settings.PREF_USER_COLORS_PREFIX + from, ""))
|
||||
remove(Settings.PREF_USER_COLORS_PREFIX + from)
|
||||
}
|
||||
if (prefs.contains(Settings.PREF_USER_ALL_COLORS_PREFIX + from)) {
|
||||
putString(Settings.PREF_USER_ALL_COLORS_PREFIX + to, prefs.getString(Settings.PREF_USER_ALL_COLORS_PREFIX + from, ""))
|
||||
remove(Settings.PREF_USER_ALL_COLORS_PREFIX + from)
|
||||
}
|
||||
if (prefs.contains(Settings.PREF_USER_MORE_COLORS_PREFIX + from)) {
|
||||
putInt(Settings.PREF_USER_MORE_COLORS_PREFIX + to, prefs.getInt(Settings.PREF_USER_MORE_COLORS_PREFIX + from, 0))
|
||||
remove(Settings.PREF_USER_MORE_COLORS_PREFIX + from)
|
||||
}
|
||||
if (prefs.getString(Settings.PREF_THEME_COLORS, Defaults.PREF_THEME_COLORS) == from)
|
||||
putString(Settings.PREF_THEME_COLORS, to)
|
||||
if (prefs.getString(Settings.PREF_THEME_COLORS_NIGHT, Defaults.PREF_THEME_COLORS_NIGHT) == from)
|
||||
putString(Settings.PREF_THEME_COLORS_NIGHT, to)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
fun determineUserColor(colors: List<ColorSetting>, context: Context, colorName: String, isNight: Boolean): Int {
|
||||
val c = colors.firstOrNull { it.name == colorName }
|
||||
val color = c?.color
|
||||
|
|
|
@ -56,7 +56,7 @@ fun SearchSettingsScreen(
|
|||
) {
|
||||
SearchScreen(
|
||||
onClickBack = onClickBack,
|
||||
title = title,
|
||||
title = { Text(title) },
|
||||
content = {
|
||||
if (content != null) content()
|
||||
else {
|
||||
|
@ -101,7 +101,7 @@ fun SearchSettingsScreen(
|
|||
@Composable
|
||||
fun <T: Any> SearchScreen(
|
||||
onClickBack: () -> Unit,
|
||||
title: String,
|
||||
title: @Composable () -> Unit,
|
||||
filteredItems: (String) -> List<T>,
|
||||
itemContent: @Composable (T) -> Unit,
|
||||
content: @Composable (ColumnScope.() -> Unit)? = null,
|
||||
|
@ -123,7 +123,7 @@ fun <T: Any> SearchScreen(
|
|||
) {
|
||||
Column {
|
||||
TopAppBar(
|
||||
title = { Text(title) },
|
||||
title = title,
|
||||
windowInsets = TopAppBarDefaults.windowInsets,
|
||||
navigationIcon = {
|
||||
IconButton(onClick = {
|
||||
|
|
|
@ -30,6 +30,7 @@ import com.github.skydoves.colorpicker.compose.BrightnessSlider
|
|||
import com.github.skydoves.colorpicker.compose.HsvColorPicker
|
||||
import com.github.skydoves.colorpicker.compose.rememberColorPickerController
|
||||
|
||||
// todo: needs different layout in landscape (bars on the side or something like that)
|
||||
@Composable
|
||||
fun ColorPickerDialog(
|
||||
onDismissRequest: () -> Unit,
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// SPDX-License-Identifier: GPL-3.0-only
|
||||
package helium314.keyboard.settings.dialogs
|
||||
|
||||
import androidx.compose.foundation.clickable
|
||||
|
@ -56,6 +57,7 @@ fun ColorThemePickerDialog(
|
|||
when {
|
||||
it.startsWith(Settings.PREF_USER_COLORS_PREFIX) -> it.substringAfter(Settings.PREF_USER_COLORS_PREFIX)
|
||||
it.startsWith(Settings.PREF_USER_ALL_COLORS_PREFIX) -> it.substringAfter(Settings.PREF_USER_ALL_COLORS_PREFIX)
|
||||
it.startsWith(Settings.PREF_USER_MORE_COLORS_PREFIX) -> it.substringAfter(Settings.PREF_USER_MORE_COLORS_PREFIX)
|
||||
else -> null
|
||||
}
|
||||
}.toSortedSet() // we don't want duplicates, and we want a consistent order
|
||||
|
|
|
@ -8,25 +8,31 @@ import androidx.compose.foundation.layout.Row
|
|||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.foundation.layout.width
|
||||
import androidx.compose.foundation.shape.CircleShape
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.LocalContentColor
|
||||
import androidx.compose.material3.LocalTextStyle
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Surface
|
||||
import androidx.compose.material3.Switch
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.material3.TextField
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.CompositionLocalProvider
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.saveable.rememberSaveable
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.input.TextFieldValue
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
import helium314.keyboard.keyboard.ColorSetting
|
||||
|
@ -88,9 +94,34 @@ fun ColorsScreen(
|
|||
fun ColorSetting.displayColor() = if (auto == true) KeyboardTheme.determineUserColor(userColors, ctx, name, isNight)
|
||||
else color ?: KeyboardTheme.determineUserColor(userColors, ctx, name, isNight)
|
||||
|
||||
var newThemeName by rememberSaveable(stateSaver = TextFieldValue.Saver) { mutableStateOf(TextFieldValue(themeName)) }
|
||||
var chosenColor: ColorSetting? by remember { mutableStateOf(null) }
|
||||
SearchScreen(
|
||||
title = themeName,
|
||||
title = {
|
||||
var nameValid by rememberSaveable { mutableStateOf(true) }
|
||||
var nameField by rememberSaveable(stateSaver = TextFieldValue.Saver) { mutableStateOf(newThemeName) }
|
||||
Row(verticalAlignment = Alignment.CenterVertically) {
|
||||
TextField(
|
||||
value = nameField,
|
||||
onValueChange = {
|
||||
nameValid = KeyboardTheme.renameUserColors(newThemeName.text, it.text, prefs)
|
||||
if (nameValid)
|
||||
newThemeName = it
|
||||
nameField = it
|
||||
},
|
||||
// modifier = Modifier.weight(1f)
|
||||
)
|
||||
CompositionLocalProvider(LocalContentColor provides MaterialTheme.colorScheme.secondary) {
|
||||
// todo: this should indicate whether name is saved, but looks like a button
|
||||
// either make it flash and then disappear, or use a better indicator
|
||||
Icon(
|
||||
painterResource(if (nameValid) R.drawable.ic_setup_check else R.drawable.ic_close),
|
||||
null,
|
||||
Modifier.width(24.dp)
|
||||
)
|
||||
}
|
||||
}
|
||||
},
|
||||
onClickBack = onClickBack,
|
||||
filteredItems = { search -> shownColors.filter {
|
||||
it.displayName.split(" ", "_").any { it.startsWith(search, true) }
|
||||
|
@ -107,7 +138,9 @@ fun ColorsScreen(
|
|||
.background(Color(colorSetting.displayColor()), shape = CircleShape)
|
||||
.size(50.dp)
|
||||
)
|
||||
Column(Modifier.weight(1f).padding(horizontal = 16.dp)) {
|
||||
Column(Modifier
|
||||
.weight(1f)
|
||||
.padding(horizontal = 16.dp)) {
|
||||
Text(colorSetting.displayName)
|
||||
if (colorSetting.auto == true)
|
||||
CompositionLocalProvider(
|
||||
|
|
Loading…
Add table
Reference in a new issue