diff --git a/exp_gui/module/control.lua b/exp_gui/module/control.lua index 74463af4..761b0ed6 100644 --- a/exp_gui/module/control.lua +++ b/exp_gui/module/control.lua @@ -31,9 +31,12 @@ ExpGui.get_top_flow = mod_gui.get_button_flow ExpGui.get_left_flow = mod_gui.get_frame_flow --- Get a player from an element or gui event ---- @param input LuaGuiElement | { player_index: uint } +--- @param input LuaGuiElement | { player_index: uint } | { element: LuaGuiElement } --- @return LuaPlayer function ExpGui.get_player(input) + if type(input) == "table" and not input.player_index then + return assert(game.get_player(input.element.player_index)) + end return assert(game.get_player(input.player_index)) end diff --git a/exp_gui/module/core_elements.lua b/exp_gui/module/core_elements.lua index ef1a6434..1ffcd319 100644 --- a/exp_gui/module/core_elements.lua +++ b/exp_gui/module/core_elements.lua @@ -11,6 +11,12 @@ local elements = {} --- @type table local buttons_with_left_element = {} --- @type table local left_elements_with_button = {} --- @type table +ExpGui.on_toolbar_button_toggled = script.generate_event_name() + +--- @class EventData.on_toolbar_button_toggled: EventData +--- @field element LuaGuiElement +--- @field state boolean + --- Set the style of a toolbar button --- @param element LuaGuiElement --- @param state boolean? @@ -137,6 +143,10 @@ function ExpGui.create_toolbar_button(options) local player = ExpGui.get_player(event) ExpGui.set_left_element_visible(left_element, player, state) end + script.raise_event(ExpGui.on_toolbar_button_toggled, { + element = event.element, + state = state, + }) end) end diff --git a/exp_gui/module/module.json b/exp_gui/module/module.json index 7cd7b787..25c05fdb 100644 --- a/exp_gui/module/module.json +++ b/exp_gui/module/module.json @@ -7,8 +7,7 @@ "control.lua" ], "require": [ - "core_elements.lua", - "test.lua" + "core_elements.lua" ], "dependencies": { "clusterio": "*", diff --git a/exp_gui/module/prototype.lua b/exp_gui/module/prototype.lua index 083dc372..31c4c56b 100644 --- a/exp_gui/module/prototype.lua +++ b/exp_gui/module/prototype.lua @@ -6,7 +6,7 @@ local GuiIter = require("modules/exp_gui/iter") --- @class ExpGui_ExpElement local ExpElement = { - _elements = {}, + _elements = {}, --- @type table } ExpElement.events = {} @@ -51,7 +51,7 @@ ExpElement._prototype = { ExpElement._metatable = { __call = nil, -- ExpElement._prototype.create __index = ExpElement._prototype, - __class = "ExpGui", + __class = "ExpElement", } --- Used to signal that the property should be the same as the define name diff --git a/exp_gui/module/test.lua b/exp_gui/module/test.lua deleted file mode 100644 index e23ef9da..00000000 --- a/exp_gui/module/test.lua +++ /dev/null @@ -1,16 +0,0 @@ - -local ExpGui = require("modules/exp_gui") - -local frame = ExpGui.element("test") - :draw{ - type = "frame", - caption = "Hello, World", - } - -ExpGui.add_left_element(frame, true) - -ExpGui.create_toolbar_button{ - name = "test-button", - left_element = frame, - caption = "Test", -} diff --git a/exp_legacy/module/config/_file_loader.lua b/exp_legacy/module/config/_file_loader.lua index 9e72d522..a80a1a8d 100644 --- a/exp_legacy/module/config/_file_loader.lua +++ b/exp_legacy/module/config/_file_loader.lua @@ -43,25 +43,25 @@ return { "modules.data.language", --- GUI - "modules.gui.readme", - "modules.gui.rocket-info", - "modules.gui.science-info", - "modules.gui.autofill", - "modules.gui.warp-list", - "modules.gui.task-list", - "modules.gui.player-list", - "modules.gui.server-ups", - "modules.gui.bonus", - "modules.gui.vlayer", - "modules.gui.research", - "modules.gui.module", - "modules.gui.landfill", - "modules.gui.tool", - "modules.gui.production", - "modules.gui.playerdata", - "modules.gui.surveillance", - "modules.graftorio.require", -- graftorio - "modules.gui.toolbar", -- must be loaded last to register toolbar handlers + --"modules.gui.readme", + --"modules.gui.rocket-info", + --"modules.gui.science-info", + --"modules.gui.autofill", + --"modules.gui.task-list", + --"modules.gui.warp-list", + --"modules.gui.player-list", + --"modules.gui.server-ups", + --"modules.gui.bonus", + --"modules.gui.vlayer", + --"modules.gui.research", + --"modules.gui.module", + --"modules.gui.landfill", + --"modules.gui.tool", + --"modules.gui.production", + --"modules.gui.playerdata", + --"modules.gui.surveillance", + --"modules.graftorio.require", -- graftorio + --"modules.gui.toolbar", -- must be loaded last to register toolbar handlers --- Config Files "config.expcore.permission_groups", -- loads some predefined permission groups diff --git a/exp_legacy/module/module.json b/exp_legacy/module/module.json index 5652b929..2a2ec59e 100644 --- a/exp_legacy/module/module.json +++ b/exp_legacy/module/module.json @@ -7,6 +7,7 @@ ], "dependencies": { "clusterio": "*", - "exp_util": "*" + "exp_util": "*", + "exp_gui": "*" } } diff --git a/exp_legacy/module/modules/addons/tree-decon.lua b/exp_legacy/module/modules/addons/tree-decon.lua index e886941d..15c2c020 100644 --- a/exp_legacy/module/modules/addons/tree-decon.lua +++ b/exp_legacy/module/modules/addons/tree-decon.lua @@ -1,10 +1,11 @@ --- Makes trees which are marked for decon "decay" quickly to allow faster building -- @addon Tree-Decon -local Event = require("modules/exp_legacy/utils/event") --- @dep utils.event local Storage = require("modules/exp_util/storage") +local Gui = require("modules/exp_gui") + +local Event = require("modules/exp_legacy/utils/event") --- @dep utils.event local Roles = require("modules.exp_legacy.expcore.roles") --- @dep expcore.roles -local Gui = require("modules.exp_legacy.expcore.gui") --- @dep expcore.gui local PlayerData = require("modules.exp_legacy.expcore.player_data") --- @dep expcore.player_data -- Storage queue used to store trees that need to be removed, also cache for player roles @@ -34,13 +35,20 @@ end local HasEnabledDecon = PlayerData.Settings:combine("HasEnabledDecon") HasEnabledDecon:set_default(false) -Gui.toolbar_toggle_button("entity/tree-01", { "tree-decon.main-tooltip" }, function(player) - return Roles.player_allowed(player, "fast-tree-decon") +Gui.create_toolbar_button{ + name = "toggle-tree-decon", + sprite = "entity/tree-01", + tooltip = { "tree-decon.main-tooltip" }, + auto_toggle = true, + visible = function(player, _) + return Roles.player_allowed(player, "fast-tree-decon") + end +}:on_event(Gui.on_toolbar_button_toggled, function(def, event) + --- @cast event EventData.on_toolbar_button_toggled + local player = Gui.get_player(event) + HasEnabledDecon:set(player, event.state) + player.print{ "tree-decon.toggle-msg", event.state and { "tree-decon.enabled" } or { "tree-decon.disabled" } } end) - :on_event(Gui.events.on_toolbar_button_toggled, function(player, _, event) - HasEnabledDecon:set(player, event.state) - player.print{ "tree-decon.toggle-msg", event.state and { "tree-decon.enabled" } or { "tree-decon.disabled" } } - end) -- Add trees to queue when marked, only allows simple entities and for players with role permission Event.add(defines.events.on_marked_for_deconstruction, function(event) diff --git a/exp_legacy/module/modules/control/spectate.lua b/exp_legacy/module/modules/control/spectate.lua index 371c014c..a7a2158b 100644 --- a/exp_legacy/module/modules/control/spectate.lua +++ b/exp_legacy/module/modules/control/spectate.lua @@ -1,6 +1,7 @@ -local Event = require("modules/exp_legacy/utils/event") --- @dep utils.event local Storage = require("modules/exp_util/storage") -local Gui = require("modules.exp_legacy.expcore.gui") --- @dep expcore.gui +local Gui = require("modules/exp_gui") + +local Event = require("modules/exp_legacy/utils/event") --- @dep utils.event ----- Locals ----- local follow_label -- Gui constructor @@ -88,7 +89,7 @@ function Public.stop_follow(player) Public.stop_spectate(player) end - Gui.destroy_if_valid(player.gui.screen[follow_label.name]) + Gui.destroy_if_valid(player.gui.screen.follow_label) following[player.index] = nil end @@ -102,19 +103,18 @@ end ----- Gui ----- --- Label used to show that the player is following, also used to allow esc to stop following --- @element follow_label -follow_label = - Gui.element(function(definition, parent, target) - Gui.destroy_if_valid(parent[definition.name]) +follow_label = Gui.element("follow-label") + :draw(function(def, parent, target) + Gui.destroy_if_valid(parent.follow_label) local label = parent.add{ type = "label", + name = "follow_label", style = "frame_title", caption = "Following " .. target.name .. ".\nClick here or press esc to stop following.", - name = definition.name, } - local player = Gui.get_player_from_element(parent) + local player = Gui.get_player(parent) local res = player.display_resolution label.location = { 0, res.height - 150 } label.style.width = res.width @@ -123,12 +123,11 @@ follow_label = return label end) - :static_name(Gui.unique_static_name) :on_click(Public.stop_follow) - :on_close(function(player) + :on_closed(function(def, event) -- Don't call set_controller during on_close as it invalidates the controller -- Setting an invalid position (as to not equal their current) will call stop_follow on the next tick - following[player.index][3] = {} + following[event.player_index][3] = {} end) ----- Events ----- diff --git a/exp_legacy/module/modules/gui/debug/event_view.lua b/exp_legacy/module/modules/gui/debug/event_view.lua index f358d77b..b2d84ded 100644 --- a/exp_legacy/module/modules/gui/debug/event_view.lua +++ b/exp_legacy/module/modules/gui/debug/event_view.lua @@ -1,4 +1,5 @@ local Event = require("modules/exp_legacy/utils/event") +local Storage = require("modules/exp_util/storage") local Gui = require("modules.exp_legacy.utils.gui") local Model = require("modules.exp_legacy.modules.gui.debug.model") @@ -21,6 +22,11 @@ local checkbox_name = Gui.uid_name() local filter_name = Gui.uid_name() local clear_filter_name = Gui.uid_name() +local storage = {} +Storage.register(storage, function(tbl) + storage = tbl +end) + -- storage tables local enabled = {} local last_events = {} diff --git a/exp_legacy/module/modules/gui/debug/expcore_gui_view.lua b/exp_legacy/module/modules/gui/debug/expcore_gui_view.lua index baf3d352..a152305f 100644 --- a/exp_legacy/module/modules/gui/debug/expcore_gui_view.lua +++ b/exp_legacy/module/modules/gui/debug/expcore_gui_view.lua @@ -1,6 +1,7 @@ -local Gui = require("modules.exp_legacy.utils.gui") --- @dep utils.gui -local ExpGui = require("modules.exp_legacy.expcore.gui") +local ExpElement = require("modules/exp_gui/prototype") local Color = require("modules/exp_util/include/color") + +local Gui = require("modules.exp_legacy.utils.gui") --- @dep utils.gui local Model = require("modules.exp_legacy.modules.gui.debug.model") --- @dep modules.gui.debug.model local dump = Model.dump @@ -24,9 +25,10 @@ function Public.show(container) local left_panel_style = left_panel.style left_panel_style.width = 300 - for element_id, file_path in pairs(ExpGui.file_paths) do - local header = left_panel.add{ type = "flow" }.add{ type = "label", name = header_name, caption = element_id .. " - " .. file_path } - Gui.set_data(header, element_id) + --- @diagnostic disable-next-line invisible + for element_name in pairs(ExpElement._elements) do + local header = left_panel.add{ type = "flow" }.add{ type = "label", name = header_name, caption = element_name } + Gui.set_data(header, element_name) end local right_flow = main_flow.add{ type = "flow", direction = "vertical" } @@ -70,7 +72,7 @@ Gui.on_click( header_name, function(event) local element = event.element - local element_id = Gui.get_data(element) + local element_name = Gui.get_data(element) local left_panel = element.parent.parent local data = Gui.get_data(left_panel) @@ -85,10 +87,11 @@ Gui.on_click( element.style.font_color = Color.orange data.selected_header = element - input_text_box.text = concat{ "Gui.defines[", element_id, "]" } + input_text_box.text = concat{ "ExpElement._elements[", element_name, "]" } input_text_box.style.font_color = Color.black - local content = dump(ExpGui.debug_info[element_id]) or "nil" + --- @diagnostic disable-next-line invisible + local content = dump(ExpElement._elements[element_name]) or "nil" right_panel.text = content end ) diff --git a/exp_legacy/module/modules/gui/debug/model.lua b/exp_legacy/module/modules/gui/debug/model.lua index cb867f1c..f349dcf4 100644 --- a/exp_legacy/module/modules/gui/debug/model.lua +++ b/exp_legacy/module/modules/gui/debug/model.lua @@ -1,7 +1,6 @@ local Gui = require("modules.exp_legacy.utils.gui") --- @dep utils.gui +local ExpUtil = require("modules/exp_util") -local gui_names = Gui.names -local type = type local concat = table.concat local inspect = table.inspect local pcall = pcall @@ -10,76 +9,7 @@ local rawset = rawset local Public = {} -local LuaObject = { "{", nil, ", name = '", nil, "'}" } -local LuaPlayer = { "{LuaPlayer, name = '", nil, "', index = ", nil, "}" } -local LuaEntity = { "{LuaEntity, name = '", nil, "', unit_number = ", nil, "}" } -local LuaGuiElement = { "{LuaGuiElement, name = '", nil, "'}" } - -local function get(obj, prop) - return obj[prop] -end - -local function get_name_safe(obj) - local s, r = pcall(get, obj, "name") - if not s then - return "nil" - else - return r or "nil" - end -end - -local function get_lua_object_type_safe(obj) - local s, r = pcall(get, obj, "help") - - if not s then - return - end - - return r():match("Lua%a+") -end - -local function inspect_process(item) - if type(item) ~= "table" or type(item.__self) ~= "userdata" then - return item - end - - local suc, valid = pcall(get, item, "valid") - if not suc then - -- no 'valid' property - return get_lua_object_type_safe(item) or "{NoHelp LuaObject}" - end - - if not valid then - return "{Invalid LuaObject}" - end - - local obj_type = get_lua_object_type_safe(item) - if not obj_type then - return "{NoHelp LuaObject}" - end - - if obj_type == "LuaPlayer" then - LuaPlayer[2] = item.name or "nil" - LuaPlayer[4] = item.index or "nil" - - return concat(LuaPlayer) - elseif obj_type == "LuaEntity" then - LuaEntity[2] = item.name or "nil" - LuaEntity[4] = item.unit_number or "nil" - - return concat(LuaEntity) - elseif obj_type == "LuaGuiElement" then - local name = item.name - LuaGuiElement[2] = gui_names and gui_names[name] or name or "nil" - - return concat(LuaGuiElement) - else - LuaObject[2] = obj_type - LuaObject[4] = get_name_safe(item) - - return concat(LuaObject) - end -end +local inspect_process = ExpUtil.safe_value local inspect_options = { process = inspect_process } function Public.dump(data) diff --git a/exp_legacy/module/utils/gui.lua b/exp_legacy/module/utils/gui.lua index 7ea8347b..c20da522 100644 --- a/exp_legacy/module/utils/gui.lua +++ b/exp_legacy/module/utils/gui.lua @@ -1,6 +1,6 @@ local Storage = require("modules/exp_util/storage") -local Event = require("modules/exp_legacy/utils/event") --- @dep expcore.gui -local mod_gui = require "mod-gui" --- @dep mod-gui +local Event = require("modules/exp_legacy/utils/event") +local mod_gui = require "mod-gui" local Gui = {} local data = {} diff --git a/exp_scenario/module/commands/_rcon.lua b/exp_scenario/module/commands/_rcon.lua index e29ecb11..7ce7ed0d 100644 --- a/exp_scenario/module/commands/_rcon.lua +++ b/exp_scenario/module/commands/_rcon.lua @@ -5,8 +5,9 @@ Adds rcon interfaces for the legacy exp core local Commands = require("modules/exp_commands") local add_static, add_dynamic = Commands.add_rcon_static, Commands.add_rcon_dynamic +add_static("Gui", require("modules/exp_gui")) + add_static("Group", require("modules.exp_legacy.expcore.permission_groups")) add_static("Roles", require("modules.exp_legacy.expcore.roles")) -add_static("Gui", require("modules.exp_legacy.expcore.gui")) add_static("Datastore", require("modules.exp_legacy.expcore.datastore")) add_static("External", require("modules.exp_legacy.expcore.external"))