package com.vgmlr.stave
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
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.platform.LocalUriHandler
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties
import androidx.compose.ui.window.DialogWindowProvider
import kotlinx.coroutines.delay
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.TextRange
import androidx.compose.ui.text.input.TextFieldValue
private val CChip = Color(0xFF3A4048)
@Composable
private fun StaveDialogShell(onDismiss: () -> Unit, content: @Composable ColumnScope.() -> Unit) {
Dialog(
onDismissRequest = onDismiss,
properties = DialogProperties(usePlatformDefaultWidth = false)
) {
(LocalView.current.parent as? DialogWindowProvider)?.window?.setDimAmount(0.8f)
Surface(
modifier = Modifier
.padding(horizontal = 24.dp)
.fillMaxWidth(),
shape = RoundedCornerShape(8.dp),
color = colorResource(id = R.color.dialog_bg_color)
) {
Column(content = content)
}
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun NewTripDialog(
onDismiss: () -> Unit,
onCreate: (String) -> Unit,
dismissible: Boolean = true,
initial: String = "",
label: String = "New Stave",
confirmLabel: String = "Start"
) {
var name by remember { mutableStateOf(TextFieldValue(initial, TextRange(initial.length))) }
val focus = remember { FocusRequester() }
val fg = colorResource(id = R.color.dialog_color)
val btnShape = RoundedCornerShape(8.dp)
val btnColors = ButtonDefaults.buttonColors(containerColor = CChip, contentColor = fg)
LaunchedEffect(Unit) {
delay(120)
focus.requestFocus()
}
val commit = {
if (name.text.isNotBlank()) {
onCreate(name.text.trim())
onDismiss()
}
}
AlertDialog(
onDismissRequest = { if (dismissible) onDismiss() },
shape = RoundedCornerShape(14.dp),
containerColor = colorResource(id = R.color.dialog_bg_color),
text = {
OutlinedTextField(
value = name,
onValueChange = { name = it },
label = { Text(label) },
singleLine = true,
modifier = Modifier
.fillMaxWidth()
.focusRequester(focus),
textStyle = TextStyle(fontSize = 17.sp),
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
keyboardActions = KeyboardActions(onDone = { commit() }),
colors = OutlinedTextFieldDefaults.colors(
focusedTextColor = fg,
unfocusedTextColor = fg,
focusedBorderColor = fg.copy(alpha = 0.45f),
unfocusedBorderColor = fg.copy(alpha = 0.15f),
focusedLabelColor = fg.copy(alpha = 0.60f),
unfocusedLabelColor = fg.copy(alpha = 0.40f),
cursorColor = fg.copy(alpha = 0.80f)
)
)
},
confirmButton = {
Button(
onClick = commit,
enabled = name.text.isNotBlank(),
modifier = Modifier.height(44.dp),
colors = btnColors,
shape = btnShape
) {
Text(
confirmLabel,
color = fg.copy(alpha = if (name.text.isNotBlank()) 1f else 0.3f),
fontSize = 15.sp
)
}
},
dismissButton = {
if (dismissible) {
Button(
onClick = onDismiss,
modifier = Modifier.height(44.dp),
colors = btnColors,
shape = btnShape
) { Text("Abort", color = fg, fontSize = 15.sp) }
}
}
)
}
@Composable
fun ConfirmDialog(
message: String,
confirmLabel: String,
dismissLabel: String,
onConfirm: () -> Unit,
onDismiss: () -> Unit
) {
val fg = colorResource(id = R.color.dialog_color)
val shape = RoundedCornerShape(8.dp)
val colors = ButtonDefaults.buttonColors(
containerColor = Color(0xFF3A4048),
contentColor = fg
)
AlertDialog(
onDismissRequest = onDismiss,
shape = RoundedCornerShape(14.dp),
containerColor = colorResource(id = R.color.dialog_bg_color),
confirmButton = {
Button(onConfirm, Modifier.height(44.dp), colors = colors, shape = shape) {
Text(confirmLabel, fontSize = 15.sp)
}
},
dismissButton = {
Button(onDismiss, Modifier.height(44.dp), colors = colors, shape = shape) {
Text(dismissLabel, fontSize = 15.sp)
}
},
text = { Text(message, color = fg, fontSize = 16.sp) }
)
}
@Composable
fun VersionDialog(onDismiss: () -> Unit) {
val uriHandler = LocalUriHandler.current
val fg = colorResource(id = R.color.dialog_color)
StaveDialogShell(onDismiss) {
Column(
modifier = Modifier.fillMaxWidth().padding(vertical = 26.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
"com.vgmlr.stave",
color = fg,
fontSize = 14.sp
)
Text(
"158.026.1",
color = fg,
fontSize = 14.sp,
modifier = Modifier.clickable { uriHandler.openUri("https://vgmlr.com/?t=Stave#download") }
)
Text(
"vgmlr.com/mlwrk",
color = fg,
fontSize = 14.sp,
modifier = Modifier.clickable { uriHandler.openUri("https://vgmlr.com/mlwrk") }
)
}
}
}