Files
coa-elvui/ElvUI_AddOnSkins/Skins/Utils.lua
T

153 lines
3.5 KiB
Lua

local E, L, V, P, G = unpack(ElvUI)
local AS = E:GetModule("AddOnSkins")
local ipairs = ipairs
local select = select
local floor = math.floor
local EnumerateFrames = EnumerateFrames
local function round(x)
return floor(x + 0.5)
end
function AS:GetObjectChildren(obj, childID, list)
if not obj then return end
if not childID then
childID = obj:GetNumChildren()
elseif childID < 0 then
childID = obj:GetNumChildren() + childID
end
if not list then
return (select(childID, obj:GetChildren()))
else
return select(childID, obj:GetChildren())
end
end
function AS:FindChildFrameByPoint(parent, objType, point1, relativeTo, point2, x, y)
if not parent then return end
local childPoint1, childParent, childPoint2, childX, childY
x = round(x)
y = round(y)
for id, child in ipairs({parent:GetChildren()}) do
if not child:GetName() and (not objType or (objType and child:IsObjectType(objType))) then
childPoint1, childParent, childPoint2, childX, childY = child:GetPoint()
childX = childX and round(childX) or 0
childY = childY and round(childY) or 0
if childPoint1 == point1
and childParent == relativeTo
and (not point2 or (childPoint2 == point2))
and x == childX
and y == childY
then
return child, id
end
end
end
end
function AS:FindChildFrameBySize(parent, objType, width, height)
if not parent then return end
width = round(width)
height = round(height)
for id, child in ipairs({parent:GetChildren()}) do
if not child:GetName() then
if not objType or (objType and child:IsObjectType(objType)) then
if round(child:GetWidth()) == width and round(child:GetHeight()) == width and round(child:GetHeight()) == height then
return child, id
end
end
end
end
end
function AS:FindFrameBySizeChild(childTypes, width, height)
if not childTypes then return end
local singleChild = type(childTypes) == "string"
local obj = EnumerateFrames()
width = round(width)
height = round(height)
while obj do
if obj.IsObjectType and obj:IsObjectType("Frame") and (not (obj:GetName() and obj:GetParent())) then
if round(obj:GetWidth()) == width and round(obj:GetHeight()) == height then
local childs = {}
for _, child in pairs({obj:GetChildren()}) do
childs[#childs + 1] = child:GetObjectType()
end
local matched = 0
for _, cType1 in ipairs(childs) do
if not singleChild then
for _, cType2 in ipairs(childTypes) do
if cType1 == cType2 then
matched = matched + 1
end
end
elseif cType1 == childTypes then
return obj
end
end
if matched == #childTypes then
return obj
end
end
end
obj = EnumerateFrames(obj)
end
end
function AS:FindFrameByPoint(point1, relativeTo, point2, x, y, multipleFrames)
if not relativeTo then return end
local frame
if multipleFrames then
frame = {}
end
local childPoint1, childParent, childPoint2, childX, childY
local obj = EnumerateFrames()
x = round(x)
y = round(y)
while obj do
if obj.IsObjectType and obj:IsObjectType("Frame") and (not (obj:GetName() and obj:GetParent())) then
childPoint1, childParent, childPoint2, childX, childY = obj:GetPoint()
childX = childX and round(childX) or 0
childY = childY and round(childY) or 0
if childPoint1 == point1
and childParent == relativeTo
and (not point2 or (childPoint2 == point2))
and x == childX
and y == childY
then
if multipleFrames then
frame[#frame + 1] = obj
else
frame = obj
break
end
end
end
obj = EnumerateFrames(obj)
end
return frame
end