426 lines
13 KiB
Lua

-------------------------------------------------------------------------------
---Class to build HelpPanel panel
---@class HelpPanel
HelpPanel = newclass(Form)
local page_list = {}
local help_data = {}
help_data.getting_start = {
name = "getting-start",
content = {}
}
help_data.getting_start.content.getting_start = {
sprite = "getting-start",
localised_text = "getting-start-panel",
desc = false,
list = "number",
count = 4
}
help_data.getting_start.content.quick_start = {
sprite = "quick-start",
localised_text = "quick-start",
desc = true,
list = "number",
count = 8
}
help_data.mod_settings = {
name = "mod-settings",
content = {}
}
help_data.mod_settings.content.mod_settings_map = {
sprite = "mod-settings-map",
localised_text = "mod-settings-map",
desc = false,
list = "none",
count = 10
}
help_data.mod_settings.content.mod_settings_player = {
sprite = "mod-settings-player",
localised_text = "mod-settings-player",
desc = false,
list = "none",
count = 5
}
help_data.preferences = {
name = "preferences",
content = {}
}
help_data.preferences.content.general = {
sprite = "preferences-general",
localised_text = "preferences-general",
desc = true,
list = "none",
count = 10
}
help_data.preferences.content.ui = {
sprite = "preferences-ui",
localised_text = "preferences-ui",
desc = true,
list = "none",
count = 3
}
help_data.preferences.content.module_priority = {
sprite = "preferences-module-priority",
localised_text = "preferences-module-priority",
desc = true,
list = "none",
count = 0
}
help_data.preferences.content.items_logistic = {
sprite = "preferences-items-logistic",
localised_text = "preferences-items-logistic",
desc = true,
list = "none",
count = 0
}
help_data.preferences.content.fluids_logistic = {
sprite = "preferences-fluids-logistic",
localised_text = "preferences-fluids-logistic",
desc = true,
list = "none",
count = 0
}
help_data.selector = {
name = "recipe-selector",
content = {}
}
help_data.selector.content.recipe_selector = {
sprite = "recipe-selector",
localised_text = "recipe-selector-normal",
desc = true,
list = "none",
count = 7
}
help_data.selector.content.recipe_selector_all = {
sprite = "recipe-selector-all",
localised_text = "recipe-selector-all",
desc = true,
list = "none",
count = 3
}
help_data.selector.content.recipe_selector_helmod = {
sprite = "recipe-selector-helmod",
localised_text = "recipe-selector-helmod",
desc = true,
list = "none",
count = 3
}
help_data.recipe_editor = {
name = "recipe-editor",
content = {}
}
help_data.recipe_editor.content.recipe_editor = {
sprite = "recipe-editor",
localised_text = "recipe-editor-general",
desc = true,
list = "number",
count = 6
}
help_data.recipe_editor.content.recipe_editor_info = {
sprite = "recipe-editor-info",
localised_text = "recipe-editor-info",
desc = true,
list = "none",
count = 2
}
help_data.recipe_editor.content.recipe_editor_factory = {
sprite = "recipe-editor-factory",
localised_text = "recipe-editor-factory",
desc = true,
list = "number",
count = 4
}
help_data.recipe_editor.content.recipe_editor_beacon = {
sprite = "recipe-editor-beacon",
localised_text = "recipe-editor-beacon",
desc = true,
list = "number",
count = 4
}
help_data.recipe_editor.content.recipe_editor_tools = {
sprite = "recipe-editor-tools",
localised_text = "recipe-editor-tools",
desc = true,
list = "number",
count = 10
}
help_data.recipe_editor.content.recipe_editor_module_selection = {
sprite = "recipe-editor-module-selection",
localised_text = "recipe-editor-module-selection",
desc = true,
list = "number",
count = 4
}
help_data.recipe_editor.content.recipe_editor_module_priority = {
sprite = "recipe-editor-module-priority",
localised_text = "recipe-editor-module-priority",
desc = true,
list = "number",
count = 6
}
help_data.production = {
name = "production",
content = {}
}
help_data.production.content.production_line = {
sprite = "production-line",
localised_text = "production-line",
desc = true,
list = "number",
count = 11
}
help_data.production.content.production_block = {
sprite = "production-block",
localised_text = "production-block",
desc = true,
list = "number",
count = 14
}
help_data.production.content.production_edition = {
sprite = "production-edition",
localised_text = "production-edition",
desc = true,
list = "none",
count = 4
}
help_data.compute = {
name = "compute",
content = {}
}
help_data.compute.content.compute_order = {
sprite = "compute-order",
localised_text = "compute-order",
desc = true,
list = "none",
count = 7
}
help_data.compute.content.compute_solver = {
localised_text = "compute-solver",
desc = true,
list = "none",
count = 5
}
help_data.special_panel = {
name = "special-panel",
content = {}
}
help_data.special_panel.content.admin = {
sprite = "admin-tab",
localised_text = "special-panel-admin",
desc = true,
list = "none",
count = 5
}
help_data.special_panel.content.properties = {
sprite = "properties-panel",
localised_text = "special-panel-properties",
desc = true,
list = "none",
count = 5
}
help_data.special_panel.content.filter = {
sprite = "filter-panel",
localised_text = "special-panel-filter",
desc = true,
list = "none",
count = 5
}
help_data.special_panel.content.unittest = {
sprite = "unittest-panel",
localised_text = "special-panel-unittest",
desc = true,
list = "none",
count = 2
}
help_data.special_panel.content.solver_debug = {
sprite = "solver-debug-panel",
localised_text = "special-panel-debug",
desc = true,
list = "none",
count = 4
}
help_data.control = {
name = "control",
content = {}
}
help_data.control.content.control = {
localised_text = "control-hotkey",
desc = true,
list = "none",
count = 3
}
help_data.tips = {
name = "tips",
content = {}
}
help_data.tips.content.production_line = {
localised_text = "tips-production-line",
desc = true,
list = "none",
count = 4
}
help_data.tips.content.production_block = {
localised_text = "tips-production-block",
desc = true,
list = "none",
count = 4
}
-------------------------------------------------------------------------------
---On initialization
function HelpPanel:onInit()
self.panelCaption = ({"helmod_help.panel-title"})
self.help_button = false
end
-------------------------------------------------------------------------------
---On Style
---@param styles table
---@param width_main number
---@param height_main number
function HelpPanel:onStyle(styles, width_main, height_main)
styles.flow_panel = {
height = math.max(height_main,800),
}
styles.menu_panel = {
width = 300,
}
styles.content_panel = {
width = 850,
}
end
-------------------------------------------------------------------------------
---Get or create content panel
---@return LuaGuiElement
function HelpPanel:getContentPanel()
local panel = self:getFrameDeepPanel("help-panel", "horizontal")
local panel_menu_name = "menu-panel"
local panel_content_name = "content-panel"
if panel[panel_menu_name] ~= nil and panel[panel_menu_name].valid then
return panel[panel_menu_name], panel[panel_content_name]
end
local menu_panel = GuiElement.add(panel, GuiFlowV(panel_menu_name))
menu_panel.style.vertically_stretchable = true
self:setStyle(menu_panel, "menu_panel", "width")
local content_panel = GuiElement.add(panel, GuiScroll(panel_content_name))
self:setStyle(content_panel, "content_panel", "width")
menu_panel.style.vertically_stretchable = true
return menu_panel, content_panel
end
-------------------------------------------------------------------------------
---On event
---@param event LuaEvent
function HelpPanel:onEvent(event)
if event.action == "change-page" then
local selected_index = event.element.selected_index
User.setParameter("selected_help", page_list[selected_index])
self:onUpdate(event)
end
end
-------------------------------------------------------------------------------
---On update
---@param event LuaEvent
function HelpPanel:onUpdate(event)
self:generateList()
self:updateMenu(event)
self:updateContent(event)
end
-------------------------------------------------------------------------------
---Update about HelpPanel
function HelpPanel:generateList()
page_list = {}
for key1,section in pairs(help_data) do
local caption_section = {"", helmod_tag.font.default_bold, helmod_tag.color.gold, {string.format("helmod_help.%s", section.name)}, helmod_tag.color.close, helmod_tag.font.close}
table.insert(page_list, {section = key1, content = nil, caption = caption_section})
for key2,content in pairs(section.content) do
local caption_content = {"", " ", {string.format("helmod_help.%s", content.localised_text)}}
table.insert(page_list, {section = key1, content = key2, caption = caption_content})
end
end
end
-------------------------------------------------------------------------------
---Update about HelpPanel
---@param event LuaEvent
function HelpPanel:updateMenu(event)
local menu_panel, content_panel = self:getContentPanel()
menu_panel.clear()
local selected_help = User.getParameter("selected_help") or {section = "getting_start", content = nil}
local items = {}
local selected_item = nil
local scroll_index = 0
for index,page in pairs(page_list) do
table.insert(items, page.caption)
if page.section == selected_help.section and page.content == selected_help.content then
selected_item = page.caption
scroll_index = index
end
end
local list_box = GuiElement.add(menu_panel, GuiListBox(self.classname, "change-page"):items(items, selected_item))
list_box.scroll_to_item(scroll_index, "top-third")
end
-------------------------------------------------------------------------------
---Update about HelpPanel
---@param event LuaEvent
function HelpPanel:updateContent(event)
local menu_panel, content_panel = self:getContentPanel()
content_panel.clear()
local selected_help = User.getParameter("selected_help") or {section = "getting_start", content = nil}
local section = help_data[selected_help.section]
local content_selected = nil
if section then
---section panel
local section_caption_name = {string.format("helmod_help.%s", section.name)}
local section_caption_desc = {string.format("helmod_help.%s-desc", section.name)}
local section_panel = GuiElement.add(content_panel, GuiFlowV("section", section.name))
section_panel.style.horizontally_stretchable = true
---section header
GuiElement.add(section_panel, GuiLabel("header"):caption({"", "[font=heading-1]", section_caption_name, "[/font]"}):style("helmod_label_help"))
local section_title = GuiElement.add(section_panel, GuiLabel(section.name, "desc"):caption({"", " ",section_caption_desc}):style("helmod_label_help"))
for key,content in pairs(section.content) do
local content_panel = GuiElement.add(section_panel, GuiFrameV(section.name, "panel", key):style("helmod_inside_frame"))
content_panel.style.horizontally_stretchable = true
local content_title_name = {string.format("helmod_help.%s", content.localised_text)}
local content_title = GuiElement.add(content_panel, GuiLabel(section.name, "title", key):caption({"", "[font=heading-2]", content_title_name, "[/font]"}):style("helmod_label_help_title"))
if content.desc then
GuiElement.add(content_panel, GuiLabel(section.name, "desc", key):caption({string.format("helmod_help.%s-desc", content.localised_text)}):style("helmod_label_help_text"))
end
if content.sprite then
GuiElement.add(content_panel, GuiSprite():sprite("helmod_"..content.sprite))
end
local column = 1
local content_list = GuiElement.add(content_panel, GuiFlowV(section.name, "list", key))
content_list.style.horizontally_stretchable = true
for line=1, content.count do
local localised_text = {string.format("helmod_help.%s-%s", content.localised_text, line)}
if content.list == "number" then
GuiElement.add(content_list, GuiLabel(section.name, key, line):caption({"", "[font=default-bold]", line, ":[/font] ", localised_text}):style("helmod_label_help_text"))
else
GuiElement.add(content_list, GuiLabel(section.name, key, line):caption({"", "[font=default-bold]*[/font] ", localised_text}):style("helmod_label_help_text"))
end
end
if key == selected_help.content then
content_selected = content_title
end
end
if content_selected ~= nil then
content_panel.scroll_to_element(content_selected, "top-third")
else
content_panel.scroll_to_element(section_title, "top-third")
end
end
end