Compare commits

...

2 Commits

Author SHA1 Message Date
f07ef47de0 Add settings and basic navigation 2025-02-16 11:26:48 +01:00
e02c600ccd Add check icon 2025-02-15 10:20:00 +01:00
9 changed files with 160 additions and 30 deletions

View File

@@ -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 {

View File

@@ -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

View File

@@ -0,0 +1,9 @@
package org.neutrino.ktans.model.repository
import service.TermServiceImpl
class TermRepository {
private val termService = TermServiceImpl()
suspend fun getTerms
}

View File

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

View File

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

View File

@@ -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,35 +20,29 @@ 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 androidx.navigation.NavController
import org.neutrino.ktans.ui.navigation.Screen
@Composable
@@ -99,7 +89,11 @@ fun LangugeDropdown(onChangeClick: (dict: Dictionary) -> Unit,dictionary: Dictio
)
},
text = { Text(l.name) },
onClick = { onChangeClick(dict); expanded = false }
onClick = { onChangeClick(dict); expanded = false },
trailingIcon = {
if (dictionary.id == id)
Icon(Icons.Default.Check,contentDescription = "Selected")
}
)
}
}
@@ -133,7 +127,8 @@ fun groupByString(terms: List<TermFull>, direction: Int): MutableList<MutableLis
}
@Composable
fun SearchBarTextField(viewModel: MainModelView) {
fun SearchBarTextField(navController: NavController) {
val viewModel: MainModelView = koinInject<MainModelView>()
val query = remember { mutableStateOf("") }
var columnViewType = remember { mutableStateOf(false) }
var tDirection = remember { mutableStateOf(1) }
@@ -183,13 +178,13 @@ fun SearchBarTextField(viewModel: MainModelView) {
Icon(
TablerIcons.Table,
contentDescription = "Table View",
modifier = Modifier.size(width = 50.dp, height = 50.dp)
modifier = Modifier.size(width = 30.dp, height = 30.dp)
)
else
Icon(
TablerIcons.FileText,
contentDescription = "List View",
modifier = Modifier.size(width = 50.dp, height = 50.dp)
modifier = Modifier.size(width = 30.dp, height = 30.dp)
)
}
Spacer(modifier = Modifier.padding(2.dp))
@@ -200,13 +195,13 @@ fun SearchBarTextField(viewModel: MainModelView) {
Icon(
TablerIcons.ArrowBigRight,
contentDescription = "Forward",
modifier = Modifier.size(width = 50.dp, height = 50.dp)
modifier = Modifier.size(width = 30.dp, height = 30.dp)
)
else
Icon(
TablerIcons.ArrowBigLeft,
contentDescription = "Resverse",
modifier = Modifier.size(width = 50.dp, height = 50.dp)
modifier = Modifier.size(width = 30.dp, height = 30.dp)
)
}
LangugeDropdown(
@@ -214,11 +209,15 @@ fun SearchBarTextField(viewModel: MainModelView) {
dictionary = dict
)
Spacer(modifier = Modifier.padding(2.dp))
Icon(
Icons.Filled.Settings,
contentDescription = "Table View",
modifier = Modifier.size(width = 50.dp, height = 50.dp)
)
IconButton(onClick = {
navController.navigate(Screen.Settings.route)
}) {
Icon(
Icons.Filled.Settings,
contentDescription = "Settings",
modifier = Modifier.size(width = 30.dp, height = 30.dp)
)}
//Spacer(modifier = Modifier.fillMaxWidth())
}
}
@@ -337,7 +336,9 @@ fun SearchBarTextField(viewModel: MainModelView) {
@Composable
fun MainView(viewModel: MainModelView = koinInject<MainModelView>()) {
SearchBarTextField(viewModel)
fun MainScreen(navController: NavController) {
SearchBarTextField(navController)
}

View File

@@ -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<MainModelView>()
Column {
Text("Setting Screen")
Button(onClick = { navController.popBackStack() }) {
Text("Back to Home Screen")
}
}
}

View File

@@ -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<List<TermFull>?> get() = _terms

View File

@@ -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" }