From ca6a03cbebbf30768ac1d96b6affcb11c67affab Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Mon, 20 Jun 2022 16:20:48 +0000 Subject: [PATCH] NAT playground rectangle selection --- .../source/EntrySprite.kiss | 2 +- .../source/PlayState.hx | 4 +- .../source/PlayState.kiss | 51 ++++++++++++++++++- 3 files changed, 54 insertions(+), 3 deletions(-) diff --git a/projects/nat-flixel-desktop-playground/source/EntrySprite.kiss b/projects/nat-flixel-desktop-playground/source/EntrySprite.kiss index 81753ce1..7505fcfe 100644 --- a/projects/nat-flixel-desktop-playground/source/EntrySprite.kiss +++ b/projects/nat-flixel-desktop-playground/source/EntrySprite.kiss @@ -21,7 +21,7 @@ (enableMouseDrag) })) - (set mousePressedCallback + **(set mousePressedCallback ->[self _x _y] { (controller.ToggleSelectEntry e) diff --git a/projects/nat-flixel-desktop-playground/source/PlayState.hx b/projects/nat-flixel-desktop-playground/source/PlayState.hx index 883b060f..97b2bc6f 100644 --- a/projects/nat-flixel-desktop-playground/source/PlayState.hx +++ b/projects/nat-flixel-desktop-playground/source/PlayState.hx @@ -12,10 +12,12 @@ import flixel.addons.ui.FlxInputText; import flixel.addons.ui.FlxUIPopup; import flixel.text.FlxText; import flixel.util.FlxColor; +using flixel.util.FlxSpriteUtil; import flixel.FlxCamera; import flixel.math.FlxVector; +import flixel.math.FlxRect; import flixel.addons.plugin.FlxMouseControl; - +import flixel.input.mouse.FlxMouseEventManager; using StringTools; @:build(kiss.Kiss.build()) diff --git a/projects/nat-flixel-desktop-playground/source/PlayState.kiss b/projects/nat-flixel-desktop-playground/source/PlayState.kiss index cd1c83d9..e5be6555 100644 --- a/projects/nat-flixel-desktop-playground/source/PlayState.kiss +++ b/projects/nat-flixel-desktop-playground/source/PlayState.kiss @@ -26,7 +26,7 @@ (prop &mut :FlxGroup uiGroup (new FlxGroup)) (add uiGroup) - (prop :FlxGroup entryGroup (new FlxGroup)) + (prop :FlxTypedGroup entryGroup (new FlxTypedGroup)) (add entryGroup) (prop uiCamera (new FlxCamera 0 0 FlxG.width FlxG.height)) @@ -35,6 +35,55 @@ (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)) + (controller.SelectEntries []) + (entryGroup.forEach + ->entrySprite + (when (.containsPoint (entrySprite.getScreenBounds) (FlxG.mouse.getScreenPosition)) + (controller.SelectEntry entrySprite.e))) + } + // mouseUp + ->s { + (set mouseDown null) + (mouseDragSprite.makeGraphic FlxG.width FlxG.height FlxColor.TRANSPARENT true) + } + // mouseOver + ->s {} + // mouseOut + ->s {} + 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)] + (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)) + (controller.ToggleSelectEntry entrySprite.e)))))))) + // make text-only sprites for entries that have no images: (archive.addSystem (new TextSpriteSystem))