Commit 2de482165862fe94791c77a01d1e0f3b8b6d1e4c

Authored by Stefan Wichmann
1 parent ae0df041

Version 0.18.4 published

CHANGELOG.md
... ... @@ -8,14 +8,22 @@ and this project adheres to the versioning of Factorio, so 0.18.x will be at lea
8 8  
9 9 ## [0.18.4] - 2020-06-07
10 10 ### General
11   -Based onyuser feedback updated the mod
  11 +Based on user feedback updated the mod
  12 +
  13 +### Added
  14 +- Added the possibility to copy the results (from recent and also the current) to the display
12 15  
13 16 ### Changed
14 17 - Window now remember last location when opened
  18 +- Updated the BS button (it's backspace people...) so it now has a nice icon instead of the letters
  19 +- Recent results now add to the top, instead of the bottom
  20 +- When calculator is opened it focues on the display for entering the equation
  21 +- You can click pretty much anywhere now and it focues on the display for entering the equation
15 22  
16 23 ### Fixed
17 24 - On multiplayer session the window would lag behind while dragging, because the location would be saved on server. This isn't going to happen anymore, hopefully (not tested yet).
18 25 - When window is moved out of boundaries, when reopened, it will correct itself to be fully in sight again.
  26 +- Settings had weird default values (were set 2 times)
19 27  
20 28 ## [0.18.3] - 2020-06-07
21 29 ### General
... ...
calcui-styles.lua
... ... @@ -53,6 +53,13 @@ data:extend({
53 53 },
54 54 {
55 55 type = "sprite",
  56 + name = "sprite_calcui_backspace",
  57 + filename = "__calculator-ui__/graphics/backspace.png",
  58 + width = 50,
  59 + height = 50
  60 + },
  61 + {
  62 + type = "sprite",
56 63 name = "sprite_calcui_red",
57 64 filename = "__calculator-ui__/graphics/red.png",
58 65 width = 50,
... ...
calculator.lua
... ... @@ -6,9 +6,9 @@ local function get_gui_root(player)
6 6 end
7 7  
8 8 -- ----------------------------------------------------------------
9   -function show_think(player, enabled)
  9 +local function show_think(player, enabled)
10 10 local root = get_gui_root(player)
11   -
  11 +
12 12 if enabled then
13 13 root.calcui.calcui_table.calcui_table_col2.calcui_rant.sprite = "sprite_calcui_think"
14 14 root.calcui.calcui_table.calcui_table_col2.calcui_scroll_pane.style.height = 196
... ... @@ -19,9 +19,9 @@ function show_think(player, enabled)
19 19 end
20 20  
21 21 -- ----------------------------------------------------------------
22   -function show_rant(player, enabled)
  22 +local function show_rant(player, enabled)
23 23 local root = get_gui_root(player)
24   -
  24 +
25 25 if enabled then
26 26 root.calcui.calcui_table.calcui_table_col2.calcui_rant.sprite = "sprite_calcui_rant"
27 27 root.calcui.calcui_table.calcui_table_col2.calcui_scroll_pane.style.height = 196
... ... @@ -40,7 +40,7 @@ local function destroy_calculator(player)
40 40 end
41 41  
42 42 -- ----------------------------------------------------------------
43   -function fix_oob_ui(player)
  43 +local function fix_oob_ui(player)
44 44 if global.gui_position[player.index].x < 0 then
45 45 global.gui_position[player.index].x = 0
46 46 end
... ... @@ -58,33 +58,40 @@ function fix_oob_ui(player)
58 58 if global.gui_position[player.index].y + height > player.display_resolution.height then
59 59 global.gui_position[player.index].y = player.display_resolution.height - height
60 60 end
61   - --global.gui_position[player.index]
62 61 end
63 62  
64 63 -- ----------------------------------------------------------------
65 64 function show_calculator(player)
66 65 local root = get_gui_root(player)
67 66  
  67 + if not global.recent_results then
  68 + global.recent_results = {}
  69 + if not global.recent_results[player.index] then
  70 + global.recent_results[player.index] = {}
  71 + end
  72 + end
  73 +
68 74 if not root.calcui then
69 75 local calcui = root.add({
70   - type = "frame",
71   - name = "calcui",
  76 + type = "frame",
  77 + name = "calcui",
72 78 style = "dialog_frame",
73 79 direction = "vertical"
74 80 })
75   -
  81 +
76 82 local flow = calcui.add({
77   - type = "flow",
  83 + type = "flow",
78 84 name = "calcui_flow"
79 85 })
80 86 flow.style.horizontally_stretchable = "on"
81   -
  87 +
82 88 flow.add({
83   - type = "label",
84   - caption = {"calculator-ui.title"},
  89 + type = "label",
  90 + name = "calcui_title",
  91 + caption = {"calculator-ui.title"},
85 92 style = "frame_title"
86 93 }).drag_target = calcui
87   -
  94 +
88 95 local widget = flow.add({
89 96 type = "empty-widget",
90 97 style = "draggable_space_header",
... ... @@ -94,30 +101,30 @@ function show_calculator(player)
94 101 widget.style.horizontally_stretchable = "on"
95 102 widget.style.minimal_width = 24
96 103 widget.style.natural_height = 24
97   -
  104 +
98 105 flow.add({
99   - type = "sprite-button",
100   - sprite = "utility/close_white",
101   - style = "frame_action_button",
  106 + type = "sprite-button",
  107 + sprite = "utility/close_white",
  108 + style = "frame_action_button",
102 109 name = "calcui_close"
103 110 })
104   -
  111 +
105 112 local table = calcui.add({
106   - type = "table",
107   - name = "calcui_table",
108   - column_count = "2",
  113 + type = "table",
  114 + name = "calcui_table",
  115 + column_count = "2",
109 116 vertical_centering = "false"
110 117 })
111   -
  118 +
112 119 local col1 = table.add({
113   - type = "flow",
114   - name = "calcui_table_col1",
  120 + type = "flow",
  121 + name = "calcui_table_col1",
115 122 direction = "vertical"
116 123 })
117   -
  124 +
118 125 local display = col1.add({
119   - type = "textfield",
120   - caption = "",
  126 + type = "textfield",
  127 + caption = "",
121 128 name = "calcui_display"
122 129 })
123 130 display.style.width = 212
... ... @@ -125,7 +132,7 @@ function show_calculator(player)
125 132 local row1 = col1.add({type="flow", name="calcui_col1_row1", direction="horizontal"})
126 133 row1.add({type="sprite-button", style="calcui_button_style_light", caption="CE", name="calcui_button_CE"}).sprite = "sprite_calcui_light" -- CE = Clear Entry (just this line)
127 134 row1.add({type="sprite-button", style="calcui_button_style_light", caption="C", name="calcui_button_C"}).sprite = "sprite_calcui_light" -- C = Clear (all, past results as well)
128   - row1.add({type="sprite-button", style="calcui_button_style_light", caption="BS", name="calcui_button_BS"}).sprite = "sprite_calcui_light"
  135 + row1.add({type="sprite-button", style="calcui_button_style_light", caption="", name="calcui_button_BS"}).sprite = "sprite_calcui_backspace"
129 136 row1.add({type="sprite-button", style="calcui_button_style_light", caption="/", name="calcui_button_DIV"}).sprite = "sprite_calcui_light"
130 137  
131 138 local row2 = col1.add({type="flow", name="calcui_col1_row2", direction="horizontal"})
... ... @@ -153,43 +160,54 @@ function show_calculator(player)
153 160 row5.add({type="sprite-button", style="calcui_button_style_red", caption="=", name="calcui_button_EQU"}).sprite = "sprite_calcui_red"
154 161  
155 162 local col2 = table.add({
156   - type = "flow",
157   - name = "calcui_table_col2",
  163 + type = "flow",
  164 + name = "calcui_table_col2",
158 165 direction = "vertical"
159 166 })
160 167  
161 168 local result = col2.add({
162   - type = "label",
163   - caption = "= ",
164   - name = "calcui_display_result"
  169 + type = "flow",
  170 + name = "calcui_result",
  171 + direction = "horizontal"
165 172 })
166   - result.style.font = "default-large"
167   -
168   - local rant = col2.add({
  173 +
  174 + result.add({
  175 + type = "label",
  176 + caption = "=",
  177 + name = "calcui_display_sign"
  178 + }).style.font = "default-large"
  179 +
  180 + result.add({
  181 + type = "label",
  182 + caption = "",
  183 + name = "calcui_copy_display_result"
  184 + }).style.font = "default-large"
  185 +
  186 + col2.add({
169 187 type = "sprite",
170 188 name = "calcui_rant"
171 189 })
172   -
  190 +
173 191 col2.add({
174   - type = "line",
  192 + type = "line",
  193 + name = "calcui_line",
175 194 direction = "horizontal"
176 195 })
177   -
  196 +
178 197 local scroll = col2.add({
179 198 type = "scroll-pane",
180 199 name = "calcui_scroll_pane"
181 200 })
182 201 scroll.style.height = 252
183   -
184   - local recents = scroll.add({
185   - type = "table",
186   - caption = "",
187   - name = "calcui_result_table",
188   - column_count = "2"
189   - })
190   - recents.style.column_alignments[1] = "right"
191   -
192   -
  202 +
  203 + scroll.add({
  204 + type = "table",
  205 + caption = "",
  206 + name = "calcui_result_table",
  207 + column_count = "3"
  208 + }).style.column_alignments[1] = "right"
  209 +
  210 +
193 211 -- use last saved location or center the gui
194 212 if not global.gui_position then
195 213 global.gui_position = {}
... ... @@ -197,16 +215,19 @@ function show_calculator(player)
197 215 if global.gui_position[player.index] then
198 216 -- fix weird saved positions (out of reach)
199 217 fix_oob_ui(player)
200   -
  218 +
201 219 calcui.location = global.gui_position[player.index]
202 220 else
203 221 calcui.force_auto_center()
204 222 end
  223 +
  224 + -- focus on display
  225 + display.focus()
205 226 end
206 227 end
207 228  
208 229 -- ----------------------------------------------------------------
209   -function hide_calculator(player)
  230 +local function hide_calculator(player)
210 231 destroy_calculator(player)
211 232 end
212 233  
... ... @@ -227,36 +248,65 @@ function focus_on_input(player)
227 248 end
228 249  
229 250 -- ----------------------------------------------------------------
230   -function clear_equation(player)
  251 +local function clear_equation(player)
231 252 local root = get_gui_root(player)
232 253 root.calcui.calcui_table.calcui_table_col1.calcui_display.text = ""
233 254 end
234 255  
235 256 -- ----------------------------------------------------------------
236   -function process_ce_key(player, button)
  257 +local function process_ce_key(player, button)
237 258 local root = get_gui_root(player)
238 259 clear_equation(player)
239   - root.calcui.calcui_table.calcui_table_col2.calcui_display_result.caption = "="
240   - root.calcui.calcui_table.calcui_table_col2.calcui_display_result.tooltip = ""
  260 + root.calcui.calcui_table.calcui_table_col2.calcui_result.calcui_copy_display_result.caption = ""
  261 + root.calcui.calcui_table.calcui_table_col2.calcui_result.calcui_copy_display_result.tooltip = ""
241 262 end
242 263  
243 264 -- ----------------------------------------------------------------
244   -function process_c_key(player, button)
  265 +local function process_c_key(player, button)
245 266 local root = get_gui_root(player)
246 267 process_ce_key(player, button)
247 268 root.calcui.calcui_table.calcui_table_col2.calcui_scroll_pane.calcui_result_table.clear()
  269 + global.recent_results[player.index] = {}
248 270 end
249 271  
250 272 -- ----------------------------------------------------------------
251   -function process_backspace_key(player, button)
  273 +local function process_backspace_key(player, button)
252 274 local root = get_gui_root(player)
253 275 root.calcui.calcui_table.calcui_table_col1.calcui_display.text = string.sub(root.calcui.calcui_table.calcui_table_col1.calcui_display.text, 1, -2)
254 276 end
255 277  
256 278 -- ----------------------------------------------------------------
257   -function fix_equation(equation, root)
  279 +local function draw_recent_table(player)
  280 + local root = get_gui_root(player)
  281 +
  282 + -- drop old table
  283 + root.calcui.calcui_table.calcui_table_col2.calcui_scroll_pane.calcui_result_table.clear()
  284 +
  285 + for i, result in ipairs(global.recent_results[player.index]) do
  286 + root.calcui.calcui_table.calcui_table_col2.calcui_scroll_pane.calcui_result_table.add({
  287 + type = "label",
  288 + name = "calcui_copy_equation_" .. i,
  289 + caption = result["equation"],
  290 + tooltip = {"calculator-ui.recent_tooltip"}
  291 + })
  292 + root.calcui.calcui_table.calcui_table_col2.calcui_scroll_pane.calcui_result_table.add({
  293 + type = "label",
  294 + name = "calcui_sign_" .. i,
  295 + caption = "="
  296 + })
  297 + root.calcui.calcui_table.calcui_table_col2.calcui_scroll_pane.calcui_result_table.add({
  298 + type = "label",
  299 + name = "calcui_copy_result_" .. i,
  300 + caption = result["result"]
  301 + })
  302 + end
  303 + root.calcui.calcui_table.calcui_table_col2.calcui_scroll_pane.scroll_to_top()
  304 +end
  305 +
  306 +-- ----------------------------------------------------------------
  307 +local function fix_equation(equation, root)
258 308 local result = equation
259   - local prev_result = root.calcui.calcui_table.calcui_table_col2.calcui_display_result.tooltip
  309 + local prev_result = root.calcui.calcui_table.calcui_table_col2.calcui_result.calcui_copy_display_result.tooltip
260 310  
261 311  
262 312 -- 1. visible part
... ... @@ -308,7 +358,7 @@ function fix_equation(equation, root)
308 358  
309 359 -- fix percentage
310 360 result = result:gsub("(%%)", "/100")
311   -
  361 +
312 362 -- fix danish keyboard
313 363 result = result:gsub(",", ".")
314 364 result = result:gsub(";", ",")
... ... @@ -321,17 +371,17 @@ end
321 371 function process_equal_key(player, button)
322 372 local root = get_gui_root(player)
323 373 local original_equation = root.calcui.calcui_table.calcui_table_col1.calcui_display.text;
324   -
  374 +
325 375 equation, original_equation = fix_equation(original_equation, root)
326   -
  376 +
327 377 -- just testing
328 378 --root.calcui.calcui_table.calcui_table_col1.calcui_display.text = equation
329   -
  379 +
330 380 if not (equation == nil or equation == "") then
331 381 local status, retval = pcall(function()
332 382 return load("return " .. equation)()
333 383 end)
334   - root.calcui.calcui_table.calcui_table_col2.calcui_display_result.tooltip = retval
  384 + root.calcui.calcui_table.calcui_table_col2.calcui_result.calcui_copy_display_result.tooltip = retval
335 385 if not (retval == math.huge or retval ~= retval) then
336 386 status, retval_show = pcall(function()
337 387 local result = string.format("%0." .. settings.get_player_settings(player)["calcui-decimal-places"].value .. "f", retval)
... ... @@ -352,31 +402,22 @@ function process_equal_key(player, button)
352 402 else
353 403 if retval <= 0 then
354 404 show_think(player, true)
355   - else
  405 + else
356 406 show_rant(player, false)
357 407 end
358 408 end
359   - root.calcui.calcui_table.calcui_table_col2.calcui_display_result.caption = "= " .. retval_show
360   -
  409 + root.calcui.calcui_table.calcui_table_col2.calcui_result.calcui_copy_display_result.caption = retval_show
  410 +
361 411 -- only write in recent table if actually a result
362 412 if status then
363   - -- check last equation and only insert if not the same
364   - local item_size = #root.calcui.calcui_table.calcui_table_col2.calcui_scroll_pane.calcui_result_table.children
365   -
366   - 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
367   - local recent_equation = root.calcui.calcui_table.calcui_table_col2.calcui_scroll_pane.calcui_result_table.add({
368   - type = "label",
369   - name = "calcui_recent_equation_" .. item_size,
370   - caption = original_equation,
371   - tooltip = {"calculator-ui.recent_tooltip"}
372   - })
373   - local recent_result = root.calcui.calcui_table.calcui_table_col2.calcui_scroll_pane.calcui_result_table.add({
374   - type = "label",
375   - name = "calcui_recent_result_" .. item_size,
376   - caption = root.calcui.calcui_table.calcui_table_col2.calcui_display_result.caption
  413 + -- check first equation and only insert if not the same
  414 + if #global.recent_results[player.index] == 0 or global.recent_results[player.index][1]["equation"] ~= original_equation then
  415 + table.insert(global.recent_results[player.index], 1, {
  416 + equation = original_equation,
  417 + result = retval_show
377 418 })
378   - root.calcui.calcui_table.calcui_table_col2.calcui_scroll_pane.scroll_to_bottom()
379 419 end
  420 + draw_recent_table(player)
380 421 end
381 422 end
382 423  
... ... @@ -386,7 +427,7 @@ function process_equal_key(player, button)
386 427 end
387 428  
388 429 -- ----------------------------------------------------------------
389   -function display_addchar(player, char)
  430 +local function display_addchar(player, char)
390 431 local root = get_gui_root(player)
391 432 root.calcui.calcui_table.calcui_table_col1.calcui_display.text = root.calcui.calcui_table.calcui_table_col1.calcui_display.text .. char
392 433 show_rant(player, false)
... ... @@ -428,10 +469,10 @@ function handle_calcui_click(event, player)
428 469 local event_name = event.element.name
429 470 local button_prefix = "calcui_button_"
430 471 local button_prefix_len = string.len(button_prefix)
431   -
432   - local recent_prefix = "calcui_recent_"
433   - local recent_prefix_len = string.len(recent_prefix);
434   -
  472 +
  473 + local copy_prefix = "calcui_copy_"
  474 + local copy_prefix_len = string.len(copy_prefix);
  475 +
435 476 -- calculator buttons
436 477 if string.sub(event_name, 1, button_prefix_len) == button_prefix then
437 478 show_rant(player, false)
... ... @@ -442,7 +483,7 @@ function handle_calcui_click(event, player)
442 483 if dispatch_func then
443 484 dispatch_func(player, button)
444 485 end
445   -
  486 +
446 487 local addchar = button_addchar[button]
447 488 if addchar then
448 489 display_addchar(player, addchar)
... ... @@ -450,15 +491,22 @@ function handle_calcui_click(event, player)
450 491 -- close button
451 492 elseif event_name == "calcui_close" then
452 493 hide_calculator(player)
453   - -- recent results
454   - elseif string.sub(event_name, 1, recent_prefix_len) == recent_prefix then
455   - if event.button == defines.mouse_button_type.left and
  494 + -- copy results
  495 + elseif string.sub(event_name, 1, copy_prefix_len) == copy_prefix then
  496 + if event.button == defines.mouse_button_type.left and
456 497 event.shift == true then
457   - -- copy equation to display
  498 + -- copy equation or result to display
458 499 local root = get_gui_root(player)
459   - 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
  500 + if event_name == "calcui_copy_display_result" then
  501 + root.calcui.calcui_table.calcui_table_col1.calcui_display.text = root.calcui.calcui_table.calcui_table_col2.calcui_result.calcui_copy_display_result.caption
  502 + else
  503 + 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
  504 + end
460 505 focus_on_input(player)
461 506 end
  507 + -- if else focus on focus on display
  508 + else
  509 + focus_on_input(player)
462 510 end
463 511 end
464 512  
... ... @@ -477,7 +525,6 @@ end
477 525 -- ----------------------------------------------------------------
478 526 function calcui_on_gui_location_changed(event)
479 527 if event.element.name == "calcui" then
480   - local root = get_gui_root(game.players[event.player_index])
481 528 if not global.gui_position then
482 529 global.gui_position = {}
483 530 end
... ...
control.lua
... ... @@ -27,17 +27,6 @@ function debug_log(f, str)
27 27 end
28 28  
29 29 -- ----------------------------------------------------------------
30   -local function get_gui_root(player)
31   - return player.gui.screen
32   -end
33   -
34   --- ----------------------------------------------------------------
35   -function destroy_calcui_gui(player)
36   - local root = get_gui_root(player)
37   - root.calcui_gui_top.destroy()
38   -end
39   -
40   --- ----------------------------------------------------------------
41 30 local function shortcut(event)
42 31 if event.prototype_name == "calcui_4func" then
43 32 local player = game.players[event.player_index]
... ... @@ -52,8 +41,8 @@ local function on_gui_click(event)
52 41 local event_name = event.element.name
53 42 debug_print("event_name " .. event_name)
54 43 local player = game.players[event.player_index]
55   -
56   - local calcui_prefix = "calcui_"
  44 +
  45 + local calcui_prefix = "calcui"
57 46 local possible_marcalc_prefix = string.sub( event_name, 1, string.len(calcui_prefix))
58 47 if possible_marcalc_prefix == calcui_prefix then
59 48 handle_calcui_click(event, player)
... ...
graphics/backspace.png 0 → 100644

653 Bytes

settings.lua
... ... @@ -6,13 +6,11 @@ data:extend({
6 6 maximum_value = 10,
7 7 name = "calcui-decimal-places",
8 8 setting_type = "runtime-per-user",
9   - default_value = true
10 9 },
11 10 {
12 11 type = "bool-setting",
13   - default_value = 0,
  12 + default_value = false,
14 13 name = "calcui-clear-on-calc",
15 14 setting_type = "runtime-per-user",
16   - default_value = false
17 15 }
18 16 })
19 17 \ No newline at end of file
... ...