summaryrefslogtreecommitdiff
path: root/src/ui.moon
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui.moon')
-rw-r--r--src/ui.moon127
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