mirror of
https://github.com/factoriolib/flib.git
synced 2025-09-04 08:26:22 +00:00
106 lines
3.4 KiB
Lua
106 lines
3.4 KiB
Lua
if ... ~= "__flib__.gui-templates" then
|
|
return require("__flib__.gui-templates")
|
|
end
|
|
|
|
local flib_math = require("__flib__.math")
|
|
local flib_gui = require("__flib__.gui")
|
|
local flib_table = require("__flib__.table")
|
|
local flib_technology = require("__flib__.technology")
|
|
|
|
local flib_gui_templates = {}
|
|
|
|
--- Create and return a technology slot. `on_click` must be a registered GUI handler through `gui-lite`.
|
|
--- @param parent LuaGuiElement
|
|
--- @param technology LuaTechnology
|
|
--- @param level uint
|
|
--- @param research_state TechnologyResearchState
|
|
--- @param on_click flib.GuiElemHandler?
|
|
--- @param tags Tags?
|
|
--- @param index uint?
|
|
--- @return LuaGuiElement
|
|
function flib_gui_templates.technology_slot(parent, technology, level, research_state, on_click, tags, index)
|
|
local technology_prototype = technology.prototype
|
|
|
|
local is_multilevel = flib_technology.is_multilevel(technology)
|
|
|
|
local research_state_str = flib_table.find(flib_technology.research_state, research_state)
|
|
local style = "flib_technology_slot_" .. research_state_str
|
|
if technology.upgrade or is_multilevel or technology_prototype.level > 1 then
|
|
style = style .. "_multilevel"
|
|
end
|
|
|
|
local base = parent.add({
|
|
type = "sprite-button",
|
|
style = style,
|
|
elem_tooltip = { type = "technology", name = technology.name },
|
|
tags = tags,
|
|
index = index,
|
|
})
|
|
if on_click then
|
|
base.tags = flib_gui.format_handlers({ [defines.events.on_gui_click] = on_click }, tags)
|
|
end
|
|
base
|
|
.add({ type = "flow", name = "icon_flow", style = "flib_technology_slot_sprite_flow", ignored_by_interaction = true })
|
|
.add({
|
|
type = "sprite",
|
|
name = "icon",
|
|
style = "flib_technology_slot_sprite",
|
|
sprite = "technology/" .. technology.name,
|
|
})
|
|
|
|
if technology.upgrade or is_multilevel or technology_prototype.level > 1 then
|
|
base.add({
|
|
type = "label",
|
|
name = "level_label",
|
|
style = "flib_technology_slot_level_label_" .. research_state_str,
|
|
caption = level,
|
|
ignored_by_interaction = true,
|
|
})
|
|
end
|
|
if is_multilevel then
|
|
local max_level = technology_prototype.max_level
|
|
local max_level_str = max_level == flib_math.max_uint and "[img=infinity]" or tostring(max_level)
|
|
base.add({
|
|
type = "label",
|
|
name = "level_range_label",
|
|
style = "flib_technology_slot_level_range_label_" .. research_state_str,
|
|
caption = technology_prototype.level .. " - " .. max_level_str,
|
|
ignored_by_interaction = true,
|
|
})
|
|
end
|
|
|
|
local ingredients_flow = base.add({
|
|
type = "flow",
|
|
style = "flib_technology_slot_ingredients_flow",
|
|
ignored_by_interaction = true,
|
|
})
|
|
|
|
local ingredients = technology.research_unit_ingredients
|
|
local ingredients_len = #ingredients
|
|
for i = 1, ingredients_len do
|
|
local ingredient = ingredients[i]
|
|
ingredients_flow.add({
|
|
type = "sprite",
|
|
style = "flib_technology_slot_ingredient",
|
|
sprite = "item/" .. ingredient.name,
|
|
ignored_by_interaction = true,
|
|
})
|
|
end
|
|
ingredients_flow.style.horizontal_spacing = flib_math.clamp((68 - 16) / (ingredients_len - 1) - 16, -15, -5)
|
|
|
|
local progress = flib_technology.get_research_progress(technology, level)
|
|
|
|
base.add({
|
|
type = "progressbar",
|
|
name = "progressbar",
|
|
style = "flib_technology_slot_progressbar",
|
|
value = progress,
|
|
visible = progress > 0,
|
|
ignored_by_interaction = true,
|
|
})
|
|
|
|
return base
|
|
end
|
|
|
|
return flib_gui_templates
|