summaryrefslogtreecommitdiff
path: root/src/ui/button.moon
blob: 789ecae998430885dfeabb1fc5e872df5864a8e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
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