Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,37 +3,35 @@ package com.mapconductor.example.pages.polyline
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import com.mapconductor.core.map.MapViewState
import com.mapconductor.core.map.OnMapEventHandler
import com.mapconductor.core.marker.Marker
import com.mapconductor.core.marker.MarkerState
import com.mapconductor.core.marker.OnMarkerEventHandler
import com.mapconductor.core.polyline.OnPolylineEventHandler
import com.mapconductor.core.polyline.Polyline
import com.mapconductor.core.polyline.PolylineState
import com.mapconductor.example.MapViewContainer

@Composable
fun PolylineMapComponent(
mapViewState: MapViewState<*>?,
viewModel: PolylinePageViewModel,
polylineState: PolylineState,
wayPointMarkers: List<MarkerState>,
modifier: Modifier = Modifier,
onMapClick: OnMapEventHandler = {},
onMarkerClick: OnMarkerEventHandler = {},
onPolylineClick: OnPolylineEventHandler = {},
onMarkerDrag: OnMarkerEventHandler = {},
) {
mapViewState?.let { it ->
MapViewContainer(
modifier = modifier,
state = it,
onMapClick = onMapClick,
onMarkerClick = onMarkerClick,
onPolylineClick = onPolylineClick,
onMarkerDrag = onMarkerDrag,
) {
// Polyline
Polyline(viewModel.polylineState)
Polyline(polylineState)

// Waypoint markers
viewModel.wayPointMarkers.forEach { marker ->
wayPointMarkers.forEach { marker ->
Marker(marker)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,9 @@ fun PolylineMapPage(
val mapViewState = viewModel.mapViewState.collectAsState()

PolylineMapComponent(
polylineState = viewModel.polylineState,
wayPointMarkers = viewModel.wayPointMarkers,
mapViewState = mapViewState.value,
viewModel = viewModel,
onMapClick = viewModel::onMapClick,
onMarkerClick = viewModel::onMarkerClick,
onPolylineClick = viewModel::onPolylineClick,
onMarkerDrag = viewModel::onMarkerDrag,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,39 +12,27 @@ import com.mapconductor.core.map.MapViewState
import com.mapconductor.core.marker.DefaultIcon
import com.mapconductor.core.marker.MarkerState
import com.mapconductor.core.polyline.PolylineState
import com.mapconductor.example.toast.ToastMessage
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow

interface PolylinePageViewModel {
val initCameraPosition: MapCameraPosition
val mapViewState: StateFlow<MapViewState<*>?>
val messages: StateFlow<List<ToastMessage>>

val wayPointMarkers: List<MarkerState>
val polylineState: PolylineState

fun onMapViewChanged(state: MapViewState<*>)

fun onMarkerClick(clicked: MarkerState)

fun onMapClick(clicked: GeoPoint)

fun onPolylineClick(state: PolylineState)

fun onMarkerDrag(dragged: MarkerState)

fun showToast(text: String)

fun removeToast(toastMessage: ToastMessage)
}

class PolylinePageViewModelImpl :
class PolylinePageViewModelImpl() :
ViewModel(),
PolylinePageViewModel {
private val _messages: MutableStateFlow<List<ToastMessage>> = MutableStateFlow(emptyList())
override val messages: StateFlow<List<ToastMessage>> = _messages.asStateFlow()

override val initCameraPosition =
MapCameraPosition(
Expand All @@ -71,30 +59,24 @@ class PolylinePageViewModelImpl :
private val _wayPointMarkers: MutableState<List<MarkerState>> =
mutableStateOf(
polylinePoints.mapIndexed { index, point ->
val markerColor = when {
index == 0 -> Color.Green
index == polylinePoints.size - 1 -> Color.Green
else -> Color.Yellow
}
val label = when {
index == 0 -> "S"
index == polylinePoints.size - 1 -> "E"
else -> "$index"
}
MarkerState(
id = "waypoint_$index",
position = point,
icon =
DefaultIcon(
fillColor =
if (index == 0 ||
index == polylinePoints.size - 1
) {
Color.Green
} else {
Color.Blue
},
strokeColor = Color.White,
label =
if (index ==
0
) {
"S"
} else if (index == polylinePoints.size - 1) {
"E"
} else {
"$index"
},
fillColor = markerColor,
strokeColor = Color.Black,
label = label,
),
draggable = true,
)
Expand Down Expand Up @@ -125,18 +107,8 @@ class PolylinePageViewModelImpl :
this._mapViewState.value = state
}

override fun onMarkerClick(clicked: MarkerState) {
val markerLabel = (clicked.icon as? DefaultIcon)?.label ?: "Marker"
showToast("Waypoint $markerLabel clicked")
}

override fun onMapClick(clicked: GeoPoint) {
showToast("Map clicked at: ${clicked.toUrlValue()}")
}

override fun onPolylineClick(state: PolylineState) {
_polylineState.value.strokeColor = Color.Magenta
showToast("Polyline clicked - ${state.points.size} points")
}

override fun onMarkerDrag(dragged: MarkerState) {
Expand All @@ -148,14 +120,6 @@ class PolylinePageViewModelImpl :
polylinePoints[markerIndex].longitude = dragged.position.longitude
}

override fun showToast(text: String) {
this._messages.value = this._messages.value + ToastMessage(text = text)
}

override fun removeToast(toastMessage: ToastMessage) {
this._messages.value = this._messages.value.filter { it != toastMessage }
}

override fun onCleared() {
super.onCleared()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ abstract class AbstractDefaultIcon(
val scaledWidth = originalSize.width * markerScale
val scaledHeight = originalSize.height * markerScale
val offsetX = (canvasSize - scaledWidth) / 2f
val offsetY = canvasSize - scaledHeight + ResourceProvider.dpToPx(strokeWidth.value - 1f).toFloat()
val offsetY = canvasSize - scaledHeight + ResourceProvider.dpToPx(strokeWidth.value).toFloat()

return Path().apply {
moveTo(12f * markerScale + offsetX, 0f * markerScale + offsetY)
Expand Down
Loading