Select and drag multiple entries. Close #74

This commit is contained in:
2022-06-27 21:57:10 +00:00
parent 5175622374
commit 4724d100cf
4 changed files with 53 additions and 15 deletions

View File

@@ -143,6 +143,9 @@
(method isSelected [:Entry e]
!(= -1 (_selectedEntries.indexOf e)))
(method getSelectedEntries []
(_selectedEntries.copy))
(defNew [&prop :Archive archive
&prop :ArchiveUI ui]
[&mut :Array<Entry> _selectedEntries []

View File

@@ -1,6 +1,7 @@
(loadFrom "nat-archive-tool" "src/nat/Lib.kiss")
(defNew [:String positionKey
(defNew [&prop :EntrySpriteSystem system
&prop :String positionKey
&prop :Archive archive
&prop :Entry e
&prop :ArchiveController controller]
@@ -21,15 +22,42 @@
(enableMouseDrag)
}))
**(set mousePressedCallback
->[self _x _y]
{
(controller.ToggleSelectEntry e)
})
(set mouseStartDragCallback
->[self _dx _dy]
(doFor sprite ~(system.getSelectedSprites)
(unless (= sprite.e.id this.e.id)
(sprite.fixToSprite this))))
(set mouseStopDragCallback
->[self _dx _dy]
(withWritableComponents archive e [positions Positions]
(dictSet positions positionKey (object x (cast this.x Float) y (cast this.y Float) z 0.0)))))
{
(savePos)
(doFor sprite (system.getSelectedSprites)
(unless (= sprite.e.id this.e.id)
(sprite.endFixToSprite)))
}))
(prop &mut :EntrySprite fixedToSprite)
(prop &mut :FlxPoint fixedOffset)
(method savePos []
(withWritableComponents archive e [positions Positions]
(dictSet positions positionKey (object x (cast this.x Float) y (cast this.y Float) z 0.0))))
(method &override :Void update [:Float elapsed]
(super.update elapsed)
(when fixedToSprite
(set x (+ fixedToSprite.x fixedOffset.x))
(set y (+ fixedToSprite.y fixedOffset.y))))
(method fixToSprite [:EntrySprite sprite]
(set fixedToSprite sprite)
(set fixedOffset (new FlxPoint (- x sprite.x) (- y sprite.y))))
(method endFixToSprite []
(savePos)
(set fixedToSprite null))
(method updateColor []
(if (controller.isSelected e)

View File

@@ -16,7 +16,7 @@
(withWritableComponents archive e [positions Positions]
(when !(positions.exists positionKey)
(dictSet positions positionKey (object x 0.0 y 0.0 z 0.0))))
(let [sprite (new EntrySprite positionKey archive e controller)]
(let [sprite (new EntrySprite this positionKey archive e controller)]
(playState.entryGroup.add sprite)
(dictSet sprites e.id sprite))))
@@ -27,4 +27,7 @@
(sprites.remove e.id)
// When an Entry is hidden, we can bet the user doesn't want it selected anymore
(controller.DeSelectEntry e)
}))
}))
(method getSelectedSprites []
(filter (for e (controller.getSelectedEntries) (dictGet sprites e.id))))

View File

@@ -47,11 +47,14 @@
// mouseDown
->s {
(set mouseDown (FlxG.mouse.getScreenPosition))
(controller.SelectEntries [])
(entryGroup.forEach
->entrySprite
(when (.containsPoint (entrySprite.getScreenBounds) (FlxG.mouse.getScreenPosition))
(controller.SelectEntry entrySprite.e)))
(let [&mut clickedOnSomething false]
(entryGroup.forEach
->entrySprite
(when (.containsPoint (entrySprite.getScreenBounds) (FlxG.mouse.getScreenPosition))
(set clickedOnSomething true)
(unless (controller.isSelected entrySprite.e)
(controller.SelectEntry entrySprite.e))))
(unless clickedOnSomething (controller.SelectEntries [])))
}
// mouseUp
->s {
@@ -62,6 +65,7 @@
->s {}
// mouseOut
->s {}
// also send events to sprites that overlap the dragging background
true
true
false)