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