feat: mutual match screen target-grid chip (needle bearing + grid + distance); grid mode centering no longer swallowed when station position is not yet available

This commit is contained in:
atsunatsu committed 2026-09-07 17:54:14 +08:00
1 parent 2c9a5b376f
commit a9fe0b74e9
4 files changed
+181 -5

No files matched your search

@@ -165,11 +165,18 @@ private fun MapScreen(uiState: MapState, onAction: (MapAction) -> Unit, mapView:
// the map page with grid mode already ON also centers the map.
var prevGridMode by remember { mutableStateOf(false) }
AndroidView({ mapView }) { view ->
// Center on the station grid whenever entering grid mode.
// Only mark the transition as consumed once a real position
// was available; otherwise a first frame with a null
// stationPosition would swallow the centering forever.
val shouldCenter = uiState.isGridMode && !prevGridMode
setGridMode(
uiState.isGridMode, uiState.workedGrids, view,
if (uiState.isGridMode && !prevGridMode) uiState.stationPosition else null
if (shouldCenter) uiState.stationPosition else null
)
prevGridMode = uiState.isGridMode
if (!shouldCenter || uiState.stationPosition != null) {
prevGridMode = uiState.isGridMode
}
if (!uiState.isGridMode) {
uiState.stationPosition?.let { setStationPosition(it, view) }
uiState.track?.let { setSatelliteTrack(it, view) }
@@ -63,6 +63,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.rtbishop.look4sat.core.domain.repository.MutualPassData
import com.rtbishop.look4sat.core.domain.repository.TrackSampleData
import com.rtbishop.look4sat.core.presentation.GridTargetChip
import com.rtbishop.look4sat.core.presentation.R
import com.rtbishop.look4sat.core.presentation.ScreenColumn
import com.rtbishop.look4sat.core.presentation.TopBar
@@ -114,7 +115,29 @@ fun MutualScreen(
strokeWidth = 2.dp
)
}
MutualStatusChip(state)
// Target-grid chip: station B grid (station A defaults to
// the user's own position), bearing/distance from A to B.
val gridB = state.stationBGrid.trim().uppercase()
val posA = com.rtbishop.look4sat.core.domain.utility.qthToPosition(state.stationAGrid)
?: state.stationALat.toDoubleOrNull()?.let { lat ->
state.stationALon.toDoubleOrNull()?.let { lon ->
com.rtbishop.look4sat.core.domain.predict.GeoPos(lat, lon)
}
}
val posB = com.rtbishop.look4sat.core.domain.utility.qthToPosition(gridB)
if (posA != null && posB != null) {
GridTargetChip(
grid = gridB,
distanceKm = com.rtbishop.look4sat.core.presentation.greatCircleDistanceKm(
posA.latitude, posA.longitude, posB.latitude, posB.longitude
),
bearingDeg = com.rtbishop.look4sat.core.presentation.greatCircleBearingDeg(
posA.latitude, posA.longitude, posB.latitude, posB.longitude
)
)
} else {
GridTargetChip(grid = null, distanceKm = null, bearingDeg = null)
}
}
}
)