Skip to content

Commit 13c2a96

Browse files
committed
Allow navigating pit schedule
1 parent 2820bb6 commit 13c2a96

File tree

4 files changed

+150
-5
lines changed

4 files changed

+150
-5
lines changed

app/src/main/java/com/scouting/app/misc/ScoutingScheduleManager.kt

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class ScoutingScheduleManager {
1414
val currentCompetitionScheduleCSV = mutableListOf<List<String>>()
1515

1616
// Follows the format teamNumber, teamName
17-
private val currentPitScheduleCSV = mutableListOf<List<String>>()
17+
val currentPitScheduleCSV = mutableListOf<List<String>>()
1818

1919
var currentMatchScoutingIteration by mutableStateOf(0)
2020
var currentPitScoutingIteration by mutableStateOf(0)
@@ -152,6 +152,32 @@ class ScoutingScheduleManager {
152152
*/
153153
fun jumpToMatch(number: Int) {
154154
currentMatchScoutingIteration = number - 1
155+
MMKV.defaultMMKV().encode("COMPETITION_SCHEDULE_CURRENT_ITERATION", currentMatchScoutingIteration)
156+
}
157+
158+
/**
159+
* Indicate if there is a pit to scout before the current one
160+
*/
161+
fun hasPrevPit(): Boolean = currentPitScoutingIteration > 0
162+
163+
/**
164+
* Indicate if there is a pit to scout after the current one
165+
*/
166+
fun hasNextPit(): Boolean = currentPitScoutingIteration < currentPitScheduleCSV.size - 1
167+
168+
/**
169+
* Decrement the current row of the pit scouting schedule we're
170+
* on and save this to MMKV
171+
*/
172+
fun moveToPrevPit() {
173+
if (currentPitScoutingIteration > 0) {
174+
currentPitScoutingIteration--
175+
MMKV.defaultMMKV().encode("PIT_SCHEDULE_CURRENT_ITERATION", currentPitScoutingIteration)
176+
} else {
177+
// currentPitScoutingIteration *should* be 0, but still set to 0 in case of negatives somehow
178+
currentPitScoutingIteration = 0
179+
MMKV.defaultMMKV().encode("PIT_SCOUTING_MODE", false)
180+
}
155181
}
156182

157183
/**
@@ -168,4 +194,13 @@ class ScoutingScheduleManager {
168194
}
169195
}
170196

197+
/**
198+
* Move to the specified pit index
199+
*
200+
* @param index The 0's based index in the pit list
201+
*/
202+
fun jumpToPit(index: Int) {
203+
currentPitScoutingIteration = index
204+
MMKV.defaultMMKV().encode("PIT_SCHEDULE_CURRENT_ITERATION", currentPitScoutingIteration)
205+
}
171206
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package com.scouting.app.view.scouting
2+
3+
import androidx.compose.foundation.background
4+
import androidx.compose.foundation.clickable
5+
import androidx.compose.foundation.layout.*
6+
import androidx.compose.foundation.lazy.LazyColumn
7+
import androidx.compose.foundation.lazy.itemsIndexed
8+
import androidx.compose.material3.MaterialTheme
9+
import androidx.compose.material3.Text
10+
import androidx.compose.runtime.Composable
11+
import androidx.compose.ui.Modifier
12+
import androidx.compose.ui.res.painterResource
13+
import androidx.compose.ui.res.stringResource
14+
import androidx.compose.ui.unit.dp
15+
import com.scouting.app.R
16+
import com.scouting.app.components.DialogScaffold
17+
import com.scouting.app.misc.ScoutingScheduleManager
18+
import com.scouting.app.theme.NeutralGrayLight
19+
import com.scouting.app.theme.ScoutingTheme
20+
import com.scouting.app.viewmodel.ScoutingViewModel
21+
22+
@Composable
23+
fun SelectPitDialog(scoutingScheduleManager: ScoutingScheduleManager, viewModel: ScoutingViewModel) {
24+
if (!viewModel.showingSelectPitDialog) {
25+
return
26+
}
27+
ScoutingTheme {
28+
DialogScaffold(
29+
icon = painterResource(id = R.drawable.ic_calendar_panel),
30+
contentDescription = stringResource(id = R.string.ic_calendar_panel_content_desc),
31+
title = stringResource(id = R.string.start_scouting_dialog_select_pit_title),
32+
onDismissRequest = {
33+
viewModel.showingSelectPitDialog = false
34+
}
35+
) {
36+
LazyColumn(
37+
modifier = Modifier
38+
.padding(vertical = 20.dp)
39+
.heightIn(0.dp, 500.dp),
40+
verticalArrangement = Arrangement.spacedBy(5.dp)
41+
) {
42+
itemsIndexed(scoutingScheduleManager.currentPitScheduleCSV) { index, item ->
43+
val number = item[0]
44+
val teamName = item[1]
45+
Row(
46+
modifier = Modifier
47+
.fillMaxWidth()
48+
.padding(horizontal = 30.dp, vertical = 10.dp)
49+
.background(color = NeutralGrayLight, shape = MaterialTheme.shapes.medium)
50+
.clickable {
51+
scoutingScheduleManager.jumpToPit(index)
52+
viewModel.populatePitDataIfScheduled()
53+
viewModel.showingSelectPitDialog = false
54+
},
55+
horizontalArrangement = Arrangement.Start
56+
) {
57+
MaterialTheme.typography.bodyLarge.color
58+
Text(
59+
text = number,
60+
modifier = Modifier
61+
.padding(15.dp)
62+
.width(70.dp),
63+
style = MaterialTheme.typography.bodyLarge
64+
)
65+
Text(
66+
text = teamName,
67+
modifier = Modifier.padding(15.dp),
68+
style = MaterialTheme.typography.bodyLarge
69+
)
70+
}
71+
}
72+
}
73+
}
74+
}
75+
}

app/src/main/java/com/scouting/app/view/scouting/StartPitScoutingView.kt

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,13 @@ import androidx.compose.ui.res.stringResource
1616
import androidx.compose.ui.unit.dp
1717
import androidx.navigation.NavController
1818
import com.scouting.app.R
19-
import com.scouting.app.components.BasicInputField
20-
import com.scouting.app.components.LargeButton
21-
import com.scouting.app.components.LargeHeaderBar
22-
import com.scouting.app.components.SpacedRow
19+
import com.scouting.app.components.*
2320
import com.scouting.app.misc.NavDestination
2421
import com.scouting.app.misc.ScoutingScheduleManager
2522
import com.scouting.app.misc.ScoutingType
2623
import com.scouting.app.theme.AffirmativeGreen
2724
import com.scouting.app.theme.AffirmativeGreenDark
25+
import com.scouting.app.theme.NeutralGrayMedium
2826
import com.scouting.app.theme.ScoutingTheme
2927
import com.scouting.app.utilities.composableContext
3028
import com.scouting.app.viewmodel.ScoutingViewModel
@@ -49,6 +47,39 @@ fun StartPitScoutingView(
4947
title = stringResource(id = R.string.start_pit_scouting_header_title),
5048
navController = navController
5149
)
50+
if (viewModel.usingPitSchedule()) {
51+
SpacedRow(modifier = Modifier.padding(top = 50.dp)) {
52+
SmallButton(
53+
text = "",
54+
enabled = scoutingScheduleManager.hasPrevPit(),
55+
icon = painterResource(id = R.drawable.ic_arrow_back),
56+
contentDescription = stringResource(id = R.string.ic_arrow_back_content_desc),
57+
onClick = {
58+
scoutingScheduleManager.moveToPrevPit()
59+
viewModel.populatePitDataIfScheduled()
60+
},
61+
color = NeutralGrayMedium
62+
)
63+
SmallButton(
64+
text = stringResource(id = R.string.start_pit_scouting_select_team_button_text),
65+
onClick = {
66+
viewModel.showingSelectPitDialog = true
67+
},
68+
color = NeutralGrayMedium
69+
)
70+
SmallButton(
71+
text = "",
72+
enabled = scoutingScheduleManager.hasNextPit(),
73+
icon = painterResource(id = R.drawable.ic_arrow_forward),
74+
contentDescription = stringResource(id = R.string.ic_arrow_forward_content_desc),
75+
onClick = {
76+
scoutingScheduleManager.moveToNextPit()
77+
viewModel.populatePitDataIfScheduled()
78+
},
79+
color = NeutralGrayMedium
80+
)
81+
}
82+
}
5283
SpacedRow(modifier = Modifier.padding(top = 50.dp)) {
5384
Text(
5485
text = stringResource(id = R.string.start_pit_scouting_team_number_prefix),
@@ -112,4 +143,5 @@ fun StartPitScoutingView(
112143
}
113144
}
114145
NoTemplateDialog(navController, viewModel)
146+
SelectPitDialog(scoutingScheduleManager, viewModel)
115147
}

app/src/main/res/values/strings.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@
115115
<string name="start_scouting_dialog_no_template_neutral_button_text">Settings</string>
116116
<string name="start_scouting_dialog_no_template_positive_button_text">Got it!</string>
117117

118+
<string name="start_scouting_dialog_select_pit_title">Select team to pit scout</string>
119+
118120
<string name="start_match_header_title">Start a match</string>
119121
<string name="start_match_match_number_text">Match number</string>
120122
<string name="start_match_team_number_text">Team number</string>
@@ -128,6 +130,7 @@
128130
<string name="start_pit_scouting_team_number_prefix">Team number</string>
129131
<string name="start_pit_scouting_team_name_prefix">Team name</string>
130132
<string name="start_pit_scouting_begin_button_text">Begin scouting</string>
133+
<string name="start_pit_scouting_select_team_button_text">Select team</string>
131134

132135
<string name="in_pit_scouting_header_text">Pit scouting</string>
133136
<string name="in_pit_scouting_primary_subtitle_text">Monitoring team %1$s</string>

0 commit comments

Comments
 (0)