base all dialogs on ThreeButtonAlertDialog

This commit is contained in:
Helium314 2025-02-05 17:18:53 +01:00
parent 534bfb2f13
commit 443223de6a
8 changed files with 30 additions and 142 deletions

View file

@ -1,17 +1,10 @@
package helium314.keyboard.settings.dialogs
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.contentColorFor
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.window.DialogProperties
import helium314.keyboard.latin.R
// taken from StreetComplete
@ -28,10 +21,6 @@ fun ConfirmationDialog(
cancelButtonText: String = stringResource(android.R.string.cancel),
neutralButtonText: String? = null,
onNeutral: () -> Unit = { },
shape: Shape = MaterialTheme.shapes.medium,
backgroundColor: Color = MaterialTheme.colorScheme.surface,
contentColor: Color = contentColorFor(backgroundColor),
properties: DialogProperties = DialogProperties(),
) {
ThreeButtonAlertDialog(
onDismissRequest = onDismissRequest,
@ -43,10 +32,6 @@ fun ConfirmationDialog(
modifier = modifier,
title = title,
text = text,
shape = shape,
backgroundColor = backgroundColor,
contentColor = contentColor,
properties = properties,
)
}

View file

@ -4,7 +4,6 @@ import android.graphics.drawable.VectorDrawable
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
@ -13,13 +12,10 @@ import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.foundation.lazy.grid.items
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Icon
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.contentColorFor
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.getValue
@ -34,7 +30,6 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.DialogProperties
import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.toBitmap
import androidx.core.util.TypedValueCompat
@ -71,18 +66,13 @@ fun CustomizeIconsDialog(
var showIconDialog: Pair<String, String>? by remember { mutableStateOf(null) }
var showDeletePrefConfirmDialog by remember { mutableStateOf(false) }
val prefs = ctx.prefs()
AlertDialog(
ThreeButtonAlertDialog(
onDismissRequest = onDismissRequest,
confirmButton = { },
dismissButton = {
Row {
if (prefs.contains(prefKey))
TextButton(onClick = { showDeletePrefConfirmDialog = true })
{ Text(stringResource(R.string.button_default)) }
Spacer(Modifier.weight(1f))
TextButton(onClick = onDismissRequest) { Text(stringResource(R.string.dialog_close)) }
}
},
onConfirmed = { },
confirmButtonText = null,
cancelButtonText = stringResource(R.string.dialog_close),
neutralButtonText = if (prefs.contains(prefKey)) stringResource(R.string.button_default) else null,
onNeutral = { showDeletePrefConfirmDialog = true },
title = { Text(stringResource(R.string.customize_icons)) },
text = {
LazyColumn(state = state) {
@ -97,11 +87,6 @@ fun CustomizeIconsDialog(
}
}
},
shape = MaterialTheme.shapes.medium,
containerColor = MaterialTheme.colorScheme.surface,
textContentColor = contentColorFor(MaterialTheme.colorScheme.surface),
properties = DialogProperties(),
)
if (showIconDialog != null) {
val iconName = showIconDialog!!.first
@ -164,7 +149,6 @@ fun CustomizeIconsDialog(
)
}
if (showDeletePrefConfirmDialog) {
val ctx = LocalContext.current
ConfirmationDialog(
onDismissRequest = { showDeletePrefConfirmDialog = false },
onConfirmed = {

View file

@ -7,13 +7,10 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.RadioButton
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.contentColorFor
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect
@ -23,13 +20,9 @@ import androidx.compose.runtime.remember
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.graphics.Shape
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.DialogProperties
// taken from StreetComplete
@Composable
@ -42,12 +35,6 @@ fun <T: Any> ListPickerDialog(
selectedItem: T? = null,
getItemName: (@Composable (T) -> String) = { it.toString() },
confirmImmediately: Boolean = true,
width: Dp? = null,
height: Dp? = null,
shape: Shape = MaterialTheme.shapes.medium,
backgroundColor: Color = MaterialTheme.colorScheme.surface,
contentColor: Color = contentColorFor(backgroundColor),
properties: DialogProperties = DialogProperties()
) {
var selected by remember { mutableStateOf(selectedItem) }
val state = rememberLazyListState()
@ -56,17 +43,12 @@ fun <T: Any> ListPickerDialog(
val index = items.indexOf(selectedItem)
if (index != -1) state.scrollToItem(index, -state.layoutInfo.viewportSize.height / 3)
}
AlertDialog(
ThreeButtonAlertDialog(
onDismissRequest = onDismissRequest,
confirmButton = {
if (!confirmImmediately)
TextButton(
onClick = { onDismissRequest(); selected?.let { onItemSelected(it) } },
enabled = selected != null,
) { Text(stringResource(android.R.string.ok)) }
},
onConfirmed = { selected?.let { onItemSelected(it) } },
confirmButtonText = if (confirmImmediately) null else stringResource(android.R.string.ok),
checkOk = { selected != null },
modifier = modifier,
dismissButton = { TextButton(onClick = onDismissRequest) { Text(stringResource(android.R.string.cancel)) } },
title = title,
text = {
CompositionLocalProvider(
@ -107,10 +89,6 @@ fun <T: Any> ListPickerDialog(
}
}
},
shape = shape,
containerColor = backgroundColor,
textContentColor = contentColor,
properties = properties,
)
}
@ -125,6 +103,5 @@ private fun PreviewListPickerDialog() {
title = { Text("Select something") },
selectedItem = 2,
getItemName = { "Item $it" },
width = 260.dp
)
}

View file

@ -4,17 +4,15 @@ import androidx.compose.animation.core.animateDpAsState
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.contentColorFor
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@ -22,14 +20,10 @@ import androidx.compose.runtime.remember
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.graphics.Shape
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.DialogProperties
import helium314.keyboard.latin.R
import sh.calvin.reorderable.ReorderableItem
import sh.calvin.reorderable.rememberReorderableLazyListState
@ -45,10 +39,6 @@ fun <T: Any> ReorderDialog(
title: @Composable (() -> Unit)? = null,
onNeutral: () -> Unit = { },
neutralButtonText: String? = null,
shape: Shape = MaterialTheme.shapes.medium,
backgroundColor: Color = MaterialTheme.colorScheme.surface,
contentColor: Color = contentColorFor(backgroundColor),
properties: DialogProperties = DialogProperties(),
) {
var reorderableItems by remember(items) { mutableStateOf(items) }
val listState = rememberLazyListState()
@ -77,7 +67,12 @@ fun <T: Any> ReorderDialog(
) { dragging ->
val elevation by animateDpAsState(if (dragging) 4.dp else 0.dp)
Surface(shadowElevation = elevation) {
Row(modifier = Modifier.longPressDraggableHandle(), verticalAlignment = Alignment.CenterVertically) {
Row(
modifier = Modifier
.longPressDraggableHandle()
.heightIn(min = 36.dp),
verticalAlignment = Alignment.CenterVertically
) {
Icon(
painterResource(R.drawable.ic_drag_indicator),
"Reorder",
@ -91,10 +86,6 @@ fun <T: Any> ReorderDialog(
}
}
},
shape = shape,
backgroundColor = backgroundColor,
contentColor = contentColor,
properties = properties,
)
}

View file

@ -1,15 +1,10 @@
package helium314.keyboard.settings.dialogs
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Slider
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.contentColorFor
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.getValue
@ -17,11 +12,8 @@ import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.window.DialogProperties
import helium314.keyboard.latin.R
@Composable
@ -37,10 +29,6 @@ fun SliderDialog(
title: (@Composable () -> Unit)? = null,
intermediateSteps: Int? = null,
positionString: (@Composable (Float) -> String) = { it.toString() },
shape: Shape = MaterialTheme.shapes.medium,
backgroundColor: Color = MaterialTheme.colorScheme.surface,
contentColor: Color = contentColorFor(backgroundColor),
properties: DialogProperties = DialogProperties()
) {
var sliderPosition by remember { mutableFloatStateOf(initialValue) }
@ -75,10 +63,6 @@ fun SliderDialog(
}
}
},
shape = shape,
backgroundColor = backgroundColor,
contentColor = contentColor,
properties = properties,
)
}

View file

@ -2,10 +2,8 @@ package helium314.keyboard.settings.dialogs
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text
import androidx.compose.material3.contentColorFor
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
@ -15,14 +13,11 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.TextRange
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.window.DialogProperties
// mostly taken from StreetComplete / SCEE
/** Dialog with which to input text. OK button is only clickable if [checkTextValid] returns true. */
@ -37,10 +32,6 @@ fun TextInputDialog(
confirmButtonText: String = stringResource(android.R.string.ok),
initialText: String = "",
textInputLabel: @Composable (() -> Unit)? = null,
shape: Shape = MaterialTheme.shapes.medium,
backgroundColor: Color = MaterialTheme.colorScheme.surface,
contentColor: Color = contentColorFor(backgroundColor),
properties: DialogProperties = DialogProperties(),
singleLine: Boolean = true,
keyboardType: KeyboardType = KeyboardType.Unspecified,
checkTextValid: (text: String) -> Boolean = { it.isNotBlank() }
@ -48,9 +39,10 @@ fun TextInputDialog(
val focusRequester = remember { FocusRequester() }
var value by remember {
mutableStateOf(TextFieldValue(initialText, selection = TextRange(0, initialText.length)))
mutableStateOf(TextFieldValue(initialText, selection = TextRange(initialText.length)))
}
// todo: this is not working any more?
LaunchedEffect(initialText) { focusRequester.requestFocus() }
ThreeButtonAlertDialog(
@ -74,10 +66,6 @@ fun TextInputDialog(
singleLine = singleLine
)
},
shape = shape,
backgroundColor = backgroundColor,
contentColor = contentColor,
properties = properties,
)
}
@ -92,4 +80,4 @@ private fun Preview() {
singleLine = false,
textInputLabel = { Text("fill it") }
)
}
}

View file

@ -26,10 +26,6 @@ fun ThreeButtonAlertDialog(
confirmButtonText: String? = stringResource(android.R.string.ok),
cancelButtonText: String = stringResource(android.R.string.cancel),
neutralButtonText: String? = null,
shape: Shape = MaterialTheme.shapes.medium,
backgroundColor: Color = MaterialTheme.colorScheme.surface,
contentColor: Color = contentColorFor(backgroundColor),
properties: DialogProperties = DialogProperties(),
) {
AlertDialog(
onDismissRequest = onDismissRequest,
@ -51,9 +47,9 @@ fun ThreeButtonAlertDialog(
modifier = modifier,
title = title,
text = text,
shape = shape,
containerColor = backgroundColor,
textContentColor = contentColor,
properties = properties,
shape = MaterialTheme.shapes.medium,
containerColor = MaterialTheme.colorScheme.surface,
textContentColor = contentColorFor( MaterialTheme.colorScheme.surface),
properties = DialogProperties(),
)
}

View file

@ -7,12 +7,8 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.TextField
import androidx.compose.material3.contentColorFor
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@ -26,7 +22,6 @@ import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.DialogProperties
import androidx.core.content.edit
import helium314.keyboard.keyboard.internal.KeyboardIconsSet
import helium314.keyboard.keyboard.internal.keyboard_parser.floris.KeyCode.checkAndConvertCode
@ -53,17 +48,13 @@ fun ToolbarKeysCustomizer(
val prefs = ctx.prefs()
var showKeyCustomizer: ToolbarKey? by remember { mutableStateOf(null) }
var showDeletePrefConfirmDialog by remember { mutableStateOf(false) }
AlertDialog(
ThreeButtonAlertDialog(
onDismissRequest = onDismissRequest,
confirmButton = {
TextButton(onClick = onDismissRequest) { Text(stringResource(R.string.dialog_close)) }
},
dismissButton = {
if (readCustomKeyCodes(prefs).isNotEmpty() || readCustomLongpressCodes(prefs).isNotEmpty())
TextButton(
onClick = { showDeletePrefConfirmDialog = true }
) { Text(stringResource(R.string.button_default)) }
},
cancelButtonText = stringResource(R.string.dialog_close),
confirmButtonText = null,
onConfirmed = { },
neutralButtonText = if (readCustomKeyCodes(prefs).isNotEmpty() || readCustomLongpressCodes(prefs).isNotEmpty()) stringResource(R.string.button_default) else null,
onNeutral = { showDeletePrefConfirmDialog = true },
title = { Text(stringResource(R.string.customize_toolbar_key_codes)) },
text = {
LazyColumn(
@ -80,10 +71,6 @@ fun ToolbarKeysCustomizer(
}
}
},
shape = MaterialTheme.shapes.medium,
containerColor = MaterialTheme.colorScheme.surface,
textContentColor = contentColorFor(MaterialTheme.colorScheme.surface),
properties = DialogProperties(),
)
if (showKeyCustomizer != null) {
val shownKey = showKeyCustomizer
@ -156,10 +143,6 @@ private fun ToolbarKeyCustomizer(
}
}
},
shape = MaterialTheme.shapes.medium,
backgroundColor = MaterialTheme.colorScheme.surface,
contentColor = contentColorFor(MaterialTheme.colorScheme.surface),
properties = DialogProperties(),
)
}