diff --git a/expcore/gui/prototype.lua b/expcore/gui/prototype.lua index ed77f293..f79b6d7a 100644 --- a/expcore/gui/prototype.lua +++ b/expcore/gui/prototype.lua @@ -27,6 +27,9 @@ local Gui = { __call = function(self, parent, ...) local element = self._draw(self, parent, ...) if self._style then self._style(element.style, element, ...) end + if self.name and self.name ~= element.name then + error("Static name \""..self.name.."\" expected but got: "..tostring(element.name)) + end return self:triggers_events(element) end, __index = function(self, key) @@ -170,19 +173,32 @@ function Gui._prototype_element:style(style_define) return self end +--[[-- Enforce the fact the element has a static name, this is required for the cases when a function define is used +@tparam[opt] string element The element that will trigger calls to the event handlers +@treturn table the element define is returned to allow for event handlers to be registered +]] +function Gui._prototype_element:static_name(name) + if name == Gui.unique_static_name then + self.name = "ExpGui_"..tostring(self.uid) + else + self.name = name + end + return self +end + --[[-- Used to link an element to an element define such that any event on the element will call the handlers on the element define @tparam LuaGuiElement element The element that will trigger calls to the event handlers @treturn LuaGuiElement The element passed as the argument to allow for cleaner returns ]] function Gui._prototype_element:triggers_events(element) - local event_triggers = element.tags.ExpGuiTriggers + local event_triggers = element.tags.ExpGui_event_triggers if not event_triggers then event_triggers = { self.uid } else table.insert(event_triggers, self.uid) end -- To modify a set of tags, the whole table needs to be written back to the respective property. - element.tags.ExpGuiTriggers = event_triggers + element.tags.ExpGui_event_triggers = event_triggers end --[[-- Set the handler which will be called for a custom event, only one handler can be used per event per element @@ -247,7 +263,7 @@ local function event_handler_factory(event_name) Event.add(event_name, function(event) local element = event.element if not element or not element.valid then return end - local event_triggers = element.tags.ExpGuiTriggers + local event_triggers = element.tags.ExpGui_event_triggers if not event_triggers then return end for _, uid in event_triggers do local element_define = Gui.defines[uid] diff --git a/modules/gui/autofill.lua b/modules/gui/autofill.lua index 8084dfbd..bb7cc089 100644 --- a/modules/gui/autofill.lua +++ b/modules/gui/autofill.lua @@ -32,7 +32,8 @@ Gui.element{ type = 'sprite-button', sprite = 'utility/expand_dark', hovered_sprite = 'utility/expand', - tooltip = {'autofill.toggle-section-tooltip'} + tooltip = {'autofill.toggle-section-tooltip'}, + name = Gui.unique_static_name } :style(Gui.sprite_style(20)) :on_click(function(_, element, _) @@ -50,14 +51,6 @@ Gui.element{ end end) ---- Used to assign an event to the header label to trigger a toggle --- @element header_toggle -local header_toggle = Gui.element() -:on_click(function(_, element, event) - event.element = element.parent.alignment[toggle_section.name] - toggle_section:raise_custom_event(event) -end) - --- Toggle enitity button, used for toggling autofill for the specific entity -- All entity autofill settings will be ignored if its disabled -- @element entity_toggle @@ -95,16 +88,18 @@ end) --- Draw a section header and main scroll -- @element autofill_section_container local section = -Gui.element(function(_, parent, section_name, table_size) +Gui.element(function(definition, parent, section_name, table_size) -- Draw the header for the section local header = Gui.header( parent, {'autofill.toggle-section-caption', rich_img('item', section_name), {'entity-name.'..section_name}}, {'autofill.toggle-section-tooltip'}, true, - section_name..'-header', - header_toggle.name + section_name..'-header' ) + + definition:triggers_events(header.parent.header_label) + -- Right aligned button to toggle the section header.caption = section_name entity_toggle(header, section_name) @@ -120,13 +115,16 @@ Gui.element(function(_, parent, section_name, table_size) return section_table end) +:on_click(function(_, element, event) + event.element = element.parent.alignment[toggle_section.name] + toggle_section:raise_custom_event(event) +end) --- Toggle item button, used for toggling autofill for the specific item -- @element toggle_item_button local toggle_item_button = -Gui.element(function(event_trigger, parent, item) +Gui.element(function(_, parent, item) return parent.add{ - name = event_trigger, type = 'sprite-button', sprite = 'item/'..item.name, tooltip = {'autofill.toggle-tooltip', rich_img('item', item.name), item.category}, @@ -161,9 +159,8 @@ end) --- Amount text field for a autofill item -- @element amount_textfield local amount_textfield = -Gui.element(function(event_trigger, parent, item) +Gui.element(function(_, parent, item) return parent.add{ - name = event_trigger, type = 'textfield', text = item.amount, tooltip = {'autofill.amount-tooltip', item.category }, @@ -233,9 +230,9 @@ end) --- Main gui container for the left flow -- @element autofill_container autofill_container = -Gui.element(function(event_trigger, parent) +Gui.element(function(definition, parent) -- Draw the internal container - local container = Gui.container(parent, event_trigger) + local container = Gui.container(parent, definition.name) -- Draw the scroll container local scroll_table = Gui.scroll_table(container, 400, 1, 'autofill-scroll-table') -- Set the scroll panel to always show the scrollbar (not doing this will result in a changing gui size) @@ -293,6 +290,7 @@ Gui.element(function(event_trigger, parent) -- Return the external container return container.parent end) +:static_name(Gui.unique_static_name) :add_to_left_flow() --- Button on the top flow used to toggle autofill container diff --git a/modules/gui/module.lua b/modules/gui/module.lua index 7cd5d94a..5d32d1d3 100644 --- a/modules/gui/module.lua +++ b/modules/gui/module.lua @@ -171,7 +171,6 @@ end local button_apply = Gui.element{ - name = 'module_b', type = 'button', caption = 'Apply', style = 'button' @@ -184,8 +183,8 @@ Gui.element{ end) module_container = -Gui.element(function(event_trigger, parent) - local container = Gui.container(parent, event_trigger, (config.module_slot_max + 2) * 36) +Gui.element(function(definition, parent) + local container = Gui.container(parent, definition.name, (config.module_slot_max + 2) * 36) Gui.header(container, 'Module Inserter', '', true) local scroll_table = Gui.scroll_table(container, (config.module_slot_max + 2) * 36, config.module_slot_max + 1) @@ -214,6 +213,7 @@ Gui.element(function(event_trigger, parent) return container.parent end) +:static_name(Gui.unique_static_name) :add_to_left_flow() Gui.left_toolbar_button('item/productivity-module-3', {'module.main-tooltip'}, module_container, function(player) diff --git a/modules/gui/player-list.lua b/modules/gui/player-list.lua index 27dc5226..e04d2375 100644 --- a/modules/gui/player-list.lua +++ b/modules/gui/player-list.lua @@ -29,7 +29,8 @@ Gui.element{ type = 'sprite-button', sprite = 'utility/expand_dots_white', tooltip = {'player-list.open-action-bar'}, - style = 'frame_button' + style = 'frame_button', + name = Gui.unique_static_name } :style{ padding = -2, @@ -85,21 +86,21 @@ end) --- Set of elements that are used to make up a row of the player table -- @element add_player_base local add_player_base = -Gui.element(function(event_trigger, parent, player_data) +Gui.element(function(definition, parent, player_data) -- Add the button to open the action bar local toggle_action_bar_flow = parent.add{ type = 'flow', name = player_data.name } open_action_bar(toggle_action_bar_flow) -- Add the player name - local player_name_flow = parent.add{ type = 'flow', name = 'player-name-'..player_data.index } - local player_name = player_name_flow.add{ + local player_name = parent.add{ type = 'label', - name = event_trigger, + name = 'player-name-'..player_data.index, caption = player_data.name, tooltip = {'player-list.open-map', player_data.name, player_data.tag, player_data.role_name} } player_name.style.padding = {0, 2,0, 0} player_name.style.font_color = player_data.chat_color + definition:triggers_events(player_name) -- Add the time played label local alignment = Gui.alignment(parent, 'player-time-'..player_data.index) @@ -202,9 +203,9 @@ end --- Main player list container for the left flow -- @element player_list_container local player_list_container = -Gui.element(function(event_trigger, parent) +Gui.element(function(definition, parent) -- Draw the internal container - local container = Gui.container(parent, event_trigger, 200) + local container = Gui.container(parent, definition.name, 200) -- Draw the scroll table for the players local scroll_table = Gui.scroll_table(container, 184, 3) @@ -255,6 +256,7 @@ Gui.element(function(event_trigger, parent) -- Return the exteral container return container.parent end) +:static_name(Gui.unique_static_name) :add_to_left_flow(true) --- Button on the top flow used to toggle the player list container diff --git a/modules/gui/readme.lua b/modules/gui/readme.lua index ca38e40e..af264d47 100644 --- a/modules/gui/readme.lua +++ b/modules/gui/readme.lua @@ -25,13 +25,11 @@ local scroll_height = 275 -- controls the height of the scrolls --- Sub content area used within the content areas -- @element sub_content local sub_content = -Gui.element(function(_, parent) - return parent.add{ - type = 'frame', - direction = 'vertical', - style = 'inside_deep_frame' - } -end) +Gui.element{ + type = 'frame', + direction = 'vertical', + style = 'inside_deep_frame' +} :style{ horizontally_stretchable = true, horizontal_align = 'center', @@ -77,17 +75,16 @@ Gui.element{ --- Used to connect to servers in server list -- @element join_server local join_server = -Gui.element(function(event_trigger, parent, server_id, wrong_version) +Gui.element(function(definition, parent, server_id, wrong_version) local status = External.get_server_status(server_id) or 'Offline' if wrong_version then status = 'Version' end local flow = parent.add{ name = server_id, type = 'flow' } - local button = flow.add{ - name = event_trigger, + local button = definition:triggers_events(flow.add{ type = 'sprite-button', sprite = 'utility/circuit_network_panel_white', --- network panel white, warning white, download white hovered_sprite = 'utility/circuit_network_panel_black', --- network panel black, warning black, download black tooltip = {'readme.servers-connect-'..status, wrong_version} - } + }) if status == 'Offline' or status == 'Current' then button.enabled = false @@ -404,9 +401,9 @@ end)) -- @element readme local readme_toggle local readme = -Gui.element(function(event_trigger, parent) +Gui.element(function(definition, parent) local container = parent.add{ - name = event_trigger, + name = definition.name, type = 'frame', style = 'invisible_frame' } @@ -439,6 +436,7 @@ Gui.element(function(event_trigger, parent) return container end) +:static_name(Gui.unique_static_name) :on_open(function(player) local toggle_button = Gui.get_top_element(player, readme_toggle) Gui.toolbar_button_style(toggle_button, true) diff --git a/modules/gui/research.lua b/modules/gui/research.lua index daf514e6..663c6c93 100644 --- a/modules/gui/research.lua +++ b/modules/gui/research.lua @@ -55,8 +55,8 @@ for i=1, #config.milestone do end local clock_container = -Gui.element(function(event_trigger, parent) - local container = Gui.container(parent, event_trigger, 200) +Gui.element(function(definition, parent) + local container = Gui.container(parent, definition.name, 200) local scroll_table = Gui.scroll_table(container, 400, 4) scroll_table.add{ @@ -143,6 +143,7 @@ Gui.element(function(event_trigger, parent) return container.parent end) +:static_name(Gui.unique_static_name) :add_to_left_flow() Gui.left_toolbar_button('item/space-science-pack', {'expcom-res.main-tooltip'}, clock_container, function(player) diff --git a/modules/gui/rocket-info.lua b/modules/gui/rocket-info.lua index a8cb673c..e0a38ceb 100644 --- a/modules/gui/rocket-info.lua +++ b/modules/gui/rocket-info.lua @@ -43,7 +43,8 @@ local toggle_launch = Gui.element{ type = 'sprite-button', sprite = 'utility/play', - tooltip = {'rocket-info.toggle-rocket-tooltip'} + tooltip = {'rocket-info.toggle-rocket-tooltip'}, + name = Gui.unique_static_name } :style(Gui.sprite_style(16)) :on_click(function(_, element, _) @@ -66,7 +67,8 @@ local launch_rocket = Gui.element{ type = 'sprite-button', sprite = 'utility/center', - tooltip = {'rocket-info.launch-tooltip'} + tooltip = {'rocket-info.launch-tooltip'}, + name = Gui.unique_static_name } :style(Gui.sprite_style(16, -1)) :on_click(function(player, element, _) @@ -82,10 +84,9 @@ end) --- XY cords that allow zoom to map when pressed -- @element silo_cords local silo_cords = -Gui.element(function(event_trigger, parent, silo_data) +Gui.element(function(definition, parent, silo_data) local silo_name = silo_data.silo_name local pos = silo_data.position - local name = config.progress.allow_zoom_to_map and event_trigger or nil local tooltip = config.progress.allow_zoom_to_map and {'rocket-info.progress-label-tooltip'} or nil -- Add the x cord flow @@ -97,9 +98,8 @@ Gui.element(function(event_trigger, parent, silo_data) flow_x.style.padding = {0, 2,0, 1} -- Add the x cord label - flow_x.add{ + local label_x = flow_x.add{ type = 'label', - name = name, caption = {'rocket-info.progress-x-pos', pos.x}, tooltip = tooltip } @@ -113,13 +113,16 @@ Gui.element(function(event_trigger, parent, silo_data) flow_y.style.padding = {0, 2,0, 1} -- Add the y cord label - flow_y.add{ + local label_y = flow_y.add{ type = 'label', - name = name, caption = {'rocket-info.progress-y-pos', pos.y}, tooltip = tooltip } + if config.progress.allow_zoom_to_map then + definition:triggers_events(label_x) + definition:triggers_events(label_y) + end end) :on_click(function(player, element, _) local rocket_silo_name = element.parent.caption @@ -422,7 +425,8 @@ Gui.element{ type = 'sprite-button', sprite = 'utility/expand_dark', hovered_sprite = 'utility/expand', - tooltip = {'rocket-info.toggle-section-tooltip'} + tooltip = {'rocket-info.toggle-section-tooltip'}, + name = Gui.unique_static_name } :style(Gui.sprite_style(20)) :on_click(function(_, element, _) @@ -440,27 +444,19 @@ Gui.element{ end end) --- Used to assign an event to the header label to trigger a toggle --- @element header_toggle -local header_toggle = Gui.element() -:on_click(function(_, element, event) - event.element = element.parent.alignment[toggle_section.name] - toggle_section:raise_custom_event(event) -end) - -- Draw a section header and main scroll -- @element rocket_list_container local section = -Gui.element(function(_, parent, section_name, table_size) +Gui.element(function(definition, parent, section_name, table_size) -- Draw the header for the section local header = Gui.header( parent, {'rocket-info.section-caption-'..section_name}, {'rocket-info.section-tooltip-'..section_name}, true, - section_name..'-header', - header_toggle.name + section_name..'-header' ) + definition:triggers_events(header.parent.header_label) -- Right aligned button to toggle the section header.caption = section_name @@ -473,13 +469,17 @@ Gui.element(function(_, parent, section_name, table_size) -- Return the flow table return scroll_table end) +:on_click(function(_, element, event) + event.element = element.parent.alignment[toggle_section.name] + toggle_section:raise_custom_event(event) +end) --- Main gui container for the left flow -- @element rocket_list_container local rocket_list_container = -Gui.element(function(event_trigger, parent) +Gui.element(function(definition, parent) -- Draw the internal container - local container = Gui.container(parent, event_trigger, 200) + local container = Gui.container(parent, definition.name, 200) -- Set the container style local style = container.style @@ -516,6 +516,7 @@ Gui.element(function(event_trigger, parent) -- Return the exteral container return container.parent end) +:static_name(Gui.unique_static_name) :add_to_left_flow(function(player) return player.force.rockets_launched > 0 and Roles.player_allowed(player, 'gui/rocket-info') end) diff --git a/modules/gui/science-info.lua b/modules/gui/science-info.lua index 345ab04a..97395ca7 100644 --- a/modules/gui/science-info.lua +++ b/modules/gui/science-info.lua @@ -261,11 +261,11 @@ end --- Main task list container for the left flow -- @element task_list_container local science_info_container = -Gui.element(function(event_trigger, parent) +Gui.element(function(definition, parent) local player = Gui.get_player_from_element(parent) -- Draw the internal container - local container = Gui.container(parent, event_trigger, 200) + local container = Gui.container(parent, definition.name, 200) -- Draw the header Gui.header(container, {'science-info.main-caption'}, {'science-info.main-tooltip'}) @@ -315,6 +315,7 @@ Gui.element(function(event_trigger, parent) -- Return the exteral container return container.parent end) +:static_name(Gui.unique_static_name) :add_to_left_flow() --- Button on the top flow used to toggle the task list container diff --git a/modules/gui/server-ups.lua b/modules/gui/server-ups.lua index 19fa57aa..af643bdc 100644 --- a/modules/gui/server-ups.lua +++ b/modules/gui/server-ups.lua @@ -23,7 +23,8 @@ UsesServerUps:set_metadata{ local server_ups = Gui.element{ type = 'label', - caption = 'SUPS = 60.0' + caption = 'SUPS = 60.0', + name = Gui.unique_static_name } :style{ font = 'default-game' diff --git a/modules/gui/task-list.lua b/modules/gui/task-list.lua index 03ccd65d..e985ce75 100644 --- a/modules/gui/task-list.lua +++ b/modules/gui/task-list.lua @@ -85,7 +85,8 @@ local add_new_task = type = "sprite-button", sprite = "utility/add", tooltip = {"task-list.add-tooltip"}, - style = "tool_button" + style = "tool_button", + name = Gui.unique_static_name }:style(Styles.sprite22):on_click( function(player, _, _) -- Disable editing @@ -164,20 +165,16 @@ local subfooter_label = --- Action flow that contains action buttons -- @element subfooter_actions local subfooter_actions = - Gui.element( - function(_, parent) - return parent.add { - type = "flow", - name = "actions" - } - end -) + Gui.element { + type = "flow", + name = "actions" +} --- Button element with a flow around it to fix duplicate name inside of the scroll flow -- @element task_list_item local task_list_item = Gui.element( - function(event_trigger, parent, task) + function(definition, parent, task) local flow = parent.add { type = "flow", @@ -187,11 +184,12 @@ local task_list_item = flow.style.horizontally_stretchable = true local button = flow.add { - name = event_trigger, + name = definition.name, type = "button", style = "list_box_item", caption = task.title } + definition:triggers_events(button) button.style.horizontally_stretchable = true button.style.horizontally_squashable = true return flow @@ -201,7 +199,7 @@ local task_list_item = local task_id = element.parent.caption PlayerSelected:set(player, task_id) end -) +):static_name(Gui.unique_static_name) --- Scrollable list of all tasks -- @element task_list @@ -239,6 +237,7 @@ local task_list = local task_view_edit_button = Gui.element { type = "button", + name = Gui.unique_static_name, caption = {"", "[img=utility/rename_icon_normal] ", {"task-list.edit"}}, tooltip = {"task-list.edit-tooltip"}, style = "shortcut_bar_button" @@ -271,6 +270,7 @@ Gui.element{ local task_view_delete_button = Gui.element { type = "button", + name = Gui.unique_static_name, caption = {"", "[img=utility/trash] ", {"task-list.delete"}}, tooltip = {"task-list.delete-tooltip"}, style = "shortcut_bar_button_red" @@ -342,6 +342,7 @@ local task_create_confirm_button -- @element task_message_textfield local task_message_textfield = Gui.element { + name = Gui.unique_static_name, type = "text-box", text = "" }:style( @@ -370,6 +371,7 @@ local task_message_textfield = task_edit_confirm_button = Gui.element { type = "button", + name = Gui.unique_static_name, caption = {"", "[img=utility/check_mark] ", {"task-list.confirm"}}, tooltip = {"task-list.confirm-tooltip"}, style = "shortcut_bar_button_green" @@ -424,6 +426,7 @@ local task_edit_footer = task_create_confirm_button = Gui.element { type = "button", + name = Gui.unique_static_name, caption = {"", "[img=utility/check_mark] ", {"task-list.confirm"}}, tooltip = {"task-list.confirm-tooltip"}, style = "shortcut_bar_button_green", @@ -496,9 +499,9 @@ end -- @element task_list_container local task_list_container = Gui.element( - function(event_trigger, parent) + function(definition, parent) -- Draw the internal container - local container = Gui.container(parent, event_trigger, 268) + local container = Gui.container(parent, definition.name, 268) container.style.maximal_width = 268 container.style.minimal_width = 268 @@ -526,7 +529,7 @@ local task_list_container = -- Return the external container return container.parent end -):add_to_left_flow( +):static_name(Gui.unique_static_name):add_to_left_flow( function(player) local task_ids = Tasks.get_force_task_ids(player.force.name) return #task_ids > 0 diff --git a/modules/gui/vlayer.lua b/modules/gui/vlayer.lua index 1b3d3999..1e830aa8 100644 --- a/modules/gui/vlayer.lua +++ b/modules/gui/vlayer.lua @@ -345,9 +345,9 @@ end) --- The main container for the vlayer gui -- @element vlayer_container local vlayer_container = -Gui.element(function(event_trigger, parent) +Gui.element(function(definition, parent) local player = Gui.get_player_from_element(parent) - local container = Gui.container(parent, event_trigger, 320) + local container = Gui.container(parent, definition.name, 320) vlayer_display_set(container, 'vlayer_st_1') vlayer_control_set(container, 'vlayer_st_2') @@ -362,6 +362,7 @@ Gui.element(function(event_trigger, parent) table[vlayer_gui_control_remove.name].visible = visible return container.parent end) +:static_name(Gui.unique_static_name) :add_to_left_flow() --- Button on the top flow used to toggle the task list container diff --git a/modules/gui/warp-list.lua b/modules/gui/warp-list.lua index 4928d66e..2c3383db 100644 --- a/modules/gui/warp-list.lua +++ b/modules/gui/warp-list.lua @@ -81,7 +81,8 @@ Gui.element{ type = 'sprite-button', sprite = 'utility/add', tooltip = {'warp-list.add-tooltip'}, - style = 'shortcut_bar_button' + style = 'shortcut_bar_button', + name = Gui.unique_static_name } :style(Styles.sprite22) :on_click(function(player, _) @@ -148,7 +149,7 @@ end) --- Warp icon button, this will trigger a warp when the player is able to -- @element warp_icon_button local warp_icon_button = -Gui.element(function(event_trigger, parent, warp) +Gui.element(function(definition, parent, warp) local warp_position = warp.position -- The SpritePath type is not the same as the SignalID type @@ -158,15 +159,16 @@ Gui.element(function(event_trigger, parent, warp) end -- Draw the element - return parent.add{ - name = event_trigger, + return definition:triggers_events(parent.add{ type = 'sprite-button', sprite = sprite, + name = definition.name, tooltip = {'warp-list.goto-tooltip', warp_position.x, warp_position.y}, style = 'slot_button' - } + }) end) :style(Styles.sprite32) +:static_name(Gui.unique_static_name) :on_click(function(player, element, _) if element.type == 'choose-elem-button' then return end local warp_id = element.parent.caption @@ -183,30 +185,31 @@ end) --- The button that is visible when the warp is in edit state -- @element warp_icon_editing local warp_icon_editing = -Gui.element(function(event_trigger, parent, warp) - return parent.add{ - name = event_trigger, +Gui.element(function(definition, parent, warp) + return definition:triggers_events(parent.add{ + name = definition.name, type = 'choose-elem-button', elem_type = 'signal', signal = {type = warp.icon.type, name = warp.icon.name}, tooltip = {'warp-list.goto-edit'} - } + }) end) +:static_name(Gui.unique_static_name) :style(Styles.sprite32) --- Warp label, visible if the player is not in edit state -- @element warp_label local warp_label = -Gui.element(function(event_trigger, parent, warp) +Gui.element(function(definition, parent, warp) local last_edit_name = warp.last_edit_name local last_edit_time = warp.last_edit_time -- Draw the element - return parent.add{ - name = event_trigger, + return definition:triggers_events(parent.add{ type = 'label', caption = warp.name, - tooltip = {'warp-list.last-edit', last_edit_name, format_time(last_edit_time)} - } + tooltip = {'warp-list.last-edit', last_edit_name, format_time(last_edit_time)}, + name = definition.name + }) end) :style{ single_line = true, @@ -220,19 +223,17 @@ end) local position = warp.position player.zoom_to_world(position, 1.5) end) +:static_name(Gui.unique_static_name) --- Warp status, visible if the player is not in edit state --- This will show if the warp is connected or not -- @element warp_status local warp_status = -Gui.element(function(event_trigger, parent) - -- Draw the element - return parent.add{ - name = event_trigger, - type = 'label', - caption = '[img=utility/electricity_icon_unplugged]', -- Temporary icon - } -end) +Gui.element{ + type = 'label', + caption = '[img=utility/electricity_icon_unplugged]', -- Temporary icon + name = Gui.unique_static_name +} :style{ -- When editing mode because textbox is larger the icon would move up. top_padding = 1, @@ -242,14 +243,14 @@ end) --- Warp textfield, visible if the player is in edit state -- @element warp_textfield local warp_textfield = -Gui.element(function(event_trigger, parent, warp) +Gui.element(function(definition, parent, warp) -- Draw the element - return parent.add{ - name = event_trigger, + return definition:triggers_events(parent.add{ type = 'textfield', text = warp.name, - clear_and_focus_on_right_click = true - } + clear_and_focus_on_right_click = true, + name = definition.name + }) end) :style{ -- Required fields to make it squashable and strechable. @@ -270,6 +271,7 @@ end) Warps.set_editing(warp_id, player.name) Warps.update_warp(warp_id, warp_name, warp_icon, player.name) end) +:static_name(Gui.unique_static_name) --- Confirms the edit to name or icon of the warp @@ -279,7 +281,8 @@ Gui.element{ type = 'sprite-button', sprite = 'utility/confirm_slot', tooltip = {'warp-list.confirm-tooltip'}, - style = 'shortcut_bar_button_green' + style = 'shortcut_bar_button_green', + name = Gui.unique_static_name } :style(Styles.sprite22) :on_click(function(player, element) @@ -297,7 +300,8 @@ Gui.element{ type = 'sprite-button', sprite = 'utility/close_black', tooltip = {'warp-list.cancel-tooltip'}, - style = 'shortcut_bar_button_red' + style = 'shortcut_bar_button_red', + name = Gui.unique_static_name } :style(Styles.sprite22) :on_click(function(player, element) @@ -318,7 +322,8 @@ Gui.element{ type = 'sprite-button', sprite = 'utility/trash', tooltip = {'warp-list.remove-tooltip'}, - style = 'shortcut_bar_button_red' + style = 'shortcut_bar_button_red', + name = Gui.unique_static_name } :style(Styles.sprite22) :on_click(function(_, element) @@ -333,7 +338,8 @@ Gui.element{ type = 'sprite-button', sprite = 'utility/rename_icon_normal', tooltip = {'warp-list.edit-tooltip-none'}, - style = 'shortcut_bar_button' + style = 'shortcut_bar_button', + name = Gui.unique_static_name } :style(Styles.sprite22) :on_click(function(player, element) @@ -402,6 +408,7 @@ end local warp_timer = Gui.element{ type = 'progressbar', + name = Gui.unique_static_name, tooltip = {'warp-list.timer-tooltip-zero', config.cooldown_duration}, minimum_value = 0, maximum_value = config.cooldown_duration*config.update_smoothing @@ -626,13 +633,13 @@ end --- Main warp list container for the left flow -- @element warp_list_container warp_list_container = -Gui.element(function(event_trigger, parent) +Gui.element(function(definition, parent) local player = Gui.get_player_from_element(parent) -- Check if user has permission to add warps local allow_add_warp = check_player_permissions(player, 'allow_add_warp') -- Draw the internal container - local container = Gui.container(parent, event_trigger, allow_add_warp and 268 or 220) + local container = Gui.container(parent, definition.name, allow_add_warp and 268 or 220) -- Draw the header local header = Gui.header( @@ -685,6 +692,7 @@ Gui.element(function(event_trigger, parent) -- Return the external container return container.parent end) +:static_name(Gui.unique_static_name) :add_to_left_flow() --- Button on the top flow used to toggle the warp list container diff --git a/utils/gui.lua b/utils/gui.lua index 12bb4806..95985d86 100644 --- a/utils/gui.lua +++ b/utils/gui.lua @@ -13,7 +13,7 @@ Global.register( function Gui.uid_name() local new_element = ExpGui.element() - return new_element.name + return tostring(new_element.uid) end -- Associates data with the LuaGuiElement. If data is nil then removes the data @@ -70,7 +70,7 @@ end local function handler_factory(event_name) return function(element_name, handler) - local element = ExpGui.defines[element_name] + local element = ExpGui.defines[tonumber(element_name)] if not element then return end element[event_name](element, function(_, _,event) handler(event)