286 lines
11 KiB
Lua
286 lines
11 KiB
Lua
-------------------------------------------------------------------------------
|
|
---Class to build RecipeExplorer panel
|
|
---@class RecipeExplorer
|
|
RecipeExplorer = newclass(Form)
|
|
|
|
local display_panel = nil
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Initialization
|
|
function RecipeExplorer:onInit()
|
|
self.panelCaption = ({"helmod_recipe-explorer-panel.title"})
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---On Style
|
|
---@param styles table
|
|
---@param width_main number
|
|
---@param height_main number
|
|
function RecipeExplorer:onStyle(styles, width_main, height_main)
|
|
styles.flow_panel = {
|
|
minimal_width = 300,
|
|
maximal_width = width_main,
|
|
minimal_height = 200,
|
|
maximal_height = height_main
|
|
}
|
|
end
|
|
|
|
------------------------------------------------------------------------------
|
|
---Get Button Sprites
|
|
---@return string, string
|
|
function RecipeExplorer:getButtonSprites()
|
|
return defines.sprites.search.white, defines.sprites.search.black
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Is tool
|
|
---@return boolean
|
|
function RecipeExplorer:isTool()
|
|
return true
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---On Bind Dispatcher
|
|
function RecipeExplorer:onBind()
|
|
Dispatcher:bind("on_gui_refresh", self, self.update)
|
|
--Dispatcher:bind("on_gui_selected", self, self.event)
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Get or create info panel
|
|
function RecipeExplorer:getInfoPanel()
|
|
local flow_panel, content_panel, menu_panel = self:getPanel()
|
|
if content_panel["info-panel"] ~= nil and content_panel["info-panel"].valid then
|
|
return content_panel["info-panel"]["scroll-panel"]
|
|
end
|
|
local mainPanel = GuiElement.add(content_panel, GuiFrameV("info-panel"):style(helmod_frame_style.panel))
|
|
mainPanel.style.horizontally_stretchable = true
|
|
mainPanel.style.vertically_stretchable = true
|
|
local scroll_panel = GuiElement.add(mainPanel, GuiScroll("scroll-panel"))
|
|
scroll_panel.style.horizontally_stretchable = false
|
|
return scroll_panel
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Update information
|
|
---@param event LuaEvent
|
|
function RecipeExplorer:updateHeader(event)
|
|
local action_panel, _ = self:getMenuPanel()
|
|
action_panel.clear()
|
|
local group1 = GuiElement.add(action_panel, GuiFlowH("group1"))
|
|
group1.style.horizontal_spacing = 10
|
|
GuiElement.add(group1, GuiButton(self.classname, "open-recipe-selector", self.classname):sprite("menu", defines.sprites.script.black, defines.sprites.script.black):style("helmod_button_menu_actived_green"):tooltip({"helmod_result-panel.add-button-recipe"}))
|
|
GuiElement.add(group1, GuiButton(self.classname, "generate-block", self.classname):sprite("menu", defines.sprites.settings.black, defines.sprites.settings.black):style("helmod_button_menu"):tooltip({"helmod_recipe-explorer-panel.generate-block"}))
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---On event
|
|
---@param event LuaEvent
|
|
function RecipeExplorer:onEvent(event)
|
|
local recipe_explore = User.getParameter("explore_recipe")
|
|
if event.action == "remove-child" then
|
|
self:removeRecipe(recipe_explore, event.item3)
|
|
self:updateDisplay()
|
|
end
|
|
|
|
if event.action == "generate-block" then
|
|
local parameter_name = string.format("%s_%s", "HMProductionPanel", "objects")
|
|
local parameter_objects = User.getParameter(parameter_name)
|
|
local model, _, _ = Model.getParameterObjects(parameter_objects)
|
|
local block = self:generateBlock(model, nil, recipe_explore)
|
|
ModelCompute.update(model)
|
|
User.setParameter(parameter_name, {name=parameter_name, model=model.id, block=block.id})
|
|
Controller:send("on_gui_update", event)
|
|
end
|
|
|
|
if event.action == "add-parent" then
|
|
User.setParameter("explore_recipe_mode", "add-parent")
|
|
local recipes = Player.searchRecipe(event.item2, true)
|
|
if #recipes == 1 then
|
|
local recipe = recipes[1]
|
|
local new_recipe = {type = recipe.type, name = recipe.name, id=game.tick }
|
|
self:addRecipe(new_recipe, recipe_explore, event.item3)
|
|
self:updateDisplay()
|
|
else
|
|
User.setParameter("explore_recipe_id", event.item3)
|
|
event.item1 = self.classname
|
|
event.item3 = event.item2
|
|
event.action = "OPEN"
|
|
event.button = defines.mouse_button_type.right
|
|
Dispatcher:send("on_gui_open", event, "HMRecipeSelector")
|
|
end
|
|
end
|
|
|
|
if event.action == "add-child" then
|
|
User.setParameter("explore_recipe_mode", "add-child")
|
|
local recipes = Player.searchRecipe(event.item2)
|
|
if #recipes == 1 then
|
|
local recipe = recipes[1]
|
|
local new_recipe = {type = recipe.type, name = recipe.name, id=game.tick }
|
|
self:addRecipe(recipe_explore, new_recipe, event.item3)
|
|
self:updateDisplay()
|
|
else
|
|
User.setParameter("explore_recipe_id", event.item3)
|
|
event.item1 = self.classname
|
|
event.item3 = event.item2
|
|
event.action = "OPEN"
|
|
Dispatcher:send("on_gui_open", event, "HMRecipeSelector")
|
|
end
|
|
end
|
|
---from RecipeSelector
|
|
if event.action == "open-recipe-selector" then
|
|
User.setParameter("explore_recipe_mode", "add-child")
|
|
User.setParameter("explore_recipe_id", nil)
|
|
event.item1 = self.classname
|
|
event.action = "OPEN"
|
|
Dispatcher:send("on_gui_open", event, "HMRecipeSelector")
|
|
end
|
|
|
|
---from RecipeSelector
|
|
if event.action == "element-select" then
|
|
local explore_recipe_mode = User.getParameter("explore_recipe_mode")
|
|
local explore_recipe_id = User.getParameter("explore_recipe_id")
|
|
local new_recipe = {type = event.item1, name = event.item2, id=game.tick }
|
|
if explore_recipe_id == nil then
|
|
User.setParameter("explore_recipe", new_recipe)
|
|
else
|
|
if explore_recipe_mode == "add-parent" then
|
|
self:addRecipe(new_recipe, recipe_explore, explore_recipe_id)
|
|
User.setParameter("explore_recipe", new_recipe)
|
|
else
|
|
self:addRecipe(recipe_explore, new_recipe, explore_recipe_id)
|
|
end
|
|
end
|
|
self:updateDisplay()
|
|
end
|
|
end
|
|
|
|
function RecipeExplorer:generateBlock(model, block, recipe)
|
|
block = ModelBuilder.addRecipeIntoProductionBlock(model, block, recipe.name, recipe.type)
|
|
if recipe.children then
|
|
for _,child in pairs(recipe.children) do
|
|
self:generateBlock(model, block, child)
|
|
end
|
|
end
|
|
return block
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---On update
|
|
---@param parent table
|
|
---@param recipe any
|
|
---@param id any
|
|
function RecipeExplorer:addRecipe(parent, recipe, id)
|
|
local explore_recipe_mode = User.getParameter("explore_recipe_mode")
|
|
if explore_recipe_mode == "add-parent" then
|
|
if recipe.id == tonumber(id or 0) then
|
|
if parent.children == nil then parent.children = {} end
|
|
table.insert(parent.children, recipe)
|
|
elseif recipe.children then
|
|
for _,child in pairs(recipe.children) do
|
|
self:addRecipe(parent, child, id)
|
|
end
|
|
end
|
|
else
|
|
if parent.id == tonumber(id or 0) then
|
|
if parent.children == nil then parent.children = {} end
|
|
table.insert(parent.children, recipe)
|
|
elseif parent.children then
|
|
for _,child in pairs(parent.children) do
|
|
self:addRecipe(child, recipe, id)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---On update
|
|
---@param parent table
|
|
---@param id any
|
|
function RecipeExplorer:removeRecipe(parent, id)
|
|
if parent.children then
|
|
local index_remove = nil
|
|
for index,child in pairs(parent.children) do
|
|
if child.id == tonumber(id or 0) then
|
|
index_remove = index
|
|
end
|
|
end
|
|
if index_remove == nil then
|
|
for _,child in pairs(parent.children) do
|
|
self:removeRecipe(child, id)
|
|
end
|
|
else
|
|
table.remove(parent.children,index_remove)
|
|
end
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---On update
|
|
---@param event LuaEvent
|
|
function RecipeExplorer:onUpdate(event)
|
|
self:updateHeader(event)
|
|
self:updateDisplay()
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Update display
|
|
function RecipeExplorer:updateDisplay()
|
|
local content_panel = self:getInfoPanel()
|
|
content_panel.clear()
|
|
local recipe_explore = User.getParameter("explore_recipe")
|
|
self:addCell(content_panel, recipe_explore, 0)
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Add cell
|
|
---@param parent any
|
|
---@param recipe table
|
|
---@param index any
|
|
function RecipeExplorer:addCell(parent, recipe, index)
|
|
if recipe ~= nil then
|
|
local recipe_prototype = RecipePrototype(recipe)
|
|
if recipe_prototype:native() ~= nil then
|
|
local cell = GuiElement.add(parent, GuiTable("cell-recipe", index):column(2))
|
|
local cell_recipe = GuiElement.add(cell, GuiFrameH("cell-recipe"):style("helmod_frame_element", "gray", 1))
|
|
cell_recipe.style.padding=5
|
|
|
|
cell_recipe.style.horizontally_stretchable = false
|
|
local cell_table = GuiElement.add(cell_recipe, GuiTable("cell-table"):column(3))
|
|
cell_table.style.horizontal_spacing=5
|
|
---products
|
|
local cell_products = GuiElement.add(cell_table, GuiFlowV("cell-products"))
|
|
for index, lua_product in pairs(recipe_prototype:getProducts(recipe.factory)) do
|
|
local product_prototype = Product(lua_product)
|
|
local product = product_prototype:clone()
|
|
product.count = product_prototype:getElementAmount()
|
|
product.time = 1
|
|
GuiElement.add(cell_products, GuiCellElementSm(self.classname, "add-parent", product.type, product.name, recipe.id or 0):element(product):tooltip("tooltip.add-recipe"):index(index):color(GuiElement.color_button_none))
|
|
end
|
|
---recipe
|
|
local icon_name, icon_type = recipe_prototype:getIcon()
|
|
local button = GuiElement.add(cell_table, GuiButtonSprite(self.classname, "remove-child", recipe.type, recipe.name, recipe.id or 0):choose(icon_type, icon_name, recipe_prototype.name))
|
|
button.locked = true
|
|
if recipe.type ~= "recipe" then
|
|
local sprite = GuiElement.add(button, GuiSprite("info"):sprite("developer"):tooltip({"tooltip.resource-recipe"}))
|
|
sprite.style.top_padding = -8
|
|
end
|
|
---ingredients
|
|
local cell_ingredients = GuiElement.add(cell_table, GuiFlowV("cell-ingredients"))
|
|
for index, lua_ingredient in pairs(recipe_prototype:getIngredients(recipe.factory)) do
|
|
local ingredient_prototype = Product(lua_ingredient)
|
|
local ingredient = ingredient_prototype:clone()
|
|
ingredient.count = ingredient_prototype:getElementAmount()
|
|
ingredient.time = 1
|
|
GuiElement.add(cell_ingredients, GuiCellElementSm(self.classname, "add-child", ingredient.type, ingredient.name, recipe.id or 0):element(ingredient):tooltip("tooltip.add-recipe"):index(index):color(GuiElement.color_button_add))
|
|
end
|
|
local cell_children = GuiElement.add(cell, GuiFlowV("cell-children"))
|
|
cell_children.style.vertical_spacing=10
|
|
if recipe.children ~= nil then
|
|
for child_index, child_recipe in pairs(recipe.children) do
|
|
self:addCell(cell_children, child_recipe, child_index)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end |