Pith - jamb
jamb/app/src/main/java/com/vgmlr/jamb/JambDialog.kt [14.5 kb]
Modified: 20:33:38 112 026 (09 Jul 026)
16 Days Ago
package com.vgmlr.jamb

import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Done
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.OutlinedTextFieldDefaults
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.UriHandler
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties

@Composable
fun FolderDialog(
    folders: List<String>,
    selected: String,
    onPick: (String) -> Unit,
    onDismiss: () -> Unit
) {
    Dialog(
        onDismissRequest = onDismiss,
        properties = DialogProperties(usePlatformDefaultWidth = false)
    ) {
        Surface(
            modifier = Modifier
                .padding(horizontal = 24.dp)
                .fillMaxWidth(),
            shape = RoundedCornerShape(8.dp),
            color = JambColors.DialogBg
        ) {
            Row(
                modifier = Modifier.padding(horizontal = 26.dp, vertical = 20.dp)
            ) {
                Column(
                    modifier = Modifier
                        .heightIn(max = 420.dp)
                        .verticalScroll(rememberScrollState())
                ) {
                    FolderRow("All Folders", selected == JambPrefs.ALL) { onPick(JambPrefs.ALL) }
                    folders.forEach { f ->
                        HorizontalDivider(
                            thickness = 1.dp,
                            color = JambColors.Rule.copy(alpha = 0.15f)
                        )
                        FolderRow(f, selected == f) { onPick(f) }
                    }
                }
            }
        }
    }
}

@Composable
private fun FolderRow(
    label: String,
    isSelected: Boolean,
    showAdd: Boolean = false,
    onClick: () -> Unit
) {
    Row(
        modifier = Modifier
            .fillMaxWidth()
            .clickable(onClick = onClick)
            .padding(horizontal = 20.dp, vertical = 14.dp),
        verticalAlignment = Alignment.CenterVertically
    ) {
        Text(
            label,
            color = if (isSelected) JambColors.FolderText else JambColors.Title,
            maxLines = 1,
            overflow = TextOverflow.Ellipsis,
            modifier = Modifier.weight(1f)
        )
        if (isSelected) {
            Spacer(Modifier.width(12.dp))
            Icon(
                Icons.Filled.Done,
                contentDescription = "Selected",
                tint = JambColors.FolderText
            )
        } else if (showAdd) {
            Spacer(Modifier.width(12.dp))
            Icon(
                Icons.Filled.Add,
                contentDescription = "New Play List",
                tint = JambColors.Title.copy(alpha = 0.4f)
            )
        }
    }
}

@Composable
fun PlaylistDialog(
    playlists: List<String>,
    selected: String?,
    onNew: () -> Unit,
    onPick: (String) -> Unit,
    onDismiss: () -> Unit
) {
    Dialog(
        onDismissRequest = onDismiss,
        properties = DialogProperties(usePlatformDefaultWidth = false)
    ) {
        Surface(
            modifier = Modifier
                .padding(horizontal = 24.dp)
                .fillMaxWidth(),
            shape = RoundedCornerShape(8.dp),
            color = JambColors.DialogBg
        ) {
            Row(modifier = Modifier.padding(horizontal = 26.dp, vertical = 20.dp)) {
                Column(
                    modifier = Modifier
                        .heightIn(max = 420.dp)
                        .verticalScroll(rememberScrollState())
                ) {
                    FolderRow("New Play List", false, showAdd = true) { onNew() }
                    playlists.forEach { p ->
                        HorizontalDivider(
                            thickness = 1.dp,
                            color = JambColors.Rule.copy(alpha = 0.15f)
                        )
                        FolderRow(p, selected == p) { onPick(p) }
                    }
                }
            }
        }
    }
}

@Composable
fun NameDialog(
    initial: String = "",
    placeholder: String = "",
    onConfirm: (String) -> Unit,
    onDismiss: () -> Unit
) {
    var text by remember { mutableStateOf(initial) }
    val focusRequester = remember { FocusRequester() }
    LaunchedEffect(Unit) { focusRequester.requestFocus() }
    Dialog(
        onDismissRequest = onDismiss,
        properties = DialogProperties(usePlatformDefaultWidth = false)
    ) {
        Surface(
            modifier = Modifier
                .padding(horizontal = 24.dp)
                .fillMaxWidth(),
            shape = RoundedCornerShape(8.dp),
            color = JambColors.DialogBg
        ) {
            Column(modifier = Modifier.padding(horizontal = 26.dp, vertical = 20.dp)) {
                OutlinedTextField(
                    value = text,
                    onValueChange = { text = it },
                    singleLine = true,
                    modifier = Modifier
                        .fillMaxWidth()
                        .focusRequester(focusRequester),
                    placeholder = {
                        Text(placeholder, color = JambColors.Title.copy(alpha = 0.3f))
                    },
                    colors = OutlinedTextFieldDefaults.colors(
                        focusedContainerColor = Color.Transparent,
                        unfocusedContainerColor = Color.Transparent,
                        cursorColor = JambColors.Title,
                        focusedTextColor = JambColors.Title,
                        unfocusedTextColor = JambColors.Title,
                        focusedBorderColor = Color(0xFFFFFFFF).copy(alpha = 0.3f),
                        unfocusedBorderColor = Color(0xFFFFFFFF).copy(alpha = 0.3f)
                    )
                )
                Row(
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(top = 16.dp),
                    horizontalArrangement = Arrangement.End
                ) {
                    Text(
                        "Nah",
                        color = JambColors.Title,
                        modifier = Modifier
                            .clip(RoundedCornerShape(6.dp))
                            .border(1.dp, Color(0xFFFFFFFF).copy(alpha = 0.05f), RoundedCornerShape(6.dp))
                            .background(Color(0xFFFFFFFF).copy(alpha = 0.05f))
                            .clickable(onClick = onDismiss)
                            .padding(horizontal = 22.dp, vertical = 8.dp)
                    )
                    Spacer(Modifier.width(10.dp))
                    Text(
                        "Yep",
                        color = JambColors.Title,
                        modifier = Modifier
                            .clip(RoundedCornerShape(6.dp))
                            .border(1.dp, Color(0xFFFFFFFF).copy(alpha = 0.05f), RoundedCornerShape(6.dp))
                            .background(Color(0xFFFFFFFF).copy(alpha = 0.05f))
                            .clickable {
                                val name = text.ifBlank { placeholder }.trim()
                                if (name.isNotBlank()) onConfirm(name)
                            }
                            .padding(horizontal = 22.dp, vertical = 8.dp)
                    )
                }
            }
        }
    }
}

@Composable
fun ConfirmDialog(
    message: String,
    onConfirm: () -> Unit,
    onDismiss: () -> Unit
) {
    Dialog(
        onDismissRequest = onDismiss,
        properties = DialogProperties(usePlatformDefaultWidth = false)
    ) {
        Surface(
            modifier = Modifier
                .padding(horizontal = 24.dp)
                .fillMaxWidth(),
            shape = RoundedCornerShape(8.dp),
            color = JambColors.DialogBg
        ) {
            Column(modifier = Modifier.padding(horizontal = 26.dp, vertical = 20.dp)) {
                Text(message, color = JambColors.Title, fontSize = 16.sp)
                Row(
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(top = 16.dp),
                    horizontalArrangement = Arrangement.End
                ) {
                    Text(
                        "Nope",
                        color = JambColors.Title,
                        modifier = Modifier
                            .clickable(onClick = onDismiss)
                            .clip(RoundedCornerShape(6.dp))
                            .border(1.dp, Color(0xFFFFFFFF).copy(alpha = 0.05f), RoundedCornerShape(6.dp))
                            .background(Color(0xFFFFFFFF).copy(alpha = 0.05f))
                            .padding(horizontal = 22.dp, vertical = 8.dp)
                    )
                    Spacer(Modifier.width(8.dp))
                    Text(
                        "Adios",
                        color = JambColors.Title,
                        modifier = Modifier
                            .clickable(onClick = onConfirm)
                            .clip(RoundedCornerShape(6.dp))
                            .border(1.dp, Color(0xFFFFFFFF).copy(alpha = 0.05f), RoundedCornerShape(6.dp))
                            .background(Color(0xFFFFFFFF).copy(alpha = 0.05f))
                            .padding(horizontal = 22.dp, vertical = 8.dp)
                    )
                }
            }
        }
    }
}

@Composable
fun DataDialog(
    show: Boolean,
    location: String,
    trackCount: Int,
    totalLength: String,
    totalSize: String,
    onDismiss: () -> Unit
) {
    if (show) {
        Dialog(
            onDismissRequest = onDismiss,
            properties = DialogProperties(usePlatformDefaultWidth = false)
        ) {
            Surface(
                modifier = Modifier
                    .padding(horizontal = 24.dp)
                    .fillMaxWidth(),
                shape = RoundedCornerShape(8.dp),
                color = JambColors.DialogBg
            ) {
                Row(
                    modifier = Modifier.padding(horizontal = 40.dp, vertical = 26.dp)
                ) {
                    Column(
                        horizontalAlignment = Alignment.Start,
                        verticalArrangement = Arrangement.spacedBy(6.dp)
                    ) {
                        Text("Location", color = JambColors.Title, fontSize = 14.sp)
                        Text("Tracks", color = JambColors.Title, fontSize = 14.sp)
                        Text("Length", color = JambColors.Title, fontSize = 14.sp)
                        Text("Size", color = JambColors.Title, fontSize = 14.sp)
                    }
                    Spacer(Modifier.width(24.dp))
                    Column(
                        horizontalAlignment = Alignment.Start,
                        verticalArrangement = Arrangement.spacedBy(6.dp)
                    ) {
                        Text(
                            location,
                            color = JambColors.Title,
                            fontSize = 14.sp,
                            fontFamily = FontFamily.Monospace
                        )
                        Text(
                            trackCount.toString(),
                            color = JambColors.Title,
                            fontSize = 14.sp,
                            fontFamily = FontFamily.Monospace
                        )
                        Text(
                            totalLength,
                            color = JambColors.Title,
                            fontSize = 14.sp,
                            fontFamily = FontFamily.Monospace
                        )
                        Text(
                            totalSize,
                            color = JambColors.Title,
                            fontSize = 14.sp,
                            fontFamily = FontFamily.Monospace
                        )
                    }
                }
            }
        }
    }
}

@Composable
fun VersionDialog(show: Boolean, onDismiss: () -> Unit, uriHandler: UriHandler) {
    if (show) {
        Dialog(
            onDismissRequest = onDismiss,
            properties = DialogProperties(usePlatformDefaultWidth = false)
        ) {
            Surface(
                modifier = Modifier
                    .padding(horizontal = 24.dp)
                    .fillMaxWidth(),
                shape = RoundedCornerShape(8.dp),
                color = JambColors.DialogBg
            ) {
                Column(
                    modifier = Modifier.padding(vertical = 26.dp),
                    horizontalAlignment = Alignment.CenterHorizontally
                ) {
                    Text("com.vgmlr.jamb", color = JambColors.Title, fontSize = 14.sp)
                    Text("112.026.1", color = JambColors.Title, fontSize = 14.sp)
                    Text(
                        "vgmlr.com/mlwrk",
                        color = JambColors.Title,
                        fontSize = 14.sp,
                        modifier = Modifier.clickable { uriHandler.openUri("https://vgmlr.com/mlwrk") }
                    )
                }
            }
        }
    }
}
Updates
Wedge - Android 126.026
Wedge - Linux 124.026
Shim - Android 117.026
Miter - 114.026
Kerf - Android 112.026
Dev
TVShow (227) 'CSA'
TVShow (228) 'APT'
TVProgram (83) 'BXT'
Miter Update(s)
Peen (Messaging)

Menu
Calendar
Project Tin (024/029)
Miter
RSS Feed
User Avatar
@vgmlr
=SUM(parts)