Files
coa-weakauras/WeakAuras/TSUHelpers.lua
T
2025-04-25 19:28:09 +02:00

150 lines
3.0 KiB
Lua

if not WeakAuras.IsLibsOK() then return end
local AddonName = ...
local Private = select(2, ...)
local function fixMissingFields(state)
if type(state) ~= "table" then return end
-- set show
if state.show == nil then
state.show = true
end
end
local remove = function(states, key)
local changed = false
local state = states[key]
if state then
state.show = false
state.changed = true
states:SetChanged(true)
changed = true
end
return changed
end
local removeAll = function(states)
local changed = false
for _, state in pairs(states) do
state.show = false
state.changed = true
changed = true
end
if changed then
states:SetChanged(true)
end
return changed
end
local skipKeys = {
trigger = true,
triggernum = true
}
local function recurseReplaceOrUpdate(t1, t2, isRoot, replace)
local changed = false
if replace then
-- Remove keys in t1 that are not in t2
for k in pairs(t1) do
if t2[k] == nil then
t1[k] = nil
changed = true
end
end
end
for k, v in pairs(t2) do
if isRoot and skipKeys[k] then
-- skip this key
else
if type(v) == "table" then
if type(t1[k]) ~= "table" then
t1[k] = {}
changed = true
end
if recurseReplaceOrUpdate(t1[k], v, false, replace) then
changed = true
end
else
if t1[k] ~= v then
t1[k] = v
changed = true
end
end
end
end
return changed
end
local replaceOrUpdate = function(states, key, newState, replace)
local changed = false
local state = states[key]
if state then
fixMissingFields(newState)
changed = recurseReplaceOrUpdate(state, newState, true, replace)
if changed then
state.changed = true
states:SetChanged(true)
end
end
return changed
end
local create = function(states, key, newState)
states[key] = newState
states[key].changed = true
states:SetChanged(true)
fixMissingFields(states[key])
return true
end
local createOrUpdate = function(states, key, newState)
key = key or ""
if states[key] then
return replaceOrUpdate(states, key, newState, false)
else
return create(states, key, newState)
end
end
local get = function(states, key, field)
key = key or ""
local state = states[key]
if state then
if field == nil then
return state
end
return state[field] or nil
end
return nil
end
local createOrReplace = function(states, key, newState)
key = key or ""
if states[key] then
return replaceOrUpdate(states, key, newState, true)
else
return create(states, key, newState)
end
end
local changedStates = {}
local isChanged = function(states)
return changedStates[states] == true
end
local setChanged = function(states, changed)
changedStates[states] = changed
end
Private.allstatesMetatable = {
__index = {
Update = createOrUpdate,
Replace = createOrReplace,
Remove = remove,
RemoveAll = removeAll,
Get = get,
IsChanged = isChanged,
SetChanged = setChanged,
}
}