Blame view

calculator.lua 18.1 KB
3ef575ee   Stefan Wichmann   Initial checkin
1
2
3
4
5
6
7
  -- calculator.lua
  
  -- ----------------------------------------------------------------
  local function get_gui_root(player)
  	return player.gui.screen
  end
  
d7393909   Stefan Wichmann   preparing release...
8
9
  local nilaus_think = { "calcui_nilaus_really" }
  local nilaus_rant = { "calcui_nilaus_ugghhhh", "utility/cannot_build" }
423dee08   compilatron   preparing release...
10
11
12
13
14
15
16
17
18
19
20
  
  -- ----------------------------------------------------------------
  local function play_sfx(player, sfx)
  	if settings.get_player_settings(player)["calcui-sfx"].value then
  		player.play_sound{
  			path = sfx,
  			volume_modifier = 1.0
  		}
  	end
  end
  
3ef575ee   Stefan Wichmann   Initial checkin
21
  -- ----------------------------------------------------------------
2de48216   Stefan Wichmann   Version 0.18.4 pu...
22
  local function show_think(player, enabled)
d7b81613   Stefan Wichmann   Minor fixed - rel...
23
  	local root = get_gui_root(player)
423dee08   compilatron   preparing release...
24
  	local col2 = root.calcui.calcui_table.calcui_table_col2
2de48216   Stefan Wichmann   Version 0.18.4 pu...
25
  
d7b81613   Stefan Wichmann   Minor fixed - rel...
26
  	if enabled then
423dee08   compilatron   preparing release...
27
28
29
30
31
32
33
  		if settings.get_player_settings(player)["calcui-nilaus-mode"].value then
  			col2.calcui_rant.sprite = "sprite_calcui_think"
  			col2.calcui_scroll_pane.style.height = 196
  			play_sfx(player, nilaus_think[math.random(1, #nilaus_think)])
  		else
  			play_sfx(player, "calcui_home_improvement")
  		end
d7b81613   Stefan Wichmann   Minor fixed - rel...
34
  	else
423dee08   compilatron   preparing release...
35
36
  		col2.calcui_rant.sprite = nil
  		col2.calcui_scroll_pane.style.height = 252
d7b81613   Stefan Wichmann   Minor fixed - rel...
37
38
39
40
  	end
  end
  
  -- ----------------------------------------------------------------
2de48216   Stefan Wichmann   Version 0.18.4 pu...
41
  local function show_rant(player, enabled)
3ef575ee   Stefan Wichmann   Initial checkin
42
  	local root = get_gui_root(player)
423dee08   compilatron   preparing release...
43
  	local col2 = root.calcui.calcui_table.calcui_table_col2
2de48216   Stefan Wichmann   Version 0.18.4 pu...
44
  
3ef575ee   Stefan Wichmann   Initial checkin
45
  	if enabled then
423dee08   compilatron   preparing release...
46
47
48
49
50
51
52
  		if settings.get_player_settings(player)["calcui-nilaus-mode"].value then
  			col2.calcui_rant.sprite = "sprite_calcui_rant"
  			col2.calcui_scroll_pane.style.height = 196
  			play_sfx(player, nilaus_rant[math.random(1, #nilaus_rant)])
  		else
  			play_sfx(player, "utility/cannot_build")
  		end
3ef575ee   Stefan Wichmann   Initial checkin
53
  	else
423dee08   compilatron   preparing release...
54
55
  		col2.calcui_rant.sprite = nil
  		col2.calcui_scroll_pane.style.height = 252
3ef575ee   Stefan Wichmann   Initial checkin
56
57
58
59
60
61
62
63
  	end
  end
  
  -- ----------------------------------------------------------------
  local function destroy_calculator(player)
  	local root = get_gui_root(player)
  	if root.calcui then
  		root.calcui.destroy()
423dee08   compilatron   preparing release...
64
  		global.recent_results[player.index] = {}
3ef575ee   Stefan Wichmann   Initial checkin
65
66
67
68
  	end
  end
  
  -- ----------------------------------------------------------------
2de48216   Stefan Wichmann   Version 0.18.4 pu...
69
  local function fix_oob_ui(player)
ae0df041   Stefan Wichmann   Fixed multiplayer...
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
  	if global.gui_position[player.index].x < 0 then
  		global.gui_position[player.index].x = 0
  	end
  	if global.gui_position[player.index].y < 0 then
  		global.gui_position[player.index].y = 0
  	end
  
  	-- TODO fixed box size, because there is no API call for that
  	local width = 255
  	local height = 350
  
  	if global.gui_position[player.index].x + width > player.display_resolution.width then
  		global.gui_position[player.index].x = player.display_resolution.width - width
  	end
  	if global.gui_position[player.index].y + height > player.display_resolution.height then
  		global.gui_position[player.index].y = player.display_resolution.height - height
  	end
ae0df041   Stefan Wichmann   Fixed multiplayer...
87
88
89
  end
  
  -- ----------------------------------------------------------------
3ef575ee   Stefan Wichmann   Initial checkin
90
91
  function show_calculator(player)
  	local root = get_gui_root(player)
3ef575ee   Stefan Wichmann   Initial checkin
92
  
2de48216   Stefan Wichmann   Version 0.18.4 pu...
93
94
  	if not global.recent_results then
  		global.recent_results = {}
423dee08   compilatron   preparing release...
95
96
97
  	end
  	if not global.recent_results[player.index] then
  		global.recent_results[player.index] = {}
2de48216   Stefan Wichmann   Version 0.18.4 pu...
98
99
  	end
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
100
101
  	if not root.calcui then
  		local calcui = root.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
102
103
  			type = "frame",
  			name = "calcui",
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
104
105
  			direction = "vertical"
  		})
2de48216   Stefan Wichmann   Version 0.18.4 pu...
106
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
107
  		local flow = calcui.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
108
  			type = "flow",
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
109
110
111
  			name = "calcui_flow"
  		})
  		flow.style.horizontally_stretchable = "on"
2de48216   Stefan Wichmann   Version 0.18.4 pu...
112
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
113
  		flow.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
114
115
116
  			type = "label",
  			name = "calcui_title",
  			caption = {"calculator-ui.title"},
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
117
118
  			style = "frame_title"
  		}).drag_target = calcui
2de48216   Stefan Wichmann   Version 0.18.4 pu...
119
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
120
121
122
123
124
125
126
127
128
  		local widget = flow.add({
  			type = "empty-widget",
  			style = "draggable_space_header",
  			name = "calcui_drag"
  		})
  		widget.drag_target = calcui
  		widget.style.horizontally_stretchable = "on"
  		widget.style.minimal_width = 24
  		widget.style.natural_height = 24
2de48216   Stefan Wichmann   Version 0.18.4 pu...
129
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
130
  		flow.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
131
132
133
  			type = "sprite-button",
  			sprite = "utility/close_white",
  			style = "frame_action_button",
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
134
135
  			name = "calcui_close"
  		})
2de48216   Stefan Wichmann   Version 0.18.4 pu...
136
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
137
  		local table = calcui.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
138
139
140
  			type = "table",
  			name = "calcui_table",
  			column_count = "2",
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
141
142
  			vertical_centering = "false"
  		})
2de48216   Stefan Wichmann   Version 0.18.4 pu...
143
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
144
  		local col1 = table.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
145
146
  			type = "flow",
  			name = "calcui_table_col1",
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
147
148
  			direction = "vertical"
  		})
2de48216   Stefan Wichmann   Version 0.18.4 pu...
149
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
150
  		local display = col1.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
151
152
  			type = "textfield",
  			caption = "",
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
153
154
  			name = "calcui_display"
  		})
1eefa090   Stefan Wichmann   visual overhaul i...
155
  		display.style.width = 212
3ef575ee   Stefan Wichmann   Initial checkin
156
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
157
  		local row1 = col1.add({type="flow", name="calcui_col1_row1", direction="horizontal"})
1eefa090   Stefan Wichmann   visual overhaul i...
158
159
  		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)
  		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)
2de48216   Stefan Wichmann   Version 0.18.4 pu...
160
  		row1.add({type="sprite-button", style="calcui_button_style_light", caption="",   name="calcui_button_BS"}).sprite = "sprite_calcui_backspace"
1eefa090   Stefan Wichmann   visual overhaul i...
161
  		row1.add({type="sprite-button", style="calcui_button_style_light", caption="/",  name="calcui_button_DIV"}).sprite = "sprite_calcui_light"
3ef575ee   Stefan Wichmann   Initial checkin
162
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
163
  		local row2 = col1.add({type="flow", name="calcui_col1_row2", direction="horizontal"})
1eefa090   Stefan Wichmann   visual overhaul i...
164
165
166
167
  		row2.add({type="sprite-button", style="calcui_button_style_dark",  caption="7",  name="calcui_button_7"}).sprite = "sprite_calcui_dark"
  		row2.add({type="sprite-button", style="calcui_button_style_dark",  caption="8",  name="calcui_button_8"}).sprite = "sprite_calcui_dark"
  		row2.add({type="sprite-button", style="calcui_button_style_dark",  caption="9",  name="calcui_button_9"}).sprite = "sprite_calcui_dark"
  		row2.add({type="sprite-button", style="calcui_button_style_light", caption="*",  name="calcui_button_MUL"}).sprite = "sprite_calcui_light"
3ef575ee   Stefan Wichmann   Initial checkin
168
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
169
  		local row3 = col1.add({type="flow", name="calcui_col1_row3", direction="horizontal"})
1eefa090   Stefan Wichmann   visual overhaul i...
170
171
172
173
  		row3.add({type="sprite-button", style="calcui_button_style_dark",  caption="4",  name="calcui_button_4"}).sprite = "sprite_calcui_dark"
  		row3.add({type="sprite-button", style="calcui_button_style_dark",  caption="5",  name="calcui_button_5"}).sprite = "sprite_calcui_dark"
  		row3.add({type="sprite-button", style="calcui_button_style_dark",  caption="6",  name="calcui_button_6"}).sprite = "sprite_calcui_dark"
  		row3.add({type="sprite-button", style="calcui_button_style_light", caption="-",  name="calcui_button_SUB"}).sprite = "sprite_calcui_light"
3ef575ee   Stefan Wichmann   Initial checkin
174
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
175
  		local row4 = col1.add({type="flow", name="calcui_col1_row4", direction="horizontal"})
1eefa090   Stefan Wichmann   visual overhaul i...
176
177
178
179
  		row4.add({type="sprite-button", style="calcui_button_style_dark",  caption="1",  name="calcui_button_1"}).sprite = "sprite_calcui_dark"
  		row4.add({type="sprite-button", style="calcui_button_style_dark",  caption="2",  name="calcui_button_2"}).sprite = "sprite_calcui_dark"
  		row4.add({type="sprite-button", style="calcui_button_style_dark",  caption="3",  name="calcui_button_3"}).sprite = "sprite_calcui_dark"
  		row4.add({type="sprite-button", style="calcui_button_style_light", caption="+",  name="calcui_button_ADD"}).sprite = "sprite_calcui_light"
3ef575ee   Stefan Wichmann   Initial checkin
180
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
181
  		local row5 = col1.add({type="flow", name="calcui_col1_row5", direction="horizontal"})
1eefa090   Stefan Wichmann   visual overhaul i...
182
183
184
185
  		row5.add({type="sprite-button", style="calcui_button_style_light", caption="%",  name="calcui_button_PERC"}).sprite = "sprite_calcui_light"
  		row5.add({type="sprite-button", style="calcui_button_style_dark",  caption="0",  name="calcui_button_0"}).sprite = "sprite_calcui_dark"
  		row5.add({type="sprite-button", style="calcui_button_style_dark",  caption=".",  name="calcui_button_DOT"}).sprite = "sprite_calcui_dark"
  		row5.add({type="sprite-button", style="calcui_button_style_red",   caption="=",  name="calcui_button_EQU"}).sprite = "sprite_calcui_red"
3ef575ee   Stefan Wichmann   Initial checkin
186
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
187
  		local col2 = table.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
188
189
  			type = "flow",
  			name = "calcui_table_col2",
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
190
191
192
193
  			direction = "vertical"
  		})
  
  		local result = col2.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
194
195
196
  			type = "flow",
  			name = "calcui_result",
  			direction = "horizontal"
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
197
  		})
2de48216   Stefan Wichmann   Version 0.18.4 pu...
198
199
200
201
202
203
204
205
206
207
208
209
210
211
  
  		result.add({
  			type = "label",
  			caption = "=",
  			name = "calcui_display_sign"
  		}).style.font = "default-large"
  
  		result.add({
  			type = "label",
  			caption = "",
  			name = "calcui_copy_display_result"
  		}).style.font = "default-large"
  
  		col2.add({
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
212
213
214
  			type = "sprite",
  			name = "calcui_rant"
  		})
2de48216   Stefan Wichmann   Version 0.18.4 pu...
215
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
216
  		col2.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
217
218
  			type = "line",
  			name = "calcui_line",
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
219
220
  			direction = "horizontal"
  		})
2de48216   Stefan Wichmann   Version 0.18.4 pu...
221
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
222
223
224
225
226
  		local scroll = col2.add({
  			type = "scroll-pane",
  			name = "calcui_scroll_pane"
  		})
  		scroll.style.height = 252
2de48216   Stefan Wichmann   Version 0.18.4 pu...
227
228
229
230
231
232
233
234
235
  
  		scroll.add({
  			type = "table",
  			caption = "",
  			name = "calcui_result_table",
  			column_count = "3"
  		}).style.column_alignments[1] = "right"
  
  
ae0df041   Stefan Wichmann   Fixed multiplayer...
236
237
238
239
240
241
242
  		-- use last saved location or center the gui
  		if not global.gui_position then
  			global.gui_position = {}
  		end
  		if global.gui_position[player.index] then
  			-- fix weird saved positions (out of reach)
  			fix_oob_ui(player)
2de48216   Stefan Wichmann   Version 0.18.4 pu...
243
  
ae0df041   Stefan Wichmann   Fixed multiplayer...
244
245
246
247
  			calcui.location = global.gui_position[player.index]
  		else
  			calcui.force_auto_center()
  		end
2de48216   Stefan Wichmann   Version 0.18.4 pu...
248
249
250
  
  		-- focus on display
  		display.focus()
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
251
  	end
3ef575ee   Stefan Wichmann   Initial checkin
252
253
254
  end
  
  -- ----------------------------------------------------------------
2de48216   Stefan Wichmann   Version 0.18.4 pu...
255
  local function hide_calculator(player)
3ef575ee   Stefan Wichmann   Initial checkin
256
257
258
259
260
261
262
263
264
265
266
267
268
269
  	destroy_calculator(player)
  end
  
  -- ----------------------------------------------------------------
  function toggle_calculator(player)
  	local root = get_gui_root(player)
  	if root and root.calcui then
  		hide_calculator(player)
  	else
  		show_calculator(player)
  	end
  end
  
  -- ----------------------------------------------------------------
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
270
271
272
273
274
275
  function focus_on_input(player)
  	local root = get_gui_root(player)
  	root.calcui.calcui_table.calcui_table_col1.calcui_display.focus()
  end
  
  -- ----------------------------------------------------------------
2de48216   Stefan Wichmann   Version 0.18.4 pu...
276
  local function clear_equation(player)
3ef575ee   Stefan Wichmann   Initial checkin
277
278
279
280
281
  	local root = get_gui_root(player)
  	root.calcui.calcui_table.calcui_table_col1.calcui_display.text = ""
  end
  
  -- ----------------------------------------------------------------
2de48216   Stefan Wichmann   Version 0.18.4 pu...
282
  local function process_ce_key(player, button)
3ef575ee   Stefan Wichmann   Initial checkin
283
284
  	local root = get_gui_root(player)
  	clear_equation(player)
423dee08   compilatron   preparing release...
285
286
287
  	local result = root.calcui.calcui_table.calcui_table_col2.calcui_result.calcui_copy_display_result
  	result.caption = ""
  	result.tooltip = ""
3ef575ee   Stefan Wichmann   Initial checkin
288
289
290
  end
  
  -- ----------------------------------------------------------------
2de48216   Stefan Wichmann   Version 0.18.4 pu...
291
  local function process_c_key(player, button)
3ef575ee   Stefan Wichmann   Initial checkin
292
293
294
  	local root = get_gui_root(player)
  	process_ce_key(player, button)
  	root.calcui.calcui_table.calcui_table_col2.calcui_scroll_pane.calcui_result_table.clear()
2de48216   Stefan Wichmann   Version 0.18.4 pu...
295
  	global.recent_results[player.index] = {}
3ef575ee   Stefan Wichmann   Initial checkin
296
297
298
  end
  
  -- ----------------------------------------------------------------
2de48216   Stefan Wichmann   Version 0.18.4 pu...
299
  local function process_backspace_key(player, button)
3ef575ee   Stefan Wichmann   Initial checkin
300
  	local root = get_gui_root(player)
423dee08   compilatron   preparing release...
301
302
  	local display = root.calcui.calcui_table.calcui_table_col1.calcui_display
  	display.text = string.sub(display.text, 1, -2)
3ef575ee   Stefan Wichmann   Initial checkin
303
304
305
  end
  
  -- ----------------------------------------------------------------
2de48216   Stefan Wichmann   Version 0.18.4 pu...
306
307
308
  local function draw_recent_table(player)
  	local root = get_gui_root(player)
  
423dee08   compilatron   preparing release...
309
310
  	local recent = root.calcui.calcui_table.calcui_table_col2.calcui_scroll_pane
  
2de48216   Stefan Wichmann   Version 0.18.4 pu...
311
  	-- drop old table
423dee08   compilatron   preparing release...
312
  	recent.calcui_result_table.clear()
2de48216   Stefan Wichmann   Version 0.18.4 pu...
313
314
  
  	for i, result in ipairs(global.recent_results[player.index]) do
423dee08   compilatron   preparing release...
315
  		recent.calcui_result_table.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
316
317
318
319
320
  			type = "label",
  			name = "calcui_copy_equation_" .. i,
  			caption = result["equation"],
  			tooltip = {"calculator-ui.recent_tooltip"}
  		})
423dee08   compilatron   preparing release...
321
  		recent.calcui_result_table.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
322
323
324
325
  			type = "label",
  			name = "calcui_sign_" .. i,
  			caption = "="
  		})
423dee08   compilatron   preparing release...
326
  		recent.calcui_result_table.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
327
328
329
330
331
  			type = "label",
  			name = "calcui_copy_result_" .. i,
  			caption = result["result"]
  		})
  	end
423dee08   compilatron   preparing release...
332
  	recent.scroll_to_top()
2de48216   Stefan Wichmann   Version 0.18.4 pu...
333
334
335
  end
  
  -- ----------------------------------------------------------------
423dee08   compilatron   preparing release...
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
  local math_lib = {
  	["abs"]   = "math.abs",
  	["acos"]  = "math.acos",
  	["asin"]  = "math.asin",
  	["atan"]  = "math.atan",
  	["atan2"] = "math.atan2",
  	["ceil"]  = "math.ceil",
  	["floor"] = "math.floor",
  	["cos"]   = "math.cos",
  	["cosh"]  = "math.cosh",
  	["sin"]   = "math.sin",
  	["sinh"]  = "math.sinh",
  	["tan"]   = "math.tan",
  	["tanh"]  = "math.tanh",
  	["deg"]   = "math.deg",
  	["rad"]   = "math.rad",
  	["exp"]   = "math.exp",
  	["log"]   = "math.log",
  	["log10"] = "math.log10",
  	["min"]   = "math.min",
  	["max"]   = "math.max",
  	["modf"]  = "math.modf",
  	["fmod"]  = "math.fmod",
  	["frexp"] = "math.frexp",
  	["ldexp"] = "math.ldexp",
  	["sqrt"]  = "math.sqrt",
  	["huge"]  = "math.huge",
  	["pi"]    = "math.pi",
  	["pow"]   = "math.pow"
  }
2de48216   Stefan Wichmann   Version 0.18.4 pu...
366
  local function fix_equation(equation, root)
3ef575ee   Stefan Wichmann   Initial checkin
367
  	local result = equation
2de48216   Stefan Wichmann   Version 0.18.4 pu...
368
  	local prev_result = root.calcui.calcui_table.calcui_table_col2.calcui_result.calcui_copy_display_result.tooltip
1eefa090   Stefan Wichmann   visual overhaul i...
369
370
371
372
373
374
375
376
377
378
379
380
381
382
  
  
  	-- 1. visible part
  	-- if equation does not start with a number or char, use the previous result (if available) and put it in front
  	if not (string.match(result:sub(1, 1), "[^%w%(%)]") == nil) and prev_result then
  		result = prev_result .. result
  	end
  
  	-- remove "math."
  	result = result:gsub("math.", "")
  	local new_equation = result
  
  
  	-- 2. invisible part
3ef575ee   Stefan Wichmann   Initial checkin
383
  	-- fix math library shortcuts
3ef575ee   Stefan Wichmann   Initial checkin
384
385
386
387
388
  	for key, val in pairs(math_lib) do
  		result = result:gsub(key, val)
  	end
  
  	-- fix percentage
d7393909   Stefan Wichmann   preparing release...
389
390
391
392
393
394
395
396
397
398
399
400
401
  	-- complex equations like "20+10%" = 22, before it was 20.1 -- big thanks to GWulf
  	result = result:gsub("(%d+)(.)(%d+)%%", function (base, sign, perc)
  		if sign == "+" then
  			return base .. "*1." .. perc
  		elseif sign == "-" then
  			return base .. "*(1-0." ..perc .. ")"
  		elseif sign == "*" then
  			return "(" .. base .. "/100)*" .. perc
  		elseif sign == "/" then
  			return "(" .. base .. "*100)/" .. perc
  		end
  	end)
  	-- still the simple equation needs some work: 1% = 0.01
3ef575ee   Stefan Wichmann   Initial checkin
402
  	result = result:gsub("(%%)", "/100")
2de48216   Stefan Wichmann   Version 0.18.4 pu...
403
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
404
405
  	-- fix danish keyboard
  	result = result:gsub(",", ".")
d7b81613   Stefan Wichmann   Minor fixed - rel...
406
  	result = result:gsub(";", ",")
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
407
  
1eefa090   Stefan Wichmann   visual overhaul i...
408
409
  
  	return result, new_equation
3ef575ee   Stefan Wichmann   Initial checkin
410
411
412
413
414
  end
  
  -- ----------------------------------------------------------------
  function process_equal_key(player, button)
  	local root = get_gui_root(player)
3ef575ee   Stefan Wichmann   Initial checkin
415
  	local original_equation = root.calcui.calcui_table.calcui_table_col1.calcui_display.text;
2de48216   Stefan Wichmann   Version 0.18.4 pu...
416
  
1eefa090   Stefan Wichmann   visual overhaul i...
417
  	equation, original_equation = fix_equation(original_equation, root)
2de48216   Stefan Wichmann   Version 0.18.4 pu...
418
  
3ef575ee   Stefan Wichmann   Initial checkin
419
420
  	-- just testing
  	--root.calcui.calcui_table.calcui_table_col1.calcui_display.text = equation
2de48216   Stefan Wichmann   Version 0.18.4 pu...
421
  
3ef575ee   Stefan Wichmann   Initial checkin
422
423
424
425
  	if not (equation == nil or equation == "") then
  		local status, retval = pcall(function()
  			return load("return " .. equation)()
  		end)
2de48216   Stefan Wichmann   Version 0.18.4 pu...
426
  		root.calcui.calcui_table.calcui_table_col2.calcui_result.calcui_copy_display_result.tooltip = retval
d7b81613   Stefan Wichmann   Minor fixed - rel...
427
428
429
430
431
432
433
434
435
436
437
  		if not (retval == math.huge or retval ~= retval) then
  			status, retval_show = pcall(function()
  				local result = string.format("%0." .. settings.get_player_settings(player)["calcui-decimal-places"].value .. "f", retval)
  				if result:len() > tostring(retval):len() then
  					result = retval
  				end
  				return result
  			end)
  		else
  			status = false
  		end
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
438
  		if retval_show == nil or retval_show == "" then
3ef575ee   Stefan Wichmann   Initial checkin
439
440
441
  			status = false
  		end
  		if not status then
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
442
  			retval_show = "NaN"
3ef575ee   Stefan Wichmann   Initial checkin
443
444
445
  			show_rant(player, true)
  		else
  			if retval <= 0 then
d7b81613   Stefan Wichmann   Minor fixed - rel...
446
  				show_think(player, true)
2de48216   Stefan Wichmann   Version 0.18.4 pu...
447
  			else
3ef575ee   Stefan Wichmann   Initial checkin
448
449
450
  				show_rant(player, false)
  			end
  		end
2de48216   Stefan Wichmann   Version 0.18.4 pu...
451
452
  		root.calcui.calcui_table.calcui_table_col2.calcui_result.calcui_copy_display_result.caption = retval_show
  
3ef575ee   Stefan Wichmann   Initial checkin
453
454
  		-- only write in recent table if actually a result
  		if status then
2de48216   Stefan Wichmann   Version 0.18.4 pu...
455
456
457
458
459
  			-- check first equation and only insert if not the same
  			if #global.recent_results[player.index] == 0 or global.recent_results[player.index][1]["equation"] ~= original_equation then
  				table.insert(global.recent_results[player.index], 1, {
  					equation = original_equation,
  					result = retval_show
3ef575ee   Stefan Wichmann   Initial checkin
460
  				})
3ef575ee   Stefan Wichmann   Initial checkin
461
  			end
2de48216   Stefan Wichmann   Version 0.18.4 pu...
462
  			draw_recent_table(player)
3ef575ee   Stefan Wichmann   Initial checkin
463
464
  		end
  	end
4078977a   Stefan Wichmann   Prepare for first...
465
466
467
468
  
  	if settings.get_player_settings(player)["calcui-clear-on-calc"].value then
  		clear_equation(player)
  	end
3ef575ee   Stefan Wichmann   Initial checkin
469
470
471
  end
  
  -- ----------------------------------------------------------------
2de48216   Stefan Wichmann   Version 0.18.4 pu...
472
  local function display_addchar(player, char)
3ef575ee   Stefan Wichmann   Initial checkin
473
  	local root = get_gui_root(player)
423dee08   compilatron   preparing release...
474
475
  	local display = root.calcui.calcui_table.calcui_table_col1.calcui_display
  	display.text = display.text .. char
3ef575ee   Stefan Wichmann   Initial checkin
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
  	show_rant(player, false)
  end
  
  -- ----------------------------------------------------------------
  local button_dispatch = {
  	["CE"]  = process_ce_key,
  	["C"]   = process_c_key,
  	["BS"]  = process_backspace_key,
  	--
  	["EQU"] = process_equal_key
  }
  local button_addchar = {
  	["DIV"]  = "/",
  	--
  	["7"]    = "7",
  	["8"]    = "8",
  	["9"]    = "9",
  	["MUL"]  = "*",
  	--
  	["4"]    = "4",
  	["5"]    = "5",
  	["6"]    = "6",
  	["SUB"]  = "-",
  	--
  	["1"]    = "1",
  	["2"]    = "2",
  	["3"]    = "3",
  	["ADD"]  = "+",
  	--
  	["PERC"] = "%",
  	["0"]    = "0",
  	["DOT"]  = "."
  }
  
  function handle_calcui_click(event, player)
  	debug_print("handle_calcui_click()")
  	local event_name = event.element.name
  	local button_prefix = "calcui_button_"
  	local button_prefix_len = string.len(button_prefix)
2de48216   Stefan Wichmann   Version 0.18.4 pu...
515
516
517
518
  
  	local copy_prefix = "calcui_copy_"
  	local copy_prefix_len = string.len(copy_prefix);
  
3ef575ee   Stefan Wichmann   Initial checkin
519
520
521
522
523
524
525
526
527
528
  	-- calculator buttons
  	if string.sub(event_name, 1, button_prefix_len) == button_prefix then
  		show_rant(player, false)
  
  		button = string.sub(event_name, button_prefix_len + 1 )
  		debug_print("handle_calcui_click button " .. button)
  		local dispatch_func = button_dispatch[button]
  		if dispatch_func then
  			dispatch_func(player, button)
  		end
2de48216   Stefan Wichmann   Version 0.18.4 pu...
529
  
3ef575ee   Stefan Wichmann   Initial checkin
530
531
532
533
534
535
536
  		local addchar = button_addchar[button]
  		if addchar then
  			display_addchar(player, addchar)
  		end
  	-- close button
  	elseif event_name == "calcui_close" then
  		hide_calculator(player)
2de48216   Stefan Wichmann   Version 0.18.4 pu...
537
538
539
  	-- copy results
  	elseif string.sub(event_name, 1, copy_prefix_len) == copy_prefix then
  		if event.button == defines.mouse_button_type.left and
3ef575ee   Stefan Wichmann   Initial checkin
540
  		   event.shift == true then
2de48216   Stefan Wichmann   Version 0.18.4 pu...
541
  			-- copy equation or result to display
3ef575ee   Stefan Wichmann   Initial checkin
542
  			local root = get_gui_root(player)
2de48216   Stefan Wichmann   Version 0.18.4 pu...
543
544
545
546
547
  			if event_name == "calcui_copy_display_result" then
  				root.calcui.calcui_table.calcui_table_col1.calcui_display.text = root.calcui.calcui_table.calcui_table_col2.calcui_result.calcui_copy_display_result.caption
  			else
  				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
  			end
3ef575ee   Stefan Wichmann   Initial checkin
548
  		end
423dee08   compilatron   preparing release...
549
  		focus_on_input(player)
2de48216   Stefan Wichmann   Version 0.18.4 pu...
550
551
552
  	-- if else focus on focus on display
  	else
  		focus_on_input(player)
3ef575ee   Stefan Wichmann   Initial checkin
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
  	end
  end
  
  -- ----------------------------------------------------------------
  function calcui_on_gui_text_changed(event)
  	if event.element.name == "calcui_display" then
  		local player = game.players[event.player_index]
  		local root = get_gui_root(player)
  		if string.find(root.calcui.calcui_table.calcui_table_col1.calcui_display.text, "=") then
  			root.calcui.calcui_table.calcui_table_col1.calcui_display.text = root.calcui.calcui_table.calcui_table_col1.calcui_display.text:gsub("=", "")
  			process_equal_key(player)
  		end
  	end
  end
  
  -- ----------------------------------------------------------------
  function calcui_on_gui_location_changed(event)
  	if event.element.name == "calcui" then
ae0df041   Stefan Wichmann   Fixed multiplayer...
571
572
573
574
  		if not global.gui_position then
  			global.gui_position = {}
  		end
  		global.gui_position[event.player_index] = event.element.location
3ef575ee   Stefan Wichmann   Initial checkin
575
  	end
4078977a   Stefan Wichmann   Prepare for first...
576
  end