diff options
Diffstat (limited to 'src/ui.moon')
| -rw-r--r-- | src/ui.moon | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/src/ui.moon b/src/ui.moon new file mode 100644 index 0000000..7a06522 --- /dev/null +++ b/src/ui.moon @@ -0,0 +1,127 @@ +hc = require("party.hardoncollider.init") +win = require("window") +Button = require("ui.button") +Joystick = require("ui.joystick") +Textbox = require("ui.textbox") + +ui_world = hc.new(64) + +ui = {} +ui.events = { + touch: {} + mouse: {} + controller: {} + keyboard: {} +} +ui.button = (x,y,width,height,text) -> + button = Button(x,y,width,height,text) + ui.node\append(button.node) + bounds = ui_world\rectangle(x,y,width,height) + ui.events.touch[bounds] = button + ui.events.mouse[bounds] = button + button + +ui.click = (x,y) -> + ui_world\shapesAt(x,y) + +ui.joystick = (x,y,r) -> + joystick = Joystick(x,y,r) + ui.node\append(joystick.node) + bounds = ui_world\circle(x,y,r) + ui.events.touch[bounds] = joystick + +ui.textbox = (x,y,width,height,value,placeholder) -> + value = value or "" + placeholder = placeholder or "" + textbox = Textbox(x,y,width,height,value,placeholder) + ui.node\append(textbox.node) + bounds = ui_world\rectangle(x,y,width,height) + ui.events.mouse[bounds] = textbox + ui.events.keyboard[textbox] = true + + +ui.node = am.group! + +has_fire = (obj) -> + assert(obj.fire, obj.__class.__name .. " doesn't have a .fire method") + +ui.dbg = am.translate(0,0)\append(am.circle(vec2(0,0),5,vec4(0,0,0,1))) +ui.node\append(ui.dbg) + +ui.node\action(() -> + pos = win\mouse_position() + down = win\mouse_pressed("left") + up = win\mouse_released("left") + wheel = win\mouse_wheel_delta() + keys = win\keys_pressed() + -- Debugging for mouse position: + ui.dbg.position2d = pos + mo_tbl = + event: "mouse_over" + data: pos + md_tbl = + event: "mouse_down" + data: pos + mu_tbl = + event: "mouse_up" + data: pos + for collider,_ in pairs(ui_world\shapesAt(pos.x, pos.y)) + match = ui.events.mouse[collider] + if match + has_fire(match) + match\fire(mo_tbl) + if down + match\fire(md_tbl) + if up + match\fire(mu_tbl) + if math.length(wheel) > 0 + etbl = + event: "mouse_scroll" + data: wheel + for collider, uiobj in pairs(ui.events.mouse) + has_fire(uiobj) + uiobj\fire(etbl) + if #keys > 0 + etbl = + event: "keys_pressed" + data: keys + shift: win\key_down("lshift") or win\key_down("rshift") + for uiobj, _ in pairs(ui.events.keyboard) + has_fire(uiobj) + if uiobj\fire(etbl) + break -- allow any keyboard listener to "trap" the signal by returning true + +-- in_touch_events = { +-- "active_touch" +-- "touches_began" +-- } +-- for touch in *win\active_touches! +-- tpos = win\touch_position(touch) +-- etbl = +-- event: "active_touch" +-- data: tpos +-- for collider,_ in pairs(ui_world\shapesAt(tpos.x, tpos.y)) +-- print("Touched collider:", collider) +-- match = ui.events.touch[collider] +-- if match +-- has_fire(match) +-- match\fire(etbl) +-- delta = win\touch_delta(touch) +-- if math.length(delta) > 0 +-- dtbl = +-- event: "touch_delta" +-- data: delta +-- for _, uiobj in pairs(ui.events.touch) +-- has_fire(uiobj) +-- uiobj\fire(dtbl) +-- for touch in *win\touches_ended! +-- etbl = +-- event: "touches_ended" +-- data: win\touch_position(touch) +-- for _,uiobj in pairs(ui.events.touch) +-- has_fire(uiobj) +-- uiobj\fire(etbl) + -- todo: expand this with controller support. +) + +ui |
