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
}
)
}
}
}