From 0db55650240c1bf120849588e979d552a2f03e9b Mon Sep 17 00:00:00 2001 From: badgamernl Date: Mon, 24 Feb 2020 23:35:25 +0100 Subject: [PATCH 1/6] Added ability to chain raise_custom_event --- expcore/gui/prototype.lua | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/expcore/gui/prototype.lua b/expcore/gui/prototype.lua index 75365bd1..21f26033 100644 --- a/expcore/gui/prototype.lua +++ b/expcore/gui/prototype.lua @@ -246,6 +246,7 @@ end --[[-- Raise the handler which is attached to any event; external use should be limited to custom events @tparam table event the event table bassed to the handler, must include fields: name, element +@treturn table the element define so more events can be raised @usage Raising a custom event element_define:raise_custom_event{ @@ -258,20 +259,20 @@ function Gui._prototype_element:raise_custom_event(event) -- Check the element is valid local element = event.element if not element or not element.valid then - return + return self end -- Get the event handler for this element local handler = self[event.name] if not handler then - return + return self end -- Get the player for this event local player_index = event.player_index or element.player_index local player = game.players[player_index] if not player or not player.valid then - return + return self end event.player = player @@ -279,6 +280,7 @@ function Gui._prototype_element:raise_custom_event(event) if not success then error('There as been an error with an event handler for a gui element:\n\t'..err) end + return self end -- This function is used to register a link between element define events and the events in the factorio api From 1273de4e86a2e1b39925d55a360417ddfbc150bc Mon Sep 17 00:00:00 2001 From: badgamernl Date: Mon, 24 Feb 2020 23:43:41 +0100 Subject: [PATCH 2/6] Added custom event on_visibility_changed_by_click Fixed warp flow issue because of this --- expcore/gui/left_flow.lua | 51 ++++++++++++++++++++++++++++++++++++--- expcore/gui/prototype.lua | 7 ++++++ modules/gui/warp-list.lua | 7 +++--- 3 files changed, 59 insertions(+), 6 deletions(-) diff --git a/expcore/gui/left_flow.lua b/expcore/gui/left_flow.lua index e21a10c1..64243932 100644 --- a/expcore/gui/left_flow.lua +++ b/expcore/gui/left_flow.lua @@ -52,7 +52,7 @@ end) ]] function Gui.left_toolbar_button(sprite,tooltip,element_define,authenticator) - return Gui.element{ + local button = Gui.element{ type = 'sprite-button', sprite = sprite, tooltip = tooltip, @@ -62,9 +62,26 @@ function Gui.left_toolbar_button(sprite,tooltip,element_define,authenticator) padding = -2 } :add_to_top_flow(authenticator) - :on_click(function(player,_,_) - Gui.toggle_left_element(player, element_define) + + -- Add on_click handler to handle click events comming from the player + button:on_click(function(player,_,_) + local top_flow = Gui.get_top_flow(player) + local element = top_flow[button.name] + local visibility_state = Gui.toggle_left_element(player, element_define) + + -- Raise custom event that tells listening elements if the element has changed visibility by a player clicking + -- Used in warp gui to handle the keep open logic + button:raise_custom_event{ + name = Gui.events.on_visibility_changed_by_click, + element = element, + state = visibility_state + } end) + + -- Add property to the left flow element with the name of the button + -- This is for the ability to reverse lookup the button from the left flow element + element_define.toolbar_button = button.name + return button end --[[-- Draw all the left elements onto the left flow, internal use only @@ -137,6 +154,34 @@ function Gui.hide_left_flow(player) hide_button.visible = false for name,_ in pairs(Gui.left_elements) do left_flow[name].visible = false + + -- Get the assosiated element define + local element_define = Gui.defines[name] + local top_flow = Gui.get_top_flow(player) + + -- Check if the the element has a button attached + if not element_define.toolbar_button then + goto hide_left_flow_end + end + + -- Check if the topflow contains the button + local button = top_flow[element_define.toolbar_button] + if not button then + goto hide_left_flow_end + end + + -- Get the button define from the reverse lookup on the element + local button_define = Gui.defines[element_define.toolbar_button] + + -- Raise the custom event if all of the top checks have passed + button_define:raise_custom_event{ + name = Gui.events.on_visibility_changed_by_click, + element = button, + state = false + } + + -- Label for the end of the loop + ::hide_left_flow_end:: end end diff --git a/expcore/gui/prototype.lua b/expcore/gui/prototype.lua index 21f26033..aedcf736 100644 --- a/expcore/gui/prototype.lua +++ b/expcore/gui/prototype.lua @@ -350,5 +350,12 @@ Gui._prototype_element.on_text_changed = event_handler_factory(defines.events.on -- @tparam function handler the event handler which will be called Gui._prototype_element.on_value_changed = event_handler_factory(defines.events.on_gui_value_changed) +--- Element Events. +-- @section customEvents +Gui.events = { + -- Triggered when a user changed the visibility of a left flow element by clicking a button + on_visibility_changed_by_click = 'on_visibility_changed_by_click' +} + -- Module return return Gui \ No newline at end of file diff --git a/modules/gui/warp-list.lua b/modules/gui/warp-list.lua index 66626780..7f63395c 100644 --- a/modules/gui/warp-list.lua +++ b/modules/gui/warp-list.lua @@ -439,9 +439,10 @@ end) Gui.left_toolbar_button('item/'..config.default_icon,{'warp-list.main-tooltip',config.standard_proximity_radius},warp_list_container, function(player) return Roles.player_allowed(player,'gui/warp-list') end) -:on_click(function(player,_,_) - local visible_state = Gui.toggle_left_element(player, warp_list_container) - keep_gui_open[player.name] = visible_state +:on_custom_event(Gui.events.on_visibility_changed_by_click, function(player,_,event) + local state = event.state -- true if visible, false if invisible + -- Set gui keep open state for player that clicked the button + keep_gui_open[player.name] = state end) --- When the name of a warp is updated this is triggered From 3aa77227ca9d9ab17d3eef9962c84055e27b1263 Mon Sep 17 00:00:00 2001 From: badgamernl Date: Wed, 26 Feb 2020 00:35:55 +0100 Subject: [PATCH 3/6] Removed goto usage --- expcore/gui/left_flow.lua | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/expcore/gui/left_flow.lua b/expcore/gui/left_flow.lua index 64243932..74003f15 100644 --- a/expcore/gui/left_flow.lua +++ b/expcore/gui/left_flow.lua @@ -160,28 +160,20 @@ function Gui.hide_left_flow(player) local top_flow = Gui.get_top_flow(player) -- Check if the the element has a button attached - if not element_define.toolbar_button then - goto hide_left_flow_end + if element_define.toolbar_button then + -- Check if the topflow contains the button + local button = top_flow[element_define.toolbar_button] + if button then + -- Get the button define from the reverse lookup on the element + local button_define = Gui.defines[element_define.toolbar_button] + -- Raise the custom event if all of the top checks have passed + button_define:raise_custom_event{ + name = Gui.events.on_visibility_changed_by_click, + element = button, + state = false + } + end end - - -- Check if the topflow contains the button - local button = top_flow[element_define.toolbar_button] - if not button then - goto hide_left_flow_end - end - - -- Get the button define from the reverse lookup on the element - local button_define = Gui.defines[element_define.toolbar_button] - - -- Raise the custom event if all of the top checks have passed - button_define:raise_custom_event{ - name = Gui.events.on_visibility_changed_by_click, - element = button, - state = false - } - - -- Label for the end of the loop - ::hide_left_flow_end:: end end From efd9c7b609f64c1d4ae23f090337eb16d2cfa1ec Mon Sep 17 00:00:00 2001 From: badgamernl Date: Wed, 26 Feb 2020 00:41:18 +0100 Subject: [PATCH 4/6] Renamed Gui.event to Gui.custom_event --- expcore/gui/left_flow.lua | 4 ++-- expcore/gui/prototype.lua | 4 ++-- modules/gui/warp-list.lua | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/expcore/gui/left_flow.lua b/expcore/gui/left_flow.lua index 74003f15..255823c5 100644 --- a/expcore/gui/left_flow.lua +++ b/expcore/gui/left_flow.lua @@ -72,7 +72,7 @@ function Gui.left_toolbar_button(sprite,tooltip,element_define,authenticator) -- Raise custom event that tells listening elements if the element has changed visibility by a player clicking -- Used in warp gui to handle the keep open logic button:raise_custom_event{ - name = Gui.events.on_visibility_changed_by_click, + name = Gui.custom_events.on_visibility_changed_by_click, element = element, state = visibility_state } @@ -168,7 +168,7 @@ function Gui.hide_left_flow(player) local button_define = Gui.defines[element_define.toolbar_button] -- Raise the custom event if all of the top checks have passed button_define:raise_custom_event{ - name = Gui.events.on_visibility_changed_by_click, + name = Gui.custom_events.on_visibility_changed_by_click, element = button, state = false } diff --git a/expcore/gui/prototype.lua b/expcore/gui/prototype.lua index aedcf736..6e7e6c5f 100644 --- a/expcore/gui/prototype.lua +++ b/expcore/gui/prototype.lua @@ -350,9 +350,9 @@ Gui._prototype_element.on_text_changed = event_handler_factory(defines.events.on -- @tparam function handler the event handler which will be called Gui._prototype_element.on_value_changed = event_handler_factory(defines.events.on_gui_value_changed) ---- Element Events. +--- Custom element events. -- @section customEvents -Gui.events = { +Gui.custom_event = { -- Triggered when a user changed the visibility of a left flow element by clicking a button on_visibility_changed_by_click = 'on_visibility_changed_by_click' } diff --git a/modules/gui/warp-list.lua b/modules/gui/warp-list.lua index 7f63395c..5e24af6c 100644 --- a/modules/gui/warp-list.lua +++ b/modules/gui/warp-list.lua @@ -439,7 +439,7 @@ end) Gui.left_toolbar_button('item/'..config.default_icon,{'warp-list.main-tooltip',config.standard_proximity_radius},warp_list_container, function(player) return Roles.player_allowed(player,'gui/warp-list') end) -:on_custom_event(Gui.events.on_visibility_changed_by_click, function(player,_,event) +:on_custom_event(Gui.custom_events.on_visibility_changed_by_click, function(player,_,event) local state = event.state -- true if visible, false if invisible -- Set gui keep open state for player that clicked the button keep_gui_open[player.name] = state From 8e9325fc0cf96dac9825a404796ed3d4283f1da6 Mon Sep 17 00:00:00 2001 From: badgamernl Date: Wed, 26 Feb 2020 00:42:33 +0100 Subject: [PATCH 5/6] Changed keep open to be a one liner --- modules/gui/warp-list.lua | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/gui/warp-list.lua b/modules/gui/warp-list.lua index 5e24af6c..b6954687 100644 --- a/modules/gui/warp-list.lua +++ b/modules/gui/warp-list.lua @@ -440,9 +440,8 @@ Gui.left_toolbar_button('item/'..config.default_icon,{'warp-list.main-tooltip',c return Roles.player_allowed(player,'gui/warp-list') end) :on_custom_event(Gui.custom_events.on_visibility_changed_by_click, function(player,_,event) - local state = event.state -- true if visible, false if invisible - -- Set gui keep open state for player that clicked the button - keep_gui_open[player.name] = state + -- Set gui keep open state for player that clicked the button: true if visible, false if invisible + keep_gui_open[player.name] = event.state end) --- When the name of a warp is updated this is triggered From 2d90d1dcdd3071c7820a0083f006e4f5b5e61dde Mon Sep 17 00:00:00 2001 From: badgamernl Date: Wed, 26 Feb 2020 00:49:57 +0100 Subject: [PATCH 6/6] Rerenamed events --- expcore/gui/left_flow.lua | 4 ++-- expcore/gui/prototype.lua | 7 +++---- modules/gui/warp-list.lua | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/expcore/gui/left_flow.lua b/expcore/gui/left_flow.lua index 255823c5..74003f15 100644 --- a/expcore/gui/left_flow.lua +++ b/expcore/gui/left_flow.lua @@ -72,7 +72,7 @@ function Gui.left_toolbar_button(sprite,tooltip,element_define,authenticator) -- Raise custom event that tells listening elements if the element has changed visibility by a player clicking -- Used in warp gui to handle the keep open logic button:raise_custom_event{ - name = Gui.custom_events.on_visibility_changed_by_click, + name = Gui.events.on_visibility_changed_by_click, element = element, state = visibility_state } @@ -168,7 +168,7 @@ function Gui.hide_left_flow(player) local button_define = Gui.defines[element_define.toolbar_button] -- Raise the custom event if all of the top checks have passed button_define:raise_custom_event{ - name = Gui.custom_events.on_visibility_changed_by_click, + name = Gui.events.on_visibility_changed_by_click, element = button, state = false } diff --git a/expcore/gui/prototype.lua b/expcore/gui/prototype.lua index 6e7e6c5f..b307da02 100644 --- a/expcore/gui/prototype.lua +++ b/expcore/gui/prototype.lua @@ -352,10 +352,9 @@ Gui._prototype_element.on_value_changed = event_handler_factory(defines.events.o --- Custom element events. -- @section customEvents -Gui.custom_event = { - -- Triggered when a user changed the visibility of a left flow element by clicking a button - on_visibility_changed_by_click = 'on_visibility_changed_by_click' -} + +-- Triggered when a user changed the visibility of a left flow element by clicking a button +Gui.events.on_visibility_changed_by_click = 'on_visibility_changed_by_click' -- Module return return Gui \ No newline at end of file diff --git a/modules/gui/warp-list.lua b/modules/gui/warp-list.lua index b6954687..595a3ba2 100644 --- a/modules/gui/warp-list.lua +++ b/modules/gui/warp-list.lua @@ -439,7 +439,7 @@ end) Gui.left_toolbar_button('item/'..config.default_icon,{'warp-list.main-tooltip',config.standard_proximity_radius},warp_list_container, function(player) return Roles.player_allowed(player,'gui/warp-list') end) -:on_custom_event(Gui.custom_events.on_visibility_changed_by_click, function(player,_,event) +:on_custom_event(Gui.events.on_visibility_changed_by_click, function(player,_,event) -- Set gui keep open state for player that clicked the button: true if visible, false if invisible keep_gui_open[player.name] = event.state end)