275 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			275 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| -------------------------------------------------------------------------------
 | |
| ---Class to build pin dialog
 | |
| ---@class PinPanel
 | |
| PinPanel = newclass(FormModel)
 | |
| 
 | |
| local display_pin_level_min = 0
 | |
| local display_pin_level_max = 4
 | |
| 
 | |
| local display_level = {
 | |
|   base = 0,
 | |
|   factory = 0,
 | |
|   products = 1,
 | |
|   ingredients = 2,
 | |
|   beacon = 3
 | |
| }
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| ---On Bind Dispatcher
 | |
| function PinPanel:onBind()
 | |
|   Dispatcher:bind("on_gui_refresh", self, self.update)
 | |
| end
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| ---On initialization
 | |
| function PinPanel:onInit()
 | |
|   self.panelCaption = ({"helmod_pin-tab-panel.title"})
 | |
|   self.otherClose = false
 | |
| end
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| ---On Style
 | |
| ---@param styles table
 | |
| ---@param width_main number
 | |
| ---@param height_main number
 | |
| function PinPanel:onStyle(styles, width_main, height_main)
 | |
|   styles.flow_panel = {
 | |
|     minimal_width = 50,
 | |
|     maximal_width = 600,
 | |
|     minimal_height = 0,
 | |
|     maximal_height = height_main
 | |
|     }
 | |
| end
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| ---On update
 | |
| ---@param event LuaEvent
 | |
| function PinPanel:onUpdate(event)
 | |
|   self:updateHeader(event)
 | |
|   self:updateInfo(event)
 | |
| end
 | |
| 
 | |
| local setting_options = {}
 | |
| table.insert(setting_options, {name="done", icon=defines.sprites.status_ok.white, icon_white=defines.sprites.status_ok.black, tooltip="tooltip.hide-show-done", column=0})
 | |
| table.insert(setting_options, {name="machine", icon=defines.sprites.factory.white, icon_white=defines.sprites.factory.black, tooltip="tooltip.hide-show-factory", column=1})
 | |
| table.insert(setting_options, {name="product", icon=defines.sprites.jewel.white, icon_white=defines.sprites.jewel.black, tooltip="tooltip.hide-show-product", column=2})
 | |
| table.insert(setting_options, {name="beacon", icon=defines.sprites.beacon.white, icon_white=defines.sprites.beacon.black, tooltip="tooltip.hide-show-beacon", column=1})
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| ---Update header
 | |
| ---@param event LuaEvent
 | |
| function PinPanel:updateHeader(event)
 | |
|   local action_panel = self:getMenuPanel()
 | |
|   action_panel.clear()
 | |
|   local group1 = GuiElement.add(action_panel, GuiFlowH("group1"))
 | |
| 
 | |
|   ---setting options
 | |
|   
 | |
|   for _,setting_option in pairs(setting_options) do
 | |
|     local setting_name = string.format("pin_panel_column_hide_%s", setting_option.name)
 | |
|     local setting_value = User.getSetting(setting_name)
 | |
|     if setting_value == true then
 | |
|       GuiElement.add(group1, GuiButton(self.classname, "change-hide", setting_option.name):sprite("menu", setting_option.icon_white, setting_option.icon):style("helmod_button_menu"):tooltip({setting_option.tooltip}))
 | |
|     else
 | |
|       GuiElement.add(group1, GuiButton(self.classname, "change-hide", setting_option.name):sprite("menu", setting_option.icon, setting_option.icon):style("helmod_button_menu_selected"):tooltip({setting_option.tooltip}))
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   local group2 = GuiElement.add(action_panel, GuiFlowH("group2"))
 | |
|   GuiElement.add(group2, GuiButton(self.classname, "recipe-done-remove"):sprite("menu", defines.sprites.checkmark.black,defines.sprites.checkmark.black):style("helmod_button_menu_actived_red"):tooltip({"helmod_button.remove-done"}))
 | |
| 
 | |
|   local parameter_objects = User.getParameter(self.parameter_objects)
 | |
|   local group3 = GuiElement.add(action_panel, GuiFlowH("group3"))
 | |
|   GuiElement.add(group3, GuiButton("HMSummaryPanel", "OPEN", parameter_objects.model, parameter_objects.block):sprite("menu", defines.sprites.list_view.black, defines.sprites.list_view.black):style("helmod_button_menu"):tooltip({"helmod_result-panel.tab-button-summary"}))
 | |
| 
 | |
|   local group4 = GuiElement.add(action_panel, GuiFlowH("group4"))
 | |
|   GuiElement.add(group4, GuiButton("HMProductionPanel", "OPEN", parameter_objects.model, parameter_objects.block):sprite("menu", defines.sprites.hangar.black,defines.sprites.hangar.black):style("helmod_button_menu"):tooltip({"helmod_result-panel.tab-button-production-block"}))
 | |
| end
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| ---Update information
 | |
| ---@param event LuaEvent
 | |
| function PinPanel:updateInfo(event)
 | |
|   local infoPanel = self:getScrollFramePanel("info-panel")
 | |
|   infoPanel.clear()
 | |
| 
 | |
|   local column = 2
 | |
|   for _,setting_option in pairs(setting_options) do
 | |
|     local setting_name = string.format("pin_panel_column_hide_%s", setting_option.name)
 | |
|     local setting_value = User.getSetting(setting_name)
 | |
|     if not(setting_value) then column = column + setting_option.column end
 | |
|   end
 | |
| 
 | |
|   local model, block, recipe = self:getParameterObjects()
 | |
| 
 | |
|   if block ~= nil then
 | |
|     local resultTable = GuiElement.add(infoPanel, GuiTable("list-data"):column(column):style("helmod_table-odd"))
 | |
|     resultTable.vertical_centering = false
 | |
|     resultTable.style.horizontally_stretchable = false
 | |
| 
 | |
|     self:addProductionBlockHeader(resultTable)
 | |
|     for _, recipe in spairs(block.recipes, function(t,a,b) return t[b]["index"] > t[a]["index"] end) do
 | |
|       local is_done = recipe.is_done or false
 | |
|       if not(is_done and User.getSetting("pin_panel_column_hide_done")) then
 | |
|         self:addProductionBlockRow(resultTable, model, block, recipe)
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| end
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| ---Add header data tab
 | |
| ---@param itable LuaGuiElement
 | |
| function PinPanel:addProductionBlockHeader(itable)
 | |
| 
 | |
|   local gui_done = GuiElement.add(itable, GuiFrameH("header-done"):style(helmod_frame_style.hidden))
 | |
|   GuiElement.add(gui_done, GuiLabel("header-done"):caption({"helmod_result-panel.col-header-done"}))
 | |
| 
 | |
|   local guiRecipe = GuiElement.add(itable, GuiFrameH("header-recipe"):style(helmod_frame_style.hidden))
 | |
|   GuiElement.add(guiRecipe, GuiLabel("header-recipe"):caption({"helmod_result-panel.col-header-recipe"}))
 | |
| 
 | |
|   if not(User.getSetting("pin_panel_column_hide_product")) then
 | |
|     local guiProducts = GuiElement.add(itable, GuiFrameH("header-products"):style(helmod_frame_style.hidden))
 | |
|     GuiElement.add(guiProducts, GuiLabel("header-products"):caption({"helmod_result-panel.col-header-products"}))
 | |
|   end
 | |
| 
 | |
|   if not(User.getSetting("pin_panel_column_hide_machine")) then
 | |
|     local guiFactory = GuiElement.add(itable, GuiFrameH("header-factory"):style(helmod_frame_style.hidden))
 | |
|     GuiElement.add(guiFactory, GuiLabel("header-factory"):caption({"helmod_result-panel.col-header-factory"}))
 | |
|   end
 | |
| 
 | |
|   if not(User.getSetting("pin_panel_column_hide_product")) then
 | |
|     local guiIngredients = GuiElement.add(itable, GuiFrameH("header-ingredients"):style(helmod_frame_style.hidden))
 | |
|     GuiElement.add(guiIngredients, GuiLabel("header-ingredients"):caption({"helmod_result-panel.col-header-ingredients"}))
 | |
|   end
 | |
| 
 | |
|   if not(User.getSetting("pin_panel_column_hide_beacon")) then
 | |
|     local guiBeacon = GuiElement.add(itable, GuiFrameH("header-beacon"):style(helmod_frame_style.hidden))
 | |
|     GuiElement.add(guiBeacon, GuiLabel("header-beacon"):caption({"helmod_result-panel.col-header-beacon"}))
 | |
|   end
 | |
| 
 | |
|   
 | |
| end
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| ---Add row data tab
 | |
| ---@param gui_table LuaGuiElement
 | |
| ---@param model table
 | |
| ---@param block table
 | |
| ---@param recipe table
 | |
| function PinPanel:addProductionBlockRow(gui_table, model, block, recipe)
 | |
|   local recipe_prototype = RecipePrototype(recipe)
 | |
|   local is_done = recipe.is_done or false
 | |
| 
 | |
|   ---col done
 | |
|   if is_done == true then
 | |
|     GuiElement.add(gui_table, GuiButton(self.classname, "recipe-done", recipe.id):sprite("menu", defines.sprites.status_ok.black, defines.sprites.status_ok.black):style("helmod_button_menu_selected_green"):tooltip({"helmod_button.done"}))
 | |
|   else
 | |
|     GuiElement.add(gui_table, GuiButton(self.classname, "recipe-done", recipe.id):sprite("menu", defines.sprites.checkmark.black, defines.sprites.checkmark.black):style("helmod_button_menu_actived_green"):tooltip({"helmod_button.done"}))
 | |
|   end
 | |
|   ---col recipe
 | |
|   local cell_recipe = GuiElement.add(gui_table, GuiFrameH("recipe", recipe.id):style(helmod_frame_style.hidden))
 | |
|   local button_recipe = GuiCellRecipe("HMRecipeEdition", "OPEN", model.id, block.id, recipe.id):element(recipe):infoIcon(recipe.type):tooltip("tooltip.edit-recipe"):color(GuiElement.color_button_default):mask(is_done)
 | |
|   --local button_recipe = GuiCellRecipe(self.classname, "do_noting", "recipe"):element(recipe):infoIcon(recipe.type):tooltip("tooltip.info-product"):color(GuiElement.color_button_default):mask(is_done)
 | |
|   GuiElement.add(cell_recipe, button_recipe)
 | |
| 
 | |
|   if not(User.getSetting("pin_panel_column_hide_product")) then
 | |
|     ---products
 | |
|     local cell_products = GuiElement.add(gui_table, GuiTable("products",recipe.id):column(3))
 | |
|     cell_products.style.horizontally_stretchable = false
 | |
|     local lua_products = recipe_prototype:getProducts(recipe.factory)
 | |
|     if lua_products ~= nil then
 | |
|       for index, lua_product in pairs(lua_products) do
 | |
|         local product_prototype = Product(lua_product)
 | |
|         local product = product_prototype:clone()
 | |
|         product.time = model.time
 | |
|         product.count = product_prototype:countProduct(model, recipe)
 | |
|         if block.by_limit == true and block.count > 1 then
 | |
|           product.limit_count = product.count / block.count
 | |
|         end
 | |
|         GuiElement.add(cell_products, GuiCellElementSm(self.classname, "do_noting", "product"):index(index):element(product):tooltip("tooltip.info-product"):color(GuiElement.color_button_none):byLimit(block.by_limit):mask(is_done))
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   if not(User.getSetting("pin_panel_column_hide_machine")) then
 | |
|     ---col factory
 | |
|     local factory = recipe.factory
 | |
|     GuiElement.add(gui_table, GuiCellFactory(self.classname, "pipette-entity", recipe.id, "factory"):index(recipe.id):element(factory):tooltip("controls.smart-pipette"):color(GuiElement.color_button_default):byLimit(block.by_limit):mask(is_done))
 | |
|   end
 | |
| 
 | |
|   if not(User.getSetting("pin_panel_column_hide_product")) then
 | |
|     ---ingredients
 | |
|     local cell_ingredients = GuiElement.add(gui_table, GuiTable("ingredients", recipe.id):column(3))
 | |
|     cell_ingredients.style.horizontally_stretchable = false
 | |
|     local lua_ingredients = recipe_prototype:getIngredients(recipe.factory)
 | |
|     if lua_ingredients ~= nil then
 | |
|       for index, lua_ingredient in pairs(lua_ingredients) do
 | |
|         local ingredient_prototype = Product(lua_ingredient)
 | |
|         local ingredient = ingredient_prototype:clone()
 | |
|         ingredient.time = model.time
 | |
|         ingredient.count = ingredient_prototype:countIngredient(model, recipe)
 | |
|         if block.by_limit == true and block.count > 1 then
 | |
|           ingredient.limit_count = ingredient.count / block.count
 | |
|         end
 | |
|         GuiElement.add(cell_ingredients, GuiCellElementSm(self.classname, "do_noting", "ingredient"):index(index):element(ingredient):tooltip("tooltip.info-product"):color(GuiElement.color_button_add):byLimit(block.by_limit):mask(is_done))
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   if not(User.getSetting("pin_panel_column_hide_beacon")) then
 | |
|     ---col beacon
 | |
|     local beacons = recipe.beacons
 | |
|     local cell_beacons = GuiElement.add(gui_table, GuiFlowH("beacon", recipe.id))
 | |
|     cell_beacons.style.horizontally_stretchable = false
 | |
|     cell_beacons.style.horizontal_spacing = 2
 | |
|     if beacons ~= nil then
 | |
|       for index, beacon in pairs(beacons) do
 | |
|         if block.by_limit == true and block.count > 1 then
 | |
|           beacon.limit_count = beacon.count / block.count
 | |
|         else
 | |
|           beacon.limit_count = nil
 | |
|         end
 | |
|         GuiElement.add(cell_beacons, GuiCellFactory(self.classname, "pipette-entity", recipe.id, "beacons", index):index(index):element(beacon):tooltip("controls.smart-pipette"):color(GuiElement.color_button_default):byLimit(block.by_limit):mask(is_done))
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| 
 | |
| end
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| ---On event
 | |
| ---@param event LuaEvent
 | |
| function PinPanel:onEvent(event)
 | |
| 
 | |
|   if event.action == "change-hide" then
 | |
|     local element = event.item1
 | |
|     local setting_name = string.format("pin_panel_column_hide_%s", element)
 | |
|     local setting_value = User.getSetting(setting_name)
 | |
|     User.setSetting(setting_name, not(setting_value))
 | |
|     self:onUpdate(event)
 | |
|   end
 | |
|   
 | |
|   local model, block, recipe = self:getParameterObjects()
 | |
| 
 | |
|   if block == nil then return end
 | |
| 
 | |
|   if event.action == "pipette-entity" then
 | |
|     local recipes = block.recipes
 | |
|     local index = tonumber(event.item3)
 | |
|     Player.setSmartTool(recipes[event.item1], event.item2, index)
 | |
|   end
 | |
|   if event.action == "recipe-done" then
 | |
|     local recipes = block.recipes
 | |
|     recipes[event.item1].is_done = not(recipes[event.item1].is_done)
 | |
|     self:updateInfo(event)
 | |
|   end
 | |
|   if event.action == "recipe-done-remove" then
 | |
|     local recipes = block.recipes
 | |
|     for _,recipe in pairs(recipes) do
 | |
|       recipe.is_done = nil
 | |
|     end
 | |
|     self:updateInfo(event)
 | |
|   end
 | |
| end
 |