Commit 3ef575ee7b1d42fb1a64b0b101fabc3d7ddb38d4
0 parents
Initial checkin
Showing
11 changed files
with
856 additions
and
0 deletions
calcui-hotkey.lua
0 → 100644
1 | +++ a/calcui-hotkey.lua | |
1 | +data:extend({ | |
2 | + { | |
3 | + type = "custom-input", | |
4 | + name = "calcui_hotkey", | |
5 | + key_sequence = "CONTROL + N", | |
6 | + consuming = "none" | |
7 | + }, | |
8 | + { | |
9 | + type = "custom-input", | |
10 | + name = "calcui_toggle", | |
11 | + key_sequence = "CONTROL + ENTER", | |
12 | + consuming = "none" | |
13 | + } | |
14 | +} | |
15 | +) | |
0 | 16 | \ No newline at end of file | ... | ... |
calcui-prototypes.lua
0 → 100644
1 | +++ a/calcui-prototypes.lua | |
1 | +-- calc-ui-prototypes.lua | |
2 | + | |
3 | +data:extend({ | |
4 | + { | |
5 | + type = "shortcut", | |
6 | + name = "calcui_4func", | |
7 | + order = "b[blueprints]-h[calculator-ui]", | |
8 | + action = "lua", | |
9 | + toggleable = true, | |
10 | + icon = | |
11 | + { | |
12 | + filename = "__calculator-ui__/graphics/calculator.png", | |
13 | + priority = "extra-high-no-scale", | |
14 | + size = 64, | |
15 | + scale = 1, | |
16 | + flags = {"icon"} | |
17 | + } | |
18 | + } | |
19 | +}) | |
0 | 20 | \ No newline at end of file | ... | ... |
calcui-styles.lua
0 → 100644
1 | +++ a/calcui-styles.lua | |
1 | +-- calc-ui-styles.lua | |
2 | + | |
3 | +local default_gui = data.raw["gui-style"].default | |
4 | + | |
5 | +default_gui.calcui_sprite_obj_style = { | |
6 | + type = "button_style", | |
7 | + -- parent="button_style", | |
8 | + top_padding = 0, | |
9 | + right_padding = 0, | |
10 | + bottom_padding = 0, | |
11 | + left_padding = 0, | |
12 | + height = 32, | |
13 | + width = 32, | |
14 | + scalable = false | |
15 | +} | |
16 | + | |
17 | +default_gui.calcui_button_style = { | |
18 | + type = "button_style", | |
19 | + -- parent="button_style", | |
20 | + top_padding = 0, | |
21 | + right_padding = 0, | |
22 | + bottom_padding = 0, | |
23 | + left_padding = 0, | |
24 | + height = 50, | |
25 | + width = 50, | |
26 | + scalable = false | |
27 | +} | |
28 | + | |
29 | +default_gui.calcui_textfield_style = { | |
30 | + type = "textbox_style", | |
31 | + width = 212 | |
32 | +} | |
33 | + | |
34 | +default_gui.calcui_table_style = { | |
35 | + type = "table_style", | |
36 | + horizontal_spacing = 5, | |
37 | + vertical_spacing = 1, | |
38 | + resize_row_to_width = false, | |
39 | + resize_to_row_height = false, | |
40 | +} | |
41 | + | |
42 | +default_gui.calcui_scroll_pane_style = { | |
43 | + type = "scroll_pane_style", | |
44 | + -- parent="scroll_pane_style", | |
45 | + -- flow_style = | |
46 | + -- { | |
47 | + -- type = "flow_style", | |
48 | + -- parent = "flow_style" | |
49 | + -- }, | |
50 | + resize_row_to_width = true, | |
51 | + resize_to_row_height = false, | |
52 | + minimal_height=128, | |
53 | + maximal_height=400, | |
54 | + max_on_row = 1, | |
55 | +} | |
56 | + | |
57 | +data:extend({ | |
58 | + { | |
59 | + type = "sprite", | |
60 | + name = "sprite_calcui_rant", | |
61 | + filename = "__calculator-ui__/graphics/nilausRant.png", | |
62 | + width = 56, | |
63 | + height = 56 | |
64 | + }, | |
65 | + { | |
66 | + type = "sprite", | |
67 | + name = "sprite_calcui_calculator", | |
68 | + filename = "__calculator-ui__/graphics/calculator.png", | |
69 | + width = 64, | |
70 | + height = 64 | |
71 | + } | |
72 | +}) | |
0 | 73 | \ No newline at end of file | ... | ... |
calculator.lua
0 → 100644
1 | +++ a/calculator.lua | |
1 | +-- calculator.lua | |
2 | + | |
3 | +-- ---------------------------------------------------------------- | |
4 | +local function get_gui_root(player) | |
5 | + return player.gui.screen | |
6 | +end | |
7 | + | |
8 | +-- ---------------------------------------------------------------- | |
9 | +function show_rant(player, enabled) | |
10 | + local root = get_gui_root(player) | |
11 | + | |
12 | + if enabled then | |
13 | + root.calcui.calcui_table.calcui_table_col2.calcui_rant.sprite = "sprite_calcui_rant" | |
14 | + root.calcui.calcui_table.calcui_table_col2.calcui_scroll_pane.style.height = 196 | |
15 | + else | |
16 | + root.calcui.calcui_table.calcui_table_col2.calcui_rant.sprite = nil | |
17 | + root.calcui.calcui_table.calcui_table_col2.calcui_scroll_pane.style.height = 252 | |
18 | + end | |
19 | +end | |
20 | + | |
21 | +-- ---------------------------------------------------------------- | |
22 | +local function destroy_calculator(player) | |
23 | + local root = get_gui_root(player) | |
24 | + if root.calcui then | |
25 | + root.calcui.destroy() | |
26 | + end | |
27 | +end | |
28 | + | |
29 | +-- ---------------------------------------------------------------- | |
30 | +function show_calculator(player) | |
31 | + local root = get_gui_root(player) | |
32 | + destroy_calculator(player) | |
33 | + | |
34 | + local calcui = root.add({ | |
35 | + type = "frame", | |
36 | + name = "calcui", | |
37 | + style = "dialog_frame", | |
38 | + direction = "vertical" | |
39 | + }) | |
40 | + | |
41 | + local flow = calcui.add({ | |
42 | + type = "flow", | |
43 | + name = "calcui_flow" | |
44 | + }) | |
45 | + flow.style.horizontally_stretchable = "on" | |
46 | + | |
47 | + flow.add({ | |
48 | + type = "label", | |
49 | + caption = {"calculator-ui.title"}, | |
50 | + style = "frame_title" | |
51 | + }).drag_target = calcui | |
52 | + | |
53 | + local widget = flow.add({ | |
54 | + type = "empty-widget", | |
55 | + style = "draggable_space_header", | |
56 | + name = "calcui_drag" | |
57 | + }) | |
58 | + widget.drag_target = calcui | |
59 | + widget.style.horizontally_stretchable = "on" | |
60 | + widget.style.minimal_width = 24 | |
61 | + widget.style.natural_height = 24 | |
62 | + | |
63 | + flow.add({ | |
64 | + type = "sprite-button", | |
65 | + sprite = "utility/close_white", | |
66 | + style = "frame_action_button", | |
67 | + name = "calcui_close" | |
68 | + }) | |
69 | + | |
70 | + local table = calcui.add({ | |
71 | + type = "table", | |
72 | + name = "calcui_table", | |
73 | + column_count = "2", | |
74 | + vertical_centering = "false" | |
75 | + }) | |
76 | + | |
77 | + local col1 = table.add({ | |
78 | + type = "flow", | |
79 | + name = "calcui_table_col1", | |
80 | + direction = "vertical" | |
81 | + }) | |
82 | + | |
83 | + local display = col1.add({ | |
84 | + type = "textfield", | |
85 | + style = "calcui_textfield_style", | |
86 | + caption = "", | |
87 | + name = "calcui_display" | |
88 | + }) | |
89 | + | |
90 | + local row1 = col1.add({type="flow", name="calcui_col1_row1", direction="horizontal"}) | |
91 | + row1.add({type="button", style="calcui_button_style", caption="CE", name="calcui_button_CE"}) -- CE = Clear Entry (just this line) | |
92 | + row1.add({type="button", style="calcui_button_style", caption="C", name="calcui_button_C"}) -- C = Clear (all, past results as well) | |
93 | + row1.add({type="button", style="calcui_button_style", caption="BS", name="calcui_button_BS"}) | |
94 | + row1.add({type="button", style="calcui_button_style", caption="/", name="calcui_button_DIV"}) | |
95 | + | |
96 | + local row2 = col1.add({type="flow", name="calcui_col1_row2", direction="horizontal"}) | |
97 | + row2.add({type="button", style="calcui_button_style", caption="7", name="calcui_button_7"}) | |
98 | + row2.add({type="button", style="calcui_button_style", caption="8", name="calcui_button_8"}) | |
99 | + row2.add({type="button", style="calcui_button_style", caption="9", name="calcui_button_9"}) | |
100 | + row2.add({type="button", style="calcui_button_style", caption="*", name="calcui_button_MUL"}) | |
101 | + | |
102 | + local row3 = col1.add({type="flow", name="calcui_col1_row3", direction="horizontal"}) | |
103 | + row3.add({type="button", style="calcui_button_style", caption="4", name="calcui_button_4"}) | |
104 | + row3.add({type="button", style="calcui_button_style", caption="5", name="calcui_button_5"}) | |
105 | + row3.add({type="button", style="calcui_button_style", caption="6", name="calcui_button_6"}) | |
106 | + row3.add({type="button", style="calcui_button_style", caption="-", name="calcui_button_SUB"}) | |
107 | + | |
108 | + local row4 = col1.add({type="flow", name="calcui_col1_row4", direction="horizontal"}) | |
109 | + row4.add({type="button", style="calcui_button_style", caption="1", name="calcui_button_1"}) | |
110 | + row4.add({type="button", style="calcui_button_style", caption="2", name="calcui_button_2"}) | |
111 | + row4.add({type="button", style="calcui_button_style", caption="3", name="calcui_button_3"}) | |
112 | + row4.add({type="button", style="calcui_button_style", caption="+", name="calcui_button_ADD"}) | |
113 | + | |
114 | + local row5 = col1.add({type="flow", name="calcui_col1_row5", direction="horizontal"}) | |
115 | + row5.add({type="button", style="calcui_button_style", caption="%", name="calcui_button_PERC"}) | |
116 | + row5.add({type="button", style="calcui_button_style", caption="0", name="calcui_button_0"}) | |
117 | + row5.add({type="button", style="calcui_button_style", caption=".", name="calcui_button_DOT"}) | |
118 | + row5.add({type="button", style="calcui_button_style", caption="=", name="calcui_button_EQU"}) | |
119 | + | |
120 | + | |
121 | + local col2 = table.add({ | |
122 | + type = "flow", | |
123 | + name = "calcui_table_col2", | |
124 | + direction = "vertical" | |
125 | + }) | |
126 | + | |
127 | + local result = col2.add({ | |
128 | + type = "label", | |
129 | + caption = "= ", | |
130 | + name = "calcui_display_result" | |
131 | + }) | |
132 | + result.style.font = "default-large" | |
133 | + | |
134 | + local rant = col2.add({ | |
135 | + type = "sprite", | |
136 | + name = "calcui_rant" | |
137 | + }) | |
138 | + | |
139 | + col2.add({ | |
140 | + type = "line", | |
141 | + direction = "horizontal" | |
142 | + }) | |
143 | + | |
144 | + local scroll = col2.add({ | |
145 | + type = "scroll-pane", | |
146 | + name = "calcui_scroll_pane" | |
147 | + }) | |
148 | + scroll.style.height = 252 | |
149 | + | |
150 | + local recents = scroll.add({ | |
151 | + type = "table", | |
152 | + caption = "", | |
153 | + name = "calcui_result_table", | |
154 | + column_count = "2" | |
155 | + }) | |
156 | + recents.style.column_alignments[1] = "right" | |
157 | + | |
158 | + | |
159 | + -- center the gui | |
160 | + calcui.force_auto_center() | |
161 | +end | |
162 | + | |
163 | +-- ---------------------------------------------------------------- | |
164 | +function hide_calculator(player) | |
165 | + destroy_calculator(player) | |
166 | +end | |
167 | + | |
168 | +-- ---------------------------------------------------------------- | |
169 | +function toggle_calculator(player) | |
170 | + local root = get_gui_root(player) | |
171 | + if root and root.calcui then | |
172 | + hide_calculator(player) | |
173 | + else | |
174 | + show_calculator(player) | |
175 | + end | |
176 | +end | |
177 | + | |
178 | +-- ---------------------------------------------------------------- | |
179 | +function clear_equation(player) | |
180 | + local root = get_gui_root(player) | |
181 | + root.calcui.calcui_table.calcui_table_col1.calcui_display.text = "" | |
182 | +end | |
183 | + | |
184 | +-- ---------------------------------------------------------------- | |
185 | +function process_ce_key(player, button) | |
186 | + local root = get_gui_root(player) | |
187 | + clear_equation(player) | |
188 | + root.calcui.calcui_table.calcui_table_col2.calcui_display_result.caption = "=" | |
189 | +end | |
190 | + | |
191 | +-- ---------------------------------------------------------------- | |
192 | +function process_c_key(player, button) | |
193 | + local root = get_gui_root(player) | |
194 | + process_ce_key(player, button) | |
195 | + root.calcui.calcui_table.calcui_table_col2.calcui_scroll_pane.calcui_result_table.clear() | |
196 | +end | |
197 | + | |
198 | +-- ---------------------------------------------------------------- | |
199 | +function process_backspace_key(player, button) | |
200 | + local root = get_gui_root(player) | |
201 | + root.calcui.calcui_table.calcui_table_col1.calcui_display.text = string.sub(root.calcui.calcui_table.calcui_table_col1.calcui_display.text, 1, -2) | |
202 | +end | |
203 | + | |
204 | +-- ---------------------------------------------------------------- | |
205 | +function fix_equation(equation) | |
206 | + local result = equation | |
207 | + | |
208 | + -- fix math library shortcuts | |
209 | + local math_lib = { | |
210 | + ["abs"] = "math.abs", | |
211 | + ["acos"] = "math.acos", | |
212 | + ["asin"] = "math.asin", | |
213 | + ["atan"] = "math.atan", | |
214 | + ["ceil"] = "math.ceil", | |
215 | + ["floor"] = "math.floor", | |
216 | + ["cos"] = "math.cos", | |
217 | + ["sin"] = "math.sin", | |
218 | + ["tan"] = "math.tan", | |
219 | + ["deg"] = "math.deg", | |
220 | + ["rad"] = "math.rad", | |
221 | + ["exp"] = "math.log", | |
222 | + ["exp"] = "math.log", | |
223 | + ["min"] = "math.min", | |
224 | + ["max"] = "math.max", | |
225 | + ["modf"] = "math.modf", | |
226 | + ["sqrt"] = "math.sqrt", | |
227 | + ["huge"] = "math.huge", | |
228 | + ["pi"] = "math.pi" | |
229 | + } | |
230 | + for key, val in pairs(math_lib) do | |
231 | + result = result:gsub(key, val) | |
232 | + end | |
233 | + | |
234 | + -- fix percentage | |
235 | + result = result:gsub("(%%)", "/100") | |
236 | + | |
237 | + return result | |
238 | +end | |
239 | + | |
240 | +-- ---------------------------------------------------------------- | |
241 | +function process_equal_key(player, button) | |
242 | + local root = get_gui_root(player) | |
243 | + | |
244 | + local original_equation = root.calcui.calcui_table.calcui_table_col1.calcui_display.text; | |
245 | + | |
246 | + equation = fix_equation(original_equation) | |
247 | + | |
248 | + -- just testing | |
249 | + --root.calcui.calcui_table.calcui_table_col1.calcui_display.text = equation | |
250 | + | |
251 | + if not (equation == nil or equation == "") then | |
252 | + local status, retval = pcall(function() | |
253 | + return load("return " .. equation)() | |
254 | + end) | |
255 | + root.calcui.calcui_table.calcui_table_col2.calcui_display_result.tooltip = retval | |
256 | + status, retval = pcall(function() | |
257 | + return tonumber(string.format("%." .. settings.get_player_settings(player)["calcui-decimal-places"].value .. "f", retval)) | |
258 | + end) | |
259 | + if retval == nil or retval == "" then | |
260 | + status = false | |
261 | + end | |
262 | + if not status then | |
263 | + retval = "NaN" | |
264 | + show_rant(player, true) | |
265 | + else | |
266 | + if retval <= 0 then | |
267 | + show_rant(player, true) | |
268 | + else | |
269 | + show_rant(player, false) | |
270 | + end | |
271 | + end | |
272 | + root.calcui.calcui_table.calcui_table_col2.calcui_display_result.caption = "= " .. retval | |
273 | + | |
274 | + -- only write in recent table if actually a result | |
275 | + if status then | |
276 | + -- check last equation and only insert if not the same | |
277 | + local item_size = #root.calcui.calcui_table.calcui_table_col2.calcui_scroll_pane.calcui_result_table.children | |
278 | + | |
279 | + if item_size == 0 or root.calcui.calcui_table.calcui_table_col2.calcui_scroll_pane.calcui_result_table.children[item_size-1].caption ~= original_equation then | |
280 | + local recent_equation = root.calcui.calcui_table.calcui_table_col2.calcui_scroll_pane.calcui_result_table.add({ | |
281 | + type = "label", | |
282 | + name = "calcui_recent_equation_" .. item_size, | |
283 | + caption = original_equation, | |
284 | + tooltip = {"calculator-ui.recent_tooltip"} | |
285 | + }) | |
286 | + local recent_result = root.calcui.calcui_table.calcui_table_col2.calcui_scroll_pane.calcui_result_table.add({ | |
287 | + type = "label", | |
288 | + name = "calcui_recent_result_" .. item_size, | |
289 | + caption = root.calcui.calcui_table.calcui_table_col2.calcui_display_result.caption | |
290 | + }) | |
291 | + root.calcui.calcui_table.calcui_table_col2.calcui_scroll_pane.scroll_to_bottom() | |
292 | + end | |
293 | + end | |
294 | + end | |
295 | +end | |
296 | + | |
297 | +-- ---------------------------------------------------------------- | |
298 | +function display_addchar(player, char) | |
299 | + local root = get_gui_root(player) | |
300 | + root.calcui.calcui_table.calcui_table_col1.calcui_display.text = root.calcui.calcui_table.calcui_table_col1.calcui_display.text .. char | |
301 | + show_rant(player, false) | |
302 | +end | |
303 | + | |
304 | +-- ---------------------------------------------------------------- | |
305 | +local button_dispatch = { | |
306 | + ["CE"] = process_ce_key, | |
307 | + ["C"] = process_c_key, | |
308 | + ["BS"] = process_backspace_key, | |
309 | + -- | |
310 | + ["EQU"] = process_equal_key | |
311 | +} | |
312 | +local button_addchar = { | |
313 | + ["DIV"] = "/", | |
314 | + -- | |
315 | + ["7"] = "7", | |
316 | + ["8"] = "8", | |
317 | + ["9"] = "9", | |
318 | + ["MUL"] = "*", | |
319 | + -- | |
320 | + ["4"] = "4", | |
321 | + ["5"] = "5", | |
322 | + ["6"] = "6", | |
323 | + ["SUB"] = "-", | |
324 | + -- | |
325 | + ["1"] = "1", | |
326 | + ["2"] = "2", | |
327 | + ["3"] = "3", | |
328 | + ["ADD"] = "+", | |
329 | + -- | |
330 | + ["PERC"] = "%", | |
331 | + ["0"] = "0", | |
332 | + ["DOT"] = "." | |
333 | +} | |
334 | + | |
335 | +function handle_calcui_click(event, player) | |
336 | + debug_print("handle_calcui_click()") | |
337 | + local event_name = event.element.name | |
338 | + local button_prefix = "calcui_button_" | |
339 | + local button_prefix_len = string.len(button_prefix) | |
340 | + | |
341 | + local recent_prefix = "calcui_recent_" | |
342 | + local recent_prefix_len = string.len(recent_prefix); | |
343 | + | |
344 | + -- calculator buttons | |
345 | + if string.sub(event_name, 1, button_prefix_len) == button_prefix then | |
346 | + show_rant(player, false) | |
347 | + | |
348 | + button = string.sub(event_name, button_prefix_len + 1 ) | |
349 | + debug_print("handle_calcui_click button " .. button) | |
350 | + local dispatch_func = button_dispatch[button] | |
351 | + if dispatch_func then | |
352 | + dispatch_func(player, button) | |
353 | + end | |
354 | + | |
355 | + local addchar = button_addchar[button] | |
356 | + if addchar then | |
357 | + display_addchar(player, addchar) | |
358 | + end | |
359 | + -- close button | |
360 | + elseif event_name == "calcui_close" then | |
361 | + hide_calculator(player) | |
362 | + -- recent results | |
363 | + elseif string.sub(event_name, 1, recent_prefix_len) == recent_prefix then | |
364 | + if event.button == defines.mouse_button_type.left and | |
365 | + event.shift == true then | |
366 | + -- copy equation to display | |
367 | + local root = get_gui_root(player) | |
368 | + root.calcui.calcui_table.calcui_table_col1.calcui_display.text = root.calcui.calcui_table.calcui_table_col2.calcui_scroll_pane.calcui_result_table[event_name].caption | |
369 | + root.calcui.calcui_table.calcui_table_col1.calcui_display.focus() | |
370 | + end | |
371 | + end | |
372 | +end | |
373 | + | |
374 | +-- ---------------------------------------------------------------- | |
375 | +function calcui_on_gui_text_changed(event) | |
376 | + if event.element.name == "calcui_display" then | |
377 | + local player = game.players[event.player_index] | |
378 | + local root = get_gui_root(player) | |
379 | + if string.find(root.calcui.calcui_table.calcui_table_col1.calcui_display.text, "=") then | |
380 | + root.calcui.calcui_table.calcui_table_col1.calcui_display.text = root.calcui.calcui_table.calcui_table_col1.calcui_display.text:gsub("=", "") | |
381 | + process_equal_key(player) | |
382 | + end | |
383 | + end | |
384 | +end | |
385 | + | |
386 | +-- ---------------------------------------------------------------- | |
387 | +function calcui_on_gui_location_changed(event) | |
388 | + if event.element.name == "calcui" then | |
389 | + local player = game.players[event.player_index] | |
390 | + local root = get_gui_root(player) | |
391 | + root.calcui.location = event.element.location | |
392 | + end | |
393 | +end | |
394 | + | |
395 | + | |
396 | + | |
397 | + | |
398 | + | |
399 | + | |
400 | +-- -- ---------------------------------------------------------------- | |
401 | +-- local function process_number_key(player, num) | |
402 | + -- debug_print("process_number_key(" .. num .. ")") | |
403 | + | |
404 | + -- if global.calcui_context[player.index].in_left_of_decimal then | |
405 | + -- val = num / global.calcui_context[player.index].decimal_place | |
406 | + -- if global.calcui_context[player.index].in_data_entry then | |
407 | + -- global.calcui_context[player.index].current_value = global.calcui_context[player.index].current_value + val | |
408 | + -- else | |
409 | + -- global.calcui_context[player.index].current_value = val | |
410 | + -- end | |
411 | + -- global.calcui_context[player.index].decimal_place = global.calcui_context[player.index].decimal_place * 10 | |
412 | + -- else | |
413 | + -- if global.calcui_context[player.index].in_data_entry then | |
414 | + -- global.calcui_context[player.index].current_value = global.calcui_context[player.index].current_value * 10 + num | |
415 | + -- else | |
416 | + -- global.calcui_context[player.index].current_value = tonumber(num) | |
417 | + -- end | |
418 | + -- end | |
419 | + -- global.calcui_context[player.index].in_data_entry = true | |
420 | + -- update_display(player) | |
421 | +-- end | |
422 | + | |
423 | +-- -- ---------------------------------------------------------------- | |
424 | +-- local function process_decimal_key(player, key) | |
425 | + -- debug_print("process_decimal_key(" .. key .. ")") | |
426 | + -- if global.calcui_context[player.index].in_left_of_decimal then | |
427 | + -- return | |
428 | + -- end | |
429 | + | |
430 | + -- global.calcui_context[player.index].in_left_of_decimal = true | |
431 | + -- global.calcui_context[player.index].decimal_place = 10 | |
432 | + -- update_display(player) | |
433 | +-- end | |
434 | + | |
435 | +-- -- ---------------------------------------------------------------- | |
436 | +-- local function process_change_sign_key(player, key) | |
437 | + -- global.calcui_context[player.index].current_value = global.calcui_context[player.index].current_value * -1 | |
438 | + -- update_display(player) | |
439 | +-- end | |
440 | + | |
441 | +-- -- ---------------------------------------------------------------- | |
442 | +-- local function process_equal_key(player, key) | |
443 | + -- debug_print("process_equal_key(" .. key .. ") global.calcui_context[player.index].current_func is " .. global.calcui_context[player.index].current_func) | |
444 | + | |
445 | + -- global.calcui_context[player.index].in_data_entry = false | |
446 | + -- doing_decimal = false | |
447 | + | |
448 | + -- if global.calcui_context[player.index].current_func == "ADD" then | |
449 | + -- global.calcui_context[player.index].current_value = global.calcui_context[player.index].operand + global.calcui_context[player.index].current_value | |
450 | + -- elseif global.calcui_context[player.index].current_func == "SUB" then | |
451 | + -- global.calcui_context[player.index].current_value = global.calcui_context[player.index].operand - global.calcui_context[player.index].current_value | |
452 | + -- elseif global.calcui_context[player.index].current_func == "MUL" then | |
453 | + -- global.calcui_context[player.index].current_value = global.calcui_context[player.index].operand * global.calcui_context[player.index].current_value | |
454 | + -- elseif global.calcui_context[player.index].current_func == "DIV" then | |
455 | + -- debug_print("process_equal_key global.calcui_context[player.index].current_value " .. global.calcui_context[player.index].current_value) | |
456 | + | |
457 | + -- if global.calcui_context[player.index].current_value == 0 then | |
458 | + -- debug_print("process_equal_key DIVIDE BY ZERO") | |
459 | + -- update_display(player, {"calcui_divide_by_zero"}) -- TODO: localize | |
460 | + -- return | |
461 | + -- end | |
462 | + -- global.calcui_context[player.index].current_value = global.calcui_context[player.index].operand / global.calcui_context[player.index].current_value | |
463 | + -- end | |
464 | + -- global.calcui_context[player.index].current_func = "" | |
465 | + -- global.calcui_context[player.index].in_data_entry = false | |
466 | + -- update_display(player) | |
467 | +-- end | |
468 | + | |
469 | +-- -- ---------------------------------------------------------------- | |
470 | +-- local function process_func_key(player, key) | |
471 | + -- debug_print("process_func_key(" .. key .. ")") | |
472 | + | |
473 | + -- if global.calcui_context[player.index].current_func ~= "" then | |
474 | + -- process_equal_key(player, key) | |
475 | + -- end | |
476 | + | |
477 | + -- global.calcui_context[player.index].current_func = key | |
478 | + -- global.calcui_context[player.index].operand = global.calcui_context[player.index].current_value | |
479 | + -- global.calcui_context[player.index].in_data_entry = false | |
480 | + -- global.calcui_context[player.index].in_left_of_decimal = false | |
481 | +-- end | |
482 | + | |
483 | +-- -- ---------------------------------------------------------------- | |
484 | +-- local function process_mem_key(player, key) | |
485 | + -- debug_print("process_mem_key(" .. key .. ")") | |
486 | + -- if calculator_memory == nil then | |
487 | + -- debug_print("process_mem_key(" .. key .. ") calculator_memory was nil") | |
488 | + -- calculator_memory = 0 | |
489 | + -- end | |
490 | + -- if key == "MS" then | |
491 | + -- calculator_memory = global.calcui_context[player.index].current_value | |
492 | + -- elseif key == "M+" then | |
493 | + -- calculator_memory = calculator_memory + global.calcui_context[player.index].current_value | |
494 | + -- elseif key == "M-" then | |
495 | + -- calculator_memory = calculator_memory - global.calcui_context[player.index].current_value | |
496 | + -- else | |
497 | + -- global.calcui_context[player.index].current_value = calculator_memory | |
498 | + -- end | |
499 | + -- global.calcui_context[player.index].in_data_entry = false | |
500 | + -- update_display(player) | |
501 | +-- end | |
502 | + | |
503 | +-- -- ---------------------------------------------------------------- | |
504 | +-- local function process_edit_key(player, key) | |
505 | + -- debug_print("process_edit_key(" .. key .. ")") | |
506 | + -- if key == "CE" then | |
507 | + -- global.calcui_context[player.index].current_value = 0 | |
508 | + -- elseif key == "C" then | |
509 | + -- init_calculator(player) | |
510 | + -- end | |
511 | + -- global.calcui_context[player.index].in_data_entry = false | |
512 | + -- update_display(player) | |
513 | +-- end | |
514 | + | |
515 | +-- -- ---------------------------------------------------------------- | |
516 | +-- local function set_current_value_to_text(player, text) | |
517 | + -- local last_char = string.sub(text, -1) | |
518 | + -- if last_char == "+" then | |
519 | + -- process_func_key(player, "ADD") | |
520 | + -- elseif last_char == "-" then | |
521 | + -- process_func_key(player, "SUB") | |
522 | + -- elseif last_char == "*" then | |
523 | + -- process_func_key(player, "MUL") | |
524 | + -- elseif last_char == "/" then | |
525 | + -- process_func_key(player, "DIV") | |
526 | + -- else | |
527 | + -- -- number | |
528 | + -- local val = tonumber(text) | |
529 | + -- if val ~= nil then | |
530 | + -- global.calcui_context[player.index].current_value = val | |
531 | + -- debug_print("set_current_value_to_text got value " .. text) | |
532 | + -- local plain_text = true | |
533 | + -- local dot = string.find(text, '.', 1, plain_text) | |
534 | + -- if dot ~= nil then | |
535 | + -- local number_decimal_places = #text - dot | |
536 | + -- global.calcui_context[player.index].decimal_place = 10 ^ (number_decimal_places + 1) | |
537 | + -- global.calcui_context[player.index].in_left_of_decimal = true | |
538 | + -- debug_print("#text " .. #text .. " number_global.calcui_context[player.index].decimal_places " .. | |
539 | + -- number_decimal_places .. " global.calcui_context[player.index].decimal_place " .. global.calcui_context[player.index].decimal_place .. " dot " .. dot .. " in_lod " .. boolstr(global.calcui_context[player.index].in_left_of_decimal)) | |
540 | + -- else | |
541 | + -- debug_print("set_current_value_to_text no dot. set lod to false" ) | |
542 | + -- global.calcui_context[player.index].in_left_of_decimal = false | |
543 | + -- end | |
544 | + -- else | |
545 | + -- debug_print("got junk") | |
546 | + -- end | |
547 | + -- end | |
548 | +-- end | |
549 | + | |
550 | +-- -- ---------------------------------------------------------------- | |
551 | +-- local function process_backspace_key(player, key) | |
552 | + -- local root = get_gui_root(player) | |
553 | + -- debug_print("process_backspace_key(" .. key .. ")") | |
554 | + -- local old_text = root.calcui.calcui_display.caption | |
555 | + -- local old_len = #old_text | |
556 | + -- text = string.sub(old_text, 1, old_len -1) | |
557 | + -- debug_print("process_backspace_key(" .. key .. ") old_text " .. old_text .. " old_len " .. old_len .. " text " .. text .. | |
558 | + -- " in_decimal " .. boolstr(global.calcui_context[player.index].in_left_of_decimal) .. " global.calcui_context[player.index].decimal_place " .. global.calcui_context[player.index].decimal_place) | |
559 | + -- if #text == 0 then | |
560 | + -- global.calcui_context[player.index].current_value = 0 | |
561 | + -- else | |
562 | + -- set_current_value_to_text(player, text) | |
563 | + -- end | |
564 | + -- update_display(player) | |
565 | +-- end | |
566 | + | |
567 | +-- -- ---------------------------------------------------------------- | |
568 | +-- local function calcui_toggle_key(event) | |
569 | + -- local player = game.players[event.player_index] | |
570 | + -- toggle_calculator(player) | |
571 | +-- end | |
572 | + | |
573 | +-- -- ---------------------------------------------------------------- | |
574 | +-- function calcui_clickable_value_clicked(player, val) -- a value in the main Max Rate Calculator has been clicked on. Paste into current value | |
575 | + -- local root = get_gui_root(player) | |
576 | + -- if root ~=nil and root.calcui ~= nil then | |
577 | + -- local text = tostring(val) | |
578 | + -- set_current_value_to_text(player, text) | |
579 | + -- update_display(player) | |
580 | + -- end | |
581 | +-- end | |
582 | + | |
583 | +-- script.on_event( "calcui_toggle", calcui_toggle_key ) | |
0 | 584 | \ No newline at end of file | ... | ... |
control.lua
0 → 100644
1 | +++ a/control.lua | |
1 | +-- control.lua | |
2 | + | |
3 | +require("calculator") | |
4 | + | |
5 | +-- ---------------------------------------------------------------- | |
6 | +function boolstr(bool) | |
7 | + if bool then | |
8 | + return "T" | |
9 | + else | |
10 | + return "F" | |
11 | + end | |
12 | +end | |
13 | + | |
14 | +-- ---------------------------------------------------------------- | |
15 | +function debug_print(str) | |
16 | + if global.marc_debug then | |
17 | + game.print(str) | |
18 | + end | |
19 | +end | |
20 | + | |
21 | +function __FUNC__() return debug.getinfo(2, 'n').name end | |
22 | + | |
23 | +function debug_log(f, str) | |
24 | + if global.marc_debug then | |
25 | + game.print(f .. ": " .. str) | |
26 | + end | |
27 | +end | |
28 | + | |
29 | +-- ---------------------------------------------------------------- | |
30 | +local function get_gui_root(player) | |
31 | + -- return player.gui.left | |
32 | + return player.gui.screen | |
33 | +end | |
34 | + | |
35 | +-- ---------------------------------------------------------------- | |
36 | +function destroy_calcui_gui(player) | |
37 | + local root = get_gui_root(player) | |
38 | + root.calcui_gui_top.destroy() | |
39 | +end | |
40 | + | |
41 | +-- ---------------------------------------------------------------- | |
42 | +local function shortcut(event) | |
43 | + if event.prototype_name == "calcui_4func" then | |
44 | + local player = game.players[event.player_index] | |
45 | + toggle_calculator(player) | |
46 | + end | |
47 | +end | |
48 | + | |
49 | +-- ---------------------------------------------------------------- | |
50 | +-- user has clicked somewhere. If clicked on any gui item name that starts with "calcui_..." | |
51 | +-- hide the gui | |
52 | +local function on_gui_click(event) | |
53 | + local event_name = event.element.name | |
54 | + debug_print("event_name " .. event_name) | |
55 | + -- local calcui_prefix = "calcui_" | |
56 | + -- local possible_calcui_prefix = string.sub( event_name, 1, string.len(calcui_prefix) ) | |
57 | + local player = game.players[event.player_index] | |
58 | + -- local root = get_gui_root(player) | |
59 | + | |
60 | + local calcui_prefix = "calcui_" | |
61 | + local possible_marcalc_prefix = string.sub( event_name, 1, string.len(calcui_prefix)) | |
62 | + if possible_marcalc_prefix == calcui_prefix then | |
63 | + handle_calcui_click(event, player) | |
64 | + return | |
65 | + end | |
66 | + | |
67 | + -- if possible_calcui_prefix == calcui_prefix then | |
68 | + -- if event_name == "calcui_calculator_button" then | |
69 | + -- toggle_calculator(player) | |
70 | + -- return | |
71 | + -- end | |
72 | + | |
73 | + -- if root.calcui_gui_top then | |
74 | + -- if event_name == "calcui_close_button" then | |
75 | + -- destroy_calcui_gui(player) | |
76 | + -- hide_calculator(player) | |
77 | + -- end | |
78 | + -- elseif event_name == "calcui_close_button" then | |
79 | + -- if player.gui.left.calcui_gui_top then | |
80 | + -- player.gui.left.calcui_gui_top.destroy() | |
81 | + -- hide_calculator(player) | |
82 | + -- end | |
83 | + -- end | |
84 | + -- end | |
85 | +end | |
86 | + | |
87 | +-- ---------------------------------------------------------------- | |
88 | +-- user has confirmed the textfield / Called when a LuaGuiElement is confirmed, for example by pressing Enter in a textfield. | |
89 | +local function on_gui_confirmed(event) | |
90 | + player = game.players[event.player_index]; | |
91 | + if event.element.name == "calcui_display" then | |
92 | + process_equal_key(player) | |
93 | + if settings.get_player_settings(player)["calcui-enter-clear"].value then | |
94 | + clear_equation(player) | |
95 | + end | |
96 | + end | |
97 | +end | |
98 | + | |
99 | +-- ---------------------------------------------------------------- | |
100 | +local function on_calcui_command(event) | |
101 | + if event.parameter == "debug" then | |
102 | + global.calcui_debug = true | |
103 | + debug_print("calcui debugging is on") | |
104 | + elseif event.parameter == "nodebug" then | |
105 | + debug_print("calcui debugging is off") | |
106 | + global.calcui_debug = false | |
107 | + elseif event.parameter == nil then | |
108 | + game.players[event.player_index].print("please add a parameter") | |
109 | + else | |
110 | + game.players[event.player_index].print("unknown calcui parameter: " .. event.parameter) | |
111 | + end | |
112 | +end | |
113 | + | |
114 | +-- ---------------------------------------------------------------- | |
115 | +--script.on_event( "calcui_hotkey", on_hotkey_main ) | |
116 | +script.on_event( defines.events.on_lua_shortcut, shortcut ) | |
117 | +script.on_event( defines.events.on_gui_click, on_gui_click) | |
118 | +script.on_event( defines.events.on_gui_confirmed, on_gui_confirmed) | |
119 | +script.on_event( defines.events.on_gui_text_changed, calcui_on_gui_text_changed ) | |
120 | +script.on_event( defines.events.on_gui_location_changed, calcui_on_gui_location_changed ) | |
121 | +commands.add_command( "calcui", "Max Rate Calculator [ debug | nodebug ] ", on_calcui_command ) | |
0 | 122 | \ No newline at end of file | ... | ... |
data.lua
0 → 100644
graphics/calculator.png
0 → 100644
387 Bytes
graphics/nilausRant.png
0 → 100644
6.86 KB
info.json
0 → 100644
1 | +++ a/info.json | |
1 | +{ | |
2 | + "name": "calculator-ui", | |
3 | + "version": "0.18.0", | |
4 | + "title": "Calculator UI", | |
5 | + "author": "Wichu", | |
6 | + "factorio_version": "0.18", | |
7 | + "dependencies": ["base >= 0.18"], | |
8 | + "description": "This mod adds a calculator with advanced controls to the UI." | |
9 | +} | |
0 | 10 | \ No newline at end of file | ... | ... |
locale/en/config.cfg
0 → 100644
1 | +++ a/locale/en/config.cfg | |
1 | +[shortcut-name] | |
2 | +calcui_4func=Calculator | |
3 | + | |
4 | +[mod-setting-name] | |
5 | +calcui-decimal-places=Decimal places | |
6 | +calcui-enter-clear=Clear equation on enter? | |
7 | + | |
8 | +[mod-settings-description] | |
9 | +calcui-decimal-places=Number of decimal places in the result | |
10 | +calcui-enter-clear=Should pressing the enter key delete the equation? | |
11 | + | |
12 | +[calculator-ui] | |
13 | +title=Calculator | |
14 | +recent_tooltip=Press shift+left-click to copy it to current equation | |
0 | 15 | \ No newline at end of file | ... | ... |
settings.lua
0 → 100644
1 | +++ a/settings.lua | |
1 | +data:extend({ | |
2 | + { | |
3 | + type = "int-setting", | |
4 | + default_value = 2, | |
5 | + minimum_value = 0, | |
6 | + maximum_value = 10, | |
7 | + name = "calcui-decimal-places", | |
8 | + setting_type = "runtime-per-user", | |
9 | + default_value = true | |
10 | + }, | |
11 | + { | |
12 | + type = "bool-setting", | |
13 | + default_value = 0, | |
14 | + name = "calcui-enter-clear", | |
15 | + setting_type = "runtime-per-user", | |
16 | + default_value = false | |
17 | + } | |
18 | +}) | |
0 | 19 | \ No newline at end of file | ... | ... |