fix(ui): make setting camera position work again

This commit is contained in:
Cilly Leang 2026-04-02 02:28:10 +11:00
parent c912723c78
commit 4cdb9a305c
Signed by: cilly
GPG key ID: 6500251E087653C9
5 changed files with 47 additions and 11 deletions

View file

@ -6,12 +6,15 @@ import androidx.compose.foundation.layout.add
import androidx.compose.foundation.layout.asPaddingValues
import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import kotlinx.coroutines.launch
import kotlinx.serialization.json.JsonObject
import moe.lava.banksia.core.Constants
import moe.lava.banksia.ui.map.mappers.routeColorExpression
import moe.lava.banksia.ui.map.mappers.toMapPosition
import moe.lava.banksia.ui.platform.BanksiaTheme
import org.maplibre.compose.camera.CameraPosition
import org.maplibre.compose.camera.rememberCameraState
@ -26,6 +29,7 @@ import org.maplibre.compose.style.BaseStyle
import org.maplibre.compose.util.ClickResult
import org.maplibre.spatialk.geojson.Feature
import org.maplibre.spatialk.geojson.Geometry
import kotlin.time.Duration.Companion.seconds
@Composable
internal fun MapLibreMaps(
@ -34,7 +38,7 @@ internal fun MapLibreMaps(
positionState: MapsPositionState,
stops: GeoJsonData.Features?,
// vehicles: GeoJsonData.Features?,
stopInnerColor: Color,
stopInnerColor: Color = BanksiaTheme.colors.surface,
onStopClicked: (Feature<Geometry, JsonObject?>) -> Unit,
) {
val camPos = rememberCameraState(
@ -43,6 +47,17 @@ internal fun MapLibreMaps(
target = MELBOURNE_POS
)
)
val scope = rememberCoroutineScope()
scope.launch {
positionState.updates.collect {
val (position, box) = it.toMapPosition()
if (box != null) {
camPos.animateTo(box, duration = 1.seconds)
} else {
camPos.animateTo(position, duration = 1.seconds)
}
}
}
val variant = if (isSystemInDarkTheme()) "dark" else "light"
@ -63,7 +78,7 @@ internal fun MapLibreMaps(
CircleLayer(
id = "maps-stops0",
source = stopsSource,
color = const(BanksiaTheme.colors.surface),
color = const(stopInnerColor),
radius = const(3.dp),
strokeWidth = const(2.dp),
strokeColor = routeColorExpression,

View file

@ -7,16 +7,18 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.launch
import moe.lava.banksia.core.util.Point
import moe.lava.banksia.ui.map.util.CameraPosition
class MapsPositionState internal constructor(
private val scope: CoroutineScope
) {
internal val updates: SharedFlow<Point>
internal val updates: SharedFlow<CameraPosition>
field = MutableSharedFlow()
fun update(position: Point) {
scope.launch { updates.emit(position) }
fun update(position: CameraPosition) {
scope.launch {
updates.emit(position)
}
}
}

View file

@ -0,0 +1,15 @@
package moe.lava.banksia.ui.map.mappers
import moe.lava.banksia.ui.map.util.CameraPosition
import org.maplibre.spatialk.geojson.BoundingBox
import org.maplibre.compose.camera.CameraPosition as MLCameraPosition
internal fun CameraPosition.toMapPosition() = Pair(
MLCameraPosition(target = this.centre.toPosition(), zoom = 16.0),
this.bounds?.let {
BoundingBox(
southwest = it.southwest.toPosition(),
northeast = it.northeast.toPosition(),
)
}
)