File size: 4,008 Bytes
b6a38d7 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
DefineClass.LabelContainer = {
__parents = { "InitDone", "ContinuousEffectContainer" },
labels = false,
label_effects = false,
}
function LabelContainer:Init()
self.labels = {}
self.label_effects = {}
end
function LabelContainer:InitEmptyLabel(label)
self.labels[label] = self.labels[label] or {}
end
function LabelContainer:AddToLabel(label, obj)
if not label then return end
local label_list = self.labels[label]
if label_list then
if table.find(label_list, obj) then return end -- already added
label_list[#label_list + 1] = obj
else
self.labels[label] = { obj }
end
local effects = self.label_effects[label]
for _, effect in pairs(effects or empty_table) do
obj:StartEffect(effect)
end
Msg("AddedToLabel", label, obj)
return true
end
function LabelContainer:RemoveFromLabel(label, obj)
local label_list = self.labels[label]
if label_list and table.remove_entry(label_list, obj) then
local effects = self.label_effects[label]
for _, effect in pairs(effects or empty_table) do
obj:StopEffect(effect.Id)
end
Msg("RemovedFromLabel", label, obj)
return true
end
end
function LabelContainer:ClearLabel(label)
local effects = self.label_effects[label]
for _, obj in ipairs(self.labels[label] or empty_table) do
for _, effect in pairs(effects or empty_table) do
obj:StopEffect(effect.Id)
end
end
self.labels[label] = {}
end
function LabelContainer:IsInLabel(label, obj)
if table.find(self.labels[label], obj) then
return true
end
return false
end
function LabelContainer:AttachEffectToLabel(label, effect, make_permanent)
assert(IsKindOf(effect, "ContinuousEffect"))
make_permanent = make_permanent ~= false
local effects
if make_permanent then
effects = self.label_effects[label] or {}
effects[effect.Id] = effect
end
for _, obj in ipairs(self.labels[label] or empty_table) do
obj:StartEffect(effect) -- this will stop the old effect with the id if it exists
end
if make_permanent then
self.label_effects[label] = effects
end
end
function LabelContainer:DetachEffectFromLabel(label, id)
local effects = self.label_effects[label] or {}
effects[id] = nil
for _, obj in ipairs(self.labels[label] or empty_table) do
obj:StopEffect(id)
end
end
function LabelContainer:ForEachInLabel(label, func, ...)
for _, obj in ipairs(self.labels[label] or empty_table) do
func(obj, ...)
end
end
function LabelContainer:GetFirstInLabel(label, filter, ...)
for _, obj in ipairs(self.labels[label] or empty_table) do
if not filter or filter(obj, ...) then
return obj
end
end
end
function LabelContainer:ResetLabels()
local labels = self.labels
for name, _ in pairs(labels) do
labels[name] = {}
end
end
function LabelContainer:ForEachInLabels(func, ...)
local labels = self.labels
for _, label in pairs(labels) do
for _, obj in ipairs(label) do
func(obj, ...)
end
end
end
----
DefineClass.LabelElement = {
__parents = { "PropertyObject" },
}
function LabelElement:AddToLabels(container)
if not container then return end
self:ForEachLabel(function(label, self, container)
container:AddToLabel(label, self)
end, self, container)
end
function LabelElement:RemoveFromLabels(container)
if not container then return end
self:ForEachLabel(function(label, self, container)
container:RemoveFromLabel(label, self)
end, self, container)
end
local __found = false
local function __CheckLabelName(label, self, name)
__found = __found or name == label
end
function LabelElement:CheckLabelName(name)
__found = false
self:ForEachLabel(__CheckLabelName, self, name)
return __found
end
RecursiveCallMethods.ForEachLabel = "call"
LabelElement.ForEachLabel = empty_func
function AllLabelsComboItems()
local labels = {}
-- collect auto labels
ClassDescendants("LabelElement", function(name, def, labels)
def:ForEachLabel(function(label, labels)
labels[label] = true
end, labels)
end, labels)
-- collect runtime custom labels
Msg("GatherAllLabels", labels)
return table.keys(labels, true)
end |