09b59f4 - Only have OnUpdate calls when necessary
[wowui.git] / OmaRF / RaidFrame.lua
index 2adcdb9..ebadfef 100644 (file)
@@ -5,9 +5,10 @@ local format = string.format;
 local UnitInRange = UnitInRange;
 local InCombatLockdown = InCombatLockdown;
 local CreateFrame, RegisterStateDriver, RegisterUnitWatch = CreateFrame, RegisterStateDriver, RegisterUnitWatch;
 local UnitInRange = UnitInRange;
 local InCombatLockdown = InCombatLockdown;
 local CreateFrame, RegisterStateDriver, RegisterUnitWatch = CreateFrame, RegisterStateDriver, RegisterUnitWatch;
+local CTimerAfter = C_Timer.After;
 local STANDARD_TEXT_FONT = STANDARD_TEXT_FONT;
 local STANDARD_TEXT_FONT = STANDARD_TEXT_FONT;
-local GameTooltip = nil;
-local GameTooltip_SetDefaultAnchor = nil;
+local GameTooltip = GameTooltip;
+local GameTooltip_SetDefaultAnchor = GameTooltip_SetDefaultAnchor;
 
 local registerEvents = OmaRFEvents.RegisterEvents;
 local registerUnitEvents = OmaRFEvents.RegisterUnitEvents;
 
 local registerEvents = OmaRFEvents.RegisterEvents;
 local registerUnitEvents = OmaRFEvents.RegisterUnitEvents;
@@ -33,6 +34,7 @@ local barTexture = "Interface\\AddOns\\OmaRF\\images\\minimalist";
 local class = nil;
 local party = {};
 local raid = {};
 local class = nil;
 local party = {};
 local raid = {};
+local updaters = {};
 
 local M = {};
 OmaRaidFrame = M;
 
 local M = {};
 OmaRaidFrame = M;
@@ -40,33 +42,40 @@ OmaRaidFrame = M;
 local function unitUpdate(frame)
     -- there's no in/out of range event, have to check each frame
     -- from FrameXML/CompactUnitFrame.lua
 local function unitUpdate(frame)
     -- there's no in/out of range event, have to check each frame
     -- from FrameXML/CompactUnitFrame.lua
-    local inRange, checked = UnitInRange(frame.displayed);
-    if checked and not inRange then
-        frame:SetAlpha(0.55);
-    else
-        frame:SetAlpha(1);
+    if frame.updating then
+        local inRange, checked = UnitInRange(frame.displayed);
+        if checked and not inRange then
+            frame:SetAlpha(0.55);
+        else
+            frame:SetAlpha(1);
+        end
+        CTimerAfter(0.20, updaters[frame]);
     end
 end
 
 local function frameShow(frame)
     registerEvents(frame);
     registerUnitEvents(frame);
     end
 end
 
 local function frameShow(frame)
     registerEvents(frame);
     registerUnitEvents(frame);
-    frame:SetScript("OnUpdate", unitUpdate);
+    frame.updating = true;
+    CTimerAfter(0.20, updaters[frame]);
     unitEvent(frame, "UPDATE_ALL_BARS");
 end
 
 local function frameHide(frame)
     frame:UnregisterAllEvents();
     unitEvent(frame, "UPDATE_ALL_BARS");
 end
 
 local function frameHide(frame)
     frame:UnregisterAllEvents();
-    frame:SetScript("OnUpdate", nil);
+    frame.updating = nil;
 end
 
 local function showTooltip(secure)
 end
 
 local function showTooltip(secure)
-    GameTooltip_SetDefaultAnchor(GameTooltip, secure);
-    GameTooltip:SetUnit(secure:GetAttribute("unit"));
+    -- only show raid frame tooltips out of combat
+    if not InCombatLockdown() then
+        GameTooltip_SetDefaultAnchor(GameTooltip, secure);
+        GameTooltip:SetUnit(secure:GetAttribute("unit"));
+    end
 end
 
 local function hideTooltip(secure)
 end
 
 local function hideTooltip(secure)
-    GameTooltip:FadeOut();
+    if GameTooltip:IsOwned(secure) then GameTooltip:FadeOut() end
 end
 
 local function setupFrame(frame, secure, unit)
 end
 
 local function setupFrame(frame, secure, unit)
@@ -138,11 +147,6 @@ local function setupFrame(frame, secure, unit)
     frame.text:SetFont(STANDARD_TEXT_FONT, 13);
     frame.text:SetPoint("CENTER", frame.background, "CENTER", 0, -1);
     frame.text:Hide();
     frame.text:SetFont(STANDARD_TEXT_FONT, 13);
     frame.text:SetPoint("CENTER", frame.background, "CENTER", 0, -1);
     frame.text:Hide();
-    frame.rez = frame:CreateTexture(nil, "OVERLAY");
-    frame.rez:SetPoint("TOPLEFT", frame.background, "CENTER", -12, 12);
-    frame.rez:SetPoint("BOTTOMRIGHT", frame.background, "CENTER", 12, -12);
-    frame.rez:SetTexture("Interface\\RaidFrame\\Raid-Icon-Rez");
-    frame.rez:Hide();
     frame.ready = frame:CreateTexture(nil, "OVERLAY");
     frame.ready:SetPoint("TOPLEFT", frame.background, "BOTTOMLEFT", 0, 14);
     frame.ready:SetPoint("BOTTOMRIGHT", frame.background, "BOTTOMLEFT", 14, 0);
     frame.ready = frame:CreateTexture(nil, "OVERLAY");
     frame.ready:SetPoint("TOPLEFT", frame.background, "BOTTOMLEFT", 0, 14);
     frame.ready:SetPoint("BOTTOMRIGHT", frame.background, "BOTTOMLEFT", 14, 0);
@@ -161,6 +165,8 @@ local function setupFrame(frame, secure, unit)
     frame:SetScript("OnEvent", unitEvent);
     secure:SetScript("OnEnter", showTooltip);
     secure:SetScript("OnLeave", hideTooltip);
     frame:SetScript("OnEvent", unitEvent);
     secure:SetScript("OnEnter", showTooltip);
     secure:SetScript("OnLeave", hideTooltip);
+    -- set up periodic updates
+    updaters[frame] = function() return unitUpdate(frame) end
     -- set attributes
     secure:RegisterForClicks("AnyDown");
     for attr, val in pairs(attributes) do
     -- set attributes
     secure:RegisterForClicks("AnyDown");
     for attr, val in pairs(attributes) do
@@ -272,9 +278,6 @@ local function initializeFocus(parent)
 end
 
 local function initialize()
 end
 
 local function initialize()
-    -- let other addons hook these to anchor tooltip elsewhere
-    GameTooltip = _G["GameTooltip"];
-    GameTooltip_SetDefaultAnchor = _G["GameTooltip_SetDefaultAnchor"];
     _, class = UnitClass("player");
     anchorX, anchorY = Settings.Character.AnchorX, Settings.Character.AnchorY;
     attributes = Settings.Character.Clickheal;
     _, class = UnitClass("player");
     anchorX, anchorY = Settings.Character.AnchorX, Settings.Character.AnchorY;
     attributes = Settings.Character.Clickheal;
@@ -333,16 +336,25 @@ local function hideBlizzardRaid()
     end
 end
 
     end
 end
 
+local function updateTooltipFuncs()
+    -- let MoveAnything hook these to anchor tooltip elsewhere
+    GameTooltip = _G["GameTooltip"];
+    GameTooltip_SetDefaultAnchor = _G["GameTooltip_SetDefaultAnchor"];
+end
+
 CFrame:RegisterEvent("PLAYER_LOGIN");
 CFrame:RegisterEvent("PLAYER_LOGIN");
+CFrame:RegisterEvent("PLAYER_ENTERING_WORLD");
 CFrame:RegisterEvent("PLAYER_REGEN_ENABLED");
 CFrame:SetScript("OnEvent", function(self, event, addon)
 CFrame:RegisterEvent("PLAYER_REGEN_ENABLED");
 CFrame:SetScript("OnEvent", function(self, event, addon)
-    if event == "PLAYER_LOGIN" then
-        OmaRFLoadChar();
-        hideBlizzardRaid();
-        initialize();
-    elseif event == "PLAYER_REGEN_ENABLED" then
+    if event == "PLAYER_REGEN_ENABLED" then
         -- if CompactRaidFrameManager_UpdateOptionsFlowContainer was called in combat
         -- couldn't hide the button
         hideBlizzardRaidButton();
         -- if CompactRaidFrameManager_UpdateOptionsFlowContainer was called in combat
         -- couldn't hide the button
         hideBlizzardRaidButton();
+    elseif event == "PLAYER_ENTERING_WORLD" then
+        CTimerAfter(0.01, updateTooltipFuncs);
+    elseif event == "PLAYER_LOGIN" then
+        OmaRFLoadChar();
+        hideBlizzardRaid();
+        initialize();
     end
 end);
     end
 end);