201 lines
8.1 KiB
Kotlin
201 lines
8.1 KiB
Kotlin
package com.racingapp.pitlog.ui
|
|
|
|
import androidx.compose.foundation.layout.Box
|
|
import androidx.compose.foundation.layout.fillMaxSize
|
|
import androidx.compose.foundation.layout.fillMaxWidth
|
|
import androidx.compose.foundation.layout.statusBarsPadding
|
|
import androidx.compose.material3.LinearProgressIndicator
|
|
import androidx.compose.material3.MaterialTheme
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.runtime.getValue
|
|
import androidx.compose.ui.Alignment
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.platform.LocalContext
|
|
import androidx.compose.ui.semantics.contentDescription
|
|
import androidx.compose.ui.semantics.semantics
|
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
|
import androidx.navigation.NavType
|
|
import androidx.navigation.compose.NavHost
|
|
import androidx.navigation.compose.composable
|
|
import androidx.navigation.compose.rememberNavController
|
|
import androidx.navigation.navArgument
|
|
import com.racingapp.pitlog.ui.guide.SetupGuideScreen
|
|
import com.racingapp.pitlog.ui.home.CarsScreen
|
|
import com.racingapp.pitlog.ui.home.HomeScreen
|
|
import com.racingapp.pitlog.ui.night.NightDetailScreen
|
|
import com.racingapp.pitlog.ui.night.NightEditorScreen
|
|
import com.racingapp.pitlog.ui.night.SetupEditorScreen
|
|
import com.racingapp.pitlog.ui.run.RunDetailScreen
|
|
import com.racingapp.pitlog.ui.run.RunEditorScreen
|
|
import com.racingapp.pitlog.ui.settings.SettingsScreen
|
|
import com.racingapp.pitlog.ui.setup.CarSetupEditorScreen
|
|
import com.racingapp.pitlog.ui.setup.CarSetupScreen
|
|
|
|
@Composable
|
|
fun PitNav() {
|
|
val nav = rememberNavController()
|
|
val context = LocalContext.current
|
|
val refreshing by LocalRepository.current.syncRefreshing().collectAsStateWithLifecycle(false)
|
|
Box(Modifier.fillMaxSize()) {
|
|
NavHost(navController = nav, startDestination = "cars") {
|
|
composable("cars") {
|
|
CarsScreen(
|
|
onOpenCar = {
|
|
nav.navigate("home") {
|
|
popUpTo("cars")
|
|
launchSingleTop = true
|
|
}
|
|
},
|
|
onAddCar = { nav.navigate("settings/car") },
|
|
onSettings = { nav.navigate("settings") },
|
|
)
|
|
}
|
|
composable("home") {
|
|
HomeScreen(
|
|
onBack = { nav.popBackStack() },
|
|
onNewNight = { nav.navigate("editor/night") },
|
|
onOpenNight = { id -> nav.navigate("night/$id") },
|
|
onLogRun = { id -> nav.navigate("editor/run/$id") },
|
|
onSettings = { nav.navigate("settings/car") },
|
|
onGuide = { nav.navigate("guide") },
|
|
onCarSetup = { nav.navigate("car-setup") },
|
|
onExport = { name, csv -> shareCsv(context, name, csv) },
|
|
)
|
|
}
|
|
composable("settings") {
|
|
SettingsScreen(showCar = false, onBack = { nav.popBackStack() })
|
|
}
|
|
composable("settings/car") {
|
|
SettingsScreen(
|
|
showCar = true,
|
|
onBack = { nav.popBackStack() },
|
|
onCarRemoved = { nav.popBackStack("cars", inclusive = false) },
|
|
)
|
|
}
|
|
composable("guide") {
|
|
SetupGuideScreen(onBack = { nav.popBackStack() })
|
|
}
|
|
composable("car-setup") {
|
|
CarSetupScreen(
|
|
onBack = { nav.popBackStack() },
|
|
onEditOriginal = { nav.navigate("car-setup/original") },
|
|
onLogChange = { nav.navigate("car-setup/change") },
|
|
)
|
|
}
|
|
composable("car-setup/original") {
|
|
CarSetupEditorScreen(loggingChange = false, onBack = { nav.popBackStack() })
|
|
}
|
|
composable("car-setup/change") {
|
|
CarSetupEditorScreen(loggingChange = true, onBack = { nav.popBackStack() })
|
|
}
|
|
composable(
|
|
route = "setup/{nightId}",
|
|
arguments = listOf(navArgument("nightId") { type = NavType.LongType }),
|
|
) { entry ->
|
|
val nightId = entry.arguments?.getLong("nightId") ?: return@composable
|
|
SetupEditorScreen(nightId = nightId, onBack = { nav.popBackStack() })
|
|
}
|
|
composable("editor/night") {
|
|
NightEditorScreen(
|
|
nightId = null,
|
|
onBack = { nav.popBackStack() },
|
|
onSaved = { id ->
|
|
nav.navigate("night/$id") {
|
|
popUpTo("editor/night") { inclusive = true }
|
|
}
|
|
},
|
|
)
|
|
}
|
|
composable(
|
|
route = "editor/night/{nightId}",
|
|
arguments = listOf(navArgument("nightId") { type = NavType.LongType }),
|
|
) { entry ->
|
|
NightEditorScreen(
|
|
nightId = entry.arguments?.getLong("nightId"),
|
|
onBack = { nav.popBackStack() },
|
|
onSaved = { nav.popBackStack() },
|
|
)
|
|
}
|
|
composable(
|
|
route = "night/{nightId}",
|
|
arguments = listOf(navArgument("nightId") { type = NavType.LongType }),
|
|
) { entry ->
|
|
val nightId = entry.arguments?.getLong("nightId") ?: return@composable
|
|
NightDetailScreen(
|
|
nightId = nightId,
|
|
onBack = { nav.popBackStack() },
|
|
onEdit = { nav.navigate("editor/night/$nightId") },
|
|
onLogRun = { nav.navigate("editor/run/$nightId") },
|
|
onOpenRun = { runId -> nav.navigate("run/$nightId/$runId") },
|
|
onDeleted = {
|
|
nav.popBackStack("home", inclusive = false)
|
|
},
|
|
onExport = { name, csv -> shareCsv(context, name, csv) },
|
|
onSetup = { nav.navigate("setup/$nightId") },
|
|
)
|
|
}
|
|
composable(
|
|
route = "editor/run/{nightId}",
|
|
arguments = listOf(navArgument("nightId") { type = NavType.LongType }),
|
|
) { entry ->
|
|
val nightId = entry.arguments?.getLong("nightId") ?: return@composable
|
|
RunEditorScreen(
|
|
nightId = nightId,
|
|
runId = null,
|
|
onBack = { nav.popBackStack() },
|
|
onSaved = { runId ->
|
|
nav.navigate("run/$nightId/$runId") {
|
|
popUpTo("editor/run/$nightId") { inclusive = true }
|
|
}
|
|
},
|
|
)
|
|
}
|
|
composable(
|
|
route = "editor/run/{nightId}/{runId}",
|
|
arguments = listOf(
|
|
navArgument("nightId") { type = NavType.LongType },
|
|
navArgument("runId") { type = NavType.LongType },
|
|
),
|
|
) { entry ->
|
|
val nightId = entry.arguments?.getLong("nightId") ?: return@composable
|
|
val runId = entry.arguments?.getLong("runId") ?: return@composable
|
|
RunEditorScreen(
|
|
nightId = nightId,
|
|
runId = runId,
|
|
onBack = { nav.popBackStack() },
|
|
onSaved = { nav.popBackStack() },
|
|
)
|
|
}
|
|
composable(
|
|
route = "run/{nightId}/{runId}",
|
|
arguments = listOf(
|
|
navArgument("nightId") { type = NavType.LongType },
|
|
navArgument("runId") { type = NavType.LongType },
|
|
),
|
|
) { entry ->
|
|
val nightId = entry.arguments?.getLong("nightId") ?: return@composable
|
|
val runId = entry.arguments?.getLong("runId") ?: return@composable
|
|
RunDetailScreen(
|
|
nightId = nightId,
|
|
runId = runId,
|
|
onBack = { nav.popBackStack() },
|
|
onEdit = { nav.navigate("editor/run/$nightId/$runId") },
|
|
onGuide = { nav.navigate("guide") },
|
|
onDeleted = { nav.popBackStack() },
|
|
)
|
|
}
|
|
}
|
|
if (refreshing) {
|
|
LinearProgressIndicator(
|
|
modifier = Modifier
|
|
.align(Alignment.TopCenter)
|
|
.fillMaxWidth()
|
|
.statusBarsPadding()
|
|
.semantics { contentDescription = "Syncing" },
|
|
color = MaterialTheme.colorScheme.primary,
|
|
trackColor = MaterialTheme.colorScheme.background,
|
|
)
|
|
}
|
|
}
|
|
}
|