Pith - stave
stave/app/src/main/kotlin/com/vgmlr/stave/StaveTrips.kt [6.3 kb]
Modified: 20:14:52 158 026 (24 Aug 026)
0 Days Ago
package com.vgmlr.stave

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.SystemBarStyle
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import android.graphics.Color as AndroidColor
import androidx.compose.material.icons.outlined.Delete
import androidx.compose.material.icons.filled.Edit

class StaveTrips : ComponentActivity() {

    private lateinit var db: StaveDatabase
    private lateinit var themeManager: StaveThemeManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge(statusBarStyle = SystemBarStyle.dark(AndroidColor.TRANSPARENT))
        db = StaveDatabase(this)
        themeManager = StaveThemeManager(this)

        setContent {
            StaveTheme(themeManager) {
                TripsScreen()
            }
        }
    }

    @OptIn(ExperimentalMaterial3Api::class)
    @Composable
    fun TripsScreen() {
        var trips by remember { mutableStateOf(db.getAllTrips()) }
        val currentId = remember { StaveSession.currentTripId(this) }
        var selectedIds by remember { mutableStateOf<Set<Int>>(emptySet()) }
        var showDelete by remember { mutableStateOf(false) }
        var showRename by remember { mutableStateOf(false) }

        Scaffold(
            topBar = {
                TopAppBar(
                    title = {
                        Text(
                            "Staves",
                            fontSize = 18.sp,
                            color = colorResource(id = R.color.title_color)
                        )
                    },
                    navigationIcon = {
                        IconButton(onClick = { finish() }) {
                            Icon(
                                Icons.AutoMirrored.Filled.ArrowBack,
                                contentDescription = "Back",
                                tint = colorResource(id = R.color.title_color)
                            )
                        }
                    },
                    colors = TopAppBarDefaults.topAppBarColors(
                        containerColor = colorResource(id = R.color.primary_color)
                    ),
                    actions = {
                        if (selectedIds.size == 1) {
                            IconButton(onClick = { showRename = true }) {
                                Icon(
                                    Icons.Filled.Edit,
                                    contentDescription = "Edit",
                                    tint = colorResource(id = R.color.title_color)
                                )
                            }
                        }
                        if (selectedIds.isNotEmpty()) {
                            IconButton(onClick = { showDelete = true }) {
                                Icon(
                                    Icons.Outlined.Delete,
                                    contentDescription = "Delete",
                                    tint = colorResource(id = R.color.title_color)
                                )
                            }
                        }
                    }
                )
            },
            contentWindowInsets = WindowInsets(0, 0, 0, 0),
            containerColor = themeManager.backgroundColor.value
        ) { padding ->
            LazyColumn(
                modifier = Modifier
                    .fillMaxSize()
                    .padding(padding)
                    .navigationBarsPadding()
                    .background(themeManager.backgroundColor.value)
            ) {
                items(trips, key = { it.id }) { trip ->
                    TripRow(
                        trip = trip,
                        isSelected = trip.id in selectedIds,
                        themeManager = themeManager,
                        onClick = {
                            if (selectedIds.isNotEmpty()) {
                                selectedIds = if (trip.id in selectedIds) selectedIds - trip.id
                                else selectedIds + trip.id
                            } else {
                                StaveSession.setCurrentTripId(this@StaveTrips, trip.id)
                                finish()
                            }
                        },
                        onLongClick = {
                            selectedIds = if (trip.id in selectedIds) selectedIds - trip.id
                            else selectedIds + trip.id
                        }
                    )
                }
                item { Spacer(Modifier.height(24.dp)) }
            }
        }
        if (showRename && selectedIds.size == 1) {
            val id = selectedIds.first()
            NewTripDialog(
                initial = trips.firstOrNull { it.id == id }?.name ?: "",
                label = "Edit",
                confirmLabel = "Save",
                onDismiss = { showRename = false },
                onCreate = { name ->
                    db.renameTrip(id, name)
                    trips = db.getAllTrips()
                    selectedIds = emptySet()
                }
            )
        }
        if (showDelete) {
            ConfirmDialog(
                message = "Delete ${selectedIds.size} ${if (selectedIds.size == 1) "trip" else "trips"}?",
                confirmLabel = "Yep",
                dismissLabel = "Nope",
                onDismiss = { showDelete = false },
                onConfirm = {
                    if (currentId in selectedIds) StaveSession.clear(this@StaveTrips)
                    selectedIds.forEach { db.deleteTrip(it) }
                    selectedIds = emptySet()
                    trips = db.getAllTrips()
                    showDelete = false
                }
            )
        }
    }
}
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.00241
257,430 (+40)