185 lines
6.9 KiB
Lua

-------------------------------------------------------------------------------
---Class to build product edition dialog
---@class ProductEdition
ProductEdition = newclass(FormModel)
-------------------------------------------------------------------------------
---On initialization
function ProductEdition:onInit()
self.panelCaption = ({"helmod_product-edition-panel.title"})
end
-------------------------------------------------------------------------------
---On Style
---@param styles table
---@param width_main number
---@param height_main number
function ProductEdition:onStyle(styles, width_main, height_main)
styles.flow_panel = {
minimal_height = 100,
maximal_height = height_main,
}
end
-------------------------------------------------------------------------------
---Get or create info panel
---@return LuaGuiElement
function ProductEdition:getInfoPanel()
local flow_panel, content_panel, menu_panel = self:getPanel()
if content_panel["info"] ~= nil and content_panel["info"].valid then
return content_panel["info"]
end
local info_panel = GuiElement.add(content_panel, GuiFrameV("info"):style(helmod_frame_style.panel))
info_panel.style.horizontally_stretchable = true
return info_panel
end
-------------------------------------------------------------------------------
---Get or create tool panel
---@return LuaGuiElement
function ProductEdition:getToolPanel()
local flow_panel, content_panel, menu_panel = self:getPanel()
if content_panel["tool_panel"] ~= nil and content_panel["tool_panel"].valid then
return content_panel["tool_panel"]
end
local tool_panel = GuiElement.add(content_panel, GuiFrameV("tool_panel"):style(helmod_frame_style.panel):caption({"helmod_product-edition-panel.tool"}))
tool_panel.style.horizontally_stretchable = true
return tool_panel
end
-------------------------------------------------------------------------------
---Get or create action panel
---@return LuaGuiElement
function ProductEdition:getActionPanel()
local flow_panel, content_panel, menu_panel = self:getPanel()
if content_panel["action_panel"] ~= nil and content_panel["action_panel"].valid then
return content_panel["action_panel"]
end
local action_panel = GuiElement.add(content_panel, GuiFrameV("action_panel"):style(helmod_frame_style.panel))
action_panel.style.horizontally_stretchable = true
return action_panel
end
-------------------------------------------------------------------------------
---After open
---@param event LuaEvent
function ProductEdition:after_open(event)
self:getInfoPanel()
end
local product = nil
local product_count = 0
-------------------------------------------------------------------------------
---On update
---@param event LuaEvent
function ProductEdition:onUpdate(event)
local model, block, recipe = self:getParameterObjects()
product = nil
if block ~= nil then
local block_elements = block.products
if block.by_product == false then
block_elements = block.ingredients
end
local element_name = event.item5
if block_elements ~= nil and block_elements[element_name] ~= nil then
product = block_elements[element_name]
product_count = product.input or 0
end
end
self:updateInfo(model, block)
if product ~= nil and product.type ~= "fluid" and product.type ~= "energy" then
self:updateTool(model, block)
end
end
-------------------------------------------------------------------------------
---Update information
---@param model table
---@param block table
local input_quantity = nil
function ProductEdition:updateInfo(model, block)
local info_panel = self:getInfoPanel()
if product ~= nil then
info_panel.clear()
local table_panel = GuiElement.add(info_panel, GuiTable("input-table"):column(2))
GuiElement.add(table_panel, GuiButtonSprite("product"):sprite(product.type, product.name))
GuiElement.add(table_panel, GuiLabel("product-label"):caption(Player.getLocalisedName(product)))
local caption = {"helmod_common.quantity"}
local count = product_count or 0
if (product.name == "steam-heat") or (product.name == "energy") then
caption = {"", {"helmod_common.quantity"}, " (MJ)"}
count = count/1e6
end
GuiElement.add(table_panel, GuiLabel("quantity-label"):caption(caption))
local cell, button
cell, input_quantity, button = GuiCellInput(self.classname, "product-update", model.id, block.id, product.name, Product(product):getTableKey()):text(count):create(table_panel)
input_quantity.focus()
input_quantity.select_all()
input_quantity.style.minimal_width = 100
end
end
-------------------------------------------------------------------------------
---Update action
---@param model table
---@param block table
function ProductEdition:updateAction(model, block)
local action_panel = self:getActionPanel()
if product ~= nil then
action_panel.clear()
local action_panel = GuiElement.add(action_panel, GuiTable("table_action"):column(3))
GuiElement.add(action_panel, GuiButton(self.classname, "product-reset", product.name):caption({"helmod_button.reset"}))
end
end
-------------------------------------------------------------------------------
---Update tool
---@param model table
---@param block table
function ProductEdition:updateTool(model, block)
local tool_panel = self:getToolPanel()
tool_panel.clear()
local table_panel = GuiElement.add(tool_panel, GuiTable("table-belt"):column(5))
for key, prototype in pairs(Player.getEntityPrototypes({{filter="type", mode="or", invert=false, type="transport-belt"}})) do
GuiElement.add(table_panel, GuiButtonSelectSprite(self.classname, "element-select"):sprite("entity", prototype.name):tooltip(EntityPrototype(prototype):getLocalisedName()))
end
end
-------------------------------------------------------------------------------
---On event
---@param event LuaEvent
function ProductEdition:onEvent(event)
local model, block, recipe = self:getParameterObjects()
if User.isWriter(model) then
if event.action == "product-update" then
local products = {}
local operation = input_quantity.text
local ok , err = pcall(function()
local quantity = formula(operation)
if (event.item4 == "steam-heat") or (event.item4 == "energy") then
quantity = quantity * 1e6
end
if quantity == 0 then quantity = nil end
ModelBuilder.updateProduct(block, event.item4, quantity)
ModelCompute.update(model)
self:close()
Controller:send("on_gui_refresh", event)
end)
if not(ok) then
Player.print("Formula is not valid!")
end
end
if event.action == "element-select" then
local belt_speed = EntityPrototype(event.item1):getBeltSpeed()
local text = string.format("%s*%s", belt_speed * Product().belt_ratio, model.time)
GuiElement.setInputText(input_quantity, text)
input_quantity.focus()
input_quantity.select(1, string.len(text))
end
end
end