Add depth attribute
This commit is contained in:
parent
5ed46b278c
commit
42dbbeea58
@ -15,10 +15,7 @@ import androidx.compose.ui.unit.IntOffset
|
|||||||
import androidx.compose.ui.unit.IntSize
|
import androidx.compose.ui.unit.IntSize
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import center.sciprog.maps.coordinates.Gmc
|
import center.sciprog.maps.coordinates.Gmc
|
||||||
import center.sciprog.maps.features.FeaturesState
|
import center.sciprog.maps.features.*
|
||||||
import center.sciprog.maps.features.PainterFeature
|
|
||||||
import center.sciprog.maps.features.ViewConfig
|
|
||||||
import center.sciprog.maps.features.drawFeature
|
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.supervisorScope
|
import kotlinx.coroutines.supervisorScope
|
||||||
import mu.KotlinLogging
|
import mu.KotlinLogging
|
||||||
@ -130,7 +127,7 @@ public actual fun MapView(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
featuresState.features.values.filter { viewPoint.zoom in it.zoomRange }.forEach { feature ->
|
featuresState.features.values.filter { viewPoint.zoom in it.zoomRange }.sortedBy { it.depth }.forEach { feature ->
|
||||||
drawFeature(state, painterCache, feature)
|
drawFeature(state, painterCache, feature)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,8 @@ package center.sciprog.maps.features
|
|||||||
import androidx.compose.runtime.mutableStateMapOf
|
import androidx.compose.runtime.mutableStateMapOf
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
|
|
||||||
|
public object DepthAttribute : Feature.Attribute<Float>
|
||||||
|
|
||||||
public object DraggableAttribute : Feature.Attribute<DragHandle<*>>
|
public object DraggableAttribute : Feature.Attribute<DragHandle<*>>
|
||||||
|
|
||||||
public object SelectableAttribute : Feature.Attribute<(FeatureId<*>, SelectableFeature<*>) -> Unit>
|
public object SelectableAttribute : Feature.Attribute<(FeatureId<*>, SelectableFeature<*>) -> Unit>
|
||||||
@ -14,7 +16,7 @@ public object ColorAttribute : Feature.Attribute<Color>
|
|||||||
public class AttributeMap {
|
public class AttributeMap {
|
||||||
public val map: MutableMap<Feature.Attribute<*>, Any> = mutableStateMapOf()
|
public val map: MutableMap<Feature.Attribute<*>, Any> = mutableStateMapOf()
|
||||||
|
|
||||||
public fun <T, A : Feature.Attribute<T>> setAttribute(
|
public operator fun <T, A : Feature.Attribute<T>> set(
|
||||||
attribute: A,
|
attribute: A,
|
||||||
attrValue: T?,
|
attrValue: T?,
|
||||||
) {
|
) {
|
||||||
@ -43,3 +45,9 @@ public class AttributeMap {
|
|||||||
|
|
||||||
override fun toString(): String = "AttributeMap(value=${map.entries})"
|
override fun toString(): String = "AttributeMap(value=${map.entries})"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public var Feature<*>.depth: Float
|
||||||
|
get() = attributes[DepthAttribute] ?: 0f
|
||||||
|
set(value) {
|
||||||
|
attributes[DepthAttribute] = value
|
||||||
|
}
|
@ -44,7 +44,7 @@ public class FeaturesState<T : Any>(public val coordinateSpace: CoordinateSpace<
|
|||||||
|
|
||||||
|
|
||||||
public fun <F : Feature<T>, V> setAttribute(id: FeatureId<F>, key: Feature.Attribute<V>, value: V?) {
|
public fun <F : Feature<T>, V> setAttribute(id: FeatureId<F>, key: Feature.Attribute<V>, value: V?) {
|
||||||
getFeature(id).attributes.setAttribute(key, value)
|
getFeature(id).attributes.set(key, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO use context receiver for that
|
//TODO use context receiver for that
|
||||||
|
@ -23,7 +23,12 @@ fun FeaturesState<XY>.background(
|
|||||||
offset,
|
offset,
|
||||||
XY(width + offset.x, height + offset.y)
|
XY(width + offset.x, height + offset.y)
|
||||||
)
|
)
|
||||||
return scalableImage(box, id = id, painter = painter)
|
return feature(
|
||||||
|
id,
|
||||||
|
ScalableImageFeature(coordinateSpace, box, painter = painter).apply {
|
||||||
|
depth = -100f
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun FeaturesState<XY>.circle(
|
fun FeaturesState<XY>.circle(
|
@ -48,14 +48,12 @@ public fun SchemeView(
|
|||||||
}
|
}
|
||||||
|
|
||||||
clipRect {
|
clipRect {
|
||||||
featuresState.features.values.filterIsInstance<ScalableImageFeature<XY>>().forEach { background ->
|
featuresState.features.values
|
||||||
drawFeature(state, painterCache, background)
|
.filter { viewPoint.zoom in it.zoomRange }
|
||||||
}
|
.sortedBy { it.depth }
|
||||||
featuresState.features.values.filter {
|
.forEach { background ->
|
||||||
it !is ScalableImageFeature && viewPoint.zoom in it.zoomRange
|
drawFeature(state, painterCache, background)
|
||||||
}.forEach { feature ->
|
}
|
||||||
drawFeature(state, painterCache, feature)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
selectRect?.let { dpRect ->
|
selectRect?.let { dpRect ->
|
||||||
val rect = dpRect.toRect()
|
val rect = dpRect.toRect()
|
||||||
|
Loading…
Reference in New Issue
Block a user