-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuttonAPI.lua
More file actions
244 lines (180 loc) · 5.6 KB
/
buttonAPI.lua
File metadata and controls
244 lines (180 loc) · 5.6 KB
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
-- Updater Information **IGNORE**
apiVersion = "1.2"
function version()
return apiVersion
end
-- START OF PROGRAM
-- Array which holds the buttons
buttons = {}
-- Sets what side the monitor is on
function setMon(side)
m = peripheral.wrap(side)
end
-- Determines if a point is inside a rectangle
function ptinrect(x1, y1, x2, y2)
if (x >= x1) and (x <= x2) and (y >= y1) and (y <= y2) then
return true
else
return false
end
end
-- Prints text in the centre of a button
function cPrint(button)
butWidth1 = buttons[button].x2 - buttons[button].x1
butHeight = buttons[button].y2 - buttons[button].y1
textX1 = buttons[button].x1 + (butWidth1/2)
textX = (textX1 - (string.len(buttons[button].label)/2))
m.setCursorPos(textX + 1, buttons[button].y1 + (butHeight/2))
-- Set text color to the button-specific color
m.setTextColor(buttons[button].textColor)
m.write(buttons[button].label)
-- Reset text color
m.setTextColor(colors.white)
end
-- Adds a button to the array
function add(butName, butLabel, butMode, butX1, butY1, butX2, butY2, butColor, butSecColor, butTextColor, butFunc)
table.insert(buttons, {
name = butName,
label = butLabel,
x1 = butX1,
y1 = butY1,
x2 = butX2,
y2 = butY2,
color = butColor,
secColor = butSecColor,
textColor = butTextColor,
func = butFunc,
mode = butMode,
toggled = ""
})
end
-- Sets the toggled state of a button on "toggle" mode
function setState(butName, state)
for i = 1, #buttons do
if buttons[i].name == butName then
buttons[i].toggled = state
end
end
end
-- Allows a program to get the state of a button
function getState(butName)
for i = 1, #buttons do
if buttons[i].name == butName then
return buttons[i].toggled
end
end
end
-- Makes a button flash between two colors
function flash(button)
--Draw the button in its secondary color
m.setBackgroundColor(buttons[button].secColor)
for y = buttons[button].y1, buttons[button].y2 do
for x = buttons[button].x1, buttons[button].x2 do
m.setCursorPos(x, y)
m.write(" ")
end
end
cPrint(button)
sleep(0.15)
-- Draws the button in its primary color once again
m.setBackgroundColor(buttons[button].color)
for y = buttons[button].y1, buttons[button].y2 do
for x = buttons[button].x1, buttons[button].x2 do
m.setCursorPos(x, y)
m.write(" ")
end
end
cPrint(button)
m.setBackgroundColor(colors.black)
end
-- Toggles the button on or off depending on the variable in the array
function toggle(button)
-- If the button is on, turn it off
if buttons[button].toggled == true then
m.setBackgroundColor(buttons[button].secColor)
for y = buttons[button].y1, buttons[button].y2 do
for x = buttons[button].x1, buttons[button].x2 do
m.setCursorPos(x, y)
m.write(" ")
end
end
cPrint(button)
buttons[button].toggled = false
m.setBackgroundColor(colors.black)
-- If the button is off, turn it on
elseif buttons[button].toggled == false then
m.setBackgroundColor(buttons[button].color)
for y = buttons[button].y1, buttons[button].y2 do
for x = buttons[button].x1, buttons[button].x2 do
m.setCursorPos(x, y)
m.write(" ")
end
end
cPrint(button)
buttons[button].toggled = true
m.setBackgroundColor(colors.black)
else
error("You have not defined the state of the "..buttons[button].name.." button.")
end
end
-- Draws the buttons on the screen
function draw()
m.clear()
for button = 1, #buttons do
if buttons[button].mode == "flash" then
-- Sets the color of the button
m.setBackgroundColor(buttons[button].color)
-- Draws the button
for y = buttons[button].y1, buttons[button].y2 do
for x = buttons[button].x1, buttons[button].x2 do
m.setCursorPos(x, y)
m.write(" ")
end
end
cPrint(button)
-- Resets the background color
m.setBackgroundColor(colors.black)
elseif buttons[button].mode == "toggle" then
if buttons[button].toggled == true then
m.setBackgroundColor(buttons[button].color)
for y = buttons[button].y1, buttons[button].y2 do
for x = buttons[button].x1, buttons[button].x2 do
m.setCursorPos(x, y)
m.write(" ")
end
end
cPrint(button)
m.setBackgroundColor(colors.black)
elseif buttons[button].toggled == false then
m.setBackgroundColor(buttons[button].secColor)
for y = buttons[button].y1, buttons[button].y2 do
for x = buttons[button].x1, buttons[button].x2 do
m.setCursorPos(x, y)
m.write(" ")
end
end
cPrint(button)
m.setBackgroundColor(colors.black)
else
error("You have not defined a mode for this button.")
end
end
end
end
-- Waits for a touch on an adjacent advanced monitor and responds accordingly
function check()
event, side, x, y = os.pullEvent("monitor_touch")
-- Match it to a button and execute the function
for button = 1, #buttons do
if ptinrect(buttons[button].x1, buttons[button].y1, buttons[button].x2, buttons[button].y2) then
if buttons[button].mode == "flash" then
flash(button)
elseif buttons[button].mode == "toggle" then
toggle(button)
else
error("You have not defined a mode for this button.")
end
buttons[button].func()
end
end
end