Move ui variable from viewModel to compose function. Move TopBar to separate file.

This commit is contained in:
2023-01-23 22:12:37 +01:00
parent c54f63736e
commit ca88bd1054
7 changed files with 70 additions and 70 deletions

View File

@@ -16,7 +16,6 @@ import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.core.os.LocaleListCompat
import androidx.lifecycle.lifecycleScope
@@ -36,6 +35,7 @@ import me.zobrist.tichucounter.domain.*
import me.zobrist.tichucounter.repository.GameRepository
import me.zobrist.tichucounter.ui.AppTheme
import me.zobrist.tichucounter.ui.MainViewModel
import me.zobrist.tichucounter.ui.TopBar
import me.zobrist.tichucounter.ui.counter.*
import me.zobrist.tichucounter.ui.history.HistoryList
import me.zobrist.tichucounter.ui.history.HistoryViewModel
@@ -120,6 +120,11 @@ class MainActivity : AppCompatActivity(), ISettingsChangeListener {
fabAction: () -> Unit
) {
var topBarTitle by remember { mutableStateOf("") }
var topBarIcon by remember { mutableStateOf(Icons.Filled.Menu) }
var topBarActions by remember { mutableStateOf(emptyList<TopBarAction>()) }
var topBarNavigationAction by remember { mutableStateOf(NavigationAction {}) }
Scaffold(
floatingActionButton = {
if (showFab) {
@@ -131,10 +136,10 @@ class MainActivity : AppCompatActivity(), ISettingsChangeListener {
},
topBar = {
TopBar(
mainViewModel.topBarTitle,
mainViewModel.topBarIcon,
{ mainViewModel.onNavigateClicked() },
mainViewModel.topBarActions
topBarTitle,
topBarIcon,
{ topBarNavigationAction.action() },
topBarActions
)
}) {
@@ -145,7 +150,7 @@ class MainActivity : AppCompatActivity(), ISettingsChangeListener {
) {
composable("counter") {
Counter(counterViewModel)
mainViewModel.topBarActions = (listOf(
topBarActions = (listOf(
TopBarAction(
Icons.Outlined.Undo,
mainViewModel.isUndoActionActive
@@ -156,9 +161,9 @@ class MainActivity : AppCompatActivity(), ISettingsChangeListener {
) { mainViewModel.redoLastRound() }
))
mainViewModel.topBarIcon = Icons.Outlined.Menu
mainViewModel.topBarTitle = stringResource(R.string.app_name)
mainViewModel.topBarNavigationAction =
topBarIcon = Icons.Outlined.Menu
topBarTitle = stringResource(R.string.app_name)
topBarNavigationAction =
NavigationAction { scope.launch { drawerState.open() } }
}
composable("history") {
@@ -171,7 +176,7 @@ class MainActivity : AppCompatActivity(), ISettingsChangeListener {
}
openDialog = false
}) { navController.navigate("counter") }
mainViewModel.topBarActions = listOf(
topBarActions = listOf(
TopBarAction(
Icons.Outlined.DeleteForever,
true
@@ -179,59 +184,23 @@ class MainActivity : AppCompatActivity(), ISettingsChangeListener {
openDialog = true
}
)
mainViewModel.topBarIcon = Icons.Outlined.Menu
mainViewModel.topBarTitle = stringResource(R.string.menu_history)
mainViewModel.topBarNavigationAction =
topBarIcon = Icons.Outlined.Menu
topBarTitle = stringResource(R.string.menu_history)
topBarNavigationAction =
NavigationAction { scope.launch { drawerState.open() } }
}
composable("settings") {
SettingsView(settingsViewModel)
mainViewModel.topBarActions = emptyList()
mainViewModel.topBarIcon = Icons.Outlined.Menu
mainViewModel.topBarTitle = stringResource(R.string.menu_settings)
mainViewModel.topBarNavigationAction =
topBarActions = emptyList()
topBarIcon = Icons.Outlined.Menu
topBarTitle = stringResource(R.string.menu_settings)
topBarNavigationAction =
NavigationAction { scope.launch { drawerState.open() } }
}
}
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun TopBar(
title: String,
icon: ImageVector,
navigateAction: () -> Unit,
actions: List<TopBarAction>
) {
TopAppBar(
title = {
Text(
title,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
},
navigationIcon = {
IconButton(onClick = { navigateAction() }) {
Icon(
imageVector = icon,
contentDescription = "Localized description"
)
}
},
actions = {
actions.forEach {
IconButton(onClick = { it.action() }, enabled = it.isActive) {
Icon(
imageVector = it.imageVector,
contentDescription = null,
)
}
}
}
)
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable

View File

@@ -2,7 +2,6 @@ package me.zobrist.tichucounter.data.entity
import androidx.room.Entity
import androidx.room.PrimaryKey
import me.zobrist.tichucounter.data.entity.IEntity
import java.util.*
@Entity

View File

@@ -2,7 +2,6 @@ package me.zobrist.tichucounter.data.entity
import androidx.room.Entity
import androidx.room.PrimaryKey
import me.zobrist.tichucounter.data.entity.IEntity
@Entity
data class Round(

View File

@@ -6,7 +6,9 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.take
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import me.zobrist.tichucounter.data.*
import me.zobrist.tichucounter.data.GameDao
import me.zobrist.tichucounter.data.GameWithScores
import me.zobrist.tichucounter.data.RoundDao
import me.zobrist.tichucounter.data.entity.Game
import me.zobrist.tichucounter.data.entity.Round
import java.util.*

View File

@@ -1,7 +1,5 @@
package me.zobrist.tichucounter.ui
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Menu
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf
@@ -11,8 +9,6 @@ import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import me.zobrist.tichucounter.data.entity.Round
import me.zobrist.tichucounter.domain.NavigationAction
import me.zobrist.tichucounter.domain.TopBarAction
import me.zobrist.tichucounter.repository.GameRepository
import javax.inject.Inject
@@ -24,11 +20,7 @@ class MainViewModel @Inject constructor(
private var redoRounds = mutableStateListOf<Round>()
private var expectedRoundCount = 0
var topBarTitle by mutableStateOf("")
var topBarActions by mutableStateOf(emptyList<TopBarAction>())
var topBarIcon by mutableStateOf(Icons.Filled.Menu)
var isUndoActionActive by mutableStateOf(false)
var topBarNavigationAction by mutableStateOf(NavigationAction {})
val isRedoActionActive: Boolean
get() = redoRounds.isNotEmpty()
@@ -51,11 +43,6 @@ class MainViewModel @Inject constructor(
}
}
fun onNavigateClicked() {
topBarNavigationAction.action()
}
fun undoLastRound() {
viewModelScope.launch {
val round = gameRepository.getLastRound()

View File

@@ -0,0 +1,44 @@
package me.zobrist.tichucounter.ui
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.text.style.TextOverflow
import me.zobrist.tichucounter.domain.TopBarAction
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TopBar(
title: String,
icon: ImageVector,
navigateAction: () -> Unit,
actions: List<TopBarAction>
) {
TopAppBar(
title = {
Text(
title,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
},
navigationIcon = {
IconButton(onClick = { navigateAction() }) {
Icon(
imageVector = icon,
contentDescription = "Localized description"
)
}
},
actions = {
actions.forEach {
IconButton(onClick = { it.action() }, enabled = it.isActive) {
Icon(
imageVector = it.imageVector,
contentDescription = null,
)
}
}
}
)
}

View File

@@ -15,8 +15,8 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import me.zobrist.tichucounter.R
import me.zobrist.tichucounter.data.entity.Game
import me.zobrist.tichucounter.data.GameWithScores
import me.zobrist.tichucounter.data.entity.Game
import me.zobrist.tichucounter.data.entity.Round
import me.zobrist.tichucounter.domain.getTotalPoints
import java.text.DateFormat