feat(ui): map as 4th bottom-nav tab, passes top bar restored to upstream layout, bigger QSO expand arrow

- Map moves from the passes-page top-right button to the bottom navigation
  bar at position 4 from the left (Satellites, Passes, AMSAT, Map, Mutual,
  Settings), matching the upstream nav order.
- Passes top bar restored to the original repo layout: left = radios dialog
  (ic_radios), right = passes filter/schedule dialog (ic_filter) — the map
  button is gone from the top bar.
- Worked-grid QSO dialog expand arrow enlarged from bodySmall to 18sp.
This commit is contained in:
atsunatsu committed 2026-09-11 20:42:27 +08:00
1 parent 1cc0bc770c
commit 3d950f90ad
3 files changed
+13 -13

No files matched your search

@@ -161,7 +161,10 @@ fun MainScreen(
} }
} }
val fadeTransition = fadeIn(animationSpec = tween(350)) togetherWith fadeOut(animationSpec = tween(350)) val fadeTransition = fadeIn(animationSpec = tween(350)) togetherWith fadeOut(animationSpec = tween(350))
val navItems = listOf(Screen.Satellites, Screen.Passes, Screen.AMSAT, Screen.Mutual, Screen.Settings) // Map sits at position 4 from the left, matching the upstream nav order
// (Satellites, Passes, AMSAT/Status, Map, ...), with the fork's Mutual tab
// appended before Settings.
val navItems = listOf(Screen.Satellites, Screen.Passes, Screen.AMSAT, Screen.Map, Screen.Mutual, Screen.Settings)
val context = LocalContext.current val context = LocalContext.current
val container = (context.applicationContext as IContainerProvider).getMainContainer() val container = (context.applicationContext as IContainerProvider).getMainContainer()
@@ -185,7 +188,7 @@ fun MainScreen(
val isSelected = when (currentKey) { val isSelected = when (currentKey) {
is Screen.Satellites -> screen is Screen.Satellites is Screen.Satellites -> screen is Screen.Satellites
is Screen.Passes -> screen is Screen.Passes is Screen.Passes -> screen is Screen.Passes
is Screen.Map -> screen is Screen.Passes is Screen.Map -> screen is Screen.Map
is Screen.AMSAT -> screen is Screen.AMSAT is Screen.AMSAT -> screen is Screen.AMSAT
is Screen.Mutual -> screen is Screen.Mutual is Screen.Mutual -> screen is Screen.Mutual
is Screen.Settings -> screen is Screen.Settings is Screen.Settings -> screen is Screen.Settings
@@ -196,7 +199,7 @@ fun MainScreen(
label = { Text(stringResource(screen.titleResId)) }, label = { Text(stringResource(screen.titleResId)) },
selected = isSelected, selected = isSelected,
onClick = { onClick = {
if (isSelected && !(currentKey is Screen.Map && screen is Screen.Passes)) return@item if (isSelected) return@item
while (backStack.size > 1) backStack.removeAt(backStack.size - 1) while (backStack.size > 1) backStack.removeAt(backStack.size - 1)
if (screen !is Screen.Passes) backStack.add(screen) if (screen !is Screen.Passes) backStack.add(screen)
} }
@@ -236,8 +239,7 @@ fun MainScreen(
container.setMutualPassData(MutualPassData()) container.setMutualPassData(MutualPassData())
container.satelliteRepo.selectPass(catNum, aosTime) container.satelliteRepo.selectPass(catNum, aosTime)
navigateToRadar() navigateToRadar()
}, }
navigateToMap = navigateToMap
) )
} }
entry<Screen.Map> { entry<Screen.Map> {
@@ -389,7 +389,7 @@ private fun WorkedGridCallRow(
) )
Text( Text(
text = if (expanded) " ▴" else " ▾", text = if (expanded) " ▴" else " ▾",
style = MaterialTheme.typography.bodySmall, fontSize = 18.sp,
color = MaterialTheme.colorScheme.primary color = MaterialTheme.colorScheme.primary
) )
} }
@@ -85,22 +85,20 @@ import java.util.TimeZone
@Composable @Composable
fun PassesDestination( fun PassesDestination(
navigateToRadar: (Int, Long) -> Unit, navigateToRadar: (Int, Long) -> Unit
navigateToMap: () -> Unit
) { ) {
val context = LocalContext.current val context = LocalContext.current
val container = (context.applicationContext as IContainerProvider).getMainContainer() val container = (context.applicationContext as IContainerProvider).getMainContainer()
val viewModel: PassesViewModel = viewModel(factory = PassesViewModel.factory(container)) val viewModel: PassesViewModel = viewModel(factory = PassesViewModel.factory(container))
val uiState = viewModel.uiState.collectAsStateWithLifecycle().value val uiState = viewModel.uiState.collectAsStateWithLifecycle().value
PassesScreen(uiState, viewModel::onAction, navigateToRadar, navigateToMap) PassesScreen(uiState, viewModel::onAction, navigateToRadar)
} }
@Composable @Composable
private fun PassesScreen( private fun PassesScreen(
uiState: PassesState, uiState: PassesState,
onAction: (PassesAction) -> Unit, onAction: (PassesAction) -> Unit,
navigateToRadar: (Int, Long) -> Unit, navigateToRadar: (Int, Long) -> Unit
navigateToMap: () -> Unit
) { ) {
if (uiState.isPassesDialogShown) { if (uiState.isPassesDialogShown) {
PassesFilterDialog( PassesFilterDialog(
@@ -158,7 +156,7 @@ private fun PassesScreen(
TopBar( TopBar(
isVerticalLayout = isVerticalLayout, isVerticalLayout = isVerticalLayout,
startAction = { startAction = {
IconCard(action = { onAction(PassesAction.TogglePassesDialog) }, resId = R.drawable.ic_filter) IconCard(action = { onAction(PassesAction.ToggleRadiosDialog) }, resId = R.drawable.ic_radios)
}, },
topInfo = { topInfo = {
TimerRow(timeString = uiState.nextTime, isTimeAos = uiState.isNextTimeAos) TimerRow(timeString = uiState.nextTime, isTimeAos = uiState.isNextTimeAos)
@@ -167,7 +165,7 @@ private fun PassesScreen(
NextPassRow(pass = uiState.nextPass, isUtc = uiState.isUtc) NextPassRow(pass = uiState.nextPass, isUtc = uiState.isUtc)
}, },
endAction = { endAction = {
IconCard(action = navigateToMap, resId = R.drawable.ic_map) IconCard(action = { onAction(PassesAction.TogglePassesDialog) }, resId = R.drawable.ic_filter)
} }
) )
} }