20b6934 - Fix old frame removal
[wowui.git] / OmaUF / Auras.lua
1 -- Auras.lua
2 local _;
3 local CreateFrame = CreateFrame;
4 local UnitAura = UnitAura;
5 local GameTooltip = GameTooltip;
6
7 local auraFilters = {"HELPFUL", "HARMFUL"};
8
9 local M = {};
10 OmaUFAuras = M;
11
12 local function updateTooltip(frame)
13     if GameTooltip:IsOwned(frame) then
14         GameTooltip:SetUnitAura(frame.unit, frame.index, frame.filter);
15     else
16         frame:SetScript("OnUpdate", nil);
17     end
18 end
19
20 local function showTooltip(frame)
21     -- tooltip handling from FrameXML/TargetFrame.xml
22     GameTooltip:SetOwner(frame, "ANCHOR_BOTTOMRIGHT", 15, -25);
23     GameTooltip:SetUnitAura(frame.unit, frame.index, frame.filter);
24     frame:SetScript("OnUpdate", updateTooltip);
25 end
26
27 local function hideTooltip(frame)
28     GameTooltip:Hide();
29     frame:SetScript("OnUpdate", nil);
30 end
31
32 function M.UpdateAuraTooltips()
33     GameTooltip = _G["GameTooltip"];
34 end
35
36 local function createAura(parent, prev, anchor, name, unit)
37     local aura = CreateFrame("Frame", name, parent);
38     aura:SetPoint("TOPLEFT", prev, anchor);
39     aura:SetWidth(20);
40     aura:SetHeight(20);
41     aura.icon = aura:CreateTexture(nil, "ARTWORK");
42     aura.icon:SetAllPoints();
43     aura.stack = aura:CreateFontString(nil, "OVERLAY", "NumberFontNormalSmall");
44     aura.stack:SetPoint("BOTTOMRIGHT");
45     aura.cd = CreateFrame("Cooldown", name.."CD", aura, "CooldownFrameTemplate");
46     aura.cd:SetReverse(true);
47     aura.cd:SetHideCountdownNumbers(true);
48     aura.cd:SetAllPoints();
49     aura.unit = unit;
50     aura:SetScript("OnEnter", showTooltip);
51     aura:SetScript("OnLeave", hideTooltip);
52     aura:Hide();
53     return aura;
54 end
55
56 function M.CreateAuraFrame(parent, unit)
57     local name = parent:GetName().."Auras";
58     parent.auras = CreateFrame("Frame", name, parent);
59     parent.auras:SetPoint("TOPLEFT", parent, "BOTTOMLEFT", 0, -8);
60     parent.auras:SetWidth(10);
61     parent.auras:SetHeight(10);
62     local i = 1;
63     -- max auras per row
64     for x=1,10 do
65         local auraName = name..i;
66         if i == 1 then
67             parent.auras[i] = createAura(parent.auras, parent.auras, "TOPLEFT", auraName, unit);
68         else
69             parent.auras[i] = createAura(parent.auras, parent.auras[i-1], "TOPRIGHT", auraName, unit);
70         end
71         i = i + 1;
72     end
73     -- max rows
74     for y=0,0 do
75         for x=1,10 do
76             local auraName = name..i;
77             parent.auras[i] = createAura(parent.auras, parent.auras[y*10+x], "BOTTOMLEFT", auraName, unit);
78             i = i + 1;
79         end
80     end
81 end
82
83 function M.UpdateAuras(frame, unit)
84     local auras = frame.auras;
85     for _, aura in ipairs(auras) do
86         if not aura:IsShown() then break end
87         aura:Hide();
88     end
89     local icon, count, duration, expires, caster, id;
90     local pos = 1;
91     for _, filter in ipairs(auraFilters) do
92         local i = 1;
93         while true do
94             _, _, icon, count, _, duration, expires, caster, _, _, id = UnitAura(unit, i, filter);
95             if not id or not auras[pos] then break end
96             -- aura filter self-applied, player-applied, list of important auras TODO
97             local aura = auras[pos];
98             aura.icon:SetTexture(icon);
99             aura.index = i;
100             aura.filter = filter;
101             if count > 1 then
102                 aura.stack:SetText(count);
103                 aura.stack:Show();
104             else
105                 aura.stack:Hide();
106             end
107             if expires > 0 then
108                 aura.cd:SetCooldown(expires - duration, duration);
109             else
110                 aura.cd:Hide();
111             end
112             aura:Show();
113             pos = pos + 1;
114             i = i + 1;
115         end
116     end
117 end