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.
bastion/libs/StdUi/StdUiPosition.lua

133 lines
4.2 KiB

--- @type StdUi
local StdUi = LibStub and LibStub('StdUi', true);
if not StdUi then
return
end
local module, version = 'Position', 2;
if not StdUi:UpgradeNeeded(module, version) then return end;
-- Points
local Center = 'CENTER';
local Top = 'TOP';
local Bottom = 'BOTTOM';
local Left = 'LEFT';
local Right = 'RIGHT';
local TopLeft = 'TOPLEFT';
local TopRight = 'TOPRIGHT';
local BottomLeft = 'BOTTOMLEFT';
local BottomRight = 'BOTTOMRIGHT';
StdUi.Anchors = {
Center = Center,
Top = Top,
Bottom = Bottom,
Left = Left,
Right = Right,
TopLeft = TopLeft,
TopRight = TopRight,
BottomLeft = BottomLeft,
BottomRight = BottomRight,
}
--- Glues object below referenced object
function StdUi:GlueBelow(object, referencedObject, x, y, align)
if align == Left then
object:SetPoint(TopLeft, referencedObject, BottomLeft, x, y);
elseif align == Right then
object:SetPoint(TopRight, referencedObject, BottomRight, x, y);
else
object:SetPoint(Top, referencedObject, Bottom, x, y);
end
end
--- Glues object above referenced object
function StdUi:GlueAbove(object, referencedObject, x, y, align)
if align == Left then
object:SetPoint(BottomLeft, referencedObject, TopLeft, x, y);
elseif align == Right then
object:SetPoint(BottomRight, referencedObject, TopRight, x, y);
else
object:SetPoint(Bottom, referencedObject, Top, x, y);
end
end
function StdUi:GlueTop(object, referencedObject, x, y, align)
if align == Left then
object:SetPoint(TopLeft, referencedObject, TopLeft, x, y);
elseif align == Right then
object:SetPoint(TopRight, referencedObject, TopRight, x, y);
else
object:SetPoint(Top, referencedObject, Top, x, y);
end
end
function StdUi:GlueBottom(object, referencedObject, x, y, align)
if align == Left then
object:SetPoint(BottomLeft, referencedObject, BottomLeft, x, y);
elseif align == Right then
object:SetPoint(BottomRight, referencedObject, BottomRight, x, y);
else
object:SetPoint(Bottom, referencedObject, Bottom, x, y);
end
end
function StdUi:GlueRight(object, referencedObject, x, y, inside)
if inside then
object:SetPoint(Right, referencedObject, Right, x, y);
else
object:SetPoint(Left, referencedObject, Right, x, y);
end
end
function StdUi:GlueLeft(object, referencedObject, x, y, inside)
if inside then
object:SetPoint(Left, referencedObject, Left, x, y);
else
object:SetPoint(Right, referencedObject, Left, x, y);
end
end
function StdUi:GlueAfter(object, referencedObject, topX, topY, bottomX, bottomY)
if topX and topY then
object:SetPoint(TopLeft, referencedObject, TopRight, topX, topY);
end
if bottomX and bottomY then
object:SetPoint(BottomLeft, referencedObject, BottomRight, bottomX, bottomY);
end
end
function StdUi:GlueBefore(object, referencedObject, topX, topY, bottomX, bottomY)
if topX and topY then
object:SetPoint(TopRight, referencedObject, TopLeft, topX, topY);
end
if bottomX and bottomY then
object:SetPoint(BottomRight, referencedObject, BottomLeft, bottomX, bottomY);
end
end
-- More advanced positioning functions
function StdUi:GlueAcross(object, referencedObject, topLeftX, topLeftY, bottomRightX, bottomRightY)
object:SetPoint(TopLeft, referencedObject, TopLeft, topLeftX, topLeftY);
object:SetPoint(BottomRight, referencedObject, BottomRight, bottomRightX, bottomRightY);
end
-- Glues object to opposite side of anchor
function StdUi:GlueOpposite(object, referencedObject, x, y, anchor)
if anchor == 'TOP' then object:SetPoint('BOTTOM', referencedObject, anchor, x, y);
elseif anchor == 'BOTTOM' then object:SetPoint('TOP', referencedObject, anchor, x, y);
elseif anchor == 'LEFT' then object:SetPoint('RIGHT', referencedObject, anchor, x, y);
elseif anchor == 'RIGHT' then object:SetPoint('LEFT', referencedObject, anchor, x, y);
elseif anchor == 'TOPLEFT' then object:SetPoint('BOTTOMRIGHT', referencedObject, anchor, x, y);
elseif anchor == 'TOPRIGHT' then object:SetPoint('BOTTOMLEFT', referencedObject, anchor, x, y);
elseif anchor == 'BOTTOMLEFT' then object:SetPoint('TOPRIGHT', referencedObject, anchor, x, y);
elseif anchor == 'BOTTOMRIGHT' then object:SetPoint('TOPLEFT', referencedObject, anchor, x, y);
else object:SetPoint('CENTER', referencedObject, anchor, x, y);
end
end
StdUi:RegisterModule(module, version);