From 92deb7177fe5fa0223a49cb459065b0d66e574a9 Mon Sep 17 00:00:00 2001 From: Niklas Kapelle Date: Sun, 21 Jan 2024 20:50:08 +0100 Subject: [PATCH] added ui events to LayerdRootElement --- src/lib/ui/elements/EventMap.hx | 22 ++++++++++++++-------- src/lib/ui/elements/LayerdRootElement.hx | 9 +++++++-- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/lib/ui/elements/EventMap.hx b/src/lib/ui/elements/EventMap.hx index 8fba7a3..d0e2d4f 100644 --- a/src/lib/ui/elements/EventMap.hx +++ b/src/lib/ui/elements/EventMap.hx @@ -2,25 +2,31 @@ package lib.ui.elements; import lib.ui.rendere.UIEventDelegate; -abstract EventMap(List<{bound:Rect, delegate:UIEventDelegate}>) { - inline public function new(?i:List<{bound:Rect, delegate:UIEventDelegate}>) { +/** + Find the responsable UIElement to handle the event based on position. Element can be layerd. + Elements added first are lower in the layer. +**/ +abstract EventMap(Array<{bound:Rect, delegate:UIEventDelegate}>) { + inline public function new(?i:Array<{bound:Rect, delegate:UIEventDelegate}>) { if (i == null) { - this = new List<{bound:Rect, delegate:UIEventDelegate}>(); + this = new Array<{bound:Rect, delegate:UIEventDelegate}>(); } else { this = i; } } public function findResponseableDelegate(pos:Pos):UIEventDelegate { - for (i in this) { - if (i.bound.isInside(pos)) { - return i.delegate; + for (i in 0...this.length) { + var newi = (this.length - 1) - i; + var element = this[newi]; + if (element.bound.isInside(pos)) { + return element.delegate; } } return null; } - public function addElement(element:UIEventDelegate, bound:Rect) { - this.add({bound: bound, delegate: element}); + public inline function addElement(element:UIEventDelegate, bound:Rect) { + this.push({bound: bound, delegate: element}); } } diff --git a/src/lib/ui/elements/LayerdRootElement.hx b/src/lib/ui/elements/LayerdRootElement.hx index c9659cb..0cb8db5 100644 --- a/src/lib/ui/elements/LayerdRootElement.hx +++ b/src/lib/ui/elements/LayerdRootElement.hx @@ -17,11 +17,16 @@ class LayerdRootElement implements UIElement { } public function render(bounds:Pos):Canvas { - // TODO: add event handle + this.eventManager.clearMap(); + var stack = new CanvasStack(); for (child in this.children) { - stack.addLayer(child.element.render(bounds), child.offset); + var canvas = child.element.render(bounds); + var bound = canvas.getBounds(); + bound.offset(child.offset); + eventManager.addMapElement(child.element, bound); + stack.addLayer(canvas, child.offset); } return stack.compress();