310 lines
12 KiB
Lua

-------------------------------------------------------------------------------
---Description of the module.
---@class GuiElement
GuiElement = newclass(function(base,...)
base.name = {...}
base.classname = "HMGuiElement"
base.options = {}
base.is_caption = true
end)
GuiElement.classname = "HMGuiElement"
GuiElement.color_button_default = "gray"
GuiElement.color_button_default_product = "blue"
GuiElement.color_button_default_ingredient = "yellow"
GuiElement.color_button_none = "blue"
GuiElement.color_button_edit = "green"
GuiElement.color_button_add = "yellow"
GuiElement.color_button_rest = "red"
-------------------------------------------------------------------------------
---Set style
---@return GuiElement
function GuiElement:style(...)
if ... ~= nil then
self.options.style = table.concat({...},"_")
end
return self
end
-------------------------------------------------------------------------------
---Set caption
---@param caption string
---@return GuiElement
function GuiElement:caption(caption)
self.m_caption = caption
return self
end
-------------------------------------------------------------------------------
---Set tooltip
---@param tooltip table
---@return GuiElement
function GuiElement:tooltip(tooltip)
if tooltip ~= nil and tooltip.classname == "HMGuiTooltip" then
self.options.tooltip = tooltip:create()
else
self.options.tooltip = tooltip
end
return self
end
-------------------------------------------------------------------------------
---Set ignored by interaction
---@return GuiElement
function GuiElement:ignored_by_interaction()
self.options.ignored_by_interaction = true
return self
end
-------------------------------------------------------------------------------
---Set overlay
---@param type string
---@param name string
---@return GuiElement
function GuiElement:overlay(type, name)
if type == nil then return self end
if name == nil then
self.m_overlay = string.format("helmod-%s", type)
elseif type ~= nil and name ~= nil then
if type == "resource" then type = "item" end
if Player.is_valid_sprite_path(string.format("%s/%s", type, name)) then
self.m_overlay = string.format("%s/%s", type, name)
elseif Player.is_valid_sprite_path(string.format("%s/%s", "item", name)) then
self.m_overlay = string.format("%s/%s", "item", name)
Logging:warn(GuiButton.classname, "wrong type", type, name, "-> item")
elseif Player.is_valid_sprite_path(string.format("%s/%s", "entity", name)) then
self.m_overlay = string.format("%s/%s", "entity", name)
Logging:warn(GuiButton.classname, "wrong type", type, name, "-> entity")
elseif Player.is_valid_sprite_path(string.format("%s/%s", "fluid", name)) then
self.m_overlay = string.format("%s/%s", "fluid", name)
Logging:warn(GuiButton.classname, "wrong type", type, name, "-> fluid")
elseif Player.is_valid_sprite_path(string.format("%s/%s", "technology", name)) then
self.m_overlay = string.format("%s/%s", "technology", name)
Logging:warn(GuiButton.classname, "wrong type", type, name, "-> technology")
elseif Player.is_valid_sprite_path(string.format("%s/%s", "recipe", name)) then
self.m_overlay = string.format("%s/%s", "recipe", name)
Logging:warn(GuiButton.classname, "wrong type", type, name, "-> recipe")
elseif Player.is_valid_sprite_path(string.format("%s/%s", "item-group", name)) then
self.m_overlay = string.format("%s/%s", "item-group", name)
Logging:warn(GuiButton.classname, "wrong type", type, name, "-> item-group")
end
end
return self
end
-------------------------------------------------------------------------------
---Get sprite string
---@param type string
---@param name string
---@param format string
---@return string
function GuiElement.getSprite(type, name, format)
local sprite = ""
if format == nil then
format = "%s/%s"
end
if name == nil then
sprite = string.format("helmod-%s", type)
elseif type ~= nil and name ~= nil then
if type == "resource" then type = "entity" end
if type == "rocket" then type = "item" end
if Player.is_valid_sprite_path(string.format("%s/%s", type, name)) then
sprite = string.format(format, type, name)
elseif Player.is_valid_sprite_path(string.format("%s/%s", "item", name)) then
sprite = string.format(format, "item", name)
Logging:warn(GuiButton.classname, "wrong type", type, name, "-> item")
elseif Player.is_valid_sprite_path(string.format("%s/%s", "entity", name)) then
sprite = string.format(format, "entity", name)
Logging:warn(GuiButton.classname, "wrong type", type, name, "-> entity")
elseif Player.is_valid_sprite_path(string.format("%s/%s", "fluid", name)) then
sprite = string.format(format, "fluid", name)
Logging:warn(GuiButton.classname, "wrong type", type, name, "-> fluid")
elseif Player.is_valid_sprite_path(string.format("%s/%s", "technology", name)) then
sprite = string.format(format, "technology", name)
Logging:warn(GuiButton.classname, "wrong type", type, name, "-> technology")
elseif Player.is_valid_sprite_path(string.format("%s/%s", "recipe", name)) then
sprite = string.format(format, "recipe", name)
Logging:warn(GuiButton.classname, "wrong type", type, name, "-> recipe")
elseif Player.is_valid_sprite_path(string.format("%s/%s", "item-group", name)) then
sprite = string.format(format, "item-group", name)
Logging:warn(GuiButton.classname, "wrong type", type, name, "-> item-group")
end
end
return sprite
end
-------------------------------------------------------------------------------
---Get options
---@return table
function GuiElement:getOptions()
self.options.name = table.concat(self.name,"=")
if self.is_caption then
self.options.caption = self.m_caption
end
return self.options
end
-------------------------------------------------------------------------------
---Get option when error
---@return table
function GuiElement:onErrorOptions()
local options = self:getOptions()
options.style = nil
return options
end
-------------------------------------------------------------------------------
---Add a element
---@param parent LuaGuiElement --container for element
---@param gui_element GuiElement
---@return LuaGuiElement --the LuaGuiElement added
function GuiElement.add(parent, gui_element)
local element = nil
local ok , err = pcall(function()
if gui_element.classname ~= "HMGuiCell" then
element = parent.add(gui_element:getOptions())
else
element = gui_element:create(parent)
end
end)
if not ok then
element = parent.add(gui_element:onErrorOptions())
log(err)
log(debug.traceback())
end
return element
end
-------------------------------------------------------------------------------
---Get Index column number
---@return number
function GuiElement.getIndexColumnNumber()
local display_ratio_horizontal = User.getModSetting("display_ratio_horizontal")
local width , height, scale = Player.getDisplaySizes()
local width_main = math.ceil(width*display_ratio_horizontal/scale)
return math.ceil((width_main - 100)/36)
end
-------------------------------------------------------------------------------
---Get Element column number
---@param size number
---@return number
function GuiElement.getElementColumnNumber(size)
local display_ratio_horizontal = User.getModSetting("display_ratio_horizontal")
local width , height, scale = Player.getDisplaySizes()
local width_main = math.ceil(width*display_ratio_horizontal/scale)
return math.max(5, math.floor((width_main-600)/(2*size)))
end
-------------------------------------------------------------------------------
---Get the number of textfield input
---@param element LuaGuiElement --textfield input
---@return number --number of textfield input
function GuiElement.getInputNumber(element)
local count = 0
if element ~= nil then
local tempCount=tonumber(element.text)
if type(tempCount) == "number" then count = tempCount end
end
return count
end
-------------------------------------------------------------------------------
---Get dropdown selection
---@param element LuaGuiElement
---@return string|table
function GuiElement.getDropdownSelection(element)
if element.selected_index == 0 then return nil end
if #element.items == 0 then return nil end
return element.items[element.selected_index]
end
-------------------------------------------------------------------------------
---Set the text of textfield input
---@param element LuaGuiElement
---@param value string
function GuiElement.setInputText(element, value)
if element ~= nil and element.text ~= nil then
element.text = value
end
end
-------------------------------------------------------------------------------
---Add temperature information
---@param parent LuaGuiElement
---@param element table
---@param style string
function GuiElement.infoTemperature(parent, element, style)
if element.type == "fluid" then
style = style or "helmod_label_element_black_m"
local T = element.temperature
local Tmin = element.minimum_temperature
local Tmax = element.maximum_temperature
if T ~= nil then
local caption = {"", T, "°"}
GuiElement.add(parent, GuiLabel("temperature"):caption(caption):style(style))
end
if Tmin ~= nil or Tmax ~= nil then
Tmin = Tmin or -1e300
Tmax = Tmax or 1e300
if Tmin > -1e300 and Tmax > 1e300 then
local caption_min = {"", "", Tmin, "°"}
GuiElement.add(parent, GuiLabel("temperature_min"):caption(caption_min):style(style))
end
if Tmin < -1e300 and Tmax < 1e300 then
local caption_max = {"", "", Tmax, "°"}
GuiElement.add(parent, GuiLabel("temperature_max"):caption(caption_max):style(style))
end
if Tmin > -1e300 and Tmax < 1e300 then
local panel = GuiElement.add(parent, GuiFlowV("temperature"))
local caption_min = {"", "", Tmin, "°"}
GuiElement.add(panel, GuiLabel("temperature_min"):caption(caption_min):style(style))
local caption_max = {"", "", Tmax, "°"}
GuiElement.add(panel, GuiLabel("temperature_max"):caption(caption_max):style(style))
end
end
end
end
-------------------------------------------------------------------------------
---Add recipe information
---@param parent LuaGuiElement
---@param element table
function GuiElement.infoRecipe(parent, element)
local sprite_name = nil
local tooltip = nil
if element.type == "recipe-burnt" then
sprite_name = GuiElement.getSprite(defines.sprite_info.burnt)
tooltip = {"tooltip.burnt-recipe"}
elseif element.type == "rocket" then
sprite_name = GuiElement.getSprite(defines.sprite_info.rocket)
tooltip = {"tooltip.rocket-recipe"}
elseif element.type == "technology" then
sprite_name = GuiElement.getSprite(defines.sprite_info.education)
tooltip = {"tooltip.technology-recipe"}
elseif element.type == "energy" then
sprite_name = GuiElement.getSprite(defines.sprite_info.energy)
tooltip = {"tooltip.energy-recipe"}
elseif element.type == "boiler" then
local style = "helmod_temperature_blue_m"
local caption = Format.formatNumberKilo(element.output_fluid_temperature, "°")
local label = GuiElement.add(parent, GuiLabel("temperature"):caption(caption):style(style):ignored_by_interaction())
label.style.top_padding = -5
elseif element.type ~= "recipe" then
sprite_name = GuiElement.getSprite(defines.sprite_info.developer)
tooltip = {"tooltip.resource-recipe"}
end
if sprite_name ~= nil then
local container = GuiElement.add(parent, GuiFlow("recipe-info"))
container.style.top_padding = -4
local sprite = GuiElement.add(container, GuiSprite("recipe-info"):sprite(sprite_name):tooltip(tooltip))
sprite.style.width = defines.sprite_size
sprite.style.height = defines.sprite_size
sprite.style.stretch_image_to_widget_size = true
end
end