mirror of
https://github.com/PHIDIAS0303/ExpCluster.git
synced 2025-12-27 11:35:22 +09:00
153 lines
5.5 KiB
Lua
153 lines
5.5 KiB
Lua
--[[
|
|
Explosive Gaming
|
|
|
|
This file can be used with permission but this and the credit below must remain in the file.
|
|
Contact a member of management on our discord to seek permission to use our code.
|
|
Any changes that you may make to the code are yours but that does not make the script yours.
|
|
Discord: https://discord.gg/r6dC2uK
|
|
]]
|
|
|
|
local center = {}
|
|
center._center = {}
|
|
|
|
--- Adds a new obj to the center gui
|
|
-- @usage Gui.center.add{name='foo',caption='Foo',tooltip='Testing',draw=function}
|
|
-- @param obj contains the new object, needs name, fraw is opt and is function(root_frame)
|
|
-- @return the object made, used to add tabs
|
|
function center.add(obj)
|
|
if not is_type(obj,'table') then return end
|
|
if not is_type(obj.name,'string') then return end
|
|
setmetatable(obj,{__index=center._center})
|
|
obj.tabs = {}
|
|
obj._tabs = {}
|
|
Gui._add_data('center',obj.name,obj)
|
|
Gui.toolbar.add(obj.name,obj.caption,obj.tooltip,obj.open)
|
|
return obj
|
|
end
|
|
|
|
-- used to get the center frame of the player, used mainly in script
|
|
function center.get_flow(player)
|
|
local player = Game.get_player(player)
|
|
return player.gui.center.exp_center or player.gui.center.add{name='exp_center',type='flow'}
|
|
end
|
|
|
|
-- used to clear the center frame of the player, used mainly in script
|
|
function center.clear(player)
|
|
local player = Game.get_player(player)
|
|
center.get_flow(player).clear()
|
|
end
|
|
|
|
-- used on the button press when the toolbar button is press, can be overriden
|
|
function center._center.open(event)
|
|
local player = Game.get_player(event)
|
|
local _center = Gui._get_data('center')[event.element.name]
|
|
local center_flow = center.get_flow(player)
|
|
if center_flow[_center.name] then center.clear(player) return end
|
|
local center_frame = center_flow.add{
|
|
name=_center.name,
|
|
type='frame',
|
|
caption=_center.caption,
|
|
direction='vertical',
|
|
style=mod_gui.frame_style
|
|
}
|
|
if player.gui.is_valid_sprite_path(center_frame.caption) then center_frame.caption = '' end
|
|
if is_type(_center.draw,'function') then
|
|
local success, err = pcall(_center.draw,_center,center_frame)
|
|
if not success then error(err) end
|
|
else error('No Callback on center frame '.._center.name)
|
|
end
|
|
player.opened=center_frame
|
|
end
|
|
|
|
-- this is the default draw function if one is not provided
|
|
function center._center:draw(frame)
|
|
Gui.bar(frame,520)
|
|
local tab_bar = frame.add{
|
|
type='frame',
|
|
name='tab_bar',
|
|
direction='vertical'
|
|
}
|
|
local tab_bar_scroll = tab_bar.add{
|
|
type='scroll-pane',
|
|
name='tab_bar_scroll',
|
|
horizontal_scroll_policy='auto-and-reserve-space',
|
|
vertical_scroll_policy='never'
|
|
}
|
|
local tab_bar_scroll_flow = tab_bar_scroll.add{
|
|
type='flow',
|
|
name='tab_bar_scroll_flow',
|
|
direction='horizontal'
|
|
}
|
|
Gui.bar(frame,520)
|
|
local tab = frame.add{
|
|
type ='frame',
|
|
name='tab',
|
|
direction='vertical'
|
|
}
|
|
local tab_scroll = tab.add{
|
|
type ='scroll-pane',
|
|
name='tab_scroll',
|
|
horizontal_scroll_policy='never',
|
|
vertical_scroll_policy='auto'
|
|
}
|
|
Gui.bar(frame,520)
|
|
local first_tab = nil
|
|
for name,button in pairs(self.tabs) do
|
|
first_tab = first_tab or name
|
|
button:draw(tab_bar_scroll_flow).style.font_color = defines.color.white
|
|
end
|
|
self._tabs[self.name..'_'..first_tab](tab_scroll)
|
|
tab_bar_scroll_flow.children[1].style.font_color = defines.color.orange
|
|
tab_scroll.style.height = 300
|
|
tab_scroll.style.width = 500
|
|
tab_bar_scroll.style.minimal_height = 40
|
|
tab_bar_scroll.style.width = 500
|
|
frame.parent.add{type='frame',name='temp'}.destroy()--recenter the GUI
|
|
end
|
|
|
|
--- If deafult draw is used then you can add tabs to the gui with this function
|
|
-- @usage _center:add_tab('foo','Foo','Just a tab',function)
|
|
-- @tparam string name this is the name of the tab
|
|
-- @tparam string caption this is the words that appear on the tab button
|
|
-- @tparam[opt] string tooltip the tooltip that is on the button
|
|
-- @tparam function callback this is called when button is pressed with function(root_frame)
|
|
-- @return self to allow chaining of _center:add_tab
|
|
function center._center:add_tab(name,caption,tooltip,callback)
|
|
self._tabs[self.name..'_'..name] = callback
|
|
self.tabs[name] = Gui.inputs.add{
|
|
type='button',
|
|
name=self.name..'_'..name,
|
|
caption=caption,
|
|
tooltip=tooltip
|
|
}:on_event('click',function(event)
|
|
local tab = event.element.parent.parent.parent.parent.tab.tab_scroll
|
|
tab.clear()
|
|
local frame_name = tab.parent.parent.name
|
|
local _center = Gui._get_data('center')[frame_name]
|
|
local _tab = _center._tabs[event.element.name]
|
|
if is_type(_tab,'function') then
|
|
for _,button in pairs(event.element.parent.children) do
|
|
if button.name == event.element.name then
|
|
button.style.font_color = defines.color.orange
|
|
else
|
|
button.style.font_color = defines.color.white
|
|
end
|
|
end
|
|
local success, err = pcall(_tab,tab)
|
|
if not success then error(err) end
|
|
end
|
|
end)
|
|
return self
|
|
end
|
|
|
|
-- used so that when gui close key is pressed this will close the gui
|
|
Event.register(defines.events.on_gui_closed,function(event)
|
|
if event.element and event.element.valid then event.element.destroy() end
|
|
end)
|
|
|
|
-- when the player rank is changed it closses the center guis
|
|
if defines.events.rank_change then
|
|
Event.register(defines.events.rank_change,center.clear)
|
|
end
|
|
|
|
return center |