Fixed bugs in left gui

This commit is contained in:
Cooldude2606
2017-12-22 18:03:50 +00:00
parent 57faffd3b4
commit a460af6cc4
2 changed files with 67 additions and 14 deletions

View File

@@ -11,20 +11,51 @@ local left = {}
left._left = {}
--- Used to add a left gui frame
-- @usage Gui.left.add{name='foo',caption='Foo',tooltip='just testing',draw=function}
-- @param obj this is what will be made, needs a name and a draw function(root_frame)
-- @usage Gui.left.add{name='foo',caption='Foo',tooltip='just testing',open_on_join=true,can_open=function,draw=function}
-- @param obj this is what will be made, needs a name and a draw function(root_frame), open_on_join can be used to set the deaful state true/false, can_open is a test to block it from opening but is not needed
-- @return the object that is made to... well idk but for the future
function left.add(obj)
if not is_type(obj,'table') then return end
if not is_type(obj.name,'string') then return end
if not is_type(obj.name,'string') then return end
setmetatable(obj,{__index=left._left})
obj.open_on_join = obj.open_on_join or false
obj.can_open = true
Gui._add_data('left',obj.name,obj)
Gui.toolbar.add(obj.name,obj.caption,obj.tooltip,obj.toggle)
return obj
end
--- This is used to update all the guis of conected players, good idea to use our thread system as it as nested for loops
-- @usage Gui.left.update()
-- @tparam string frame this is the name of a frame if you only want to update one
function left.update(frame)
if not Server or not Server._thread then
for _,player in pairs(game.connected_players) do
local frames = Gui._get_data('left') or {}
if frame then frames = {[frame]=frames[frame]} or {} end
for name,left in pairs(frames) do
local fake_event = {player_index=player.index,element={name=name}}
left.open(fake_event)
end
end
else
local frames = Gui._get_data('left') or {}
if frame then frames = {[frame]=frames[frame]} or {} end
Server.new_thread{
data={players=game.connected_players,frames=frames}
}:on_event('tick',function(thread)
if #thread.data.players == 0 then thread:close() return end
local player = table.remove(thread.data.players,1)
Server.new_thread{
data={player=player,frames=thread.data.frames}
}:on_event('resolve',function(thread)
for name,left in pairs(thread.data.frames) do
local fake_event = {player_index=thread.data.player.index,element={name=name}}
left.open(fake_event)
end
end):queue()
end):open()
end
end
--- Used to open the left gui of every player
-- @usage Gui.left.open('foo')
-- @tparam string left_name this is the gui that you want to open
@@ -75,11 +106,15 @@ function left._left.open(event)
local _left = Gui._get_data('left')[event.element.name]
local left_flow = mod_gui.get_frame_flow(player)
local frame = nil
if left_flow[_left.name] then frame = left_flow[_left.name] frame.clear()
else frame = left_flow.add{type='frame',name=_left.name,style=mod_gui.frame_style,caption=_left.caption} end
frame.style.visible = true
if is_type(_left.open_on_join,'boolean') then frame.style.visible = _left.open_on_join end
if is_type(_left.draw,'function') then _left:draw(frame) else frame.style.visible = false error('No Callback On '.._left.name) end
if left_flow[_left.name] then
frame = left_flow[_left.name]
frame.clear()
else
frame = left_flow.add{type='frame',name=_left.name,style=mod_gui.frame_style,caption=_left.caption,direction='vertical'}
frame.style.visible = false
if is_type(_left.open_on_join,'boolean') then frame.style.visible = _left.open_on_join end
end
if is_type(_left.draw,'function') then _left.draw(frame) else frame.style.visible = false error('No Callback On '.._left.name) end
end
-- this is called when the toolbar button is pressed
@@ -94,14 +129,17 @@ function left._left.toggle(event)
local success, err = pcall(_left.can_open,player)
if not success then error(err)
elseif err == true then open = true end
elseif is_type(_left.can_open,'boolean') then
open = _left.can_open
else
if is_type(Ranking,'table') and Ranking._presets and Ranking._presets().meta.rank_count > 0 then
if Ranking.get_rank(player):allowed(_left.name) then open = true end
end
end
if open and left.style.visible ~= true then
left.style.visible = true
else
left.style.visible = false
end
if not open then player_return('You can not open this panel right now',defines.text_color.crit,player) player.play_sound{path='utility/cannot_build'} end
end
-- draws the left guis when a player first joins, fake_event is just because i am lazy
@@ -112,4 +150,6 @@ Event.register(defines.events.on_player_joined_game,function(event)
local fake_event = {player_index=player.index,element={name=name}}
left.open(fake_event)
end
end)
end)
return left

View File

@@ -94,7 +94,7 @@ local function test_gui(event)
if not game.player and not event.player_index then return end
local player = game.player or Game.get_player(event)
if player.gui.top['gui-test'] then player.gui.top['gui-test'].destroy() end
local frame = player.gui.top.add{type='frame',name='gui-test'}
local frame = mod_gui.get_frame_flow(player).add{type='frame',name='gui-test',direction='vertical'}
gui_tset_close:draw(frame)
caption_test:draw(frame)
sprite_test:draw(frame)
@@ -124,6 +124,19 @@ end):add_tab('tab-2','Tab 2','Just a tab',function(frame)
end
end)
-- testing the left gui, open_test_on_all_left_guis is realy long just so it is very unlickly to be used
Gui.left.add{
name='test-left',
caption='Gui Left',
tooltip='just testing',
draw=function(frame)
for _,player in pairs(game.connected_players) do
frame.add{type='label',caption=player.name}
end
end,
can_open=function(player) return player.index == 1 or global.open_test_on_all_left_guis end
}
return test_gui