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 |