hc = require("party.hardoncollider.init") win = require("window") log = require("log") 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 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 textbox 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) --log.info("Found button under mouse:" .. tostring(match), {"ui","mouseover"}) match\fire(mo_tbl) if down log.info("Found button under mouse:" .. tostring(match), {"ui","mousedown"}) match\fire(md_tbl) if up log.info("Found button under mouse:" .. tostring(match), {"ui","mouseup"}) 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