|
|
|
|
|
|
|
|
|
DefineClass.XContextWindow = { |
|
__parents = { "XWindow" }, |
|
properties = { |
|
{ category = "Interaction", id = "ContextUpdateOnOpen", editor = "bool", default = false, }, |
|
{ category = "Interaction", id = "OnContextUpdate", editor = "func", params = "self, context, ...", }, |
|
}, |
|
context = false, |
|
} |
|
|
|
function XContextWindow:Init(parent, context) |
|
if context then |
|
self:SetContext(context, false) |
|
end |
|
end |
|
|
|
function XContextWindow:Done() |
|
self:SetContext(nil, false) |
|
end |
|
|
|
function XContextWindow:Open(...) |
|
XWindow.Open(self, ...) |
|
if self.ContextUpdateOnOpen then |
|
procall(self.OnContextUpdate, self, self.context, "open") |
|
end |
|
end |
|
|
|
function XContextWindow:OnContextUpdate(context, ...) |
|
end |
|
|
|
function XContextWindow:GetContext() |
|
return self.context |
|
end |
|
|
|
function XContextWindow:GetParentContext() |
|
local parent = self.parent |
|
if parent then |
|
return parent:GetContext() |
|
end |
|
end |
|
|
|
function XContextWindow:SetContext(context, update) |
|
if self.context == (context or false) and not update then return end |
|
ForEachObjInContext(self.context, function (obj, self) |
|
local windows = ObjToWindows[obj] |
|
if windows then |
|
table.remove_entry(windows, self) |
|
if #windows == 0 then |
|
ObjToWindows[obj] = nil |
|
end |
|
end |
|
end, self) |
|
self.context = context |
|
ForEachObjInContext(context, function (obj, self) |
|
local windows = ObjToWindows[obj] |
|
if windows then |
|
windows[#windows + 1] = self |
|
else |
|
ObjToWindows[obj] = { self } |
|
end |
|
end, self) |
|
if update ~= false then |
|
procall(self.OnContextUpdate, self, context, update or "set") |
|
end |
|
end |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if FirstLoad then |
|
ObjToWindows = setmetatable({}, weak_keys_meta) |
|
XContextUpdateLogging = false |
|
end |
|
|
|
function XContextUpdate(context, ...) |
|
if not context then return end |
|
for _, window in ipairs(ObjToWindows[context] or empty_table) do |
|
if XContextUpdateLogging then |
|
print("ContextUpdate:", FormatWindowPath(window)) |
|
end |
|
procall(window.OnContextUpdate, window, window.context, ...) |
|
end |
|
end |
|
|
|
function OnMsg.ObjModified(obj) |
|
XContextUpdate(obj, "modified") |
|
end |
|
|
|
|