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.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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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.*
|
||||
|
||||
@@ -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()
|
||||
|
||||
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.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
|
||||
|
||||
Reference in New Issue
Block a user