@@ -4,14 +4,17 @@ import androidx.compose.foundation.clickable
4
4
import androidx.compose.foundation.layout.Arrangement
5
5
import androidx.compose.foundation.layout.Column
6
6
import androidx.compose.foundation.layout.Row
7
+ import androidx.compose.foundation.layout.Spacer
7
8
import androidx.compose.foundation.layout.fillMaxSize
8
9
import androidx.compose.foundation.layout.fillMaxWidth
9
10
import androidx.compose.foundation.layout.padding
11
+ import androidx.compose.foundation.layout.size
10
12
import androidx.compose.foundation.layout.width
11
13
import androidx.compose.foundation.rememberScrollState
12
14
import androidx.compose.foundation.verticalScroll
13
15
import androidx.compose.material.icons.Icons
14
16
import androidx.compose.material.icons.automirrored.filled.ArrowBackIos
17
+ import androidx.compose.material.icons.automirrored.filled.ArrowForwardIos
15
18
import androidx.compose.material3.Card
16
19
import androidx.compose.material3.CardColors
17
20
import androidx.compose.material3.CenterAlignedTopAppBar
@@ -35,43 +38,68 @@ import androidx.compose.ui.text.font.FontWeight
35
38
import androidx.compose.ui.text.style.TextOverflow
36
39
import androidx.compose.ui.unit.dp
37
40
import androidx.compose.ui.unit.sp
41
+ import androidx.lifecycle.SavedStateHandle
38
42
import androidx.lifecycle.ViewModel
39
43
import androidx.lifecycle.viewmodel.compose.viewModel
40
44
import androidx.navigation.NavController
41
45
import com.ramcosta.composedestinations.annotation.Destination
46
+ import com.ramcosta.composedestinations.navigation.navigate
47
+ import com.sunkensplashstudios.VRCRoboScout.destinations.EventTeamMatchesViewDestination
42
48
import com.sunkensplashstudios.VRCRoboScout.ui.theme.*
43
49
44
50
import kotlinx.coroutines.CoroutineScope
45
51
import kotlinx.coroutines.Dispatchers
46
52
import kotlinx.coroutines.launch
47
53
import kotlinx.coroutines.withContext
48
54
55
+ // class EventDivisionRankingsViewModel(private val state: SavedStateHandle): ViewModel() {
49
56
class EventDivisionRankingsViewModel : ViewModel () {
50
57
var event by mutableStateOf(Event ())
51
58
var division by mutableStateOf(Division ())
59
+ var rankings by mutableStateOf(listOf<TeamRanking >())
52
60
var teamPerformanceRatings by mutableStateOf(mapOf<Int , TeamPerformanceRatings >())
61
+ /* var event: Event
62
+ get() = state.get<Event>("event") ?: Event()
63
+ set(value) = state.set("event", value)
64
+
65
+ var division: Division
66
+ get() = state.get<Division>("division") ?: Division()
67
+ set(value) = state.set("division", value)
68
+
69
+ var rankings: List<TeamRanking>
70
+ get() = state.get<List<TeamRanking>>("rankings") ?: listOf()
71
+ set(value) = state.set("rankings", value)
72
+
73
+ var teamPerformanceRatings: Map<Int, TeamPerformanceRatings>
74
+ get() = state.get<Map<Int, TeamPerformanceRatings>>("teamPerformanceRatings") ?: mapOf()
75
+ set(value) = state.set("teamPerformanceRatings", value)*/
53
76
}
54
77
55
78
@OptIn(ExperimentalMaterial3Api ::class )
56
79
@Destination
57
80
@Composable
58
81
fun EventDivisionRankingsView (event : Event , division : Division , eventDivisionRankingsViewModel : EventDivisionRankingsViewModel = viewModel(), navController : NavController ) {
59
82
60
- var loading by remember { mutableStateOf(event .rankings[division] == null || event .teamPerformanceRatings[division] == null ) }
83
+ var loading by remember { mutableStateOf(eventDivisionRankingsViewModel .rankings.isEmpty() || eventDivisionRankingsViewModel .teamPerformanceRatings.isEmpty() ) }
61
84
62
85
fun updateRankings () {
63
- if (eventDivisionRankingsViewModel.event.rankings[division] == null || eventDivisionRankingsViewModel.event.teamPerformanceRatings[division] == null ) {
64
- loading = true
65
- }
66
86
CoroutineScope (Dispatchers .Default ).launch {
67
87
try {
88
+ println (" updating rankings: $event , $division " )
89
+ /* println("old rankings: ${event.rankings[division]}")
90
+ println("old rankings event model: ${eventDivisionRankingsViewModel.event.rankings}")
91
+ println("old rankings model: ${eventDivisionRankingsViewModel.rankings}")
92
+ println("old ratings: ${event.teamPerformanceRatings[division]}")
93
+ println("old ratings model: ${eventDivisionRankingsViewModel.teamPerformanceRatings}")*/
94
+ event.fetchRankings(division)
95
+ eventDivisionRankingsViewModel.rankings = (event.rankings[division] ? : emptyList()).toMutableList()
68
96
event.calculateTeamPerformanceRatings(division)
69
- eventDivisionRankingsViewModel.teamPerformanceRatings = eventDivisionRankingsViewModel.event.teamPerformanceRatings[division] ? : emptyMap()
70
- eventDivisionRankingsViewModel.event.rankings[division] = (eventDivisionRankingsViewModel.event.rankings[division] ? : emptyList()).toMutableList()
97
+ eventDivisionRankingsViewModel.teamPerformanceRatings = event.teamPerformanceRatings[division] ? : emptyMap()
98
+ /* println("new rankings: ${eventDivisionRankingsViewModel.rankings}")
99
+ println("new ratings: ${eventDivisionRankingsViewModel.teamPerformanceRatings}")*/
71
100
} catch (e: Exception ) {
72
101
e.printStackTrace()
73
102
}
74
- // event.fetchRankings(division)
75
103
withContext(Dispatchers .Main ) {
76
104
loading = false
77
105
}
@@ -112,7 +140,7 @@ fun EventDivisionRankingsView(event: Event, division: Division, eventDivisionRan
112
140
.fillMaxSize()
113
141
) {
114
142
var update by remember { mutableStateOf(true ) }
115
- println (" div: ${eventDivisionRankingsViewModel.event. rankings[division] } " )
143
+ println (" div: ${eventDivisionRankingsViewModel.rankings} " )
116
144
println (" loading: $loading " )
117
145
println (" update: $update " )
118
146
@@ -123,11 +151,14 @@ fun EventDivisionRankingsView(event: Event, division: Division, eventDivisionRan
123
151
124
152
if (loading) {
125
153
LoadingView ()
154
+ println (" loading" )
126
155
}
127
- else if (( eventDivisionRankingsViewModel.event. rankings[division] ? : emptyList()) .isEmpty()) {
156
+ else if (eventDivisionRankingsViewModel.rankings.isEmpty()) {
128
157
NoDataView ()
158
+ println (" no data" )
129
159
}
130
160
else {
161
+ println (" data" )
131
162
Column (
132
163
modifier = Modifier .verticalScroll(rememberScrollState())
133
164
) {
@@ -144,12 +175,17 @@ fun EventDivisionRankingsView(event: Event, division: Division, eventDivisionRan
144
175
verticalArrangement = Arrangement .spacedBy(0 .dp),
145
176
modifier = Modifier .padding(horizontal = 10 .dp)
146
177
) {
147
- eventDivisionRankingsViewModel.event. rankings[division]? .reversed()? .forEach { ranking ->
148
- val performanceRatings = eventDivisionRankingsViewModel.teamPerformanceRatings.get( ranking.team.id)
178
+ eventDivisionRankingsViewModel.rankings.reversed().forEach { ranking ->
179
+ val performanceRatings = eventDivisionRankingsViewModel.teamPerformanceRatings[ ranking.team.id]
149
180
Row (
150
181
modifier = Modifier
151
182
.padding(vertical = 10 .dp)
152
- .fillMaxWidth(),
183
+ .fillMaxWidth()
184
+ .clickable {
185
+ navController.navigate(
186
+ EventTeamMatchesViewDestination (event, eventDivisionRankingsViewModel.event.getTeam(ranking.team.id) ? : Team ())
187
+ )
188
+ },
153
189
verticalAlignment = Alignment .CenterVertically
154
190
) {
155
191
Column {
@@ -184,6 +220,7 @@ fun EventDivisionRankingsView(event: Event, division: Division, eventDivisionRan
184
220
modifier = Modifier .fillMaxWidth(),
185
221
horizontalArrangement = Arrangement .SpaceEvenly
186
222
) {
223
+ Spacer (modifier = Modifier .weight(1.0f ))
187
224
Column (
188
225
verticalArrangement = Arrangement .spacedBy((- 10 ).dp)
189
226
) {
@@ -203,6 +240,7 @@ fun EventDivisionRankingsView(event: Event, division: Division, eventDivisionRan
203
240
color = Color .Gray
204
241
)
205
242
}
243
+ Spacer (modifier = Modifier .weight(1.0f ))
206
244
Column (
207
245
verticalArrangement = Arrangement .spacedBy((- 10 ).dp)
208
246
) {
@@ -222,6 +260,7 @@ fun EventDivisionRankingsView(event: Event, division: Division, eventDivisionRan
222
260
color = Color .Gray
223
261
)
224
262
}
263
+ Spacer (modifier = Modifier .weight(1.0f ))
225
264
Column (
226
265
verticalArrangement = Arrangement .spacedBy((- 10 ).dp)
227
266
) {
@@ -241,8 +280,22 @@ fun EventDivisionRankingsView(event: Event, division: Division, eventDivisionRan
241
280
color = Color .Gray
242
281
)
243
282
}
283
+ Spacer (modifier = Modifier .weight(1.0f ))
284
+ Icon (
285
+ Icons .AutoMirrored .Filled .ArrowForwardIos ,
286
+ modifier = Modifier .size(15 .dp),
287
+ tint = MaterialTheme .colorScheme.onSurface.copy(alpha = 0.3f ),
288
+ contentDescription = " Show Match List"
289
+ )
244
290
}
245
291
}
292
+ Spacer (modifier = Modifier .weight(1.0f ))
293
+ Icon (
294
+ Icons .AutoMirrored .Filled .ArrowForwardIos ,
295
+ modifier = Modifier .size(15 .dp),
296
+ tint = MaterialTheme .colorScheme.onSurface.copy(alpha = 0.3f ),
297
+ contentDescription = " Show ${eventDivisionRankingsViewModel.event.getTeam(ranking.team.id)?.number} Match List"
298
+ )
246
299
}
247
300
}
248
301
}
0 commit comments