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.
336 lines
12 KiB
336 lines
12 KiB
if not WeakAuras.IsCorrectVersion() then return end
|
|
local AddonName, OptionsPrivate = ...
|
|
|
|
-- Lua APIs
|
|
local tinsert, wipe = table.insert, wipe
|
|
local pairs = pairs
|
|
|
|
local AceGUI = LibStub("AceGUI-3.0")
|
|
|
|
local displayButtons = WeakAuras.displayButtons
|
|
|
|
local importAddonButtons = {}
|
|
local importDisplayButtons = {}
|
|
WeakAuras.importDisplayButtons = importDisplayButtons
|
|
|
|
function OptionsPrivate.CreateImportButtons()
|
|
wipe(importAddonButtons);
|
|
wipe(importDisplayButtons);
|
|
for addonName, addonData in pairs(OptionsPrivate.Private) do
|
|
local addonButton = AceGUI:Create("WeakAurasImportButton");
|
|
importAddonButtons[addonName] = addonButton;
|
|
addonButton:SetTitle(addonData.displayName);
|
|
addonButton:SetIcon(addonData.icon);
|
|
addonButton:SetDescription(addonData.description);
|
|
addonButton:SetClick(function()
|
|
if(addonButton.checkbox:GetChecked()) then
|
|
for id, data in pairs(addonData.displays) do
|
|
if not(data.parent) then
|
|
local childButton = importDisplayButtons[id];
|
|
childButton.checkbox:SetChecked(true);
|
|
WeakAuras.EnableAddonDisplay(id);
|
|
end
|
|
end
|
|
for id, data in pairs(addonData.displays) do
|
|
if(data.parent) then
|
|
local childButton = importDisplayButtons[id];
|
|
childButton.checkbox:SetChecked(true);
|
|
WeakAuras.EnableAddonDisplay(id);
|
|
end
|
|
end
|
|
else
|
|
for id, data in pairs(addonData.displays) do
|
|
if not(data.parent) then
|
|
local childButton = importDisplayButtons[id];
|
|
childButton.checkbox:SetChecked(false);
|
|
WeakAuras.DisableAddonDisplay(id);
|
|
end
|
|
end
|
|
for id, data in pairs(addonData.displays) do
|
|
if(data.parent) then
|
|
local childButton = importDisplayButtons[id];
|
|
childButton.checkbox:SetChecked(false);
|
|
WeakAuras.DisableAddonDisplay(id);
|
|
end
|
|
end
|
|
end
|
|
OptionsPrivate.Private.ResolveCollisions(function()
|
|
for groupId, dataFromAddon in pairs(addonData.displays) do
|
|
if(dataFromAddon.controlledChildren) then
|
|
local data = WeakAuras.GetData(groupId);
|
|
if(data) then
|
|
for index, childId in pairs(data.controlledChildren) do
|
|
local childButton = WeakAuras.GetDisplayButton(childId);
|
|
childButton:SetGroup(groupId, data.regionType == "dynamicgroup");
|
|
childButton:SetGroupOrder(index, #data.controlledChildren);
|
|
end
|
|
|
|
local button = WeakAuras.GetDisplayButton(groupId);
|
|
button.callbacks.UpdateExpandButton();
|
|
WeakAuras.UpdateDisplayButton(data);
|
|
WeakAuras.ClearAndUpdateOptions(data.id);
|
|
end
|
|
end
|
|
end
|
|
|
|
OptionsPrivate.Private.ScanForLoads();
|
|
OptionsPrivate.SortDisplayButtons();
|
|
end);
|
|
end);
|
|
|
|
local function UpdateAddonChecked()
|
|
local shouldBeChecked = true;
|
|
for id, data in pairs(addonData.displays) do
|
|
if not(OptionsPrivate.Private.IsDefinedByAddon(id)) then
|
|
shouldBeChecked = false;
|
|
break;
|
|
end
|
|
end
|
|
addonButton.checkbox:SetChecked(shouldBeChecked);
|
|
end
|
|
|
|
local numAddonDisplays = 0;
|
|
for id, data in pairs(addonData.displays) do
|
|
if(data.controlledChildren) then
|
|
numAddonDisplays = numAddonDisplays + 1;
|
|
local groupButton = AceGUI:Create("WeakAurasImportButton");
|
|
importDisplayButtons[id] = groupButton;
|
|
|
|
groupButton:SetTitle(id);
|
|
groupButton:SetDescription(data.desc);
|
|
|
|
local numGroupDisplays = 0;
|
|
|
|
local function UpdateGroupChecked()
|
|
local shouldBeChecked = true;
|
|
for index, childId in pairs(data.controlledChildren) do
|
|
if not(OptionsPrivate.Private.IsDefinedByAddon(childId)) then
|
|
shouldBeChecked = false;
|
|
break;
|
|
end
|
|
end
|
|
groupButton.checkbox:SetChecked(shouldBeChecked);
|
|
UpdateAddonChecked();
|
|
end
|
|
|
|
for index, childId in pairs(data.controlledChildren) do
|
|
numGroupDisplays = numGroupDisplays + 1;
|
|
numAddonDisplays = numAddonDisplays + 1;
|
|
local childButton = AceGUI:Create("WeakAurasImportButton");
|
|
importDisplayButtons[childId] = childButton;
|
|
|
|
local data = OptionsPrivate.Private[addonName].displays[childId];
|
|
|
|
childButton:SetTitle(childId);
|
|
childButton:SetDescription(data.desc);
|
|
childButton:SetExpandVisible(false);
|
|
childButton:SetLevel(3);
|
|
|
|
childButton:SetClick(function()
|
|
if(childButton.checkbox:GetChecked()) then
|
|
WeakAuras.EnableAddonDisplay(childId);
|
|
else
|
|
WeakAuras.DisableAddonDisplay(childId);
|
|
end
|
|
OptionsPrivate.Private.ResolveCollisions(function()
|
|
OptionsPrivate.Private.ScanForLoads();
|
|
OptionsPrivate.SortDisplayButtons();
|
|
UpdateGroupChecked();
|
|
end);
|
|
end);
|
|
childButton.updateChecked = UpdateGroupChecked;
|
|
childButton.checkbox:SetChecked(OptionsPrivate.Private.IsDefinedByAddon(childId));
|
|
end
|
|
|
|
groupButton:SetClick(function()
|
|
if(groupButton.checkbox:GetChecked()) then
|
|
WeakAuras.EnableAddonDisplay(id);
|
|
for index, childId in pairs(data.controlledChildren) do
|
|
local childButton = importDisplayButtons[childId];
|
|
childButton.checkbox:SetChecked(true);
|
|
WeakAuras.EnableAddonDisplay(childId);
|
|
end
|
|
else
|
|
WeakAuras.DisableAddonDisplay(id);
|
|
for index, childId in pairs(data.controlledChildren) do
|
|
local childButton = importDisplayButtons[childId];
|
|
childButton.checkbox:SetChecked(false);
|
|
WeakAuras.DisableAddonDisplay(childId);
|
|
end
|
|
end
|
|
OptionsPrivate.Private.ResolveCollisions(function()
|
|
local data = WeakAuras.GetData(id);
|
|
if(data) then
|
|
for index, childId in pairs(data.controlledChildren) do
|
|
local childButton = WeakAuras.GetDisplayButton(childId);
|
|
childButton:SetGroup(id, data.regionType == "dynamicgroup");
|
|
childButton:SetGroupOrder(index, #data.controlledChildren);
|
|
end
|
|
|
|
local button = WeakAuras.GetDisplayButton(id);
|
|
button.callbacks.UpdateExpandButton();
|
|
WeakAuras.UpdateDisplayButton(data);
|
|
WeakAuras.ClearAndUpdateOptions(data.id);
|
|
end
|
|
|
|
OptionsPrivate.Private.ScanForLoads();
|
|
OptionsPrivate.SortDisplayButtons();
|
|
UpdateAddonChecked();
|
|
end);
|
|
end);
|
|
groupButton.updateChecked = UpdateAddonChecked;
|
|
groupButton:SetExpandVisible(true);
|
|
if(numGroupDisplays > 0) then
|
|
groupButton:EnableExpand();
|
|
groupButton:SetOnExpandCollapse(WeakAuras.SortImportButtons);
|
|
end
|
|
groupButton:SetLevel(2);
|
|
UpdateGroupChecked();
|
|
elseif not(importDisplayButtons[id]) then
|
|
numAddonDisplays = numAddonDisplays + 1;
|
|
local displayButton = AceGUI:Create("WeakAurasImportButton");
|
|
importDisplayButtons[id] = displayButton;
|
|
|
|
displayButton:SetTitle(id);
|
|
displayButton:SetDescription(data.desc);
|
|
displayButton:SetExpandVisible(false);
|
|
displayButton:SetLevel(2);
|
|
|
|
displayButton:SetClick(function()
|
|
if(displayButton.checkbox:GetChecked()) then
|
|
WeakAuras.EnableAddonDisplay(id);
|
|
else
|
|
WeakAuras.DisableAddonDisplay(id);
|
|
end
|
|
OptionsPrivate.Private.ResolveCollisions(function()
|
|
OptionsPrivate.SortDisplayButtons()
|
|
UpdateAddonChecked();
|
|
end);
|
|
end);
|
|
displayButton.updateChecked = UpdateAddonChecked;
|
|
displayButton.checkbox:SetChecked(OptionsPrivate.Private.IsDefinedByAddon(id));
|
|
end
|
|
end
|
|
|
|
addonButton:SetExpandVisible(true);
|
|
if(numAddonDisplays > 0) then
|
|
addonButton:EnableExpand();
|
|
addonButton:SetOnExpandCollapse(WeakAuras.SortImportButtons);
|
|
end
|
|
addonButton:SetLevel(1);
|
|
UpdateAddonChecked();
|
|
end
|
|
end
|
|
|
|
local container = nil;
|
|
function WeakAuras.SortImportButtons(newContainer)
|
|
container = newContainer or container;
|
|
wipe(container.children);
|
|
local toSort = {};
|
|
for addon, addonData in pairs(OptionsPrivate.Private) do
|
|
container:AddChild(importAddonButtons[addon]);
|
|
wipe(toSort);
|
|
for id, data in pairs(addonData.displays) do
|
|
if not(data.parent) then
|
|
tinsert(toSort, id);
|
|
end
|
|
end
|
|
table.sort(toSort, function(a, b) return a < b end);
|
|
for index, id in ipairs(toSort) do
|
|
if(importAddonButtons[addon]:GetExpanded()) then
|
|
importDisplayButtons[id].frame:Show();
|
|
container:AddChild(importDisplayButtons[id]);
|
|
else
|
|
importDisplayButtons[id].frame:Hide();
|
|
end
|
|
if(addonData.displays[id].controlledChildren) then
|
|
for childIndex, childId in pairs(addonData.displays[id].controlledChildren) do
|
|
if(importAddonButtons[addon]:GetExpanded() and importDisplayButtons[id]:GetExpanded()) then
|
|
importDisplayButtons[childId].frame:Show();
|
|
container:AddChild(importDisplayButtons[childId]);
|
|
else
|
|
importDisplayButtons[childId].frame:Hide();
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
container:DoLayout();
|
|
end
|
|
|
|
function WeakAuras.EnableAddonDisplay(id)
|
|
local db = OptionsPrivate.savedVars.db
|
|
if not(db.registered[id]) then
|
|
local addon, data;
|
|
for addonName, addonData in pairs(OptionsPrivate.Private) do
|
|
if(addonData.displays[id]) then
|
|
addon = addonName;
|
|
data = CopyTable(addonData.displays[id]);
|
|
break;
|
|
end
|
|
end
|
|
|
|
if(db.displays[id]) then
|
|
-- ID collision
|
|
OptionsPrivate.Private.collisions[id] = {addon, data};
|
|
else
|
|
db.registered[id] = addon;
|
|
if(data.controlledChildren) then
|
|
wipe(data.controlledChildren);
|
|
end
|
|
WeakAuras.Add(data);
|
|
OptionsPrivate.Private.SyncParentChildRelationships(true);
|
|
OptionsPrivate.AddDisplayButton(data);
|
|
end
|
|
end
|
|
end
|
|
|
|
-- This function overrides the WeakAuras.CollisionResolved that is defined in WeakAuras.lua,
|
|
-- ensuring that sidebar buttons are created properly after collision resolution
|
|
function WeakAuras.CollisionResolved(addon, data, force)
|
|
WeakAuras.EnableAddonDisplay(data.id);
|
|
end
|
|
|
|
function WeakAuras.DisableAddonDisplay(id)
|
|
local frame = WeakAuras.OptionsFrame()
|
|
local db = OptionsPrivate.savedVars.db
|
|
db.registered[id] = false;
|
|
local data = WeakAuras.GetData(id);
|
|
if(data) then
|
|
local parentData;
|
|
if(data.parent) then
|
|
parentData = db.displays[data.parent];
|
|
end
|
|
|
|
if(data.controlledChildren) then
|
|
for index, childId in pairs(data.controlledChildren) do
|
|
local childButton = displayButtons[childId];
|
|
if(childButton) then
|
|
childButton:SetGroup();
|
|
end
|
|
local childData = db.displays[childId];
|
|
if(childData) then
|
|
childData.parent = nil;
|
|
end
|
|
end
|
|
end
|
|
|
|
WeakAuras.Delete(data);
|
|
OptionsPrivate.Private.SyncParentChildRelationships(true);
|
|
frame.buttonsScroll:DeleteChild(displayButtons[id]);
|
|
displayButtons[id] = nil;
|
|
|
|
if(parentData and parentData.controlledChildren) then
|
|
for index, childId in pairs(parentData.controlledChildren) do
|
|
local childButton = displayButtons[childId];
|
|
if(childButton) then
|
|
childButton:SetGroupOrder(index, #parentData.controlledChildren);
|
|
end
|
|
end
|
|
WeakAuras.Add(parentData);
|
|
WeakAuras.ClearAndUpdateOptions(parentData.id);
|
|
WeakAuras.UpdateDisplayButton(parentData);
|
|
end
|
|
end
|
|
end
|
|
|