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