You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

208 lines
5.8 KiB

-- ========================================================================= --
-- SylingTracker --
-- https://www.curseforge.com/wow/addons/sylingtracker --
-- --
-- Repository: --
-- https://github.com/Skamer/SylingTracker --
-- --
-- ========================================================================= --
Syling "SylingTracker.Utils" ""
-- ========================================================================= --
namespace "SLT"
-- ========================================================================= --
GetBuildInfo = GetBuildInfo
clone = System.Toolset.clone
class "Utils" (function(_ENV)
__Static__() function IsOnShadowlands()
local _, _, _, interfaceVersion = GetBuildInfo()
if interfaceVersion >= 90000 then
return true
end
return false
end
__Static__() function MergeTable(t1, t2)
for k, v in pairs(t2) do
if (type(v) == "table") and (type(t1[k] or false) == "table") then
MergeTable(t1[k], t2[k])
else
t1[k] = v
end
end
return t1
end
-- __Static__() function ResetStyles(frame)
-- for name, v in Style.GetCustomStyles(frame) do
-- print("ResetStyles", name, v)
-- Style[frame][name] = nil
-- end
-- end
__Static__() function ClearStyles(frame, stylesToClear)
if not stylesToClear then
return
end
for k in pairs(stylesToClear) do
Style[frame][k] = CLEAR
end
end
__Static__() function ClearChildStyles(parent, child, stylesToClear)
if not stylesToClear then
return
end
for uiProp in pairs(stylesToClear) do
Style[frame][childProperty][uiProp] = CLEAR
end
end
__Arguments__ { Frame }
__Static__() function IsUsedAsBackdrop(frame)
local prop = value:GetChildPropertyName()
if prop and prop:match("^backdrop") then
return true
end
return false
end
__Iterator__()
__Static__() function IterateFrameChildren(frame, includeHidden)
local yield = coroutine.yield
for childName, child in frame:GetChilds() do
local prop = child:GetChildPropertyName()
if not (prop and prop:match("^backdrop")) then
if child:IsShown() or (not child:IsShown() and includeHidden) then
yield(childName, child)
end
end
end
end
__Static__() function ResetStyles(frame, applyToChildren, log)
if applyToChildren then
for _, child in IterateFrameChildren(frame) do
ResetStyles(child, applyToChildren)
end
end
for name, v in Style.GetCustomStyles(frame) do
if log then
print("Reset Props:", name, "With previous value", v)
end
Style[frame][name] = nil
end
end
__Arguments__{ Frame }
__Static__() function IterateChildren(frame)
return frame:GetChilds():Filter(function(key, value)
-- local prop = value:GetChildPropertyName()
-- if prop and prop:match("^backdrop") then
-- return false
-- end
return true
end):GetIterator()
end
__Static__() function DeepCopy(t)
return clone(t, true)
end
__Static__() function ShalowCopy(t)
return clone(t, false)
end
class "Instance" (function(_ENV)
__Static__() function GetCurrentInstance()
local mapID = C_Map.GetBestMapForUnit("player")
if mapID then
return EJ_GetInstanceForMap(mapID)
end
end
end)
end)
class "DiffMap" (function(_ENV)
-----------------------------------------------------------------------------
-- Methods --
-----------------------------------------------------------------------------
__Arguments__ { String + Number, Variable.Optional() }
function SetValue(self, key, value)
self.values[key] = value
end
__Arguments__ { DiffMap, Variable.Optional(Boolean)}
function Diff(self, other, ignoreTable)
-- Get a complete keys list to iterate
local keys = {}
-- Start with the self object
for index, key in self.values.Keys:ToList():GetIterator() do
keys[key] = true
end
-- Then with the other object
for index, key in other.values.Keys:ToList():GetIterator() do
keys[key] = true
end
local changes = {}
-- Check if there is changes
for key in pairs(keys) do
local valueA = self.values[key]
local valueB = other.values[key]
local valueChanged = true
if valueA == nil and valueB == nil then
valueChanged = false
elseif valueA ~= nil and valueB ~= nil then
local typeA = type(valueA)
local typeB = type(valueB)
if typeA == typeB then
if not ignoreTable and typeA == "table" then
if API:IsTableEqual(valueA, valueB, true) then
valueChanged = false
end
elseif typeA == "string" or typeA == "number" or typeA == "boolean" then
if valueA == valueB then
valueChanged = false
end
end
end
end
if valueChanged then
tinsert(changes, key)
end
end
-- Return changes
return changes
end
------------------------------------------------------------------------------
-- Constructors --
------------------------------------------------------------------------------
function DiffMap(self)
self.values = Dictionary()
end
end)