Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 40 additions & 9 deletions modules/corelib/util.lua
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,28 @@ function quit()
g_app.quit()
end

function hasValue(object, value)
local ret = object[value] ~= nil
local meta = getmetatable(object)
if meta and meta.__index and type(meta.__index) == 'table' then
ret = object[value] ~= meta.__index[value]
end
return ret
end

function createHandler(object, signal)
return function (...)
local target = object
while type(target) == 'table' and not hasValue(target, signal) do
target = getmetatable(target)
if target then target = target.__index end
end
if type(target) == 'table' then
signalcall(target[signal], ...)
end
end
end

function connect(object, arg1, arg2, arg3)
local signalsAndSlots
local pushFront
Expand All @@ -53,6 +75,10 @@ function connect(object, arg1, arg2, arg3)
end

for signal,slot in pairs(signalsAndSlots) do
if type(slot) ~= 'function' then
perror(debug.traceback('unable to connect a non function value'))
end

if not object[signal] then
local mt = getmetatable(object)
if mt and type(object) == 'userdata' then
Expand All @@ -62,21 +88,26 @@ function connect(object, arg1, arg2, arg3)
end
end

if not object[signal] then
object[signal] = slot
local objectHasValue = hasValue(object, signal)
local addHandler = type(object) == 'table' and (not object[signal] or not objectHasValue or type(object[signal]) ~= 'table')

if not object[signal] or not objectHasValue then
object[signal] = { }
elseif type(object[signal]) == 'function' then
object[signal] = { object[signal] }
end

if type(slot) ~= 'function' then
perror(debug.traceback('unable to connect a non function value'))
if pushFront then
table.insert(object[signal], 1, slot)
else
table.insert(object[signal], #object[signal]+1, slot)
end

if type(object[signal]) == 'table' then
if pushFront then
table.insert(object[signal], 1, slot)
else
table.insert(object[signal], #object[signal]+1, slot)
if addHandler then
local meta = getmetatable(object)
local parent = meta and meta.__index
if type(parent) == 'table' then
table.insert(object[signal], createHandler(parent, signal))
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion modules/game_interface/widgets/uiitem.lua
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ function UIItem:onDestroy()
end

function UIItem:onHoverChange(hovered)
UIWidget.onHoverChange(self, hovered)
signalcall(UIWidget.onHoverChange, self, hovered)

if self:isVirtual() or not self:isDraggable() then return end

Expand Down