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 | \ No newline at end of file | 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 | \ No newline at end of file | 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 | \ No newline at end of file | 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 | \ No newline at end of file | 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 | \ No newline at end of file | 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 | \ No newline at end of file | 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 | \ No newline at end of file | 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 | \ No newline at end of file | 19 | \ No newline at end of file |