mirror of
https://github.com/PHIDIAS0303/ExpCluster.git
synced 2025-12-27 11:35:22 +09:00
Add generic event handlers and anchor
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user