|
|
|
|
if not WeakAuras.IsLibsOK() then return end
|
|
|
|
|
---@type string
|
|
|
|
|
local AddonName = ...
|
|
|
|
|
---@class OptionsPrivate
|
|
|
|
|
local OptionsPrivate = select(2, ...)
|
|
|
|
|
|
|
|
|
|
local L = WeakAuras.L;
|
|
|
|
|
|
|
|
|
|
-- Calculate bounding box
|
|
|
|
|
local function getRect(data)
|
|
|
|
|
-- Temp variables
|
|
|
|
|
local blx, bly, trx, try;
|
|
|
|
|
blx, bly = data.xOffset or 0, data.yOffset or 0;
|
|
|
|
|
|
|
|
|
|
if (data.width == nil or data.height == nil or data.regionType == "text") then
|
|
|
|
|
return blx, bly, blx, bly;
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- Calc bounding box
|
|
|
|
|
if(data.selfPoint:find("LEFT")) then
|
|
|
|
|
trx = blx + data.width;
|
|
|
|
|
elseif(data.selfPoint:find("RIGHT")) then
|
|
|
|
|
trx = blx;
|
|
|
|
|
blx = blx - data.width;
|
|
|
|
|
else
|
|
|
|
|
blx = blx - (data.width/2);
|
|
|
|
|
trx = blx + data.width;
|
|
|
|
|
end
|
|
|
|
|
if(data.selfPoint:find("BOTTOM")) then
|
|
|
|
|
try = bly + data.height;
|
|
|
|
|
elseif(data.selfPoint:find("TOP")) then
|
|
|
|
|
try = bly;
|
|
|
|
|
bly = bly - data.height;
|
|
|
|
|
else
|
|
|
|
|
bly = bly - (data.height/2);
|
|
|
|
|
try = bly + data.height;
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- Return data
|
|
|
|
|
return blx, bly, trx, try;
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function getHeight(data, region)
|
|
|
|
|
if data.regionType == "text" then
|
|
|
|
|
return region.height
|
|
|
|
|
else
|
|
|
|
|
return data.height
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local function getWidth(data, region)
|
|
|
|
|
if data.regionType == "text" then
|
|
|
|
|
return region.width
|
|
|
|
|
else
|
|
|
|
|
return data.width
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function createDistributeAlignOptions(id, data)
|
|
|
|
|
return {
|
|
|
|
|
align_h = {
|
|
|
|
|
type = "select",
|
|
|
|
|
width = WeakAuras.normalWidth,
|
|
|
|
|
name = L["Horizontal Align"],
|
|
|
|
|
order = 10,
|
|
|
|
|
values = OptionsPrivate.Private.align_types,
|
|
|
|
|
get = function()
|
|
|
|
|
if(#data.controlledChildren < 1) then
|
|
|
|
|
return nil;
|
|
|
|
|
end
|
|
|
|
|
---@type AnchorPoint?, AnchorPoint?, AnchorPoint?
|
|
|
|
|
local alignedCenter, alignedRight, alignedLeft = "CENTER", "RIGHT", "LEFT";
|
|
|
|
|
for index, childId in pairs(data.controlledChildren) do
|
|
|
|
|
local childData = WeakAuras.GetData(childId);
|
|
|
|
|
if(childData) then
|
|
|
|
|
local left, _, right = getRect(childData);
|
|
|
|
|
local center = (left + right) / 2;
|
|
|
|
|
if(math.abs(right) >= 0.01) then
|
|
|
|
|
alignedRight = nil;
|
|
|
|
|
end
|
|
|
|
|
if(math.abs(left) >= 0.01) then
|
|
|
|
|
alignedLeft = nil;
|
|
|
|
|
end
|
|
|
|
|
if(math.abs(center) >= 0.01) then
|
|
|
|
|
alignedCenter = nil;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return (alignedCenter or alignedRight or alignedLeft);
|
|
|
|
|
end,
|
|
|
|
|
set = function(info, v)
|
|
|
|
|
for index, childId in pairs(data.controlledChildren) do
|
|
|
|
|
local childData = WeakAuras.GetData(childId);
|
|
|
|
|
local childRegion = WeakAuras.GetRegion(childId)
|
|
|
|
|
if(childData and childRegion) then
|
|
|
|
|
if(v == "CENTER") then
|
|
|
|
|
if(childData.selfPoint:find("LEFT")) then
|
|
|
|
|
childData.xOffset = 0 - (getWidth(childData, childRegion) / 2);
|
|
|
|
|
elseif(childData.selfPoint:find("RIGHT")) then
|
|
|
|
|
childData.xOffset = 0 + (getWidth(childData, childRegion) / 2);
|
|
|
|
|
else
|
|
|
|
|
childData.xOffset = 0;
|
|
|
|
|
end
|
|
|
|
|
elseif(v == "LEFT") then
|
|
|
|
|
if(childData.selfPoint:find("LEFT")) then
|
|
|
|
|
childData.xOffset = 0;
|
|
|
|
|
elseif(childData.selfPoint:find("RIGHT")) then
|
|
|
|
|
childData.xOffset = 0 + getWidth(childData, childRegion);
|
|
|
|
|
else
|
|
|
|
|
childData.xOffset = 0 + (getWidth(childData, childRegion) / 2);
|
|
|
|
|
end
|
|
|
|
|
elseif(v == "RIGHT") then
|
|
|
|
|
if(childData.selfPoint:find("LEFT")) then
|
|
|
|
|
childData.xOffset = 0 - getWidth(childData, childRegion);
|
|
|
|
|
elseif(childData.selfPoint:find("RIGHT")) then
|
|
|
|
|
childData.xOffset = 0;
|
|
|
|
|
else
|
|
|
|
|
childData.xOffset = 0 - (getWidth(childData, childRegion) / 2);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
WeakAuras.Add(childData);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
WeakAuras.Add(data);
|
|
|
|
|
OptionsPrivate.ResetMoverSizer();
|
|
|
|
|
end
|
|
|
|
|
},
|
|
|
|
|
align_v = {
|
|
|
|
|
type = "select",
|
|
|
|
|
width = WeakAuras.normalWidth,
|
|
|
|
|
name = L["Vertical Align"],
|
|
|
|
|
order = 15,
|
|
|
|
|
values = OptionsPrivate.Private.rotated_align_types,
|
|
|
|
|
get = function()
|
|
|
|
|
if(#data.controlledChildren < 1) then
|
|
|
|
|
return nil;
|
|
|
|
|
end
|
|
|
|
|
---@type AnchorPoint?, AnchorPoint?, AnchorPoint?
|
|
|
|
|
local alignedCenter, alignedBottom, alignedTop = "CENTER", "RIGHT", "LEFT";
|
|
|
|
|
for index, childId in pairs(data.controlledChildren) do
|
|
|
|
|
local childData = WeakAuras.GetData(childId);
|
|
|
|
|
if(childData) then
|
|
|
|
|
local _, bottom, _, top = getRect(childData);
|
|
|
|
|
local center = (bottom + top) / 2;
|
|
|
|
|
if(math.abs(bottom) >= 0.01) then
|
|
|
|
|
alignedBottom = nil;
|
|
|
|
|
end
|
|
|
|
|
if(math.abs(top) >= 0.01) then
|
|
|
|
|
alignedTop = nil;
|
|
|
|
|
end
|
|
|
|
|
if(math.abs(center) >= 0.01) then
|
|
|
|
|
alignedCenter = nil;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return alignedCenter or alignedBottom or alignedTop;
|
|
|
|
|
end,
|
|
|
|
|
set = function(info, v)
|
|
|
|
|
for index, childId in pairs(data.controlledChildren) do
|
|
|
|
|
local childData = WeakAuras.GetData(childId);
|
|
|
|
|
local childRegion = WeakAuras.GetRegion(childId)
|
|
|
|
|
if(childData and childRegion) then
|
|
|
|
|
if(v == "CENTER") then
|
|
|
|
|
if(childData.selfPoint:find("BOTTOM")) then
|
|
|
|
|
childData.yOffset = 0 - (getHeight(childData, childRegion) / 2);
|
|
|
|
|
elseif(childData.selfPoint:find("TOP")) then
|
|
|
|
|
childData.yOffset = 0 + (getHeight(childData, childRegion) / 2);
|
|
|
|
|
else
|
|
|
|
|
childData.yOffset = 0;
|
|
|
|
|
end
|
|
|
|
|
elseif(v == "RIGHT") then
|
|
|
|
|
if(childData.selfPoint:find("BOTTOM")) then
|
|
|
|
|
childData.yOffset = 0;
|
|
|
|
|
elseif(childData.selfPoint:find("TOP")) then
|
|
|
|
|
childData.yOffset = 0 + getHeight(childData, childRegion);
|
|
|
|
|
else
|
|
|
|
|
childData.yOffset = 0 + (getHeight(childData, childRegion) / 2);
|
|
|
|
|
end
|
|
|
|
|
elseif(v == "LEFT") then
|
|
|
|
|
if(childData.selfPoint:find("BOTTOM")) then
|
|
|
|
|
childData.yOffset = 0 - ( childData.height or childRegion.height);
|
|
|
|
|
elseif(childData.selfPoint:find("TOP")) then
|
|
|
|
|
childData.yOffset = 0;
|
|
|
|
|
else
|
|
|
|
|
childData.yOffset = 0 - (getHeight(childData, childRegion) / 2);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
WeakAuras.Add(childData);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
WeakAuras.Add(data);
|
|
|
|
|
OptionsPrivate.ResetMoverSizer();
|
|
|
|
|
end
|
|
|
|
|
},
|
|
|
|
|
distribute_h = {
|
|
|
|
|
type = "range",
|
|
|
|
|
control = "WeakAurasSpinBox",
|
|
|
|
|
width = WeakAuras.normalWidth,
|
|
|
|
|
name = L["Distribute Horizontally"],
|
|
|
|
|
order = 20,
|
|
|
|
|
softMin = -100,
|
|
|
|
|
softMax = 100,
|
|
|
|
|
bigStep = 1,
|
|
|
|
|
get = function()
|
|
|
|
|
if(#data.controlledChildren < 2) then
|
|
|
|
|
return nil;
|
|
|
|
|
end
|
|
|
|
|
local spaced;
|
|
|
|
|
local previousData;
|
|
|
|
|
for index, childId in pairs(data.controlledChildren) do
|
|
|
|
|
local childData = WeakAuras.GetData(childId);
|
|
|
|
|
if(childData) then
|
|
|
|
|
local left, _, right = getRect(childData);
|
|
|
|
|
if not(previousData) then
|
|
|
|
|
if not(math.abs(left) < 0.01 or math.abs(right) < 0.01) then
|
|
|
|
|
return nil;
|
|
|
|
|
end
|
|
|
|
|
previousData = childData;
|
|
|
|
|
else
|
|
|
|
|
local pleft, _, pright = getRect(previousData);
|
|
|
|
|
if(left - pleft > 0) then
|
|
|
|
|
if not(spaced) then
|
|
|
|
|
spaced = left - pleft;
|
|
|
|
|
else
|
|
|
|
|
if(math.abs(spaced - (left - pleft)) > 0.01) then
|
|
|
|
|
return nil;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
elseif(right - pright < 0) then
|
|
|
|
|
if not(spaced) then
|
|
|
|
|
spaced = right - pright;
|
|
|
|
|
else
|
|
|
|
|
if(math.abs(spaced - (right - pright)) > 0.01) then
|
|
|
|
|
return nil;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
return nil;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
previousData = childData;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return spaced;
|
|
|
|
|
end,
|
|
|
|
|
set = function(info, v)
|
|
|
|
|
local xOffset = 0;
|
|
|
|
|
for index, childId in pairs(data.controlledChildren) do
|
|
|
|
|
local childData = WeakAuras.GetData(childId);
|
|
|
|
|
local childRegion = WeakAuras.GetRegion(childId)
|
|
|
|
|
if(childData and childRegion) then
|
|
|
|
|
if(v > 0) then
|
|
|
|
|
if(childData.selfPoint:find("LEFT")) then
|
|
|
|
|
childData.xOffset = xOffset;
|
|
|
|
|
elseif(childData.selfPoint:find("RIGHT")) then
|
|
|
|
|
childData.xOffset = xOffset + getWidth(childData, childRegion);
|
|
|
|
|
else
|
|
|
|
|
childData.xOffset = xOffset + (getWidth(childData, childRegion) / 2);
|
|
|
|
|
end
|
|
|
|
|
xOffset = xOffset + v;
|
|
|
|
|
elseif(v < 0) then
|
|
|
|
|
if(childData.selfPoint:find("LEFT")) then
|
|
|
|
|
childData.xOffset = xOffset - getWidth(childData, childRegion);
|
|
|
|
|
elseif(childData.selfPoint:find("RIGHT")) then
|
|
|
|
|
childData.xOffset = xOffset;
|
|
|
|
|
else
|
|
|
|
|
childData.xOffset = xOffset - (getWidth(childData, childRegion) / 2);
|
|
|
|
|
end
|
|
|
|
|
xOffset = xOffset + v;
|
|
|
|
|
end
|
|
|
|
|
WeakAuras.Add(childData);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
WeakAuras.Add(data);
|
|
|
|
|
OptionsPrivate.ResetMoverSizer();
|
|
|
|
|
end
|
|
|
|
|
},
|
|
|
|
|
distribute_v = {
|
|
|
|
|
type = "range",
|
|
|
|
|
control = "WeakAurasSpinBox",
|
|
|
|
|
width = WeakAuras.normalWidth,
|
|
|
|
|
name = L["Distribute Vertically"],
|
|
|
|
|
order = 25,
|
|
|
|
|
softMin = -100,
|
|
|
|
|
softMax = 100,
|
|
|
|
|
bigStep = 1,
|
|
|
|
|
get = function()
|
|
|
|
|
if(#data.controlledChildren < 2) then
|
|
|
|
|
return nil;
|
|
|
|
|
end
|
|
|
|
|
local spaced;
|
|
|
|
|
local previousData;
|
|
|
|
|
for index, childId in pairs(data.controlledChildren) do
|
|
|
|
|
local childData = WeakAuras.GetData(childId);
|
|
|
|
|
if(childData) then
|
|
|
|
|
local _, bottom, _, top = getRect(childData);
|
|
|
|
|
if not(previousData) then
|
|
|
|
|
if not(math.abs(bottom) < 0.01 or math.abs(top) < 0.01) then
|
|
|
|
|
return nil;
|
|
|
|
|
end
|
|
|
|
|
previousData = childData;
|
|
|
|
|
else
|
|
|
|
|
local _, pbottom, _, ptop = getRect(previousData);
|
|
|
|
|
if(bottom - pbottom > 0) then
|
|
|
|
|
if not(spaced) then
|
|
|
|
|
spaced = bottom - pbottom;
|
|
|
|
|
else
|
|
|
|
|
if(math.abs(spaced - (bottom - pbottom)) > 0.01) then
|
|
|
|
|
return nil;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
elseif(top - ptop < 0) then
|
|
|
|
|
if not(spaced) then
|
|
|
|
|
spaced = top - ptop;
|
|
|
|
|
else
|
|
|
|
|
if(math.abs(spaced - (top - ptop)) > 0.01) then
|
|
|
|
|
return nil;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
return nil;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
previousData = childData;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return spaced;
|
|
|
|
|
end,
|
|
|
|
|
set = function(info, v)
|
|
|
|
|
local yOffset = 0;
|
|
|
|
|
for index, childId in pairs(data.controlledChildren) do
|
|
|
|
|
local childData = WeakAuras.GetData(childId);
|
|
|
|
|
local childRegion = WeakAuras.GetRegion(childId)
|
|
|
|
|
if(childData and childRegion) then
|
|
|
|
|
if(v > 0) then
|
|
|
|
|
if(childData.selfPoint:find("BOTTOM")) then
|
|
|
|
|
childData.yOffset = yOffset;
|
|
|
|
|
elseif(childData.selfPoint:find("TOP")) then
|
|
|
|
|
childData.yOffset = yOffset + getHeight(childData, childRegion);
|
|
|
|
|
else
|
|
|
|
|
childData.yOffset = yOffset + (getHeight(childData, childRegion) / 2);
|
|
|
|
|
end
|
|
|
|
|
yOffset = yOffset + v;
|
|
|
|
|
elseif(v < 0) then
|
|
|
|
|
if(childData.selfPoint:find("BOTTOM")) then
|
|
|
|
|
childData.yOffset = yOffset - getHeight(childData, childRegion);
|
|
|
|
|
elseif(childData.selfPoint:find("TOP")) then
|
|
|
|
|
childData.yOffset = yOffset;
|
|
|
|
|
else
|
|
|
|
|
childData.yOffset = yOffset - (getHeight(childData, childRegion) / 2);
|
|
|
|
|
end
|
|
|
|
|
yOffset = yOffset + v;
|
|
|
|
|
end
|
|
|
|
|
WeakAuras.Add(childData);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
WeakAuras.Add(data);
|
|
|
|
|
OptionsPrivate.ResetMoverSizer();
|
|
|
|
|
end
|
|
|
|
|
},
|
|
|
|
|
space_h = {
|
|
|
|
|
type = "range",
|
|
|
|
|
control = "WeakAurasSpinBox",
|
|
|
|
|
width = WeakAuras.normalWidth,
|
|
|
|
|
name = L["Space Horizontally"],
|
|
|
|
|
order = 30,
|
|
|
|
|
softMin = -100,
|
|
|
|
|
softMax = 100,
|
|
|
|
|
bigStep = 1,
|
|
|
|
|
get = function()
|
|
|
|
|
if(#data.controlledChildren < 2) then
|
|
|
|
|
return nil;
|
|
|
|
|
end
|
|
|
|
|
local spaced;
|
|
|
|
|
local previousData;
|
|
|
|
|
for index, childId in pairs(data.controlledChildren) do
|
|
|
|
|
local childData = WeakAuras.GetData(childId);
|
|
|
|
|
if(childData) then
|
|
|
|
|
local left, _, right = getRect(childData);
|
|
|
|
|
if not(previousData) then
|
|
|
|
|
if not(math.abs(left) < 0.01 or math.abs(right) < 0.01) then
|
|
|
|
|
return nil;
|
|
|
|
|
end
|
|
|
|
|
previousData = childData;
|
|
|
|
|
else
|
|
|
|
|
local pleft, _, pright = getRect(previousData);
|
|
|
|
|
if(left - pright > 0) then
|
|
|
|
|
if not(spaced) then
|
|
|
|
|
spaced = left - pright;
|
|
|
|
|
else
|
|
|
|
|
if(math.abs(spaced - (left - pright)) > 0.01) then
|
|
|
|
|
return nil;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
elseif(right - pleft < 0) then
|
|
|
|
|
if not(spaced) then
|
|
|
|
|
spaced = right - pleft;
|
|
|
|
|
else
|
|
|
|
|
if(math.abs(spaced - (right - pleft)) > 0.01) then
|
|
|
|
|
return nil;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
return nil;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
previousData = childData;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return spaced;
|
|
|
|
|
end,
|
|
|
|
|
set = function(info, v)
|
|
|
|
|
local xOffset = 0;
|
|
|
|
|
for index, childId in pairs(data.controlledChildren) do
|
|
|
|
|
local childData = WeakAuras.GetData(childId);
|
|
|
|
|
local childRegion = WeakAuras.GetRegion(childId)
|
|
|
|
|
if(childData and childRegion) then
|
|
|
|
|
if(v >= 0) then
|
|
|
|
|
if(childData.selfPoint:find("LEFT")) then
|
|
|
|
|
childData.xOffset = xOffset;
|
|
|
|
|
elseif(childData.selfPoint:find("RIGHT")) then
|
|
|
|
|
childData.xOffset = xOffset + getWidth(childData, childRegion);
|
|
|
|
|
else
|
|
|
|
|
childData.xOffset = xOffset + (getWidth(childData, childRegion) / 2);
|
|
|
|
|
end
|
|
|
|
|
xOffset = xOffset + v + getWidth(childData, childRegion);
|
|
|
|
|
elseif(v < 0) then
|
|
|
|
|
if(childData.selfPoint:find("LEFT")) then
|
|
|
|
|
childData.xOffset = xOffset - getWidth(childData, childRegion);
|
|
|
|
|
elseif(childData.selfPoint:find("RIGHT")) then
|
|
|
|
|
childData.xOffset = xOffset;
|
|
|
|
|
else
|
|
|
|
|
childData.xOffset = xOffset - (getWidth(childData, childRegion) / 2);
|
|
|
|
|
end
|
|
|
|
|
xOffset = xOffset + v - getWidth(childData, childRegion);
|
|
|
|
|
end
|
|
|
|
|
WeakAuras.Add(childData);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
WeakAuras.Add(data);
|
|
|
|
|
OptionsPrivate.ResetMoverSizer();
|
|
|
|
|
end
|
|
|
|
|
},
|
|
|
|
|
space_v = {
|
|
|
|
|
type = "range",
|
|
|
|
|
control = "WeakAurasSpinBox",
|
|
|
|
|
width = WeakAuras.normalWidth,
|
|
|
|
|
name = L["Space Vertically"],
|
|
|
|
|
order = 35,
|
|
|
|
|
softMin = -100,
|
|
|
|
|
softMax = 100,
|
|
|
|
|
bigStep = 1,
|
|
|
|
|
get = function()
|
|
|
|
|
if(#data.controlledChildren < 2) then
|
|
|
|
|
return nil;
|
|
|
|
|
end
|
|
|
|
|
local spaced;
|
|
|
|
|
local previousData;
|
|
|
|
|
for _, childId in pairs(data.controlledChildren) do
|
|
|
|
|
local childData = WeakAuras.GetData(childId);
|
|
|
|
|
if(childData) then
|
|
|
|
|
local _, bottom, _, top = getRect(childData);
|
|
|
|
|
if not(previousData) then
|
|
|
|
|
if not(math.abs(bottom) < 0.01 or math.abs(top) < 0.01) then
|
|
|
|
|
return nil;
|
|
|
|
|
end
|
|
|
|
|
previousData = childData;
|
|
|
|
|
else
|
|
|
|
|
local _, pbottom, _, ptop = getRect(previousData);
|
|
|
|
|
if(bottom - ptop > 0) then
|
|
|
|
|
if not(spaced) then
|
|
|
|
|
spaced = bottom - ptop;
|
|
|
|
|
else
|
|
|
|
|
if(math.abs(spaced - (bottom - ptop)) > 0.01) then
|
|
|
|
|
return nil;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
elseif(top - pbottom < 0) then
|
|
|
|
|
if not(spaced) then
|
|
|
|
|
spaced = top - pbottom;
|
|
|
|
|
else
|
|
|
|
|
if(math.abs(spaced - (top - pbottom)) > 0.01) then
|
|
|
|
|
return nil;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
return nil;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
previousData = childData;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return spaced;
|
|
|
|
|
end,
|
|
|
|
|
set = function(info, v)
|
|
|
|
|
local yOffset = 0;
|
|
|
|
|
for index, childId in pairs(data.controlledChildren) do
|
|
|
|
|
local childData = WeakAuras.GetData(childId);
|
|
|
|
|
local childRegion = WeakAuras.GetRegion(childId)
|
|
|
|
|
if(childData and childRegion) then
|
|
|
|
|
if(v >= 0) then
|
|
|
|
|
if(childData.selfPoint:find("BOTTOM")) then
|
|
|
|
|
childData.yOffset = yOffset;
|
|
|
|
|
elseif(childData.selfPoint:find("TOP")) then
|
|
|
|
|
childData.yOffset = yOffset + getHeight(childData, childRegion);
|
|
|
|
|
else
|
|
|
|
|
childData.yOffset = yOffset + (getHeight(childData, childRegion) / 2);
|
|
|
|
|
end
|
|
|
|
|
yOffset = yOffset + v + getHeight(childData, childRegion);
|
|
|
|
|
elseif(v < 0) then
|
|
|
|
|
if(childData.selfPoint:find("BOTTOM")) then
|
|
|
|
|
childData.yOffset = yOffset - getHeight(childData, childRegion);
|
|
|
|
|
elseif(childData.selfPoint:find("TOP")) then
|
|
|
|
|
childData.yOffset = yOffset;
|
|
|
|
|
else
|
|
|
|
|
childData.yOffset = yOffset - (getHeight(childData, childRegion) / 2);
|
|
|
|
|
end
|
|
|
|
|
yOffset = yOffset + v - getHeight(childData, childRegion);
|
|
|
|
|
end
|
|
|
|
|
WeakAuras.Add(childData);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
WeakAuras.Add(data);
|
|
|
|
|
OptionsPrivate.ResetMoverSizer();
|
|
|
|
|
end
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- Create region options table
|
|
|
|
|
local function createOptions(id, data)
|
|
|
|
|
-- Region options
|
|
|
|
|
local options = {
|
|
|
|
|
__title = L["Group Settings"],
|
|
|
|
|
__order = 1,
|
|
|
|
|
groupIcon = {
|
|
|
|
|
type = "input",
|
|
|
|
|
width = WeakAuras.doubleWidth - 0.15,
|
|
|
|
|
name = L["Group Icon"],
|
|
|
|
|
desc = L["Set Thumbnail Icon"],
|
|
|
|
|
order = 0.50,
|
|
|
|
|
get = function()
|
|
|
|
|
return data.groupIcon and tostring(data.groupIcon) or ""
|
|
|
|
|
end,
|
|
|
|
|
set = function(info, v)
|
|
|
|
|
data.groupIcon = v
|
|
|
|
|
WeakAuras.Add(data)
|
|
|
|
|
WeakAuras.UpdateThumbnail(data)
|
|
|
|
|
end
|
|
|
|
|
},
|
|
|
|
|
chooseIcon = {
|
|
|
|
|
type = "execute",
|
|
|
|
|
width = 0.15,
|
|
|
|
|
name = L["Choose"],
|
|
|
|
|
order = 0.51,
|
|
|
|
|
func = function()
|
|
|
|
|
OptionsPrivate.OpenIconPicker(data, { [data.id] = {"groupIcon"} }, true)
|
|
|
|
|
end,
|
|
|
|
|
imageWidth = 24,
|
|
|
|
|
imageHeight = 24,
|
|
|
|
|
control = "WeakAurasIcon",
|
|
|
|
|
image = "Interface\\AddOns\\WeakAuras\\Media\\Textures\\browse",
|
|
|
|
|
},
|
|
|
|
|
-- Alignment/Distribute options are added below
|
|
|
|
|
scale = {
|
|
|
|
|
type = "range",
|
|
|
|
|
control = "WeakAurasSpinBox",
|
|
|
|
|
width = WeakAuras.normalWidth,
|
|
|
|
|
name = L["Group Scale"],
|
|
|
|
|
order = 45,
|
|
|
|
|
min = 0.05,
|
|
|
|
|
softMax = 2,
|
|
|
|
|
max = 10,
|
|
|
|
|
bigStep = 0.05,
|
|
|
|
|
get = function()
|
|
|
|
|
return data.scale or 1
|
|
|
|
|
end,
|
|
|
|
|
set = function(info, v)
|
|
|
|
|
data.scale = data.scale or 1
|
|
|
|
|
local change = 1 - (v/data.scale)
|
|
|
|
|
data.xOffset = data.xOffset/(1-change)
|
|
|
|
|
data.yOffset = data.yOffset/(1-change)
|
|
|
|
|
data.scale = v
|
|
|
|
|
WeakAuras.Add(data);
|
|
|
|
|
OptionsPrivate.ResetMoverSizer();
|
|
|
|
|
end
|
|
|
|
|
},
|
|
|
|
|
alpha = {
|
|
|
|
|
type = "range",
|
|
|
|
|
control = "WeakAurasSpinBox",
|
|
|
|
|
width = WeakAuras.normalWidth,
|
|
|
|
|
name = L["Group Alpha"],
|
|
|
|
|
order = 46,
|
|
|
|
|
min = 0,
|
|
|
|
|
max = 1,
|
|
|
|
|
bigStep = 0.01,
|
|
|
|
|
isPercent = true
|
|
|
|
|
},
|
|
|
|
|
sharedFrameLevel = {
|
|
|
|
|
type = "toggle",
|
|
|
|
|
width = WeakAuras.normalWidth,
|
|
|
|
|
name = L["Flat Framelevels"],
|
|
|
|
|
desc = L["The group and all direct children will share the same base frame level."],
|
|
|
|
|
order = 47,
|
|
|
|
|
set = function(info, v)
|
|
|
|
|
data.sharedFrameLevel = v
|
|
|
|
|
WeakAuras.Add(data)
|
|
|
|
|
for parent in OptionsPrivate.Private.TraverseParents(data) do
|
|
|
|
|
WeakAuras.Add(parent)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
},
|
|
|
|
|
endHeader = {
|
|
|
|
|
type = "header",
|
|
|
|
|
order = 100,
|
|
|
|
|
name = "",
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
local hasSubGroups = false
|
|
|
|
|
local hasDynamicSubGroup = false
|
|
|
|
|
for index, childId in pairs(data.controlledChildren) do
|
|
|
|
|
local childData = WeakAuras.GetData(childId);
|
|
|
|
|
if childData.controlledChildren then
|
|
|
|
|
hasSubGroups = true
|
|
|
|
|
end
|
|
|
|
|
if childData.regionType == "dynamicgroup" then
|
|
|
|
|
hasDynamicSubGroup = true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if hasSubGroups and hasDynamicSubGroup then
|
|
|
|
|
break
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not hasSubGroups then
|
|
|
|
|
for k, v in pairs(createDistributeAlignOptions(id, data)) do
|
|
|
|
|
options[k] = v
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if not hasDynamicSubGroup then
|
|
|
|
|
for k, v in pairs(OptionsPrivate.commonOptions.BorderOptions(id, data, nil, nil, 70)) do
|
|
|
|
|
options[k] = v
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
group = options,
|
|
|
|
|
position = OptionsPrivate.commonOptions.PositionOptions(id, data, nil, true, true, true),
|
|
|
|
|
};
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function createThumbnail()
|
|
|
|
|
-- frame
|
|
|
|
|
local thumbnail = CreateFrame("Frame", nil, UIParent);
|
|
|
|
|
thumbnail:SetWidth(32);
|
|
|
|
|
thumbnail:SetHeight(32);
|
|
|
|
|
|
|
|
|
|
-- border
|
|
|
|
|
local border = thumbnail:CreateTexture(nil, "OVERLAY");
|
|
|
|
|
border:SetAllPoints(thumbnail);
|
|
|
|
|
border:SetTexture("Interface\\BUTTONS\\UI-Quickslot2.blp");
|
|
|
|
|
border:SetTexCoord(0.2, 0.8, 0.2, 0.8);
|
|
|
|
|
|
|
|
|
|
local icon = thumbnail:CreateTexture(nil, "OVERLAY")
|
|
|
|
|
icon:SetAllPoints(thumbnail)
|
|
|
|
|
thumbnail.icon = icon
|
|
|
|
|
|
|
|
|
|
return thumbnail
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function createDefaultIcon(parent)
|
|
|
|
|
-- default Icon
|
|
|
|
|
local defaultIcon = CreateFrame("Frame", nil, parent);
|
|
|
|
|
parent.defaultIcon = defaultIcon;
|
|
|
|
|
|
|
|
|
|
local t1 = defaultIcon:CreateTexture(nil, "ARTWORK");
|
|
|
|
|
t1:SetWidth(24);
|
|
|
|
|
t1:SetHeight(8);
|
|
|
|
|
t1:SetColorTexture(0.8, 0, 0, 0.5);
|
|
|
|
|
t1:SetPoint("TOP", parent, "TOP", 0, -6);
|
|
|
|
|
local t2 = defaultIcon:CreateTexture(nil, "ARTWORK");
|
|
|
|
|
t2:SetWidth(20);
|
|
|
|
|
t2:SetHeight(20);
|
|
|
|
|
t2:SetColorTexture(0.2, 0.8, 0.2, 0.5);
|
|
|
|
|
t2:SetPoint("TOP", t1, "BOTTOM", 0, 5);
|
|
|
|
|
local t3 = defaultIcon:CreateTexture(nil, "ARTWORK");
|
|
|
|
|
t3:SetWidth(20);
|
|
|
|
|
t3:SetHeight(12);
|
|
|
|
|
t3:SetColorTexture(0.1, 0.25, 1, 0.5);
|
|
|
|
|
t3:SetPoint("TOP", t2, "BOTTOM", -5, 8);
|
|
|
|
|
|
|
|
|
|
return defaultIcon
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- Modify preview thumbnail
|
|
|
|
|
local function modifyThumbnail(parent, frame, data)
|
|
|
|
|
function frame:SetIcon()
|
|
|
|
|
if data.groupIcon then
|
|
|
|
|
local success = OptionsPrivate.Private.SetTextureOrAtlas(frame.icon, data.groupIcon)
|
|
|
|
|
if success then
|
|
|
|
|
if frame.defaultIcon then
|
|
|
|
|
frame.defaultIcon:Hide()
|
|
|
|
|
end
|
|
|
|
|
frame.icon:Show()
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if frame.icon then
|
|
|
|
|
frame.icon:Hide()
|
|
|
|
|
end
|
|
|
|
|
if not frame.defaultIcon then
|
|
|
|
|
frame.defaultIcon = createDefaultIcon(frame)
|
|
|
|
|
end
|
|
|
|
|
frame.defaultIcon:Show()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
frame:SetIcon()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- Create "new region" preview
|
|
|
|
|
local function createIcon()
|
|
|
|
|
local thumbnail = createThumbnail()
|
|
|
|
|
thumbnail.defaultIcon = createDefaultIcon(thumbnail)
|
|
|
|
|
return thumbnail
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- Register new region type options with WeakAuras
|
|
|
|
|
OptionsPrivate.registerRegions = OptionsPrivate.registerRegions or {}
|
|
|
|
|
table.insert(OptionsPrivate.registerRegions, function()
|
|
|
|
|
OptionsPrivate.Private.RegisterRegionOptions("group", createOptions, createIcon, L["Group"], createThumbnail, modifyThumbnail,
|
|
|
|
|
L["Controls the positioning and configuration of multiple displays at the same time"])
|
|
|
|
|
end)
|