1010package it.unibo.alchemist.boundary.composeui
1111
1212import androidx.compose.foundation.BorderStroke
13- import androidx.compose.foundation.Canvas
1413import androidx.compose.foundation.layout.Arrangement
1514import androidx.compose.foundation.layout.Column
1615import androidx.compose.foundation.layout.fillMaxSize
1716import androidx.compose.foundation.layout.padding
17+ import androidx.compose.material3.AlertDialog
1818import androidx.compose.material3.Button
1919import androidx.compose.material3.CardDefaults
2020import androidx.compose.material3.ExperimentalMaterial3Api
@@ -27,12 +27,11 @@ import androidx.compose.material3.TopAppBarDefaults
2727import androidx.compose.runtime.Composable
2828import androidx.compose.runtime.getValue
2929import androidx.compose.ui.Modifier
30- import androidx.compose.ui.geometry.Offset
3130import androidx.compose.ui.graphics.Color
32- import androidx.compose.ui.graphics.drawscope.DrawScope
3331import androidx.compose.ui.unit.dp
3432import androidx.lifecycle.compose.collectAsStateWithLifecycle
3533import androidx.lifecycle.viewmodel.compose.viewModel
34+ import com.apollographql.apollo3.api.Error
3635import it.unibo.alchemist.boundary.composeui.viewmodels.SimulationStatus
3736import it.unibo.alchemist.boundary.composeui.viewmodels.SimulationStatusViewModel
3837
@@ -41,22 +40,27 @@ import it.unibo.alchemist.boundary.composeui.viewmodels.SimulationStatusViewMode
4140 */
4241@Composable
4342fun app (viewModel : SimulationStatusViewModel = viewModel { SimulationStatusViewModel () }) {
44- val uiState by viewModel.uiState.collectAsStateWithLifecycle()
43+ val simulationStatus by viewModel.simulationStatus.collectAsStateWithLifecycle()
44+ val time by viewModel.time.collectAsStateWithLifecycle()
45+ val errors by viewModel.errors.collectAsStateWithLifecycle()
4546 Scaffold (
46- topBar = { topBar(uiState ) },
47+ topBar = { topBar(simulationStatus ) },
4748 ) { innerPadding ->
4849 Column (
4950 modifier = Modifier .padding(innerPadding).padding(horizontal = 8 .dp, vertical = 16 .dp),
5051 verticalArrangement = Arrangement .spacedBy(16 .dp),
5152 ) {
52- controlButton(uiState , viewModel::play, viewModel::pause)
53+ controlButton(simulationStatus , viewModel::play, viewModel::pause)
5354 OutlinedCard (
55+ modifier = Modifier .fillMaxSize(),
5456 colors = CardDefaults .cardColors(
5557 containerColor = MaterialTheme .colorScheme.surface,
5658 ),
5759 border = BorderStroke (1 .dp, Color .Black ),
5860 ) {
59- Canvas (modifier = Modifier .fillMaxSize()) {
61+ Column (verticalArrangement = Arrangement .spacedBy(4 .dp)) {
62+ Text (" Time: $time " )
63+ errorDialog(viewModel::monitor, errors)
6064 }
6165 }
6266 }
@@ -98,12 +102,22 @@ fun controlButton(status: SimulationStatus, resume: () -> Unit, pause: () -> Uni
98102 }
99103}
100104
101- /* *
102- * Node graphical representation.
103- */
104105@Composable
105- fun node (drawScope : DrawScope , id : Int ) {
106- val x = (drawScope.size.width / 2 ) + (id * 10 )
107- val y = (drawScope.size.height / 2 ) + (id * 10 )
108- drawScope.drawCircle(Color .White , radius = 10f , center = Offset (x, y))
106+ fun errorDialog (dismiss : () -> Unit , errors : List <Error >? ) {
107+ if (! errors.isNullOrEmpty()) {
108+ AlertDialog (
109+ onDismissRequest = dismiss,
110+ title = { Text (" Error" ) },
111+ text = {
112+ for (error in errors) {
113+ Text (error.message)
114+ }
115+ },
116+ confirmButton = {
117+ Button (onClick = dismiss) {
118+ Text (" OK" )
119+ }
120+ },
121+ )
122+ }
109123}
0 commit comments