From dbe40d51e23c6ff5385b2ae7accaf997c7a4d04c Mon Sep 17 00:00:00 2001 From: Cooldude2606 Date: Sat, 8 Jun 2019 15:45:40 +0100 Subject: [PATCH] Added auto open for warp gui --- expcore/gui.lua | 3 +- expcore/gui/left.lua | 15 ++++++++-- modules/gui/warp-list.lua | 60 +++++++++++++++++++++++---------------- 3 files changed, 51 insertions(+), 27 deletions(-) diff --git a/expcore/gui.lua b/expcore/gui.lua index 7f38e777..9bfe8171 100644 --- a/expcore/gui.lua +++ b/expcore/gui.lua @@ -213,12 +213,13 @@ Gui.classes.left_frames = LeftFrames LeftFrames._prototype:on_draw(player,frame) --- Use to draw your elements to the new frame LeftFrames._prototype:on_update(player,frame) --- Use to edit your frame when there is no need to redraw it + LeftFrames._prototype:on_player_toggle(player,frame) --- Triggered when the player toggle the left frame LeftFrames._prototype:event_handler(action) --- Creates an event handler that will trigger one of its functions, use with Event.add ]] local CenterFrames = require 'expcore.gui.center' Gui.get_center_flow = CenterFrames.get_flow -Gui.toggle_left_frame = CenterFrames.toggle_frame +Gui.toggle_center_frame = CenterFrames.toggle_frame Gui.draw_center_frame = CenterFrames.draw_frame Gui.redraw_center_frame = CenterFrames.redraw_frames Gui.new_center_frame = CenterFrames.new_frame diff --git a/expcore/gui/left.lua b/expcore/gui/left.lua index 77a03db0..77c67c94 100644 --- a/expcore/gui/left.lua +++ b/expcore/gui/left.lua @@ -45,6 +45,7 @@ LeftFrames._prototype:on_draw(player,frame) --- Use to draw your elements to the new frame LeftFrames._prototype:on_update(player,frame) --- Use to edit your frame when there is no need to redraw it + LeftFrames._prototype:on_player_toggle(player,frame) --- Is triggered when the player presses the toggle button LeftFrames._prototype:event_handler(action) --- Creates an event handler that will trigger one of its functions, use with Event.add ]] local Gui = require 'expcore.gui.core' @@ -58,7 +59,8 @@ local LeftFrames = { frames={}, _prototype=Gui._prototype_factory{ on_draw = Gui._event_factory('on_draw'), - on_update = Gui._event_factory('on_update') + on_update = Gui._event_factory('on_update'), + on_player_toggle = Gui._event_factory('on_player_toggle') } } setmetatable(LeftFrames._prototype, { @@ -138,7 +140,12 @@ function LeftFrames.new_frame(permision_name) mt.__call = self.event_handler self:on_click(function(player,_element) - self:toggle(player) + local visible = self:toggle(player) + + if self.events.on_player_toggle then + local frame = self:get_frame(player) + self.events.on_player_toggle(player,frame,visible) + end end) LeftFrames.frames[self.name] = self @@ -258,6 +265,10 @@ Buttons.new_button() for _,define in pairs(LeftFrames.frames) do local frame = LeftFrames.get_frame(define.name,player) frame.visible = false + + if define.events.on_player_toggle then + define.events.on_player_toggle(player,frame,false) + end end element.visible = false end) diff --git a/modules/gui/warp-list.lua b/modules/gui/warp-list.lua index 8e466e4f..9b766997 100644 --- a/modules/gui/warp-list.lua +++ b/modules/gui/warp-list.lua @@ -12,16 +12,19 @@ local format_time,table_keys,table_values,table_keysort = ext_require('expcore.c local warp_list local warp_name_store = 'gui.left.warps.names' local warp_icon_store = 'gui.left.warps.tags' -local warp_player_in_range_store = 'gui.left.warps.allowed' +local warp_player_in_range_store = 'gui.left.warps.in_range' local warp_details = {} local force_warps = {} +local keep_open = {} Global.register({ warp_details=warp_details, - force_warps=force_warps + force_warps=force_warps, + keep_open=keep_open },function(tbl) force_warps = tbl.force_warps warp_details = tbl.warp_details + keep_open = tbl.keep_open end) --- Returns if a player is allowed to edit the given warp @@ -247,7 +250,9 @@ Gui.new_progressbar() style.color = Colors.light_blue end) :on_store_complete(function(player_name,reset) - Store.set(warp_player_in_range_store,player_name,true) + -- this is to force an update of the button + local in_range = Store.get(warp_player_in_range_store,player_name) + Store.set(warp_player_in_range_store,player_name,in_range) end) --- When the button is clicked it will teleport the player @@ -274,7 +279,9 @@ end) if config.bypass_warp_limits_permision and not Roles.player_allowed(player,config.bypass_warp_limits_permision) then warp_timer:set_store(player.name,0) - Store.set(warp_player_in_range_store,player.name,false) + -- this is to force an update of the buttons + local in_range = Store.get(warp_player_in_range_store,player.name) + Store.set(warp_player_in_range_store,player.name,in_range) end end) @@ -639,6 +646,9 @@ end) generate_warp(player,data_table,warp_id) end end) +:on_player_toggle(function(player,element,visible) + keep_open[player.name] = visible +end) --- When the name of a warp is updated this is triggered Store.register(warp_name_store,function(value,warp_id) @@ -691,6 +701,10 @@ Store.register(warp_player_in_range_store,function(value,player_name) local timer = warp_timer:get_store(player_name) local state = not timer and value + if not keep_open[player.name] then + Gui.toggle_left_frame(warp_list.name,player,value) + end + if force_warps[force.name] then for _,warp_id in pairs(force_warps[force.name]) do local element = table_area['icon-'..warp_id][goto_warp.name] @@ -717,35 +731,33 @@ Event.on_nth_tick(math.floor(60/config.update_smothing),function() end for _,player in pairs(game.connected_players) do - local timer = warp_timer:get_store(player.name) - local role = config.bypass_warp_limits_permision and Roles.player_allowed(player,config.bypass_warp_limits_permision) + local was_in_range = Store.get(warp_player_in_range_store,player.name) + local force = player.force + local warps = force_warps[force.name] - if not timer and not role then - local force = player.force - local warps = force_warps[force.name] - - if warps then - local surface = player.surface.index - local pos = player.position - local px,py = pos.x,pos.y - - for _,warp_id in pairs(warps) do - local warp = warp_details[warp_id] - local wpos = warp.position - if warp.surface.index == surface then - local dx,dy = px-wpos.x,py-wpos.y - if not warp.editing and (dx*dx)+(dy*dy) < rs2 or (dx*dx)+(dy*dy) < r2 then + if warps then + local surface = player.surface.index + local pos = player.position + local px,py = pos.x,pos.y + for _,warp_id in pairs(warps) do + local warp = warp_details[warp_id] + local wpos = warp.position + if warp.surface.index == surface then + local dx,dy = px-wpos.x,py-wpos.y + if not warp.editing and (dx*dx)+(dy*dy) < rs2 or (dx*dx)+(dy*dy) < r2 then + if not was_in_range then Store.set(warp_player_in_range_store,player.name,true) - return end + return end end - + end + if was_in_range then Store.set(warp_player_in_range_store,player.name,false) end - end + end end)