Skip to content

Commit a606d38

Browse files
committed
Implement match lists in EventDivisionMatchesView
1 parent c5037c4 commit a606d38

File tree

7 files changed

+239
-210
lines changed

7 files changed

+239
-210
lines changed

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ class EventDivisionAwardsViewModel: ViewModel() {
5050
}
5151

5252
@OptIn(ExperimentalMaterial3Api::class)
53-
@EventDivisionNavGraph
5453
@Destination
5554
@Composable
5655
fun EventDivisionAwardsView(eventDivisionAwardsViewModel: EventDivisionAwardsViewModel = viewModel(), navController: NavController) {

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

Lines changed: 121 additions & 168 deletions
Large diffs are not rendered by default.

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ class EventDivisionRankingsViewModel: ViewModel() {
5252
}
5353

5454
@OptIn(ExperimentalMaterial3Api::class)
55-
@EventDivisionNavGraph
5655
@Destination
5756
@Composable
5857
fun EventDivisionRankingsView(event: Event, division: Division, eventDivisionRankingsViewModel: EventDivisionRankingsViewModel = viewModel(), navController: NavController) {

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

Lines changed: 32 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,13 @@ import androidx.navigation.NavController
3232
import androidx.navigation.compose.currentBackStackEntryAsState
3333
import com.google.accompanist.navigation.material.ExperimentalMaterialNavigationApi
3434
import com.ramcosta.composedestinations.annotation.Destination
35-
import com.ramcosta.composedestinations.annotation.RootNavGraph
36-
import com.ramcosta.composedestinations.annotation.NavGraph
3735
import com.sunkensplashstudios.VRCRoboScout.destinations.*
38-
import com.sunkensplashstudios.VRCRoboScout.ui.theme.topContainer
3936

4037
class EventDivisionViewModel: ViewModel() {
4138
var event by mutableStateOf(Event())
4239
var division by mutableStateOf(Division())
4340
}
4441

45-
@RootNavGraph
46-
@NavGraph
47-
annotation class EventDivisionNavGraph(
48-
val start: Boolean = false
49-
)
50-
5142
@Composable
5243
fun DivisionTabView(tabBarItems: List<TabBarItem>, navController: NavController, selectedTabIndex: Int, onSelectedTabIndexChange: (Int) -> Unit) {
5344
val localContext = LocalContext.current
@@ -114,8 +105,8 @@ fun EventDivisionView(eventDivisionViewModel: EventDivisionViewModel = viewModel
114105
)
115106

116107
// setting up the individual tabs
117-
val teamsTab = TabBarItem(title = "Teams", direction = EventTeamsViewDestination(eventDivisionViewModel.event), selectedIcon = Icons.Filled.People, unselectedIcon = Icons.Outlined.PeopleOutline)
118-
val matchListTab = TabBarItem(title = "Match List", direction = EventDivisionMatchesViewDestination(), selectedIcon = Icons.Filled.AccessTimeFilled, unselectedIcon = Icons.Outlined.AccessTime)
108+
val teamsTab = TabBarItem(title = "Teams", direction = EventTeamsViewDestination(eventDivisionViewModel.event, eventDivisionViewModel.division), selectedIcon = Icons.Filled.People, unselectedIcon = Icons.Outlined.PeopleOutline)
109+
val matchListTab = TabBarItem(title = "Match List", direction = EventDivisionMatchesViewDestination(eventDivisionViewModel.event, eventDivisionViewModel.division), selectedIcon = Icons.Filled.AccessTimeFilled, unselectedIcon = Icons.Outlined.AccessTime)
119110
val rankingsTab = TabBarItem(title = "Rankings", direction = EventDivisionRankingsViewDestination(eventDivisionViewModel.event, eventDivisionViewModel.division), selectedIcon = Icons.Filled.FormatListNumbered, unselectedIcon = Icons.Filled.FormatListNumbered)
120111
val awardsTab = TabBarItem(title = "Awards", direction = EventDivisionAwardsViewDestination(), selectedIcon = Icons.Filled.EmojiEvents, unselectedIcon = Icons.Outlined.EmojiEvents)
121112

@@ -163,32 +154,36 @@ fun EventDivisionView(eventDivisionViewModel: EventDivisionViewModel = viewModel
163154
modifier = Modifier.fillMaxSize().padding(padding)
164155
) {
165156
// Replace DestinationsNavHost below with if statement to check if the tab is selected
166-
if (selectedTabIndex == 0) {
167-
EventTeamsView(
168-
navController = navController,
169-
event = event,
170-
division = division
171-
)
172-
}
173-
else if (selectedTabIndex == 1) {
174-
EventDivisionMatchesView(
175-
navController = navController,
176-
eventDivisionMatchesViewModel = divisionViewModels["event_division_matches_view"] as EventDivisionMatchesViewModel
177-
)
178-
}
179-
else if (selectedTabIndex == 2) {
180-
EventDivisionRankingsView(
181-
event = event,
182-
division = division,
183-
navController = navController,
184-
eventDivisionRankingsViewModel = divisionViewModels["event_division_rankings_view"] as EventDivisionRankingsViewModel
185-
)
186-
}
187-
else if (selectedTabIndex == 3) {
188-
EventDivisionAwardsView(
189-
navController = navController,
190-
eventDivisionAwardsViewModel = divisionViewModels["event_division_awards_view"] as EventDivisionAwardsViewModel
191-
)
157+
when (selectedTabIndex) {
158+
0 -> {
159+
EventTeamsView(
160+
navController = navController,
161+
event = event,
162+
division = division
163+
)
164+
}
165+
1 -> {
166+
EventDivisionMatchesView(
167+
navController = navController,
168+
event = event,
169+
division = division,
170+
eventDivisionMatchesViewModel = divisionViewModels["event_division_matches_view"] as EventDivisionMatchesViewModel
171+
)
172+
}
173+
2 -> {
174+
EventDivisionRankingsView(
175+
event = event,
176+
division = division,
177+
navController = navController,
178+
eventDivisionRankingsViewModel = divisionViewModels["event_division_rankings_view"] as EventDivisionRankingsViewModel
179+
)
180+
}
181+
3 -> {
182+
EventDivisionAwardsView(
183+
navController = navController,
184+
eventDivisionAwardsViewModel = divisionViewModels["event_division_awards_view"] as EventDivisionAwardsViewModel
185+
)
186+
}
192187
}
193188
}
194189
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ import kotlinx.coroutines.launch
4444
import kotlinx.coroutines.withContext
4545

4646
@OptIn(ExperimentalMaterial3Api::class)
47-
@EventDivisionNavGraph(start = true)
4847
@Destination
4948
@Composable
5049
fun EventTeamsView(navController: NavController, event: Event? = null, division: Division? = null) {

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

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,11 +327,82 @@ class Season {
327327
var name: String = ""
328328
}
329329

330+
enum class AllianceColor {
331+
RED, BLUE
332+
}
333+
334+
enum class Round(val value: Int) {
335+
NONE(0), PRACTICE(1), QUALIFICATION(2), R128(3), R64(4), R32(5), R16(6), QUARTERFINALS(7), SEMIFINALS(8), FINALS(9)
336+
}
337+
338+
@Serializable
339+
data class AllianceMember(
340+
val team: ShortTeam,
341+
val sitting: Boolean
342+
)
343+
344+
@Serializable
345+
data class MatchAlliance(
346+
val color: String,
347+
@kotlinx.serialization.Transient val allianceColor: AllianceColor = if (color == "red") AllianceColor.RED else AllianceColor.BLUE,
348+
val score: Int,
349+
@SerialName("teams") val members: List<AllianceMember>
350+
)
351+
352+
@Serializable
353+
data class ShortEvent(
354+
val id: Int,
355+
val name: String,
356+
val code: String
357+
)
358+
359+
@Serializable
360+
data class Match(
361+
val id: Int,
362+
val event: ShortEvent,
363+
val division: Division,
364+
val round: Int,
365+
val instance: Int,
366+
@SerialName("matchnum") val matchNum: Int,
367+
val scheduled: String?,
368+
@kotlinx.serialization.Transient val scheduledDate: Date? = RoboScoutAPI.roboteventsDate(scheduled ?: "", true),
369+
val started: String?,
370+
@kotlinx.serialization.Transient val startedDate: Date? = RoboScoutAPI.roboteventsDate(started ?: "", true),
371+
val field: String?,
372+
val session: Int,
373+
val scored: Boolean,
374+
val name: String,
375+
@kotlinx.serialization.Transient val shortName: String = name.replace("Qualifier", "Q").replace("Practice", "P").replace("Final", "F").replace("#", ""),
376+
val alliances: List<MatchAlliance>,
377+
@kotlinx.serialization.Transient val redAlliance: MatchAlliance = alliances.find { it.color == "red" }!!,
378+
@kotlinx.serialization.Transient val blueAlliance: MatchAlliance = alliances.find { it.color == "blue" }!!,
379+
@kotlinx.serialization.Transient val redScore: Int = redAlliance.score,
380+
@kotlinx.serialization.Transient val blueScore: Int = blueAlliance.score
381+
) {
382+
383+
fun allianceFor(team: Team): AllianceColor? {
384+
redAlliance.members.find { it.team.id == team.id }?.let { return AllianceColor.RED }
385+
blueAlliance.members.find { it.team.id == team.id }?.let { return AllianceColor.BLUE }
386+
return null
387+
}
388+
389+
fun winningAlliance(): AllianceColor? {
390+
return when {
391+
redScore > blueScore -> AllianceColor.RED
392+
blueScore > redScore -> AllianceColor.BLUE
393+
else -> null
394+
}
395+
}
396+
397+
fun completed(): Boolean {
398+
return !(started == null || (startedDate ?: Date()).time > Date().time - 300000) && redScore != 0 && blueScore != 0
399+
}
400+
}
401+
330402
@Serializable
331403
class Division {
332404
var id: Int = 0
333405
var name: String = ""
334-
var order: Int = 0
335406
}
336407

337408
@Serializable
@@ -402,6 +473,7 @@ class Event {
402473
@kotlinx.serialization.Transient var endDate: Date? = null
403474
var season: Season = Season()
404475
var location: Location = Location()
476+
@kotlinx.serialization.Transient var matches: MutableMap<Division, MutableList<Match>> = mutableMapOf<Division, MutableList<Match>>()
405477
var teams: MutableList<Team> = mutableListOf<Team>()
406478
@kotlinx.serialization.Transient var teamIDs: IntArray = intArrayOf()
407479
@kotlinx.serialization.Transient var teamObjects = ArrayList<Team>()
@@ -488,6 +560,15 @@ class Event {
488560
}
489561
}
490562

563+
suspend fun fetchMatches(division: Division) {
564+
val data = RoboScoutAPI.roboteventsRequest("/events/${this.id}/divisions/${division.id}/matches")
565+
this.matches[division] = mutableListOf<Match>()
566+
for (match in data) {
567+
val fetchedMatch: Match = jsonWorker.decodeFromJsonElement(match)
568+
this.matches[division]!!.add(fetchedMatch)
569+
}
570+
}
571+
491572
suspend fun fetchSkillsRankings() {
492573
val data = RoboScoutAPI.roboteventsRequest("/events/${this.id}/skills")
493574
this.skillsRankings = mutableListOf<TeamSkillsRanking>()

app/src/main/java/com/sunkensplashstudios/VRCRoboScout/ui/theme/Color.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,7 @@ val Pink80 = Color(0xFFEFB8C8)
88

99
val Purple40 = Color(0xFF6650a4)
1010
val PurpleGrey40 = Color(0xFF625b71)
11-
val Pink40 = Color(0xFF7D5260)
11+
val Pink40 = Color(0xFF7D5260)
12+
13+
val allianceRed = Color(0xFFFF3B30)
14+
val allianceBlue = Color(0xFF007AFF)

0 commit comments

Comments
 (0)