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 | ... | ... |