Move ui variable from viewModel to compose function. Move TopBar to separate file.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
44
app/src/main/java/me/zobrist/tichucounter/ui/TopBar.kt
Normal file
44
app/src/main/java/me/zobrist/tichucounter/ui/TopBar.kt
Normal 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,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user