armory/Sources/armory/logicnode/OnCanvasElementNode.hx
2020-05-14 17:34:39 +02:00

117 lines
2.7 KiB
Haxe

package armory.logicnode;
import armory.trait.internal.CanvasScript;
import iron.Scene;
#if arm_ui
import zui.Canvas.Anchor;
#end
class OnCanvasElementNode extends LogicNode {
var canvas: CanvasScript;
var element: String;
/**
* The event type this node should react to, can be "click" or "hover".
*/
public var property0: String;
/**
* If the event type is click, this property states whether to check for
* "down", "started" or "released" events.
*/
public var property1: String;
/**
* The mouse button that this node should react to. Only used when listening
* for mouse clicks.
*/
public var property2: String;
public function new(tree: LogicTree) {
super(tree);
tree.notifyOnUpdate(update);
}
#if arm_ui
function update() {
element = inputs[0].get();
// Ensure canvas is ready
if(!Scene.active.ready) return;
canvas = Scene.active.getTrait(CanvasScript);
if (canvas == null) canvas = Scene.active.camera.getTrait(CanvasScript);
if(canvas == null) return;
if (!canvas.ready) return;
if(canvas.getElement(element) == null) return;
if(canvas.getElement(element).visible == false) return;
var mouse = iron.system.Input.getMouse();
var isEvent = false;
if (property0 == "click") {
switch (property1) {
case "down":
isEvent = mouse.down(property2);
case "started":
isEvent = mouse.started(property2);
case "released":
isEvent = mouse.released(property2);
}
}
// Hovered
else {
isEvent = true;
}
if (isEvent)
{
var canvasElem = canvas.getElement(element);
var left = canvasElem.x;
var top = canvasElem.y;
var right = left + canvasElem.width;
var bottom = top + canvasElem.height;
var anchor = canvasElem.anchor;
var cx = canvas.getCanvas().width;
var cy = canvas.getCanvas().height;
var mouseX = mouse.x;
var mouseY = mouse.y;
switch(anchor)
{
case Top:
mouseX -= cx/2 - canvasElem.width/2;
case TopRight:
mouseX -= cx - canvasElem.width;
case CenterLeft:
mouseY -= cy/2 - canvasElem.height/2;
case Anchor.Center:
mouseX -= cx/2 - canvasElem.width/2;
mouseY -= cy/2 - canvasElem.height/2;
case CenterRight:
mouseX -= cx - canvasElem.width;
mouseY -= cy/2 - canvasElem.height/2;
case BottomLeft:
mouseY -= cy - canvasElem.height;
case Bottom:
mouseX -= cx/2 - canvasElem.width/2;
mouseY -= cy - canvasElem.height;
case BottomRight:
mouseX -= cx - canvasElem.width;
mouseY -= cy - canvasElem.height;
}
if((mouseX >= left) && (mouseX <= right))
{
if((mouseY >= top) && (mouseY <= bottom))
{
runOutput(0);
}
}
}
}
#else
function update() {}
#end
}