Add generic event handlers and anchor

This commit is contained in:
Cooldude2606
2025-01-04 01:54:29 +00:00
parent ce560ca157
commit 8572e156a2

View File

@@ -14,6 +14,12 @@ local ExpElement = {
--- @alias ExpElement.DataCallback fun(def: ExpElement, element: LuaGuiElement?, parent: LuaGuiElement, ...): table? --- @alias ExpElement.DataCallback fun(def: ExpElement, element: LuaGuiElement?, parent: LuaGuiElement, ...): table?
--- @alias ExpElement.OnEventAdder<E> fun(self: ExpElement, handler: fun(def: ExpElement, event: E)): ExpElement --- @alias ExpElement.OnEventAdder<E> fun(self: ExpElement, handler: fun(def: ExpElement, event: E)): ExpElement
--- @class ExpElement.anchor: GuiAnchor
--- @overload fun(anchor: GuiAnchor): ExpElement
--- @class ExpElement.data: ExpGui.GuiData
--- @overload fun(data: table): ExpElement
--- @class ExpElement._debug --- @class ExpElement._debug
--- @field defined_at string --- @field defined_at string
--- @field draw_src table? --- @field draw_src table?
@@ -22,7 +28,8 @@ local ExpElement = {
--- @class ExpElement --- @class ExpElement
--- @field name string --- @field name string
--- @field scope string --- @field scope string
--- @field data ExpGui.GuiData --- @field data ExpElement.data
--- @field anchor ExpElement.anchor?
--- @field _debug ExpElement._debug --- @field _debug ExpElement._debug
--- @field _draw ExpElement.DrawCallback? --- @field _draw ExpElement.DrawCallback?
--- @field _style ExpElement.StyleCallback? --- @field _style ExpElement.StyleCallback?
@@ -41,6 +48,15 @@ ExpElement._metatable = {
__class = "ExpGui", __class = "ExpGui",
} }
ExpElement._anchor_metatable = {
__call = function(self, anchor)
assert(type(table) == "table", "Anchor must be a table")
for k, v in pairs(anchor) do
self[k] = v
end
end
}
--- Register a new instance of a prototype --- Register a new instance of a prototype
--- @param name string --- @param name string
--- @return ExpElement --- @return ExpElement
@@ -52,7 +68,6 @@ function ExpElement.create(name)
local instance = { local instance = {
name = name, name = name,
scope = scope, scope = scope,
data = GuiData.create(scope),
_events = {}, _events = {},
_debug = { _debug = {
defined_at = ExpUtil.safe_file_path(2), defined_at = ExpUtil.safe_file_path(2),
@@ -60,6 +75,8 @@ function ExpElement.create(name)
} }
ExpElement._elements[name] = instance ExpElement._elements[name] = instance
instance.data = GuiData.create(scope, instance)
instance.anchor = setmetatable({}, ExpElement._anchor_metatable)
return setmetatable(instance, ExpElement._metatable) return setmetatable(instance, ExpElement._metatable)
end end
@@ -284,37 +301,22 @@ local e = defines.events
local events = { local events = {
} }
--- Create a function to add event handlers to an element definition --- Handle any gui events
--- @param event_name any --- @param event EventData.on_gui_click
--- @return ExpElement.OnEventAdder<EventData> local function event_handler(event)
local function event_factory(event_name) local element = event.element
--- @param event EventData.on_gui_click if not element or not element.valid then return end
events[event_name] = function(event)
local element = event.element
if not element or not element.valid then return end
local event_tags = element.tags and element.tags["ExpGui"] local event_tags = element.tags and element.tags["ExpGui"]
if not event_tags then return end if not event_tags then return end
--- @cast event_tags string[] --- @cast event_tags string[]
for _, define_name in ipairs(event_tags) do for _, define_name in ipairs(event_tags) do
local define = ExpElement._elements[define_name] local define = ExpElement._elements[define_name]
if define then if define then
define:_raise_event(event) define:_raise_event(event)
end
end end
end end
return function(self, handler)
self._has_handlers = true
local handlers = self._events[event_name]
if not handlers then
handlers = {}
self._events[event_name] = handlers
end
handlers[#handlers + 1] = handler
return self
end
end end
--- Raise all handlers for an event on this definition --- Raise all handlers for an event on this definition
@@ -327,6 +329,30 @@ function ExpElement._prototype:_raise_event(event)
end end
end end
--- Add an event handler
--- @param event defines.events
--- @param handler fun(def: ExpElement, event: EventData)
--- @return ExpElement
function ExpElement._prototype:on_event(event, handler)
events[event] = event_handler
self._has_handlers = true
local handlers = self._events[event] or {}
handlers[#handlers + 1] = handler
self._events[event] = handlers
return self
end
--- Create a function to add event handlers to an element definition
--- @param event defines.events
--- @return ExpElement.OnEventAdder<EventData>
local function event_factory(event)
return function(self, handler)
return self:on_event(event, handler)
end
end
--- Called when LuaGuiElement checked state is changed (related to checkboxes and radio buttons). --- Called when LuaGuiElement checked state is changed (related to checkboxes and radio buttons).
--- @type ExpElement.OnEventAdder<EventData.on_gui_checked_state_changed> --- @type ExpElement.OnEventAdder<EventData.on_gui_checked_state_changed>
ExpElement._prototype.on_checked_state_changed = event_factory(e.on_gui_checked_state_changed) ExpElement._prototype.on_checked_state_changed = event_factory(e.on_gui_checked_state_changed)