pass events to ui element
This commit is contained in:
parent
bddb80c42d
commit
3b6bc85271
@ -1,10 +0,0 @@
|
||||
package lib.ui.reactive;
|
||||
|
||||
using tink.CoreApi;
|
||||
|
||||
import util.Vec.Vec2;
|
||||
|
||||
interface IElement {
|
||||
public function render(bounds:Vec2<Int>):Canvas;
|
||||
public var changed(default, null):Signal<Noise>;
|
||||
}
|
@ -1,31 +1,48 @@
|
||||
package lib.ui.reactive;
|
||||
|
||||
import util.Rect;
|
||||
import kernel.Log;
|
||||
import util.Color;
|
||||
import util.Vec.Vec2;
|
||||
import kernel.ui.WindowContext;
|
||||
|
||||
using tink.CoreApi;
|
||||
|
||||
class ReactiveUI {
|
||||
private final context:WindowContext;
|
||||
private final children:Array<IElement>;
|
||||
private final children:Array<UIElement>;
|
||||
private var elementMap: Map<Rect,UIElement> = new Map();
|
||||
|
||||
public function new(context:WindowContext, children:Array<IElement>) {
|
||||
public function new(context:WindowContext, children:Array<UIElement>) {
|
||||
this.context = context;
|
||||
this.children = children;
|
||||
|
||||
for (child in children) {
|
||||
child.changed.handle(v -> {
|
||||
child.changed.handle(_ -> {
|
||||
context.reset();
|
||||
render();
|
||||
});
|
||||
}
|
||||
|
||||
setupEvents();
|
||||
}
|
||||
|
||||
private function setupEvents() {
|
||||
context.clickSignal.handle(params ->{
|
||||
for (k => v in this.elementMap){
|
||||
if (k.isInside(params.pos)){
|
||||
v.handleClickEvent(params.pos,params.button);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public function render() {
|
||||
var size = context.getSize();
|
||||
var result = renderChildren(children, size);
|
||||
this.elementMap = result.map;
|
||||
|
||||
var screen = renderChildren(children, size);
|
||||
|
||||
writeToContext(screen);
|
||||
writeToContext(result.canvas);
|
||||
}
|
||||
|
||||
private function writeToContext(screen:Canvas) {
|
||||
@ -62,8 +79,9 @@ class ReactiveUI {
|
||||
}
|
||||
}
|
||||
|
||||
public static function renderChildren(children:Array<IElement>, bounds:Vec2<Int>):Canvas {
|
||||
var rtn:Canvas = new Canvas();
|
||||
public static function renderChildren(children:Array<UIElement>, bounds:Vec2<Int>):{canvas: Canvas, map: Map<Rect,UIElement>} {
|
||||
var canvas:Canvas = new Canvas();
|
||||
var elementMap: Map<Rect,UIElement> = new Map();
|
||||
|
||||
var writePoint:Vec2<Int> = {x: 0, y: 0};
|
||||
|
||||
@ -79,11 +97,12 @@ class ReactiveUI {
|
||||
y: bounds.y - writePoint.y
|
||||
});
|
||||
|
||||
rtn.combine(childRender, writePoint);
|
||||
canvas.combine(childRender, writePoint);
|
||||
elementMap.set(new Rect(writePoint,{x: childRender.maxWidth(), y: writePoint.y + childRender.hight()}),child);
|
||||
|
||||
writePoint = {x: 0, y: writePoint.y + childRender.hight()};
|
||||
}
|
||||
|
||||
return rtn;
|
||||
return {canvas: canvas,map: elementMap};
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,7 @@
|
||||
package lib.ui.reactive;
|
||||
|
||||
import kernel.Log;
|
||||
import kernel.ButtonType;
|
||||
import util.Observable;
|
||||
using tink.CoreApi;
|
||||
|
||||
@ -7,17 +9,13 @@ import util.Color;
|
||||
import util.Vec.Vec2;
|
||||
import util.MathI;
|
||||
|
||||
class TextElement implements IElement {
|
||||
public var changed(default, null):Signal<Noise>;
|
||||
|
||||
private var changedTrigger:SignalTrigger<Noise>;
|
||||
|
||||
class TextElement extends UIElement {
|
||||
private final text:Observable<String>;
|
||||
private final bg:Color;
|
||||
private final fg:Color;
|
||||
|
||||
public function new(text:Observable<String>, ?background:Color = Black, ?textColor:Color = White) {
|
||||
setupTrigger();
|
||||
super();
|
||||
|
||||
this.text = text;
|
||||
this.bg = background;
|
||||
@ -28,11 +26,6 @@ class TextElement implements IElement {
|
||||
});
|
||||
}
|
||||
|
||||
private function setupTrigger() {
|
||||
changedTrigger = Signal.trigger();
|
||||
changed = changedTrigger.asSignal();
|
||||
}
|
||||
|
||||
public function render(bounds:Vec2<Int>):Canvas {
|
||||
var rtn = new Canvas();
|
||||
|
||||
@ -45,4 +38,8 @@ class TextElement implements IElement {
|
||||
|
||||
return rtn;
|
||||
}
|
||||
|
||||
public override function handleClickEvent(pos: Vec2<Int>,button: ButtonType):Void {
|
||||
Log.debug('Click: ${this.text.get()}');
|
||||
}
|
||||
}
|
||||
|
20
src/lib/ui/reactive/UIElement.hx
Normal file
20
src/lib/ui/reactive/UIElement.hx
Normal file
@ -0,0 +1,20 @@
|
||||
package lib.ui.reactive;
|
||||
|
||||
import kernel.Log;
|
||||
import kernel.ButtonType;
|
||||
import util.Vec.Vec2;
|
||||
|
||||
using tink.CoreApi;
|
||||
|
||||
abstract class UIElement {
|
||||
abstract public function render(bounds:Vec2<Int>):Canvas;
|
||||
public var changed(default, null):Signal<Noise>;
|
||||
private final changedTrigger:SignalTrigger<Noise> = Signal.trigger();
|
||||
|
||||
public function new() {
|
||||
changed = changedTrigger.asSignal();
|
||||
}
|
||||
|
||||
public function handleClickEvent(pos: Vec2<Int>,button: ButtonType):Void {
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user