From f07ef47de0467fa9de7a38f83d9358888d788b94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaroslav=20Dr=C5=BE=C3=ADk?= Date: Sun, 16 Feb 2025 11:26:48 +0100 Subject: [PATCH] Add settings and basic navigation --- composeApp/build.gradle.kts | 7 ++ .../kotlin/org/neutrino/ktans/App.kt | 3 +- .../ktans/model/repository/TermRepo.kt.old | 9 +++ .../kotlin/org/neutrino/ktans/ui/MainView.kt | 9 +++ .../ktans/ui/navigation/AppNavigation.kt | 23 ++++++ .../MainView.kt => ui/screens/MainScreen.kt} | 28 +++----- .../ktans/ui/screens/SettingsScreen.kt | 72 +++++++++++++++++++ .../neutrino/ktans/viewmodel/MainModelView.kt | 6 +- gradle/libs.versions.toml | 6 ++ 9 files changed, 142 insertions(+), 21 deletions(-) create mode 100644 composeApp/src/commonMain/kotlin/org/neutrino/ktans/model/repository/TermRepo.kt.old create mode 100644 composeApp/src/commonMain/kotlin/org/neutrino/ktans/ui/MainView.kt create mode 100644 composeApp/src/commonMain/kotlin/org/neutrino/ktans/ui/navigation/AppNavigation.kt rename composeApp/src/commonMain/kotlin/org/neutrino/ktans/{view/MainView.kt => ui/screens/MainScreen.kt} (95%) create mode 100644 composeApp/src/commonMain/kotlin/org/neutrino/ktans/ui/screens/SettingsScreen.kt diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts index 4be2916..8290077 100644 --- a/composeApp/build.gradle.kts +++ b/composeApp/build.gradle.kts @@ -73,9 +73,11 @@ kotlin { implementation(compose.ui) implementation(compose.components.resources) implementation(compose.components.uiToolingPreview) + implementation(compose.animation) implementation(libs.androidx.lifecycle.livedata.core) implementation(libs.androidx.lifecycle.viewmodel) implementation(libs.androidx.lifecycle.runtime.compose) + implementation(libs.androidx.navigation.compose) implementation(libs.lifecycle.runtime.compose) implementation(libs.lifecycle.viewmodel.compose) implementation(libs.androidx.lifecycle.viewmodel.compose) @@ -88,12 +90,17 @@ kotlin { implementation(libs.composeIcons.fontAwesome) implementation(libs.korau) implementation(libs.flagkit) + implementation(libs.navigation.compose.v280alpha10) + } desktopMain.dependencies { implementation(compose.desktop.currentOs) implementation(libs.kotlinx.coroutines.swing) } } +dependencies { + implementation(libs.androidx.navigation.runtime.android) +} } android { diff --git a/composeApp/src/commonMain/kotlin/org/neutrino/ktans/App.kt b/composeApp/src/commonMain/kotlin/org/neutrino/ktans/App.kt index ac7668f..0bb6c7f 100644 --- a/composeApp/src/commonMain/kotlin/org/neutrino/ktans/App.kt +++ b/composeApp/src/commonMain/kotlin/org/neutrino/ktans/App.kt @@ -34,8 +34,7 @@ import org.koin.compose.koinInject import org.koin.core.parameter.parametersOf import org.neutrino.ktans.di.appModule import org.koin.compose.viewmodel.dsl.viewModelOf -import org.neutrino.ktans.view.MainView - +import org.neutrino.ktans.ui.MainView @Composable @Preview diff --git a/composeApp/src/commonMain/kotlin/org/neutrino/ktans/model/repository/TermRepo.kt.old b/composeApp/src/commonMain/kotlin/org/neutrino/ktans/model/repository/TermRepo.kt.old new file mode 100644 index 0000000..56d54cd --- /dev/null +++ b/composeApp/src/commonMain/kotlin/org/neutrino/ktans/model/repository/TermRepo.kt.old @@ -0,0 +1,9 @@ +package org.neutrino.ktans.model.repository + +import service.TermServiceImpl + +class TermRepository { + private val termService = TermServiceImpl() + + suspend fun getTerms +} diff --git a/composeApp/src/commonMain/kotlin/org/neutrino/ktans/ui/MainView.kt b/composeApp/src/commonMain/kotlin/org/neutrino/ktans/ui/MainView.kt new file mode 100644 index 0000000..83fefdf --- /dev/null +++ b/composeApp/src/commonMain/kotlin/org/neutrino/ktans/ui/MainView.kt @@ -0,0 +1,9 @@ +package org.neutrino.ktans.ui + +import androidx.compose.runtime.Composable +import org.neutrino.ktans.ui.navigation.NavGraph + +@Composable +fun MainView() { + NavGraph() +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/org/neutrino/ktans/ui/navigation/AppNavigation.kt b/composeApp/src/commonMain/kotlin/org/neutrino/ktans/ui/navigation/AppNavigation.kt new file mode 100644 index 0000000..388c799 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/org/neutrino/ktans/ui/navigation/AppNavigation.kt @@ -0,0 +1,23 @@ +package org.neutrino.ktans.ui.navigation + + +import androidx.compose.runtime.Composable +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController +import org.neutrino.ktans.ui.screens.MainScreen +import org.neutrino.ktans.ui.screens.SettingsScreen + +sealed class Screen(val route: String) { + object Home : Screen("home") + object Settings : Screen("settings") +} + +@Composable +fun NavGraph(startDestination: String = Screen.Home.route) { + val navController = rememberNavController() + NavHost(navController = navController, startDestination = startDestination) { + composable(Screen.Home.route) { MainScreen(navController) } + composable(Screen.Settings.route) { SettingsScreen(navController) } + } +} diff --git a/composeApp/src/commonMain/kotlin/org/neutrino/ktans/view/MainView.kt b/composeApp/src/commonMain/kotlin/org/neutrino/ktans/ui/screens/MainScreen.kt similarity index 95% rename from composeApp/src/commonMain/kotlin/org/neutrino/ktans/view/MainView.kt rename to composeApp/src/commonMain/kotlin/org/neutrino/ktans/ui/screens/MainScreen.kt index d621e27..8d8859d 100644 --- a/composeApp/src/commonMain/kotlin/org/neutrino/ktans/view/MainView.kt +++ b/composeApp/src/commonMain/kotlin/org/neutrino/ktans/ui/screens/MainScreen.kt @@ -1,14 +1,10 @@ -package org.neutrino.ktans.view +package org.neutrino.ktans.ui.screens -import androidx.compose.foundation.layout.IntrinsicSize -import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.background import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import androidx.compose.foundation.Image import androidx.compose.foundation.text.selection.SelectionContainer -import androidx.compose.material.Button -import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.* import androidx.compose.ui.Alignment @@ -24,18 +20,13 @@ import androidx.compose.material.icons.filled.Settings import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem import androidx.compose.runtime.Composable -import kotlinx.coroutines.flow.observeOn import org.koin.compose.koinInject import org.neutrino.ktans.viewmodel.MainModelView -import org.neutrino.ktans.viewmodel.Status import androidx.compose.foundation.border import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.lifecycle.viewmodel.compose.viewModel import compose.icons.TablerIcons import compose.icons.tablericons.Table -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.material.icons.filled.Check import compose.icons.FontAwesomeIcons @@ -44,16 +35,14 @@ import compose.icons.tablericons.ArrowBigRight import compose.icons.tablericons.FileText import compose.icons.fontawesomeicons.solid.PlayCircle import compose.icons.tablericons.ArrowBigLeft -import models.Term import models.TermFull -import kotlinx.coroutines.* import service.DatabaseFactory.getTranslationForLanguages -import service.DatabaseFactory.getLanguageForCode import service.DatabaseFactory.getDictionaies import service.DatabaseFactory.getLanguageForId import dev.carlsen.flagkit.FlagKit -import dev.carlsen.flagkit.FlagIcons import models.Dictionary +import androidx.navigation.NavController +import org.neutrino.ktans.ui.navigation.Screen @Composable @@ -138,7 +127,8 @@ fun groupByString(terms: List, direction: Int): MutableList() val query = remember { mutableStateOf("") } var columnViewType = remember { mutableStateOf(false) } var tDirection = remember { mutableStateOf(1) } @@ -220,7 +210,7 @@ fun SearchBarTextField(viewModel: MainModelView) { ) Spacer(modifier = Modifier.padding(2.dp)) IconButton(onClick = { - /* TODO */ + navController.navigate(Screen.Settings.route) }) { Icon( Icons.Filled.Settings, @@ -346,7 +336,9 @@ fun SearchBarTextField(viewModel: MainModelView) { @Composable -fun MainView(viewModel: MainModelView = koinInject()) { - SearchBarTextField(viewModel) +fun MainScreen(navController: NavController) { + + + SearchBarTextField(navController) } diff --git a/composeApp/src/commonMain/kotlin/org/neutrino/ktans/ui/screens/SettingsScreen.kt b/composeApp/src/commonMain/kotlin/org/neutrino/ktans/ui/screens/SettingsScreen.kt new file mode 100644 index 0000000..17f9232 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/org/neutrino/ktans/ui/screens/SettingsScreen.kt @@ -0,0 +1,72 @@ +package org.neutrino.ktans.ui.screens + +import androidx.compose.foundation.layout.IntrinsicSize +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.background +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import androidx.compose.foundation.Image +import androidx.compose.foundation.text.selection.SelectionContainer +import androidx.compose.material.Button +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.material.TextField +import androidx.compose.material.IconButton +import androidx.compose.material.Icon +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Search +import androidx.compose.material.icons.filled.Clear +import androidx.compose.material.icons.filled.Settings +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.runtime.Composable +import kotlinx.coroutines.flow.observeOn +import org.koin.compose.koinInject +import org.neutrino.ktans.viewmodel.MainModelView +import org.neutrino.ktans.viewmodel.Status +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.lifecycle.viewmodel.compose.viewModel +import compose.icons.TablerIcons +import compose.icons.tablericons.Table +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.material.icons.filled.Check +import compose.icons.FontAwesomeIcons +import compose.icons.fontawesomeicons.Solid +import compose.icons.tablericons.ArrowBigRight +import compose.icons.tablericons.FileText +import compose.icons.fontawesomeicons.solid.PlayCircle +import compose.icons.tablericons.ArrowBigLeft +import models.Term +import models.TermFull +import kotlinx.coroutines.* +import service.DatabaseFactory.getTranslationForLanguages +import service.DatabaseFactory.getLanguageForCode +import service.DatabaseFactory.getDictionaies +import service.DatabaseFactory.getLanguageForId +import dev.carlsen.flagkit.FlagKit +import dev.carlsen.flagkit.FlagIcons +import models.Dictionary +import models.Settings +import androidx.navigation.NavController + +@Composable +fun SettingsScreen(navController: NavController) { + val viewModel: MainModelView = koinInject() + Column { + Text("Setting Screen") + Button(onClick = { navController.popBackStack() }) { + Text("Back to Home Screen") + } + } +} + + + diff --git a/composeApp/src/commonMain/kotlin/org/neutrino/ktans/viewmodel/MainModelView.kt b/composeApp/src/commonMain/kotlin/org/neutrino/ktans/viewmodel/MainModelView.kt index bd18e1c..0f40519 100644 --- a/composeApp/src/commonMain/kotlin/org/neutrino/ktans/viewmodel/MainModelView.kt +++ b/composeApp/src/commonMain/kotlin/org/neutrino/ktans/viewmodel/MainModelView.kt @@ -20,7 +20,11 @@ import korlibs.io.file.std.openAsZip import models.Dictionary import models.Translation import service.DatabaseFactory.getDictionaies - +import androidx.navigation.NavHostController +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.currentBackStackEntryAsState +import androidx.navigation.compose.rememberNavController class MainModelView(private val repository: TermServiceImpl): ViewModel() { val terms : StateFlow?> get() = _terms diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 60470d7..6bd350d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -68,7 +68,9 @@ lifecycleViewmodelKtx = "2.6.1" lifecycleViewmodelCompose = "2.8.4" logback = "1.5.12" material = "1.7.6" +navigationCompose = "2.8.0-alpha10" okio = "3.10.2" +androidx-navigation = "2.7.0" psqlVersion = "42.7.4" restAssuredVersion = "5.5.0" runtimeLivedata = "1.7.6" @@ -77,6 +79,7 @@ symbolProcessingApi = "2.1.0-1.0.29" lifecycleLivedataCoreKtx = "2.8.7" composeIcons = "1.1.1" korau = "4.0.10" +navigationRuntimeAndroid = "2.9.0-alpha06" [libraries] @@ -185,13 +188,16 @@ ktor-server-core = { module = "io.ktor:ktor-server-core-jvm", version.ref = "kto ktor-server-netty = { module = "io.ktor:ktor-server-netty-jvm", version.ref = "ktor" } ktor-server-tests = { module = "io.ktor:ktor-server-tests-jvm", version.ref = "ktor" } material = { module = "androidx.compose.material:material", version.ref = "material" } +navigation-compose-v280alpha10 = { module = "org.jetbrains.androidx.navigation:navigation-compose", version.ref = "navigationCompose" } okio = { module = "com.squareup.okio:okio-bom", version.ref = "okio" } postgresql = { module = "org.postgresql:postgresql", version.ref = "psqlVersion" } +androidx-navigation-compose = { module = "org.jetbrains.androidx.navigation:navigation-compose", version.ref = "androidx-navigation" } rest-assured = { module = "io.rest-assured:rest-assured", version.ref = "restAssuredVersion" } symbol-processing-api = { module = "com.google.devtools.ksp:symbol-processing-api", version.ref = "symbolProcessingApi" } koin-bom = { module = "io.insert-koin:koin-bom", version.ref = "koin-bom" } koin-core = { module = "io.insert-koin:koin-core" } androidx-lifecycle-livedata-core-ktx = { group = "androidx.lifecycle", name = "lifecycle-livedata-core-ktx", version.ref = "lifecycleLivedataCoreKtx" } +androidx-navigation-runtime-android = { group = "androidx.navigation", name = "navigation-runtime-android", version.ref = "navigationRuntimeAndroid" } [plugins] androidApplication = { id = "com.android.application", version.ref = "agp" }