26c8dda - Remove heal absorb from player and target frames
[wowui.git] / OmaUF / Auras.lua
index deb62fa..5e6de47 100644 (file)
 -- Auras.lua
 local _;
 local CreateFrame = CreateFrame;
+local UnitAura = UnitAura;
+local GameTooltip = GameTooltip;
+
+local auraFilters = {"HELPFUL", "HARMFUL"};
 
 local M = {};
 OmaUFAuras = M;
 
-function M.CreateAuraFrame(parent)
-    parent.auras = CreateFrame("Frame", nil, parent);
-    parent.auras:SetPoint("TOPLEFT", parent, "BOTTOMLEFT", 0, -2);
+local function updateTooltip(frame)
+    if GameTooltip:IsOwned(frame) then
+        GameTooltip:SetUnitAura(frame.unit, frame.index, frame.filter);
+    else
+        frame:SetScript("OnUpdate", nil);
+    end
+end
+
+local function showTooltip(frame)
+    -- tooltip handling from FrameXML/TargetFrame.xml
+    GameTooltip:SetOwner(frame, "ANCHOR_BOTTOMRIGHT", 15, -25);
+    GameTooltip:SetUnitAura(frame.unit, frame.index, frame.filter);
+    frame:SetScript("OnUpdate", updateTooltip);
+end
+
+local function hideTooltip(frame)
+    GameTooltip:Hide();
+    frame:SetScript("OnUpdate", nil);
+end
+
+function M.UpdateAuraTooltips()
+    GameTooltip = _G["GameTooltip"];
+end
+
+local function createAura(parent, prev, anchor, name, unit)
+    local aura = CreateFrame("Frame", name, parent);
+    aura:SetPoint("TOPLEFT", prev, anchor);
+    aura:SetWidth(20);
+    aura:SetHeight(20);
+    aura.icon = aura:CreateTexture(nil, "ARTWORK");
+    aura.icon:SetAllPoints();
+    aura.stack = aura:CreateFontString(nil, "OVERLAY", "NumberFontNormalSmall");
+    aura.stack:SetPoint("BOTTOMRIGHT");
+    aura.cd = CreateFrame("Cooldown", name.."CD", aura, "CooldownFrameTemplate");
+    aura.cd:SetReverse(true);
+    aura.cd:SetHideCountdownNumbers(true);
+    aura.cd:SetAllPoints();
+    aura.unit = unit;
+    aura:SetScript("OnEnter", showTooltip);
+    aura:SetScript("OnLeave", hideTooltip);
+    aura:Hide();
+    return aura;
+end
+
+function M.CreateAuraFrame(parent, unit)
+    local name = parent:GetName().."Auras";
+    parent.auras = CreateFrame("Frame", name, parent);
+    parent.auras:SetPoint("TOPLEFT", parent, "BOTTOMLEFT", 0, -8);
+    parent.auras:SetWidth(10);
+    parent.auras:SetHeight(10);
+    local i = 1;
+    -- max auras per row
+    for x=1,10 do
+        local auraName = name..i;
+        if i == 1 then
+            parent.auras[i] = createAura(parent.auras, parent.auras, "TOPLEFT", auraName, unit);
+        else
+            parent.auras[i] = createAura(parent.auras, parent.auras[i-1], "TOPRIGHT", auraName, unit);
+        end
+        i = i + 1;
+    end
+    -- max rows
+    for y=0,0 do
+        for x=1,10 do
+            local auraName = name..i;
+            parent.auras[i] = createAura(parent.auras, parent.auras[y*10+x], "BOTTOMLEFT", auraName, unit);
+            i = i + 1;
+        end
+    end
 end
 
 function M.UpdateAuras(frame, unit)
     local auras = frame.auras;
+    for _, aura in ipairs(auras) do
+        if not aura:IsShown() then break end
+        aura:Hide();
+    end
+    local icon, count, duration, expires, caster, id;
+    local pos = 1;
+    for _, filter in ipairs(auraFilters) do
+        local i = 1;
+        while true do
+            _, _, icon, count, _, duration, expires, caster, _, _, id = UnitAura(unit, i, filter);
+            if not id or not auras[pos] then break end
+            -- aura filter self-applied, player-applied, list of important auras TODO
+            local aura = auras[pos];
+            aura.icon:SetTexture(icon);
+            aura.index = i;
+            aura.filter = filter;
+            if count > 1 then
+                aura.stack:SetText(count);
+                aura.stack:Show();
+            else
+                aura.stack:Hide();
+            end
+            if expires > 0 then
+                aura.cd:SetCooldown(expires - duration, duration);
+            else
+                aura.cd:Hide();
+            end
+            aura:Show();
+            pos = pos + 1;
+            i = i + 1;
+        end
+    end
 end