[orx-shapes] Add support for multiple selections

This commit is contained in:
Edwin Jakobs
2023-10-23 21:28:47 +02:00
parent c28cedbb8c
commit 9336bbfa18
2 changed files with 59 additions and 30 deletions

View File

@@ -19,6 +19,10 @@ class ContourAdjuster(var contour: ShapeContour) {
*/
var edgeIndices = listOf(0)
private var vertexWorkingSet = emptyList<Int>()
private var edgeWorkingSet = emptyList<Int>()
/**
* the selected vertex
*/
@@ -27,6 +31,19 @@ class ContourAdjuster(var contour: ShapeContour) {
return ContourAdjusterVertex(this, vertexIndices.first())
}
val vertices: Sequence<ContourAdjusterVertex>
get() {
vertexWorkingSet = vertexIndices
return sequence {
while (vertexWorkingSet.isNotEmpty()) {
val head = vertexWorkingSet.first()
vertexWorkingSet = vertexWorkingSet.drop(1)
yield(ContourAdjusterVertex(this@ContourAdjuster, head))
}
}
}
/**
* the selected edge
*/
@@ -35,6 +52,18 @@ class ContourAdjuster(var contour: ShapeContour) {
return ContourAdjusterEdge(this, edgeIndices.first())
}
val edges: Sequence<ContourAdjusterEdge>
get() {
edgeWorkingSet = edgeIndices
return sequence {
while (edgeWorkingSet.isNotEmpty()) {
val head = edgeWorkingSet.first()
edgeWorkingSet = edgeWorkingSet.drop(1)
yield(ContourAdjusterEdge(this@ContourAdjuster, head))
}
}
}
/**
* select a vertex by index
*/
@@ -70,7 +99,7 @@ class ContourAdjuster(var contour: ShapeContour) {
fun selectVertices(predicate: (Int, ContourVertex) -> Boolean) {
vertexIndices =
(0 until if (contour.closed) contour.segments.size else contour.segments.size + 1).filter { index ->
predicate(index, ContourVertex(contour, index) )
predicate(index, ContourVertex(contour, index))
}
}
@@ -102,13 +131,11 @@ class ContourAdjuster(var contour: ShapeContour) {
fun selectEdges(predicate: (Int, ContourEdge) -> Boolean) {
vertexIndices =
(0 until if (contour.closed) contour.segments.size else contour.segments.size + 1).filter { index ->
predicate(index, ContourEdge(contour, index) )
predicate(index, ContourEdge(contour, index))
}
}
fun updateSelection(adjustments: List<SegmentOperation>) {
var newVertexIndices = vertexIndices
var newEdgeIndices = edgeIndices
for (adjustment in adjustments) {
when (adjustment) {
@@ -120,29 +147,28 @@ class ContourAdjuster(var contour: ShapeContour) {
it
}
}
newVertexIndices = insert(newVertexIndices)
newEdgeIndices = insert(newEdgeIndices)
vertexIndices = insert(vertexIndices)
edgeIndices = insert(edgeIndices)
vertexWorkingSet = insert(vertexWorkingSet)
edgeWorkingSet = insert(edgeWorkingSet)
}
is SegmentOperation.Remove -> {
fun remove(list: List<Int>) = list.mapNotNull {
if (it in adjustment.index..<adjustment.index + adjustment.amount) {
null
} else if (it > adjustment.index) {
it - adjustment.amount
} else {
it
}
}
// TODO: handling of vertices in open contours is wrong here
newVertexIndices = newVertexIndices.mapNotNull {
if (it in adjustment.index ..< adjustment.index+adjustment.amount) {
null
} else if (it > adjustment.index) {
it - adjustment.amount
} else {
it
}
}
newEdgeIndices = newEdgeIndices.mapNotNull {
if (it in adjustment.index ..< adjustment.index+adjustment.amount) {
null
} else if (it > adjustment.index) {
it - adjustment.amount
} else {
it
}
}
vertexIndices = remove(vertexIndices)
edgeIndices = remove(edgeIndices)
vertexWorkingSet = remove(vertexWorkingSet)
edgeWorkingSet = remove(edgeWorkingSet)
}
}
}