Blame view

calculator.lua 18.2 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
106
  			style = "dialog_frame",
  			direction = "vertical"
  		})
2de48216   Stefan Wichmann   Version 0.18.4 pu...
107
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
108
  		local flow = calcui.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
109
  			type = "flow",
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
110
111
112
  			name = "calcui_flow"
  		})
  		flow.style.horizontally_stretchable = "on"
2de48216   Stefan Wichmann   Version 0.18.4 pu...
113
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
114
  		flow.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
115
116
117
  			type = "label",
  			name = "calcui_title",
  			caption = {"calculator-ui.title"},
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
118
119
  			style = "frame_title"
  		}).drag_target = calcui
2de48216   Stefan Wichmann   Version 0.18.4 pu...
120
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
121
122
123
124
125
126
127
128
129
  		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...
130
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
131
  		flow.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
132
133
134
  			type = "sprite-button",
  			sprite = "utility/close_white",
  			style = "frame_action_button",
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
135
136
  			name = "calcui_close"
  		})
2de48216   Stefan Wichmann   Version 0.18.4 pu...
137
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
138
  		local table = calcui.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
139
140
141
  			type = "table",
  			name = "calcui_table",
  			column_count = "2",
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
142
143
  			vertical_centering = "false"
  		})
2de48216   Stefan Wichmann   Version 0.18.4 pu...
144
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
145
  		local col1 = table.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
146
147
  			type = "flow",
  			name = "calcui_table_col1",
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
148
149
  			direction = "vertical"
  		})
2de48216   Stefan Wichmann   Version 0.18.4 pu...
150
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
151
  		local display = col1.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
152
153
  			type = "textfield",
  			caption = "",
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
154
155
  			name = "calcui_display"
  		})
1eefa090   Stefan Wichmann   visual overhaul i...
156
  		display.style.width = 212
3ef575ee   Stefan Wichmann   Initial checkin
157
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
158
  		local row1 = col1.add({type="flow", name="calcui_col1_row1", direction="horizontal"})
1eefa090   Stefan Wichmann   visual overhaul i...
159
160
  		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...
161
  		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...
162
  		row1.add({type="sprite-button", style="calcui_button_style_light", caption="/",  name="calcui_button_DIV"}).sprite = "sprite_calcui_light"
3ef575ee   Stefan Wichmann   Initial checkin
163
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
164
  		local row2 = col1.add({type="flow", name="calcui_col1_row2", direction="horizontal"})
1eefa090   Stefan Wichmann   visual overhaul i...
165
166
167
168
  		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
169
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
170
  		local row3 = col1.add({type="flow", name="calcui_col1_row3", direction="horizontal"})
1eefa090   Stefan Wichmann   visual overhaul i...
171
172
173
174
  		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
175
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
176
  		local row4 = col1.add({type="flow", name="calcui_col1_row4", direction="horizontal"})
1eefa090   Stefan Wichmann   visual overhaul i...
177
178
179
180
  		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
181
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
182
  		local row5 = col1.add({type="flow", name="calcui_col1_row5", direction="horizontal"})
1eefa090   Stefan Wichmann   visual overhaul i...
183
184
185
186
  		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
187
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
188
  		local col2 = table.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
189
190
  			type = "flow",
  			name = "calcui_table_col2",
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
191
192
193
194
  			direction = "vertical"
  		})
  
  		local result = col2.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
195
196
197
  			type = "flow",
  			name = "calcui_result",
  			direction = "horizontal"
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
198
  		})
2de48216   Stefan Wichmann   Version 0.18.4 pu...
199
200
201
202
203
204
205
206
207
208
209
210
211
212
  
  		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...
213
214
215
  			type = "sprite",
  			name = "calcui_rant"
  		})
2de48216   Stefan Wichmann   Version 0.18.4 pu...
216
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
217
  		col2.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
218
219
  			type = "line",
  			name = "calcui_line",
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
220
221
  			direction = "horizontal"
  		})
2de48216   Stefan Wichmann   Version 0.18.4 pu...
222
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
223
224
225
226
227
  		local scroll = col2.add({
  			type = "scroll-pane",
  			name = "calcui_scroll_pane"
  		})
  		scroll.style.height = 252
2de48216   Stefan Wichmann   Version 0.18.4 pu...
228
229
230
231
232
233
234
235
236
  
  		scroll.add({
  			type = "table",
  			caption = "",
  			name = "calcui_result_table",
  			column_count = "3"
  		}).style.column_alignments[1] = "right"
  
  
ae0df041   Stefan Wichmann   Fixed multiplayer...
237
238
239
240
241
242
243
  		-- 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...
244
  
ae0df041   Stefan Wichmann   Fixed multiplayer...
245
246
247
248
  			calcui.location = global.gui_position[player.index]
  		else
  			calcui.force_auto_center()
  		end
2de48216   Stefan Wichmann   Version 0.18.4 pu...
249
250
251
  
  		-- focus on display
  		display.focus()
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
252
  	end
3ef575ee   Stefan Wichmann   Initial checkin
253
254
255
  end
  
  -- ----------------------------------------------------------------
2de48216   Stefan Wichmann   Version 0.18.4 pu...
256
  local function hide_calculator(player)
3ef575ee   Stefan Wichmann   Initial checkin
257
258
259
260
261
262
263
264
265
266
267
268
269
270
  	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...
271
272
273
274
275
276
  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...
277
  local function clear_equation(player)
3ef575ee   Stefan Wichmann   Initial checkin
278
279
280
281
282
  	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...
283
  local function process_ce_key(player, button)
3ef575ee   Stefan Wichmann   Initial checkin
284
285
  	local root = get_gui_root(player)
  	clear_equation(player)
423dee08   compilatron   preparing release...
286
287
288
  	local result = root.calcui.calcui_table.calcui_table_col2.calcui_result.calcui_copy_display_result
  	result.caption = ""
  	result.tooltip = ""
3ef575ee   Stefan Wichmann   Initial checkin
289
290
291
  end
  
  -- ----------------------------------------------------------------
2de48216   Stefan Wichmann   Version 0.18.4 pu...
292
  local function process_c_key(player, button)
3ef575ee   Stefan Wichmann   Initial checkin
293
294
295
  	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...
296
  	global.recent_results[player.index] = {}
3ef575ee   Stefan Wichmann   Initial checkin
297
298
299
  end
  
  -- ----------------------------------------------------------------
2de48216   Stefan Wichmann   Version 0.18.4 pu...
300
  local function process_backspace_key(player, button)
3ef575ee   Stefan Wichmann   Initial checkin
301
  	local root = get_gui_root(player)
423dee08   compilatron   preparing release...
302
303
  	local display = root.calcui.calcui_table.calcui_table_col1.calcui_display
  	display.text = string.sub(display.text, 1, -2)
3ef575ee   Stefan Wichmann   Initial checkin
304
305
306
  end
  
  -- ----------------------------------------------------------------
2de48216   Stefan Wichmann   Version 0.18.4 pu...
307
308
309
  local function draw_recent_table(player)
  	local root = get_gui_root(player)
  
423dee08   compilatron   preparing release...
310
311
  	local recent = root.calcui.calcui_table.calcui_table_col2.calcui_scroll_pane
  
2de48216   Stefan Wichmann   Version 0.18.4 pu...
312
  	-- drop old table
423dee08   compilatron   preparing release...
313
  	recent.calcui_result_table.clear()
2de48216   Stefan Wichmann   Version 0.18.4 pu...
314
315
  
  	for i, result in ipairs(global.recent_results[player.index]) do
423dee08   compilatron   preparing release...
316
  		recent.calcui_result_table.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
317
318
319
320
321
  			type = "label",
  			name = "calcui_copy_equation_" .. i,
  			caption = result["equation"],
  			tooltip = {"calculator-ui.recent_tooltip"}
  		})
423dee08   compilatron   preparing release...
322
  		recent.calcui_result_table.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
323
324
325
326
  			type = "label",
  			name = "calcui_sign_" .. i,
  			caption = "="
  		})
423dee08   compilatron   preparing release...
327
  		recent.calcui_result_table.add({
2de48216   Stefan Wichmann   Version 0.18.4 pu...
328
329
330
331
332
  			type = "label",
  			name = "calcui_copy_result_" .. i,
  			caption = result["result"]
  		})
  	end
423dee08   compilatron   preparing release...
333
  	recent.scroll_to_top()
2de48216   Stefan Wichmann   Version 0.18.4 pu...
334
335
336
  end
  
  -- ----------------------------------------------------------------
423dee08   compilatron   preparing release...
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
366
  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...
367
  local function fix_equation(equation, root)
3ef575ee   Stefan Wichmann   Initial checkin
368
  	local result = equation
2de48216   Stefan Wichmann   Version 0.18.4 pu...
369
  	local prev_result = root.calcui.calcui_table.calcui_table_col2.calcui_result.calcui_copy_display_result.tooltip
1eefa090   Stefan Wichmann   visual overhaul i...
370
371
372
373
374
375
376
377
378
379
380
381
382
383
  
  
  	-- 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
384
  	-- fix math library shortcuts
3ef575ee   Stefan Wichmann   Initial checkin
385
386
387
388
389
  	for key, val in pairs(math_lib) do
  		result = result:gsub(key, val)
  	end
  
  	-- fix percentage
d7393909   Stefan Wichmann   preparing release...
390
391
392
393
394
395
396
397
398
399
400
401
402
  	-- 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
403
  	result = result:gsub("(%%)", "/100")
2de48216   Stefan Wichmann   Version 0.18.4 pu...
404
  
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
405
406
  	-- fix danish keyboard
  	result = result:gsub(",", ".")
d7b81613   Stefan Wichmann   Minor fixed - rel...
407
  	result = result:gsub(";", ",")
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
408
  
1eefa090   Stefan Wichmann   visual overhaul i...
409
410
  
  	return result, new_equation
3ef575ee   Stefan Wichmann   Initial checkin
411
412
413
414
415
  end
  
  -- ----------------------------------------------------------------
  function process_equal_key(player, button)
  	local root = get_gui_root(player)
3ef575ee   Stefan Wichmann   Initial checkin
416
  	local original_equation = root.calcui.calcui_table.calcui_table_col1.calcui_display.text;
2de48216   Stefan Wichmann   Version 0.18.4 pu...
417
  
1eefa090   Stefan Wichmann   visual overhaul i...
418
  	equation, original_equation = fix_equation(original_equation, root)
2de48216   Stefan Wichmann   Version 0.18.4 pu...
419
  
3ef575ee   Stefan Wichmann   Initial checkin
420
421
  	-- just testing
  	--root.calcui.calcui_table.calcui_table_col1.calcui_display.text = equation
2de48216   Stefan Wichmann   Version 0.18.4 pu...
422
  
3ef575ee   Stefan Wichmann   Initial checkin
423
424
425
426
  	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...
427
  		root.calcui.calcui_table.calcui_table_col2.calcui_result.calcui_copy_display_result.tooltip = retval
d7b81613   Stefan Wichmann   Minor fixed - rel...
428
429
430
431
432
433
434
435
436
437
438
  		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...
439
  		if retval_show == nil or retval_show == "" then
3ef575ee   Stefan Wichmann   Initial checkin
440
441
442
  			status = false
  		end
  		if not status then
c6cb1d22   Stefan Wichmann   Bugfix 0.18.1 - b...
443
  			retval_show = "NaN"
3ef575ee   Stefan Wichmann   Initial checkin
444
445
446
  			show_rant(player, true)
  		else
  			if retval <= 0 then
d7b81613   Stefan Wichmann   Minor fixed - rel...
447
  				show_think(player, true)
2de48216   Stefan Wichmann   Version 0.18.4 pu...
448
  			else
3ef575ee   Stefan Wichmann   Initial checkin
449
450
451
  				show_rant(player, false)
  			end
  		end
2de48216   Stefan Wichmann   Version 0.18.4 pu...
452
453
  		root.calcui.calcui_table.calcui_table_col2.calcui_result.calcui_copy_display_result.caption = retval_show
  
3ef575ee   Stefan Wichmann   Initial checkin
454
455
  		-- only write in recent table if actually a result
  		if status then
2de48216   Stefan Wichmann   Version 0.18.4 pu...
456
457
458
459
460
  			-- 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
461
  				})
3ef575ee   Stefan Wichmann   Initial checkin
462
  			end
2de48216   Stefan Wichmann   Version 0.18.4 pu...
463
  			draw_recent_table(player)
3ef575ee   Stefan Wichmann   Initial checkin
464
465
  		end
  	end
4078977a   Stefan Wichmann   Prepare for first...
466
467
468
469
  
  	if settings.get_player_settings(player)["calcui-clear-on-calc"].value then
  		clear_equation(player)
  	end
3ef575ee   Stefan Wichmann   Initial checkin
470
471
472
  end
  
  -- ----------------------------------------------------------------
2de48216   Stefan Wichmann   Version 0.18.4 pu...
473
  local function display_addchar(player, char)
3ef575ee   Stefan Wichmann   Initial checkin
474
  	local root = get_gui_root(player)
423dee08   compilatron   preparing release...
475
476
  	local display = root.calcui.calcui_table.calcui_table_col1.calcui_display
  	display.text = display.text .. char
3ef575ee   Stefan Wichmann   Initial checkin
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
515
  	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...
516
517
518
519
  
  	local copy_prefix = "calcui_copy_"
  	local copy_prefix_len = string.len(copy_prefix);
  
3ef575ee   Stefan Wichmann   Initial checkin
520
521
522
523
524
525
526
527
528
529
  	-- 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...
530
  
3ef575ee   Stefan Wichmann   Initial checkin
531
532
533
534
535
536
537
  		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...
538
539
540
  	-- 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
541
  		   event.shift == true then
2de48216   Stefan Wichmann   Version 0.18.4 pu...
542
  			-- copy equation or result to display
3ef575ee   Stefan Wichmann   Initial checkin
543
  			local root = get_gui_root(player)
2de48216   Stefan Wichmann   Version 0.18.4 pu...
544
545
546
547
548
  			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
549
  		end
423dee08   compilatron   preparing release...
550
  		focus_on_input(player)
2de48216   Stefan Wichmann   Version 0.18.4 pu...
551
552
553
  	-- if else focus on focus on display
  	else
  		focus_on_input(player)
3ef575ee   Stefan Wichmann   Initial checkin
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
  	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...
572
573
574
575
  		if not global.gui_position then
  			global.gui_position = {}
  		end
  		global.gui_position[event.player_index] = event.element.location
3ef575ee   Stefan Wichmann   Initial checkin
576
  	end
4078977a   Stefan Wichmann   Prepare for first...
577
  end