From c45d852aa0db5dec33468a2aac27d2d94ccaa83f Mon Sep 17 00:00:00 2001 From: Dennis Date: Mon, 7 Apr 2025 00:13:23 +0200 Subject: [PATCH] Implements basic navigation --- .idea/inspectionProfiles/Project_Default.xml | 50 ++++++++++++++ .../main/java/com/dnsc/plaindo/PlaindoApp.kt | 36 +++++++--- .../java/com/dnsc/plaindo/TopLevelRoute.kt | 6 ++ .../dnsc/plaindo/ui/agenda/PlaindoAgenda.kt | 6 ++ .../plaindo/ui/agenda/PlaindoAgendaScreen.kt | 15 ++++ .../plaindo/ui/components/BottomNavigation.kt | 42 ++++++++++++ .../ui/{shared => components}/TopBar.kt | 13 +++- .../dnsc/plaindo/ui/components/TopBarMenu.kt | 68 +++++++++++++++++++ .../ui/overview/PlaindoOverviewScreen.kt | 21 ++---- .../ui/settings/PlaindoSettingsScreen.kt | 19 ++---- 10 files changed, 237 insertions(+), 39 deletions(-) create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 app/src/main/java/com/dnsc/plaindo/TopLevelRoute.kt create mode 100644 app/src/main/java/com/dnsc/plaindo/ui/agenda/PlaindoAgenda.kt create mode 100644 app/src/main/java/com/dnsc/plaindo/ui/agenda/PlaindoAgendaScreen.kt create mode 100644 app/src/main/java/com/dnsc/plaindo/ui/components/BottomNavigation.kt rename app/src/main/java/com/dnsc/plaindo/ui/{shared => components}/TopBar.kt (56%) create mode 100644 app/src/main/java/com/dnsc/plaindo/ui/components/TopBarMenu.kt diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..f0c6ad0 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,50 @@ + + + + \ No newline at end of file diff --git a/app/src/main/java/com/dnsc/plaindo/PlaindoApp.kt b/app/src/main/java/com/dnsc/plaindo/PlaindoApp.kt index 3b4ab2c..104bf76 100644 --- a/app/src/main/java/com/dnsc/plaindo/PlaindoApp.kt +++ b/app/src/main/java/com/dnsc/plaindo/PlaindoApp.kt @@ -1,24 +1,44 @@ package com.dnsc.plaindo +import android.util.Log +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.DateRange +import androidx.compose.material.icons.outlined.Home +import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController -import com.dnsc.plaindo.ui.overview.PlaindoOverview +import com.dnsc.plaindo.ui.agenda.PlaindoAgendaScreen +import com.dnsc.plaindo.ui.components.BottomNavigation +import com.dnsc.plaindo.ui.components.TopBar import com.dnsc.plaindo.ui.overview.PlaindoOverviewScreen -import com.dnsc.plaindo.ui.settings.PlaindoSettings import com.dnsc.plaindo.ui.settings.PlaindoSettingsScreen @Composable fun PlaindoApp() { + val topLevelRoutes = listOf( + TopLevelRoute("Home", "overview", Icons.Outlined.Home), + TopLevelRoute("Agenda", "agenda", Icons.Outlined.DateRange), + ) val navController = rememberNavController() - NavHost(navController, startDestination = PlaindoOverview) { - composable { - PlaindoOverviewScreen() - } - composable { - PlaindoSettingsScreen() + Scaffold( + topBar = { + TopBar("Plaindo", navController) + }, + bottomBar = { BottomNavigation(navController, topLevelRoutes) } + ) { innerPadding -> + NavHost(navController, startDestination = "overview") { + composable("overview") { + PlaindoOverviewScreen(navController, innerPadding) + } + composable("agenda") { + PlaindoAgendaScreen(innerPadding) + } + composable("settings") { + PlaindoSettingsScreen(innerPadding) + } } } } \ No newline at end of file diff --git a/app/src/main/java/com/dnsc/plaindo/TopLevelRoute.kt b/app/src/main/java/com/dnsc/plaindo/TopLevelRoute.kt new file mode 100644 index 0000000..1031cca --- /dev/null +++ b/app/src/main/java/com/dnsc/plaindo/TopLevelRoute.kt @@ -0,0 +1,6 @@ +package com.dnsc.plaindo + +import androidx.compose.ui.graphics.vector.ImageVector + +data class TopLevelRoute(val name: String, val route: String, val icon: ImageVector) + diff --git a/app/src/main/java/com/dnsc/plaindo/ui/agenda/PlaindoAgenda.kt b/app/src/main/java/com/dnsc/plaindo/ui/agenda/PlaindoAgenda.kt new file mode 100644 index 0000000..379d087 --- /dev/null +++ b/app/src/main/java/com/dnsc/plaindo/ui/agenda/PlaindoAgenda.kt @@ -0,0 +1,6 @@ +package com.dnsc.plaindo.ui.agenda + +import kotlinx.serialization.Serializable + +@Serializable +object PlaindoAgenda \ No newline at end of file diff --git a/app/src/main/java/com/dnsc/plaindo/ui/agenda/PlaindoAgendaScreen.kt b/app/src/main/java/com/dnsc/plaindo/ui/agenda/PlaindoAgendaScreen.kt new file mode 100644 index 0000000..2ebcd83 --- /dev/null +++ b/app/src/main/java/com/dnsc/plaindo/ui/agenda/PlaindoAgendaScreen.kt @@ -0,0 +1,15 @@ +package com.dnsc.plaindo.ui.agenda + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier + +@Composable +fun PlaindoAgendaScreen(innerPadding: PaddingValues) { + Column(modifier = Modifier.padding(innerPadding)) { + Text(text = "Agenda") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dnsc/plaindo/ui/components/BottomNavigation.kt b/app/src/main/java/com/dnsc/plaindo/ui/components/BottomNavigation.kt new file mode 100644 index 0000000..0c44523 --- /dev/null +++ b/app/src/main/java/com/dnsc/plaindo/ui/components/BottomNavigation.kt @@ -0,0 +1,42 @@ +package com.dnsc.plaindo.ui.components + +import android.util.Log +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.DateRange +import androidx.compose.material.icons.outlined.Home +import androidx.compose.material.icons.outlined.List +import androidx.compose.material3.Icon +import androidx.compose.material3.NavigationBar +import androidx.compose.material3.NavigationBarItem +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.navigation.NavDestination.Companion.hierarchy +import androidx.navigation.NavGraph.Companion.findStartDestination +import androidx.navigation.NavHostController +import androidx.navigation.compose.currentBackStackEntryAsState +import com.dnsc.plaindo.TopLevelRoute + +@Composable +fun BottomNavigation(navController: NavHostController, topLevelRoutes: List) { + NavigationBar { + val navBackStackEntry = navController.currentBackStackEntryAsState().value + val currentDestination = navBackStackEntry?.destination + + topLevelRoutes.forEach { topLevelRoute -> + NavigationBarItem( + icon = { Icon(topLevelRoute.icon, contentDescription = topLevelRoute.name) }, + label = { Text(topLevelRoute.name) }, + selected = currentDestination?.hierarchy?.any { it.route == topLevelRoute.route } == true, + onClick = { + navController.navigate(topLevelRoute.route) { + popUpTo(navController.graph.findStartDestination().id) { + saveState = true + } + launchSingleTop = true + restoreState = true + } + } + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dnsc/plaindo/ui/shared/TopBar.kt b/app/src/main/java/com/dnsc/plaindo/ui/components/TopBar.kt similarity index 56% rename from app/src/main/java/com/dnsc/plaindo/ui/shared/TopBar.kt rename to app/src/main/java/com/dnsc/plaindo/ui/components/TopBar.kt index 987421d..51a92d3 100644 --- a/app/src/main/java/com/dnsc/plaindo/ui/shared/TopBar.kt +++ b/app/src/main/java/com/dnsc/plaindo/ui/components/TopBar.kt @@ -1,23 +1,30 @@ -package com.dnsc.plaindo.ui.shared +package com.dnsc.plaindo.ui.components import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import androidx.navigation.NavHostController @OptIn(ExperimentalMaterial3Api::class) @Composable -fun TopBar(title: String) { +fun TopBar(title: String, navController: NavHostController) { TopAppBar( title = { Text( text = title, - modifier = Modifier.fillMaxWidth(), + modifier = Modifier.fillMaxWidth().padding(start = 12.dp), textAlign = TextAlign.Left ) + }, + actions = { + TopBarMenu(navController) } ) } \ No newline at end of file diff --git a/app/src/main/java/com/dnsc/plaindo/ui/components/TopBarMenu.kt b/app/src/main/java/com/dnsc/plaindo/ui/components/TopBarMenu.kt new file mode 100644 index 0000000..b723c90 --- /dev/null +++ b/app/src/main/java/com/dnsc/plaindo/ui/components/TopBarMenu.kt @@ -0,0 +1,68 @@ +package com.dnsc.plaindo.ui.components + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.MoreVert +import androidx.compose.material.icons.outlined.Menu +import androidx.compose.material.icons.outlined.Search +import androidx.compose.material.icons.outlined.Settings +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.navigation.NavController +import androidx.navigation.NavGraph.Companion.findStartDestination +import androidx.navigation.NavHostController + +@Composable +fun TopBarMenu(navController: NavHostController) { + var expanded by remember { mutableStateOf(false) } + + Box( + modifier = Modifier + .padding(16.dp) + ) { + IconButton(onClick = { expanded = !expanded }) { + Icon(Icons.Default.MoreVert, contentDescription = "More options") + } + DropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false } + ) { + DropdownMenuItem( + leadingIcon = { Icon(Icons.Outlined.Menu, contentDescription = "Filter", modifier = Modifier.padding(start = 12.dp)) }, + text = { Text("Filter", fontSize = 16.sp, modifier = Modifier.padding(end = 16.dp)) }, + onClick = { /* Do something... */ } + ) + DropdownMenuItem( + leadingIcon = { Icon(Icons.Outlined.Search, contentDescription = "Search", modifier = Modifier.padding(start = 12.dp)) }, + text = { Text("Search", fontSize = 16.sp, modifier = Modifier.padding(end = 16.dp)) }, + onClick = { /* Do something... */ } + ) + DropdownMenuItem( + leadingIcon = { Icon(Icons.Outlined.Settings, contentDescription = "Settings", modifier = Modifier.padding(start = 12.dp)) }, + text = { Text("Settings", fontSize = 16.sp, modifier = Modifier.padding(end = 16.dp)) }, + onClick = { + navController.navigate("settings") { + popUpTo(navController.graph.findStartDestination().id) { + saveState = true + } + launchSingleTop = true + restoreState = true + } + expanded = false + } + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dnsc/plaindo/ui/overview/PlaindoOverviewScreen.kt b/app/src/main/java/com/dnsc/plaindo/ui/overview/PlaindoOverviewScreen.kt index 262e1d5..cf467d2 100644 --- a/app/src/main/java/com/dnsc/plaindo/ui/overview/PlaindoOverviewScreen.kt +++ b/app/src/main/java/com/dnsc/plaindo/ui/overview/PlaindoOverviewScreen.kt @@ -1,24 +1,17 @@ package com.dnsc.plaindo.ui.overview import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import com.dnsc.plaindo.ui.shared.TopBar +import androidx.navigation.NavHostController +import com.dnsc.plaindo.ui.components.TopBar @Composable -fun PlaindoOverviewScreen() { - Scaffold( - topBar = { - TopBar(title = "Overview") - } - ) { innerPadding -> - Column( - modifier = Modifier.padding(innerPadding) - ) { - Text(text = "Overview") - } +fun PlaindoOverviewScreen(navController: NavHostController, innerPadding: PaddingValues) { + Column(modifier = Modifier.padding(innerPadding)) { + Text(text = "Overview") } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/dnsc/plaindo/ui/settings/PlaindoSettingsScreen.kt b/app/src/main/java/com/dnsc/plaindo/ui/settings/PlaindoSettingsScreen.kt index e0cfaaf..693563b 100644 --- a/app/src/main/java/com/dnsc/plaindo/ui/settings/PlaindoSettingsScreen.kt +++ b/app/src/main/java/com/dnsc/plaindo/ui/settings/PlaindoSettingsScreen.kt @@ -1,24 +1,15 @@ package com.dnsc.plaindo.ui.settings import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import com.dnsc.plaindo.ui.shared.TopBar @Composable -fun PlaindoSettingsScreen() { - Scaffold( - topBar = { - TopBar(title = "Settings") - } - ) { innerPadding -> - Column( - modifier = Modifier.padding(innerPadding) - ) { - Text(text = "Settings") - } +fun PlaindoSettingsScreen(innerPadding: PaddingValues) { + Column(modifier = Modifier.padding(innerPadding)) { + Text(text = "Settings") } -} \ No newline at end of file +}