NAT flixel use KissExtendedSprite dragToSelect support

This commit is contained in:
2022-09-28 23:22:32 +00:00
parent 9ab0c3d671
commit 65dc9461aa
3 changed files with 13 additions and 62 deletions

View File

@@ -3,7 +3,7 @@ package;
import kiss.Prelude;
import kiss.List;
import flash.display.BitmapData;
import flixel.addons.display.FlxExtendedSprite;
import kiss_flixel.KissExtendedSprite;
import flixel.text.FlxText;
import flixel.util.FlxSpriteUtil;
import nat.Entry;
@@ -16,4 +16,4 @@ import nat.components.Scale;
using kiss_flixel.CameraTools;
@:build(kiss.Kiss.build())
class EntrySprite extends FlxExtendedSprite {}
class EntrySprite extends KissExtendedSprite {}

View File

@@ -15,6 +15,15 @@
->[archive e pos &opt ui]
(unless (sprites.exists e.id)
(let [sprite (new EntrySprite this _playgroundKey pos archive e controller)]
(sprite.enableDragToSelect
->:Void {
(controller.AddSelectEntry e)
(sprite.updateColor)
}
->:Void {
(controller.DeSelectEntry e)
(sprite.updateColor)
})
(playState.entryGroup.add sprite)
(dictSet sprites e.id sprite)))
->[archive e pos e2 pos2 &opt ui]

View File

@@ -43,64 +43,6 @@
(set uiGroup.cameras [uiCamera])
(prop mouseDragCamera (new FlxCamera 0 0 FlxG.width FlxG.height))
(set mouseDragCamera.bgColor FlxColor.TRANSPARENT)
(FlxG.cameras.add mouseDragCamera false)
(prop mouseDragSprite (new FlxSprite 0 0))
(prop &mut :FlxPoint mouseDown null)
(mouseDragSprite.makeGraphic FlxG.width FlxG.height FlxColor.TRANSPARENT)
(set mouseDragSprite.cameras [mouseDragCamera])
(add mouseDragSprite)
(FlxMouseEventManager.add mouseDragSprite
// mouseDown
->s {
(set mouseDown (FlxG.mouse.getScreenPosition))
(let [&mut clickedOnSomething false]
(entryGroup.forEach
->:Void entrySprite
(when (.containsPoint (entrySprite.getScreenBounds) (FlxG.mouse.getScreenPosition))
(when (hasComponent entrySprite.e Circle)
(unless (entrySprite.pixelsOverlapPoint (FlxG.mouse.getWorldPosition))
(return)))
(set clickedOnSomething true)
(unless (controller.isSelected entrySprite.e)
(controller.SelectEntry entrySprite.e))))
(unless clickedOnSomething (controller.SelectEntries [])))
}
// mouseUp
->s {
(set mouseDown null)
(mouseDragSprite.makeGraphic FlxG.width FlxG.height FlxColor.TRANSPARENT true)
}
// mouseOver
->s {}
// mouseOut
->s {}
// also send events to sprites that overlap the dragging background
true
true
false)
(FlxMouseEventManager.setMouseMoveCallback mouseDragSprite
->s (when mouseDown (unless FlxMouseControl.isDragging
// draw the selection rectangle
(mouseDragSprite.makeGraphic FlxG.width FlxG.height FlxColor.TRANSPARENT true)
(let [curPos (FlxG.mouse.getScreenPosition)
x1 (min curPos.x mouseDown.x)
y1 (min curPos.y mouseDown.y)
x2 (max curPos.x mouseDown.x)
y2 (max curPos.y mouseDown.y)
selectWidth (- x2 x1)
selectHeight (- y2 y1)
rectangle (new FlxRect x1 y1 selectWidth selectHeight)]
(when (< 0 (+ selectWidth selectHeight))
(mouseDragSprite.drawRect x1 y1 selectWidth selectHeight FlxColor.TRANSPARENT (object color FlxColor.LIME)))
// Handle entry selection
(entryGroup.forEach ->entrySprite
(let [overlaps (rectangle.overlaps (entrySprite.getScreenBounds))]
(when !(= overlaps (controller.isSelected entrySprite.e))
(unless (hasComponent entrySprite.e Circle)
(controller.ToggleSelectEntry entrySprite.e)))))))))
(FlxG.camera.calculateScrollBounds entryGroup SCROLL_BOUND_MARGIN))
(method :Void showPrefixMap [:Map<String,ShortcutKey<Entry>> map]
@@ -158,7 +100,7 @@
// TODO allow changing the a scroll factor
// Control the UI camera with WASD, and the playground camera with arrow keys:
(var KEYBOARD_SCROLL_SPEED 200)
(var KEYBOARD_SCROLL_SPEED 800)
(FlxG.camera.updateKeyControl
elapsed
@@ -167,7 +109,7 @@
->{FlxG.keys.pressed.RIGHT}
->{FlxG.keys.pressed.UP}
->{FlxG.keys.pressed.DOWN})
(FlxG.camera.updateMouseBorderControl elapsed KEYBOARD_SCROLL_SPEED 0.15)
(FlxG.camera.updateMouseBorderControl elapsed KEYBOARD_SCROLL_SPEED 0.01)
(FlxG.camera.updateScrollWheelZoom elapsed 1)