Skip to content

Commit b31fbe4

Browse files
committed
OPR, DPR, and CCWM calculations along with awards support in EventDivisionAwardsView
1 parent bc6eaf5 commit b31fbe4

File tree

7 files changed

+288
-182
lines changed

7 files changed

+288
-182
lines changed

app/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,4 +118,5 @@ dependencies {
118118
implementation("me.saket.cascade:cascade:2.3.0")
119119
implementation("me.saket.cascade:cascade-compose:2.3.0")
120120
implementation("io.mhssn:colorpicker:1.0.0")
121+
implementation("org.ejml:ejml-simple:0.38")
121122
}

app/src/main/java/com/sunkensplashstudios/VRCRoboScout/EventDivisionAwardsView.kt

Lines changed: 75 additions & 160 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import androidx.compose.material3.Scaffold
2727
import androidx.compose.material3.Text
2828
import androidx.compose.material3.TopAppBarDefaults
2929
import androidx.compose.runtime.Composable
30+
import androidx.compose.runtime.LaunchedEffect
3031
import androidx.compose.runtime.getValue
3132
import androidx.compose.runtime.mutableStateOf
3233
import androidx.compose.runtime.remember
@@ -43,6 +44,10 @@ import androidx.lifecycle.viewmodel.compose.viewModel
4344
import androidx.navigation.NavController
4445
import com.ramcosta.composedestinations.annotation.Destination
4546
import com.sunkensplashstudios.VRCRoboScout.ui.theme.*
47+
import kotlinx.coroutines.CoroutineScope
48+
import kotlinx.coroutines.Dispatchers
49+
import kotlinx.coroutines.launch
50+
import kotlinx.coroutines.withContext
4651

4752
class EventDivisionAwardsViewModel: ViewModel() {
4853
var event by mutableStateOf(Event())
@@ -52,7 +57,27 @@ class EventDivisionAwardsViewModel: ViewModel() {
5257
@OptIn(ExperimentalMaterial3Api::class)
5358
@Destination
5459
@Composable
55-
fun EventDivisionAwardsView(eventDivisionAwardsViewModel: EventDivisionAwardsViewModel = viewModel(), navController: NavController) {
60+
fun EventDivisionAwardsView(event: Event, division: Division, eventDivisionAwardsViewModel: EventDivisionAwardsViewModel = viewModel(), navController: NavController) {
61+
62+
var loading by remember { mutableStateOf(event.awards[division] == null) }
63+
64+
fun updateAwards() {
65+
if (event.matches[division] == null) {
66+
loading = true
67+
}
68+
CoroutineScope(Dispatchers.Default).launch {
69+
event.fetchAwards(division)
70+
withContext(Dispatchers.Main) {
71+
loading = false
72+
}
73+
}
74+
}
75+
76+
LaunchedEffect(Unit) {
77+
eventDivisionAwardsViewModel.event = event
78+
eventDivisionAwardsViewModel.division = division
79+
}
80+
5681
Scaffold(
5782
topBar = {
5883
CenterAlignedTopAppBar(
@@ -61,7 +86,7 @@ fun EventDivisionAwardsView(eventDivisionAwardsViewModel: EventDivisionAwardsVie
6186
titleContentColor = MaterialTheme.colorScheme.onTopContainer,
6287
),
6388
title = {
64-
Text("Event Info", fontWeight = FontWeight.Bold)
89+
Text("${division.name} Awards", fontWeight = FontWeight.Bold)
6590
},
6691
navigationIcon = {
6792
Icon(
@@ -79,22 +104,29 @@ fun EventDivisionAwardsView(eventDivisionAwardsViewModel: EventDivisionAwardsVie
79104
Column(
80105
modifier = Modifier.fillMaxSize().padding(padding)
81106
) {
82-
Text(
83-
eventDivisionAwardsViewModel.event.name,
84-
modifier = Modifier.padding(20.dp),
85-
textAlign = TextAlign.Center,
86-
fontSize = 20.sp,
87-
)
88-
Column(
89-
modifier = Modifier.verticalScroll(rememberScrollState())
90-
) {
107+
var update by remember { mutableStateOf(true) }
108+
109+
if (update) {
110+
update = false
111+
updateAwards()
112+
}
113+
114+
if (loading) {
115+
LoadingView()
116+
}
117+
else if ((event.awards[division] ?: emptyList()).isEmpty()) {
118+
NoDataView()
119+
}
120+
else {
91121
Column(
92-
modifier = Modifier.fillMaxSize().padding(padding)
122+
modifier = Modifier.verticalScroll(rememberScrollState())
93123
) {
94124
Card(
95125
modifier = Modifier.padding(horizontal = 10.dp, vertical = 2.dp),
96126
colors = CardColors(
97-
containerColor = MaterialTheme.colorScheme.surfaceContainer.copy(alpha = 0.5f),
127+
containerColor = MaterialTheme.colorScheme.surfaceContainer.copy(
128+
alpha = 0.5f
129+
),
98130
disabledContainerColor = Color.Unspecified.copy(alpha = 0.5f),
99131
contentColor = MaterialTheme.colorScheme.onSurface,
100132
disabledContentColor = Color.Unspecified
@@ -104,159 +136,42 @@ fun EventDivisionAwardsView(eventDivisionAwardsViewModel: EventDivisionAwardsVie
104136
verticalArrangement = Arrangement.spacedBy(0.dp),
105137
modifier = Modifier.padding(horizontal = 10.dp)
106138
) {
107-
Row(
108-
horizontalArrangement = Arrangement.SpaceBetween,
109-
verticalAlignment = Alignment.CenterVertically,
110-
modifier = Modifier.fillMaxWidth().padding(vertical = 10.dp)
111-
) {
112-
Text(
113-
"Teams",
114-
)
115-
Spacer(modifier = Modifier.size(10.dp))
116-
Text(
117-
eventDivisionAwardsViewModel.event.teams.size.toString(),
118-
)
119-
}
120-
HorizontalDivider(
121-
thickness = 0.5.dp,
122-
color = MaterialTheme.colorScheme.secondary.copy(alpha = 0.1f),
123-
)
124-
Box {
125-
var expanded by remember { mutableStateOf(false) }
139+
event.awards[division]?.forEach { award ->
126140
Row(
127-
horizontalArrangement = Arrangement.SpaceBetween,
128-
verticalAlignment = Alignment.CenterVertically,
129141
modifier = Modifier.fillMaxWidth().padding(vertical = 10.dp)
130142
) {
131-
Text(
132-
"Divisions",
133-
color = MaterialTheme.colorScheme.button,
134-
modifier = Modifier.clickable {
135-
expanded = !expanded
143+
Column {
144+
Text(award.title)
145+
Column(
146+
verticalArrangement = Arrangement.spacedBy(-5.dp),
147+
) {
148+
award.teamWinners.forEach { teamWinner ->
149+
val team =
150+
event.getTeam(teamWinner.team.id) ?: Team()
151+
Row {
152+
Text(
153+
team.number,
154+
fontSize = 14.sp,
155+
fontWeight = FontWeight.Bold,
156+
color = Color.Gray
157+
)
158+
Spacer(modifier = Modifier.size(5.dp))
159+
Text(
160+
team.name,
161+
fontSize = 14.sp,
162+
color = Color.Gray
163+
)
164+
}
165+
}
136166
}
137-
)
138-
Spacer(modifier = Modifier.size(10.dp))
139-
Text(
140-
eventDivisionAwardsViewModel.event.divisions.size.toString(),
141-
)
142-
}
143-
DropdownMenu(
144-
expanded = expanded,
145-
onDismissRequest = { expanded = false }
146-
) {
147-
eventDivisionAwardsViewModel.event.divisions.forEach { division ->
148-
DropdownMenuItem(
149-
text = {
150-
Text(
151-
division.name
152-
)
153-
},
154-
onClick = { }
155-
)
156167
}
157168
}
158-
}
159-
HorizontalDivider(
160-
thickness = 0.5.dp,
161-
color = MaterialTheme.colorScheme.secondary.copy(alpha = 0.1f),
162-
)
163-
Row(
164-
horizontalArrangement = Arrangement.SpaceBetween,
165-
verticalAlignment = Alignment.CenterVertically,
166-
modifier = Modifier.fillMaxWidth().padding(vertical = 10.dp)
167-
) {
168-
Text(
169-
"City",
170-
)
171-
Spacer(modifier = Modifier.size(10.dp))
172-
Text(
173-
eventDivisionAwardsViewModel.event.location.city ?: "Unknown",
174-
)
175-
}
176-
HorizontalDivider(
177-
thickness = 0.5.dp,
178-
color = MaterialTheme.colorScheme.secondary.copy(alpha = 0.1f),
179-
)
180-
Row(
181-
horizontalArrangement = Arrangement.SpaceBetween,
182-
verticalAlignment = Alignment.CenterVertically,
183-
modifier = Modifier.fillMaxWidth().padding(vertical = 10.dp)
184-
) {
185-
Text(
186-
"Region",
187-
)
188-
Spacer(modifier = Modifier.size(10.dp))
189-
Text(
190-
eventDivisionAwardsViewModel.event.location.region ?: "Unknown",
191-
)
192-
}
193-
HorizontalDivider(
194-
thickness = 0.5.dp,
195-
color = MaterialTheme.colorScheme.secondary.copy(alpha = 0.1f),
196-
)
197-
Row(
198-
horizontalArrangement = Arrangement.SpaceBetween,
199-
verticalAlignment = Alignment.CenterVertically,
200-
modifier = Modifier.fillMaxWidth().padding(vertical = 10.dp)
201-
) {
202-
Text(
203-
"Country",
204-
)
205-
Spacer(modifier = Modifier.size(10.dp))
206-
Text(
207-
eventDivisionAwardsViewModel.event.location.country ?: "Unknown",
208-
)
209-
}
210-
HorizontalDivider(
211-
thickness = 0.5.dp,
212-
color = MaterialTheme.colorScheme.secondary.copy(alpha = 0.1f),
213-
)
214-
Row(
215-
horizontalArrangement = Arrangement.SpaceBetween,
216-
verticalAlignment = Alignment.CenterVertically,
217-
modifier = Modifier.fillMaxWidth().padding(vertical = 10.dp)
218-
) {
219-
Text(
220-
"Date",
221-
)
222-
Spacer(modifier = Modifier.size(10.dp))
223-
Text(
224-
RoboScoutAPI.formatDate(eventDivisionAwardsViewModel.event.startDate)
225-
)
226-
}
227-
HorizontalDivider(
228-
thickness = 0.5.dp,
229-
color = MaterialTheme.colorScheme.secondary.copy(alpha = 0.1f),
230-
)
231-
Row(
232-
horizontalArrangement = Arrangement.SpaceBetween,
233-
verticalAlignment = Alignment.CenterVertically,
234-
modifier = Modifier.fillMaxWidth().padding(vertical = 10.dp)
235-
) {
236-
Text(
237-
"Season",
238-
)
239-
Spacer(modifier = Modifier.size(10.dp))
240-
Text(
241-
eventDivisionAwardsViewModel.event.season.name
242-
)
243-
}
244-
HorizontalDivider(
245-
thickness = 0.5.dp,
246-
color = MaterialTheme.colorScheme.secondary.copy(alpha = 0.1f),
247-
)
248-
Row(
249-
horizontalArrangement = Arrangement.SpaceBetween,
250-
verticalAlignment = Alignment.CenterVertically,
251-
modifier = Modifier.fillMaxWidth().padding(vertical = 10.dp)
252-
) {
253-
Text(
254-
"Developer",
255-
)
256-
Spacer(modifier = Modifier.size(10.dp))
257-
Text(
258-
eventDivisionAwardsViewModel.event.sku
259-
)
169+
if (event.awards[division]?.last() != award) {
170+
HorizontalDivider(
171+
thickness = 0.5.dp,
172+
color = MaterialTheme.colorScheme.secondary.copy(alpha = 0.1f),
173+
)
174+
}
260175
}
261176
}
262177
}

0 commit comments

Comments
 (0)