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.

290 lines
8.5 KiB

local _;
local _G = _G;
local pairs = pairs;
local VUHDO_BUFF_PANEL_BASE_HEIGHT;
local VUHDO_BUFF_PANEL_BASE_WIDTH;
local VUHDO_IN_PANEL_HEIGHT;
local VUHDO_PANEL_OFFSET_Y;
local VUHDO_PANEL_OFFSET_X;
local VUHDO_PANEL_WIDTH = 0;
local VUHDO_PANEL_HEIGHT = 0;
local VUHDO_BUFF_PANEL_GAP_X = 4;
local VUHDO_BUFF_PANEL_GAP_TOP = 4;
--
local function VUHDO_addBuffSwatch(aBuffPanel, aGroupName, aBuffInfo, aBuffTarget, aCategSpec)
if not aBuffInfo then return nil; end
local tBuffName = aBuffInfo[1];
local tPostfix = tBuffName .. aBuffInfo[2] .. (aBuffTarget or "");
local tSwatch = VUHDO_getOrCreateBuffSwatch("VuhDoBuffSwatch_" .. tPostfix, aBuffPanel);
tSwatch:SetAttribute("buff", aBuffInfo);
tSwatch:SetAttribute("target", aBuffTarget);
tSwatch:SetAttribute("buffname", aCategSpec);
_G[tSwatch:GetName() .. "GroupLabelLabel"]:SetText(aGroupName);
tSwatch:SetPoint("TOPLEFT", aBuffPanel:GetName(), "TOPLEFT", VUHDO_BUFF_PANEL_BASE_WIDTH, -VUHDO_BUFF_PANEL_BASE_HEIGHT);
tSwatch:SetBackdropBorderColor(VUHDO_backColor(VUHDO_BUFF_SETTINGS["CONFIG"]["SWATCH_BORDER_COLOR"]));
tSwatch:Show();
local tButton = _G[tSwatch:GetName() .. "GlassButton"];
if not tButton:GetAttribute("unit") then
VUHDO_setupAllBuffButtonsTo(tButton, tBuffName, "player", aBuffInfo[2]);
end
VUHDO_IN_PANEL_HEIGHT = VUHDO_BUFF_PANEL_BASE_HEIGHT + tSwatch:GetHeight();
VUHDO_updateBuffSwatch(tSwatch);
local tIsSingle = VUHDO_isUseSingleBuff(tSwatch);
if tIsSingle ~= 2 then
if tIsSingle then
VUHDO_setupAllBuffButtonsTo(tButton, tBuffName, tSwatch:GetAttribute("lowtarget"), aBuffInfo[2]);
else
VUHDO_setupAllBuffButtonUnits(tButton, tSwatch:GetAttribute("goodtarget"));
end
end
return tSwatch;
end
--
function VUHDO_getBuffInfoForName(aBuffName, aCategoryName)
for _, tBuffInfo in pairs(VUHDO_getPlayerClassBuffs()[aCategoryName]) do
if aBuffName == tBuffInfo[1] then
return tBuffInfo;
end
end
return nil;
end
--
local function VUHDO_getFirstBuffCategoryVariant(aCategorySpec)
local tFirstVariant = nil;
for _, tFirstVariant in pairs(VUHDO_getPlayerClassBuffs()[aCategorySpec]) do
if VUHDO_BUFFS[tFirstVariant[1]] ~= nil then
return tFirstVariant;
end
end
return nil;
end
--
local function VUHDO_addBuffPanel(aCategorySpec)
local tCategName = aCategorySpec;
local tSettings = VUHDO_BUFF_SETTINGS[tCategName];
local tBuffPanel, tSwatch;
local tIcon;
local tTargetType;
local tIconFrame;
local tTexture;
local tLabelText;
local tFirstVariant = VUHDO_getFirstBuffCategoryVariant(aCategorySpec);
-- Happens on emergency login
if not tFirstVariant or not VUHDO_BUFFS[tFirstVariant[1]] then
return nil;
end
tTargetType = tFirstVariant[2];
tLabelText = VUHDO_BUFF_SETTINGS[tCategName]["buff"] or tFirstVariant[1];
tBuffPanel = VUHDO_getOrCreateBuffPanel("VuhDoBuffPanel" .. tLabelText .. tTargetType);
if VUHDO_BUFF_SETTINGS["CONFIG"]["COMPACT"] then
VUHDO_BUFF_PANEL_BASE_WIDTH = 24;
VUHDO_BUFF_PANEL_BASE_HEIGHT = 0;
else
VUHDO_BUFF_PANEL_BASE_WIDTH = 0;
VUHDO_BUFF_PANEL_BASE_HEIGHT = 30;
end
tIcon = (VUHDO_BUFFS[tLabelText] ~= nil and VUHDO_BUFFS[tLabelText]["icon"] ~= nil)
and VUHDO_BUFFS[tLabelText]["icon"] or VUHDO_BUFFS[tFirstVariant[1]]["icon"];
if not tIcon then return nil; end
local tLabel = _G[tBuffPanel:GetName() .. "BuffNameLabelLabel"];
tLabel:SetText(tLabelText);
tLabel:SetShown(VUHDO_BUFF_SETTINGS["CONFIG"]["SHOW_LABEL"] and not VUHDO_BUFF_SETTINGS["CONFIG"]["COMPACT"]);
tIconFrame = _G[tBuffPanel:GetName() .. "IconTexture"];
tTexture = _G[tIconFrame:GetName() .. "Texture"];
tTexture:SetTexture(tIcon);
local tGap = VUHDO_BUFF_SETTINGS["CONFIG"]["COMPACT"] and 0 or 3
tIconFrame:SetPoint("TOPLEFT", tBuffPanel:GetName(), "TOPLEFT" , tGap, -tGap);
if VUHDO_LibButtonFacade then
VUHDO_LibButtonFacade:Group("VuhDo", VUHDO_I18N_BUFF_WATCH):AddButton(tIconFrame, { ["Icon"] = tTexture });
end
VUHDO_IN_PANEL_HEIGHT = 0;
tSwatch = nil;
if VUHDO_BUFF_TARGET_UNIQUE == tTargetType then
if not tSettings["name"] then tSettings["name"] = VUHDO_PLAYER_NAME; end
tSwatch = VUHDO_addBuffSwatch(tBuffPanel, tSettings["name"], tFirstVariant, "N" .. tSettings["name"], aCategorySpec);
else
local tVariants = VUHDO_getBuffInfoForName(tSettings["buff"], aCategorySpec) or VUHDO_getBuffInfoForName(tFirstVariant[1], aCategorySpec);
if tVariants then
tSwatch = VUHDO_addBuffSwatch(tBuffPanel, VUHDO_I18N_PLAYER, tVariants, "S", aCategorySpec);
end
end
if tSwatch then
tBuffPanel:SetPoint("TOPLEFT", "VuhDoBuffWatchMainFrame", "TOPLEFT", VUHDO_PANEL_OFFSET_X, -VUHDO_PANEL_OFFSET_Y);
tBuffPanel:SetWidth(tSwatch:GetWidth() + VUHDO_BUFF_PANEL_BASE_WIDTH);
tBuffPanel:SetHeight(VUHDO_IN_PANEL_HEIGHT);
_G[tBuffPanel:GetName() .. "BuffNameLabel"]:SetWidth(tBuffPanel:GetWidth() - 30);
tBuffPanel:Show();
end
return tBuffPanel;
end
--
local function VUHDO_addAllBuffPanels()
local tBuffPanel;
local tColPanels;
VUHDO_PANEL_OFFSET_Y = VUHDO_BUFF_PANEL_GAP_TOP;
VUHDO_PANEL_OFFSET_X = VUHDO_BUFF_PANEL_GAP_X;
VUHDO_PANEL_HEIGHT = VUHDO_BUFF_PANEL_GAP_TOP;
VUHDO_PANEL_WIDTH = VUHDO_BUFF_PANEL_GAP_X;
VUHDO_IN_GRID_MAX_X = 0;
tColPanels = 0;
local tIndex = 0;
for _, _ in pairs(VUHDO_getPlayerClassBuffs()) do
for tCategName, _ in pairs(VUHDO_getPlayerClassBuffs()) do
if VUHDO_BUFF_ORDER[tCategName] == tIndex + 1 then
tIndex = tIndex + 1;
if (VUHDO_BUFF_SETTINGS[tCategName] or { })["enabled"] then
tBuffPanel = VUHDO_addBuffPanel(tCategName);
if tBuffPanel then
tColPanels = tColPanels + 1;
VUHDO_PANEL_OFFSET_Y = VUHDO_PANEL_OFFSET_Y + VUHDO_IN_PANEL_HEIGHT;
if VUHDO_PANEL_OFFSET_Y > VUHDO_PANEL_HEIGHT then
VUHDO_PANEL_HEIGHT = VUHDO_PANEL_OFFSET_Y;
end
if VUHDO_PANEL_OFFSET_X > VUHDO_PANEL_WIDTH then
VUHDO_PANEL_WIDTH = VUHDO_PANEL_OFFSET_X;
end
if tColPanels >= VUHDO_BUFF_SETTINGS["CONFIG"]["PANEL_MAX_BUFFS"] then
VUHDO_PANEL_OFFSET_Y = VUHDO_BUFF_PANEL_GAP_TOP;
VUHDO_PANEL_OFFSET_X = VUHDO_PANEL_OFFSET_X + tBuffPanel:GetWidth();
VUHDO_IN_GRID_MAX_X = 0;
tColPanels = 0;
end
end
end
end
end
end
if tBuffPanel then
VUHDO_PANEL_WIDTH = VUHDO_PANEL_WIDTH + tBuffPanel:GetWidth();
end
end
--
local sIsForceHide = false;
function VUHDO_setBuffWatchForceHide(anIsForce)
sIsForceHide = anIsForce;
end
--
local sIsOutOfCombat = false;
function VUHDO_getIsOutOfCombat()
return sIsOutOfCombat;
end
function VUHDO_setIsOutOfCombat(anIsEnded)
sIsOutOfCombat = anIsEnded;
if VuhDoBuffWatchMainFrame and sIsOutOfCombat and VUHDO_BUFF_SETTINGS["CONFIG"]["HIDE_OUT_OF_COMBAT"] then
VuhDoBuffWatchMainFrame:Hide();
else
VUHDO_reloadBuffPanel();
end
end
--
function VUHDO_reloadBuffPanel()
if InCombatLockdown() or sIsForceHide or (VUHDO_BUFF_SETTINGS["CONFIG"]["HIDE_OUT_OF_COMBAT"] and sIsOutOfCombat) then
if VuhDoBuffWatchMainFrame then VuhDoBuffWatchMainFrame:Hide(); end
return;
end
if not VUHDO_BUFF_SETTINGS["CONFIG"] then
if VuhDoBuffWatchMainFrame then VuhDoBuffWatchMainFrame:Hide(); end
return;
end
VUHDO_resetBuffSwatchInfos();
VUHDO_resetAllBuffPanels();
if not VuhDoBuffWatchMainFrame then
CreateFrame("Frame", "VuhDoBuffWatchMainFrame", UIParent, "VuhDoBuffWatchMainFrameTemplate");
end
VUHDO_addAllBuffPanels();
if VUHDO_PANEL_HEIGHT < 10 then
VUHDO_PANEL_HEIGHT = 24;
VUHDO_PANEL_WIDTH = 150;
VuhDoBuffWatchMainFrameInfoLabel:Show();
else
VuhDoBuffWatchMainFrameInfoLabel:Hide();
end
VuhDoBuffWatchMainFrame:ClearAllPoints();
local tPosition = VUHDO_BUFF_SETTINGS["CONFIG"]["POSITION"];
VuhDoBuffWatchMainFrame:SetPoint(tPosition["point"], "UIParent", tPosition["relativePoint"], tPosition["x"], tPosition["y"]);
VuhDoBuffWatchMainFrame:SetWidth(VUHDO_PANEL_WIDTH + VUHDO_BUFF_PANEL_GAP_X);
VuhDoBuffWatchMainFrame:SetHeight(VUHDO_PANEL_HEIGHT + VUHDO_BUFF_PANEL_GAP_TOP);
VuhDoBuffWatchMainFrame:SetBackdropColor(VUHDO_backColor(VUHDO_BUFF_SETTINGS["CONFIG"]["PANEL_BG_COLOR"]));
VuhDoBuffWatchMainFrame:SetBackdropBorderColor(VUHDO_backColor(VUHDO_BUFF_SETTINGS["CONFIG"]["PANEL_BORDER_COLOR"]));
VuhDoBuffWatchMainFrame:SetScale(VUHDO_BUFF_SETTINGS["CONFIG"]["SCALE"]);
if VUHDO_BUFF_SETTINGS["CONFIG"]["SHOW"] then
VuhDoBuffWatchMainFrame:Show();
else
VuhDoBuffWatchMainFrame:Hide();
end
end