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.Modifier
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.core.os.LocaleListCompat import androidx.core.os.LocaleListCompat
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
@@ -36,6 +35,7 @@ import me.zobrist.tichucounter.domain.*
import me.zobrist.tichucounter.repository.GameRepository import me.zobrist.tichucounter.repository.GameRepository
import me.zobrist.tichucounter.ui.AppTheme import me.zobrist.tichucounter.ui.AppTheme
import me.zobrist.tichucounter.ui.MainViewModel import me.zobrist.tichucounter.ui.MainViewModel
import me.zobrist.tichucounter.ui.TopBar
import me.zobrist.tichucounter.ui.counter.* import me.zobrist.tichucounter.ui.counter.*
import me.zobrist.tichucounter.ui.history.HistoryList import me.zobrist.tichucounter.ui.history.HistoryList
import me.zobrist.tichucounter.ui.history.HistoryViewModel import me.zobrist.tichucounter.ui.history.HistoryViewModel
@@ -120,6 +120,11 @@ class MainActivity : AppCompatActivity(), ISettingsChangeListener {
fabAction: () -> Unit 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( Scaffold(
floatingActionButton = { floatingActionButton = {
if (showFab) { if (showFab) {
@@ -131,10 +136,10 @@ class MainActivity : AppCompatActivity(), ISettingsChangeListener {
}, },
topBar = { topBar = {
TopBar( TopBar(
mainViewModel.topBarTitle, topBarTitle,
mainViewModel.topBarIcon, topBarIcon,
{ mainViewModel.onNavigateClicked() }, { topBarNavigationAction.action() },
mainViewModel.topBarActions topBarActions
) )
}) { }) {
@@ -145,7 +150,7 @@ class MainActivity : AppCompatActivity(), ISettingsChangeListener {
) { ) {
composable("counter") { composable("counter") {
Counter(counterViewModel) Counter(counterViewModel)
mainViewModel.topBarActions = (listOf( topBarActions = (listOf(
TopBarAction( TopBarAction(
Icons.Outlined.Undo, Icons.Outlined.Undo,
mainViewModel.isUndoActionActive mainViewModel.isUndoActionActive
@@ -156,9 +161,9 @@ class MainActivity : AppCompatActivity(), ISettingsChangeListener {
) { mainViewModel.redoLastRound() } ) { mainViewModel.redoLastRound() }
)) ))
mainViewModel.topBarIcon = Icons.Outlined.Menu topBarIcon = Icons.Outlined.Menu
mainViewModel.topBarTitle = stringResource(R.string.app_name) topBarTitle = stringResource(R.string.app_name)
mainViewModel.topBarNavigationAction = topBarNavigationAction =
NavigationAction { scope.launch { drawerState.open() } } NavigationAction { scope.launch { drawerState.open() } }
} }
composable("history") { composable("history") {
@@ -171,7 +176,7 @@ class MainActivity : AppCompatActivity(), ISettingsChangeListener {
} }
openDialog = false openDialog = false
}) { navController.navigate("counter") } }) { navController.navigate("counter") }
mainViewModel.topBarActions = listOf( topBarActions = listOf(
TopBarAction( TopBarAction(
Icons.Outlined.DeleteForever, Icons.Outlined.DeleteForever,
true true
@@ -179,59 +184,23 @@ class MainActivity : AppCompatActivity(), ISettingsChangeListener {
openDialog = true openDialog = true
} }
) )
mainViewModel.topBarIcon = Icons.Outlined.Menu topBarIcon = Icons.Outlined.Menu
mainViewModel.topBarTitle = stringResource(R.string.menu_history) topBarTitle = stringResource(R.string.menu_history)
mainViewModel.topBarNavigationAction = topBarNavigationAction =
NavigationAction { scope.launch { drawerState.open() } } NavigationAction { scope.launch { drawerState.open() } }
} }
composable("settings") { composable("settings") {
SettingsView(settingsViewModel) SettingsView(settingsViewModel)
mainViewModel.topBarActions = emptyList() topBarActions = emptyList()
mainViewModel.topBarIcon = Icons.Outlined.Menu topBarIcon = Icons.Outlined.Menu
mainViewModel.topBarTitle = stringResource(R.string.menu_settings) topBarTitle = stringResource(R.string.menu_settings)
mainViewModel.topBarNavigationAction = topBarNavigationAction =
NavigationAction { scope.launch { drawerState.open() } } 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) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable

View File

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

View File

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

View File

@@ -6,7 +6,9 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.take import kotlinx.coroutines.flow.take
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext 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.Game
import me.zobrist.tichucounter.data.entity.Round import me.zobrist.tichucounter.data.entity.Round
import java.util.* import java.util.*

View File

@@ -1,7 +1,5 @@
package me.zobrist.tichucounter.ui 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.getValue
import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
@@ -11,8 +9,6 @@ import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import me.zobrist.tichucounter.data.entity.Round 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 me.zobrist.tichucounter.repository.GameRepository
import javax.inject.Inject import javax.inject.Inject
@@ -24,11 +20,7 @@ class MainViewModel @Inject constructor(
private var redoRounds = mutableStateListOf<Round>() private var redoRounds = mutableStateListOf<Round>()
private var expectedRoundCount = 0 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 isUndoActionActive by mutableStateOf(false)
var topBarNavigationAction by mutableStateOf(NavigationAction {})
val isRedoActionActive: Boolean val isRedoActionActive: Boolean
get() = redoRounds.isNotEmpty() get() = redoRounds.isNotEmpty()
@@ -51,11 +43,6 @@ class MainViewModel @Inject constructor(
} }
} }
fun onNavigateClicked() {
topBarNavigationAction.action()
}
fun undoLastRound() { fun undoLastRound() {
viewModelScope.launch { viewModelScope.launch {
val round = gameRepository.getLastRound() 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.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import me.zobrist.tichucounter.R import me.zobrist.tichucounter.R
import me.zobrist.tichucounter.data.entity.Game
import me.zobrist.tichucounter.data.GameWithScores import me.zobrist.tichucounter.data.GameWithScores
import me.zobrist.tichucounter.data.entity.Game
import me.zobrist.tichucounter.data.entity.Round import me.zobrist.tichucounter.data.entity.Round
import me.zobrist.tichucounter.domain.getTotalPoints import me.zobrist.tichucounter.domain.getTotalPoints
import java.text.DateFormat import java.text.DateFormat