Pith - stave
stave/app/src/main/kotlin/com/vgmlr/stave/StaveDialog.kt [6.5 kb]
Modified: 20:14:51 158 026 (24 Aug 026)
0 Days Ago
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") }
            )
        }
    }
}
Updates
Stave - Android 158.026
Kerf - Android 157.026
Kiln - Android 157.026
Wedge - Android 156.026
Whittle - Linux 155.026

Menu
Calendar
Project Tin (024/029)
Miter
RSS Feed
User Avatar
@vgmlr
=SUM(parts)
0.00186
257,434 (+44)