185 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			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 |