194 lines
6.8 KiB
Lua
194 lines
6.8 KiB
Lua
-------------------------------------------------------------------------------
|
|
---Class to build Calculator panel
|
|
---@class Calculator
|
|
Calculator = newclass(Form)
|
|
|
|
local display_panel = nil
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Initialization
|
|
function Calculator:onInit()
|
|
self.panelCaption = ({"helmod_calculator-panel.title"})
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---On Style
|
|
---@param styles table
|
|
---@param width_main number
|
|
---@param height_main number
|
|
function Calculator:onStyle(styles, width_main, height_main)
|
|
styles.flow_panel = nil
|
|
end
|
|
|
|
------------------------------------------------------------------------------
|
|
---Get Button Sprites
|
|
---@return string, string
|
|
function Calculator:getButtonSprites()
|
|
return defines.sprites.calculator.white,defines.sprites.calculator.black
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Is tool
|
|
---@return boolean
|
|
function Calculator:isTool()
|
|
return true
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Get or create column panel
|
|
--
|
|
---@function [parent=#Calculator] getColumnPanel
|
|
--
|
|
function Calculator:getColumnPanel()
|
|
local flow_panel, content_panel, menu_panel = self:getPanel()
|
|
local panel_name = "main_panel"
|
|
if content_panel[panel_name] ~= nil and content_panel[panel_name].valid then
|
|
return content_panel[panel_name]["display_panel1"], content_panel[panel_name]["display_panel2"]
|
|
end
|
|
local panel = self:getFlowPanel(panel_name, "horizontal")
|
|
local display_panel1 = GuiElement.add(panel, GuiFrameV("display_panel1"))
|
|
display_panel1.style.vertically_stretchable = true
|
|
local display_panel2 = GuiElement.add(panel, GuiFrameV("display_panel2"))
|
|
display_panel2.style.vertically_stretchable = true
|
|
return display_panel1, display_panel2
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---On event
|
|
---@param event LuaEvent
|
|
function Calculator:onEvent(event)
|
|
---import
|
|
if event.action == "compute" then
|
|
local text = event.element.text
|
|
local ok , err = pcall(function()
|
|
local result = formula(text)
|
|
self:addHistory(text, result)
|
|
User.setParameter("calculator_value", result or 0)
|
|
self:updateDisplay()
|
|
self:updateHistory()
|
|
end)
|
|
if not(ok) then
|
|
Player.print("Formula is not valid!")
|
|
end
|
|
end
|
|
if event.action == "selected-key" then
|
|
if event.item1 == "enter" then
|
|
local ok , err = pcall(function()
|
|
local calculator_value = User.getParameter("calculator_value") or 0
|
|
local result = formula(calculator_value)
|
|
self:addHistory(calculator_value, result)
|
|
User.setParameter("calculator_value", result or 0)
|
|
self:updateDisplay()
|
|
self:updateHistory()
|
|
end)
|
|
if not(ok) then
|
|
Player.print("Formula is not valid!")
|
|
end
|
|
elseif event.item1 == "clear" then
|
|
User.setParameter("calculator_value", 0)
|
|
self:updateDisplay()
|
|
else
|
|
local calculator_value = User.getParameter("calculator_value") or 0
|
|
if calculator_value == 0 then calculator_value = "" end
|
|
User.setParameter("calculator_value", calculator_value..event.item1)
|
|
self:updateDisplay()
|
|
end
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Add history
|
|
---@param calculator_value string
|
|
---@param result number
|
|
function Calculator:addHistory(calculator_value, result)
|
|
if calculator_value ~= result then
|
|
local calculator_history = User.getParameter("calculator_history") or {}
|
|
table.insert(calculator_history,1,string.format("%s=%s",calculator_value,result))
|
|
if #calculator_history > 9 then table.remove(calculator_history,#calculator_history) end
|
|
User.setParameter("calculator_history", calculator_history)
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---On update
|
|
---@param event LuaEvent
|
|
function Calculator:onUpdate(event)
|
|
self:updateDisplay()
|
|
self:updateKeyboard()
|
|
self:updateHistory()
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Update display
|
|
function Calculator:updateDisplay()
|
|
local keyboard_panel = self:getFrameDeepPanel("display")
|
|
keyboard_panel.clear()
|
|
|
|
local calculator_value = User.getParameter("calculator_value") or 0
|
|
display_panel = GuiElement.add(keyboard_panel, GuiTextField(self.classname, "compute"):text(calculator_value):style("helmod_textfield_calculator"))
|
|
--display_panel.style.horizontally_stretchable = true
|
|
display_panel.style.width=352
|
|
display_panel.style.horizontal_align = "right"
|
|
display_panel.focus()
|
|
end
|
|
-------------------------------------------------------------------------------
|
|
---Update keyboard
|
|
function Calculator:updateKeyboard()
|
|
local _,keyboard_panel = self:getColumnPanel()
|
|
keyboard_panel.clear()
|
|
|
|
local table_panel = GuiElement.add(keyboard_panel, GuiTable("keys"):column(4))
|
|
local keys = {}
|
|
table.insert(keys, {key="clear" ,caption="C", tooltip="clear"})
|
|
table.insert(keys, {key="(" ,caption="("})
|
|
table.insert(keys, {key=")" ,caption=")"})
|
|
table.insert(keys, {key="" ,caption=""})
|
|
|
|
table.insert(keys, {key="" ,caption=""})
|
|
table.insert(keys, {key="^" ,caption="^", tooltip="x pow y"})
|
|
table.insert(keys, {key="%" ,caption="%", tooltip="x modulo y"})
|
|
table.insert(keys, {key="/" ,caption="/"})
|
|
|
|
table.insert(keys, {key="7" ,caption="7"})
|
|
table.insert(keys, {key="8" ,caption="8"})
|
|
table.insert(keys, {key="9" ,caption="9"})
|
|
table.insert(keys, {key="*" ,caption="X"})
|
|
|
|
table.insert(keys, {key="4" ,caption="4"})
|
|
table.insert(keys, {key="5" ,caption="5"})
|
|
table.insert(keys, {key="6" ,caption="6"})
|
|
table.insert(keys, {key="-" ,caption="-"})
|
|
|
|
table.insert(keys, {key="1" ,caption="1"})
|
|
table.insert(keys, {key="2" ,caption="2"})
|
|
table.insert(keys, {key="3" ,caption="3"})
|
|
table.insert(keys, {key="+" ,caption="+"})
|
|
|
|
table.insert(keys, {key="" ,caption=""})
|
|
table.insert(keys, {key="0" ,caption="0"})
|
|
table.insert(keys, {key="." ,caption="."})
|
|
table.insert(keys, {key="enter" ,caption="="})
|
|
|
|
for index,button in pairs(keys) do
|
|
if button.key == "" then
|
|
GuiElement.add(table_panel, GuiLabel("vide",index))
|
|
else
|
|
GuiElement.add(table_panel, GuiButton(self.classname, "selected-key",button.key):caption(button.caption):tooltip(button.tooltip):style("helmod_button_calculator"))
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Update history
|
|
function Calculator:updateHistory()
|
|
local history_panel = self:getColumnPanel()
|
|
history_panel.clear()
|
|
history_panel.style.width=200
|
|
|
|
local calculator_history = User.getParameter("calculator_history") or {}
|
|
for index, line in pairs(calculator_history) do
|
|
GuiElement.add(history_panel, GuiLabel("history",index):caption(line))
|
|
end
|
|
|
|
end |