feat: add 'current exact position' button for station A

Removed the automatic posA=stationPos override. Added a button
'当前精确位置' below the grid input that fills in the exact station
position from settings (lat/lon + grid). Users can now freely edit
the position fields and use the button when they want the exact
position.
This commit is contained in:
atsunatsu committed 2026-08-03 03:32:03 +08:00
1 parent 571145838d
commit 81ae8772d2
2 files changed
+16 -13

No files matched your search

@@ -129,6 +129,7 @@ fun MutualScreen(
onStationBLon = viewModel::onStationBLon, onStationBLon = viewModel::onStationBLon,
onStationBGrid = viewModel::onStationBGrid, onStationBGrid = viewModel::onStationBGrid,
onStationBMinElev = viewModel::onStationBMinElev, onStationBMinElev = viewModel::onStationBMinElev,
onUseCurrentPosition = viewModel::onUseCurrentPosition,
onHoursAhead = viewModel::onHoursAhead, onHoursAhead = viewModel::onHoursAhead,
onClearError = viewModel::clearError onClearError = viewModel::clearError
) )
@@ -150,6 +151,7 @@ private fun MutualContent(
onStationBLon: (String) -> Unit, onStationBLon: (String) -> Unit,
onStationBGrid: (String) -> Unit, onStationBGrid: (String) -> Unit,
onStationBMinElev: (Double) -> Unit, onStationBMinElev: (Double) -> Unit,
onUseCurrentPosition: () -> Unit,
onHoursAhead: (Int) -> Unit, onHoursAhead: (Int) -> Unit,
onClearError: () -> Unit onClearError: () -> Unit
) { ) {
@@ -224,6 +226,12 @@ private fun MutualContent(
singleLine = true, singleLine = true,
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) )
OutlinedButton(
onClick = onUseCurrentPosition,
modifier = Modifier.align(Alignment.End)
) {
Text("当前精确位置", style = MaterialTheme.typography.bodySmall)
}
Text( Text(
text = "最小仰角:${state.stationAMinElev.toInt()}°", text = "最小仰角:${state.stationAMinElev.toInt()}°",
style = MaterialTheme.typography.bodySmall style = MaterialTheme.typography.bodySmall
@@ -139,6 +139,14 @@ class MutualViewModel(
} }
fun onStationAMinElev(value: Double) = _uiState.update { it.copy(stationAMinElev = value) } fun onStationAMinElev(value: Double) = _uiState.update { it.copy(stationAMinElev = value) }
fun onStationBMinElev(value: Double) = _uiState.update { it.copy(stationBMinElev = value) } fun onStationBMinElev(value: Double) = _uiState.update { it.copy(stationBMinElev = value) }
fun onUseCurrentPosition() {
val pos = settingsRepo.stationPosition.value
_uiState.update { it.copy(
stationALat = "%.4f".format(pos.latitude),
stationALon = "%.4f".format(pos.longitude),
stationAGrid = latLonToGrid(pos.latitude, pos.longitude)
) }
}
fun onHoursAhead(value: Int) = _uiState.update { it.copy(hoursAhead = value) } fun onHoursAhead(value: Int) = _uiState.update { it.copy(hoursAhead = value) }
fun onSelectPass(index: Int) = _uiState.update { it.copy(selectedPassIndex = index) } fun onSelectPass(index: Int) = _uiState.update { it.copy(selectedPassIndex = index) }
@@ -154,19 +162,6 @@ class MutualViewModel(
return return
} }
// When station A's grid matches the pre-filled grid (user hasn't changed it),
// use the exact station position from settings so the pass times and elevation
// curves are consistent with the main Passes page.
val stationPos = settingsRepo.stationPosition.value
val prefillGrid = latLonToGrid(stationPos.latitude, stationPos.longitude)
if (state.stationAGrid.trim().uppercase() == prefillGrid) {
posA = stationPos
}
// Same for station B: if its grid matches the user's station, use exact position.
if (state.stationBGrid.trim().uppercase() == prefillGrid) {
posB = stationPos
}
val satellites = satelliteRepo.satellites.value val satellites = satelliteRepo.satellites.value
if (satellites.isEmpty()) { if (satellites.isEmpty()) {
_uiState.update { it.copy(errorMessage = "没有卫星数据,请先在卫星列表中选择卫星") } _uiState.update { it.copy(errorMessage = "没有卫星数据,请先在卫星列表中选择卫星") }