z_mirror/flib

git clone https://git.raiguard.me/z_mirror/flib

Caleb HeuerRemove require guardsa9f2be7

trunk
3.3 KiB101 linesraw
1local flib_math = require("__flib__.math")
2local flib_gui = require("__flib__.gui")
3local flib_table = require("__flib__.table")
4local flib_technology = require("__flib__.technology")
5
6local flib_gui_templates = {}
7
8--- Create and return a technology slot. `on_click` must be a registered GUI handler through `gui-lite`.
9--- @param parent LuaGuiElement
10--- @param technology LuaTechnology
11--- @param level uint
12--- @param research_state TechnologyResearchState
13--- @param on_click flib.GuiElemHandler?
14--- @param tags Tags?
15--- @param index uint?
16--- @return LuaGuiElement
17function flib_gui_templates.technology_slot(parent, technology, level, research_state, on_click, tags, index)
18  local technology_prototype = technology.prototype
19
20  local is_multilevel = flib_technology.is_multilevel(technology)
21
22  local research_state_str = flib_table.find(flib_technology.research_state, research_state)
23  local style = "flib_technology_slot_" .. research_state_str
24  if technology.upgrade or is_multilevel or technology_prototype.level > 1 then
25    style = style .. "_multilevel"
26  end
27
28  local base = parent.add({
29    type = "sprite-button",
30    style = style,
31    elem_tooltip = { type = "technology", name = technology.name },
32    tags = tags,
33    index = index,
34  })
35  if on_click then
36    base.tags = flib_gui.format_handlers({ [defines.events.on_gui_click] = on_click }, tags)
37  end
38  base
39    .add({ type = "flow", name = "icon_flow", style = "flib_technology_slot_sprite_flow", ignored_by_interaction = true })
40    .add({
41      type = "sprite",
42      name = "icon",
43      style = "flib_technology_slot_sprite",
44      sprite = "technology/" .. technology.name,
45    })
46
47  if technology.upgrade or is_multilevel or technology_prototype.level > 1 then
48    base.add({
49      type = "label",
50      name = "level_label",
51      style = "flib_technology_slot_level_label_" .. research_state_str,
52      caption = level,
53      ignored_by_interaction = true,
54    })
55  end
56  if is_multilevel then
57    local max_level = technology_prototype.max_level
58    local max_level_str = max_level == flib_math.max_uint and "[img=infinity]" or tostring(max_level)
59    base.add({
60      type = "label",
61      name = "level_range_label",
62      style = "flib_technology_slot_level_range_label_" .. research_state_str,
63      caption = technology_prototype.level .. " - " .. max_level_str,
64      ignored_by_interaction = true,
65    })
66  end
67
68  local ingredients_flow = base.add({
69    type = "flow",
70    style = "flib_technology_slot_ingredients_flow",
71    ignored_by_interaction = true,
72  })
73
74  local ingredients = technology.research_unit_ingredients
75  local ingredients_len = #ingredients
76  for i = 1, ingredients_len do
77    local ingredient = ingredients[i]
78    ingredients_flow.add({
79      type = "sprite",
80      style = "flib_technology_slot_ingredient",
81      sprite = "item/" .. ingredient.name,
82      ignored_by_interaction = true,
83    })
84  end
85  ingredients_flow.style.horizontal_spacing = flib_math.clamp((68 - 16) / (ingredients_len - 1) - 16, -15, -5)
86
87  local progress = flib_technology.get_research_progress(technology, level)
88
89  base.add({
90    type = "progressbar",
91    name = "progressbar",
92    style = "flib_technology_slot_progressbar",
93    value = progress,
94    visible = progress > 0,
95    ignored_by_interaction = true,
96  })
97
98  return base
99end
100
101return flib_gui_templates