summaryrefslogtreecommitdiff
path: root/src/ui/button.moon
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/button.moon')
-rw-r--r--src/ui/button.moon131
1 files changed, 131 insertions, 0 deletions
diff --git a/src/ui/button.moon b/src/ui/button.moon
new file mode 100644
index 0000000..789ecae
--- /dev/null
+++ b/src/ui/button.moon
@@ -0,0 +1,131 @@
+
+s = require("ui.sprites")
+util = require("util")
+color = require("color")
+states = {"up","down"}
+rows = {"upper","mid","lower"}
+cols = {"left","mid","right"}
+class Button
+ --am.sprite() only works once the window is created
+ @initalized = false
+ @initalize: =>
+ for _, state, _, row, _, col in util.cartesian(states, rows, cols)
+ name = table.concat({state,row,col},"_")
+ assert(s["button_" .. name], "Failed to find sprite:" .. name)
+ @[name] = am.sprite(s["button_" .. name],"left","top")
+ @initalized = true
+ new: (x,y,w,h,text)=>
+ if not @@initalized
+ @@initalize!
+ @em = 16 -- width of a character
+ text = text or ""
+ assert(w > 15, "Button must have at least width 15")
+ @node = am.group!
+ position = am.translate(x,y+h)\tag("position")
+ @up_sprites = am.group!
+ position\append(@up_sprites)
+ @down_sprites = am.group!
+ @node\append(position)
+ @up_sprites\append(@@up_upper_left)
+ @up_sprites\append(
+ am.translate(@@up_upper_left.width,0)\append(
+ am.scale(w - @@up_upper_left.width - @@up_upper_right.width,1)\append(
+ @@up_upper_mid
+ )))
+ @up_sprites\append(
+ am.translate(w - @@up_upper_right.width, 0)\append(
+ @@up_upper_right
+ ))
+ mid_height = h - @@up_upper_left.height - @@up_lower_left.height
+ @up_sprites\append(
+ am.translate(0,-@@up_upper_left.height)\append(
+ am.scale(1,mid_height)\append(
+ @@up_mid_left
+ )))
+ @up_sprites\append(
+ am.translate(@@up_upper_left.width, -@@up_upper_left.height)\append(
+ am.scale(w - @@up_mid_left.width - @@up_mid_right.width, h - @@up_upper_mid.height - @@up_lower_mid.height)\append(
+ @@up_mid_mid
+ )))
+ @up_sprites\append(
+ am.translate(w - @@up_mid_right.width,-@@up_upper_right.height)\append(
+ am.scale(1,h - @@up_upper_right.height - @@up_lower_right.height)\append(
+ @@up_mid_right
+ )))
+ @up_sprites\append(
+ am.translate(0,-(h - @@up_lower_left.height))\append(
+ @@up_lower_left
+ ))
+ @up_sprites\append(
+ am.translate(@@up_lower_left.width,-(h - @@up_lower_mid.height))\append(
+ am.scale(w - @@up_lower_left.width - @@up_lower_right.width,1)\append(
+ @@up_lower_mid
+ )))
+ @up_sprites\append(
+ am.translate(w - @@up_lower_right.width, -(h - @@up_lower_right.height))\append(
+ @@up_lower_right
+ ))
+ @up_sprites\append(
+ am.translate(@@up_upper_left.width, -@@up_upper_right.height)\append(
+ am.text(text, "left","top", color.am_color.foreground)
+ ))
+ @down_sprites\append(@@down_upper_left)
+ @down_sprites\append(
+ am.translate(@@down_upper_left.width,0)\append(
+ am.scale(w - @@down_upper_left.width - @@down_upper_right.width,1)\append(
+ @@down_upper_mid
+ )))
+ @down_sprites\append(
+ am.translate(w - @@down_upper_right.width, 0)\append(
+ @@down_upper_right
+ ))
+ mid_height = h - @@down_upper_left.height - @@down_lower_left.height
+ @down_sprites\append(
+ am.translate(0,-@@down_upper_left.height)\append(
+ am.scale(1,mid_height)\append(
+ @@down_mid_left
+ )))
+ @down_sprites\append(
+ am.translate(@@down_upper_left.width, -@@down_upper_left.height)\append(
+ am.scale(w - @@down_mid_left.width - @@down_mid_right.width, h - @@down_upper_mid.height - @@down_lower_mid.height)\append(
+ @@down_mid_mid
+ )))
+ @down_sprites\append(
+ am.translate(w - @@down_mid_right.width,-@@down_upper_right.height)\append(
+ am.scale(1,h - @@down_upper_right.height - @@down_lower_right.height)\append(
+ @@down_mid_right
+ )))
+ @down_sprites\append(
+ am.translate(0,-(h - @@down_lower_left.height))\append(
+ @@down_lower_left
+ ))
+ @down_sprites\append(
+ am.translate(@@down_lower_left.width,-(h - @@down_lower_mid.height))\append(
+ am.scale(w - @@down_lower_left.width - @@down_lower_right.width,1)\append(
+ @@down_lower_mid
+ )))
+ @down_sprites\append(
+ am.translate(w - @@down_lower_right.width, -(h - @@down_lower_right.height))\append(
+ @@down_lower_right
+ ))
+ @text = am.text(text, "left","top", color.am_color.foreground)
+ position\append(
+ am.translate(@@down_upper_left.width, -@@down_upper_right.height)\append(
+ @text
+ ))
+ @depressed = false
+ down: () =>
+ @depressed = true
+ @.node("position")\replace(@up_sprites, @down_sprites)
+ up: () =>
+ @depressed = false
+ @.node("position")\replace(@down_sprites, @up_sprites)
+ fire: (e) =>
+ if e.event == "touches_began" or e.event == "mouse_down"
+ @down!
+ if @on
+ @on(e)
+ if e.event == "touches_ended" or e.event == "mouse_up"
+ @up!
+
+Button