Update core files

This commit is contained in:
Cooldude2606
2023-10-01 22:40:49 +01:00
parent d82514ccb6
commit 51480e4ca5
4 changed files with 62 additions and 27 deletions

View File

@@ -16,7 +16,8 @@ Gui.element{
type = 'sprite-button',
sprite = 'utility/preset',
style = 'tool_button',
tooltip = {'gui_util.button_tooltip'}
tooltip = {'gui_util.button_tooltip'},
name = Gui.unique_static_name
}
:style{
padding = -2,
@@ -35,7 +36,8 @@ Gui.element{
type = 'sprite-button',
sprite = 'utility/preset',
style = 'tool_button',
tooltip = {'gui_util.button_tooltip'}
tooltip = {'gui_util.button_tooltip'},
name = Gui.unique_static_name
}
:style{
padding = -2,
@@ -54,7 +56,8 @@ Gui.element{
type = 'sprite-button',
sprite = 'utility/close_black',
style = 'tool_button',
tooltip = {'expcore-gui.left-button-tooltip'}
tooltip = {'expcore-gui.left-button-tooltip'},
name = Gui.unique_static_name
}
:style{
padding = -3,
@@ -83,5 +86,4 @@ Event.add(defines.events.on_player_created, function(event)
show_top.visible = false
hide_left.visible = false
Gui.draw_left_flow(player)
end)

View File

@@ -38,6 +38,7 @@ example_flow_with_button:add_to_left_flow(true)
]]
function Gui._prototype_element:add_to_left_flow(open_on_join)
if not self.name then error("Elements for the top flow must have a static name") end
Gui.left_elements[self.name] = open_on_join or false
return self
end

View File

@@ -8,24 +8,31 @@ local Event = require 'utils.event' --- @dep utils.event
local Gui = {
--- The current highest uid that is being used by a define, will not increase during runtime
uid = 0,
--- Used to automatically assign a unique static name to an element
unique_static_name = {},
--- String indexed table used to avoid conflict with custom event names, similar to how defines.events works
events = {},
--- Uid indexed array that stores all the factory functions that were defined, no new values will be added during runtime
defines = {},
--- An string indexed table of all the defines which are used by the core of the gui system, used for internal refrence
--- An string indexed table of all the defines which are used by the core of the gui system, used for internal reference
core_defines = {},
--- Used to store the file names where elements were defined, this can be useful to find the uid of an element, mostly for debuging
--- Used to store the file names where elements were defined, this can be useful to find the uid of an element, mostly for debugging
file_paths = {},
--- Used to store extra infomation about elements as they get defined such as the params used and event handlers registered to them
--- Used to store extra information about elements as they get defined such as the params used and event handlers registered to them
debug_info = {},
--- The prototype used to store the functions of an element define
_prototype_element = {},
--- The prototype metatable applied to new element defines
_mt_element = {
__call = function(self, parent, ...)
local element = self._draw(self.name, parent, ...)
local element = self._draw(self, parent, ...)
if self._style then self._style(element.style, element, ...) end
return element
return self:triggers_events(element)
end,
__index = function(self, key)
if self._draw_data then
return self._draw_data[key]
end
end
}
}
@@ -76,32 +83,35 @@ end)
]]
function Gui.element(element_define)
_C.error_if_runtime()
-- Set the metatable to allow access to register events
local element = setmetatable({}, Gui._mt_element)
-- Increment the uid counter
local uid = Gui.uid + 1
Gui.uid = uid
local name = tostring(uid)
element.name = name
Gui.debug_info[name] = { draw = 'None', style = 'None', events = {} }
element.uid = uid
Gui.debug_info[uid] = { draw = 'None', style = 'None', events = {} }
-- Add the defination function
-- Add the definition function
if type(element_define) == 'table' then
Gui.debug_info[name].draw = element_define
element_define.name = name
Gui.debug_info[uid].draw = element_define
if element_define.name == Gui.unique_static_name then
element_define.name = "ExpGui_"..tostring(uid)
end
element._draw_data = element_define
element._draw = function(_, parent)
return parent.add(element_define)
end
else
Gui.debug_info[name].draw = 'Function'
Gui.debug_info[uid].draw = 'Function'
element._draw = element_define
end
-- Add the define to the base module
local file_path = debug.getinfo(2, 'S').source:match('^.+/currently%-playing/(.+)$'):sub(1, -5)
Gui.file_paths[name] = file_path
Gui.defines[name] = element
Gui.file_paths[uid] = file_path
Gui.defines[uid] = element
-- Return the element so event handers can be accessed
return element
@@ -143,16 +153,16 @@ end)
]]
function Gui._prototype_element:style(style_define)
-- Add the defination function
-- Add the definition function
if type(style_define) == 'table' then
Gui.debug_info[self.name].style = style_define
Gui.debug_info[self.uid].style = style_define
self._style = function(style)
for key, value in pairs(style_define) do
style[key] = value
end
end
else
Gui.debug_info[self.name].style = 'Function'
Gui.debug_info[self.uid].style = 'Function'
self._style = style_define
end
@@ -160,6 +170,21 @@ function Gui._prototype_element:style(style_define)
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
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
end
--[[-- Set the handler which will be called for a custom event, only one handler can be used per event per element
@tparam string event_name the name of the event you want to handler to be called on, often from Gui.events
@tparam function handler the handler that you want to be called when the event is raised
@@ -172,7 +197,7 @@ end)
]]
function Gui._prototype_element:on_custom_event(event_name, handler)
table.insert(Gui.debug_info[self.name].events, event_name)
table.insert(Gui.debug_info[self.uid].events, event_name)
Gui.events[event_name] = event_name
self[event_name] = handler
return self
@@ -222,13 +247,18 @@ 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 element_define = Gui.defines[element.name]
if not element_define then return end
local event_triggers = element.tags.ExpGuiTriggers
if not event_triggers then return end
for _, uid in event_triggers do
local element_define = Gui.defines[uid]
if not element_define then
element_define:raise_custom_event(event)
end
end
end)
return function(self, handler)
table.insert(Gui.debug_info[self.name].events, debug.getinfo(1, "n").name)
table.insert(Gui.debug_info[self.uid].events, debug.getinfo(1, "n").name)
self[event_name] = handler
return self
end

View File

@@ -48,6 +48,7 @@ end)
]]
function Gui._prototype_element:add_to_top_flow(authenticator)
if not self.name then error("Elements for the top flow must have a static name") end
Gui.top_elements[self.name] = authenticator or true
return self
end
@@ -138,7 +139,8 @@ function Gui.toolbar_button(sprite, tooltip, authenticator)
type = 'sprite-button',
sprite = sprite,
tooltip = tooltip,
style = Gui.top_flow_button_style
style = Gui.top_flow_button_style,
name = Gui.unique_static_name
}
:style{
minimal_width = 36,