-- rLib: framefader -- zork, 2016 ----------------------------- -- Variables ----------------------------- local A, L = ... -- classic-disable --local SpellFlyout = SpellFlyout ----------------------------- -- Functions ----------------------------- local function FaderOnFinished(self) --print("FaderOnFinished",self.__owner:GetName(),self.finAlpha) self.__owner:SetAlpha(self.finAlpha) end local function FaderOnUpdate(self) --print("FaderOnUpdate",self.__owner:GetName(),self.__animFrame:GetAlpha()) self.__owner:SetAlpha(self.__animFrame:GetAlpha()) end local function CreateFaderAnimation(frame) if frame.fader then return end local animFrame = CreateFrame("Frame",nil,frame) animFrame.__owner = frame frame.fader = animFrame:CreateAnimationGroup() frame.fader.__owner = frame frame.fader.__animFrame = animFrame frame.fader.direction = nil frame.fader.setToFinalAlpha = false frame.fader.anim = frame.fader:CreateAnimation("Alpha") frame.fader:HookScript("OnFinished", FaderOnFinished) frame.fader:HookScript("OnUpdate", FaderOnUpdate) end function L:StartFadeIn(frame) if frame.fader.direction == "in" then return end frame.fader:Pause() frame.fader.anim:SetFromAlpha(frame.faderConfig.fadeOutAlpha or 0) frame.fader.anim:SetToAlpha(frame.faderConfig.fadeInAlpha or 1) frame.fader.anim:SetDuration(frame.faderConfig.fadeInDuration or 0.3) frame.fader.anim:SetSmoothing(frame.faderConfig.fadeInSmooth or "OUT") --start right away frame.fader.anim:SetStartDelay(frame.faderConfig.fadeInDelay or 0) frame.fader.finAlpha = frame.faderConfig.fadeInAlpha frame.fader.direction = "in" frame.fader:Play() end function L:StartFadeOut(frame) if frame.fader.direction == "out" then return end frame.fader:Pause() frame.fader.anim:SetFromAlpha(frame.faderConfig.fadeInAlpha or 1) frame.fader.anim:SetToAlpha(frame.faderConfig.fadeOutAlpha or 0) frame.fader.anim:SetDuration(frame.faderConfig.fadeOutDuration or 0.3) frame.fader.anim:SetSmoothing(frame.faderConfig.fadeOutSmooth or "OUT") --wait for some time before starting the fadeout frame.fader.anim:SetStartDelay(frame.faderConfig.fadeOutDelay or 0) frame.fader.finAlpha = frame.faderConfig.fadeOutAlpha frame.fader.direction = "out" frame.fader:Play() end local function IsMouseOverFrame(frame) if MouseIsOver(frame) then return true end -- classic-disable --[[ if not SpellFlyout:IsShown() then return false end if not SpellFlyout.__faderParent then return false end if SpellFlyout.__faderParent == frame and MouseIsOver(SpellFlyout) then return true end ]]-- return false end local function FrameHandler(frame) if IsMouseOverFrame(frame) then L:StartFadeIn(frame) else L:StartFadeOut(frame) end end local function OffFrameHandler(self) if not self.__faderParent then return end FrameHandler(self.__faderParent) end local function OnShow(self) if self.fader then L:StartFadeIn(self) end end local function OnHide(self) if self.fader then L:StartFadeOut(self) end end -- classic-disable --[[ local function SpellFlyoutOnShow(self) local frame = self:GetParent():GetParent():GetParent() if not frame.fader then return end --set new frame parent self.__faderParent = frame if not self.__faderHook then SpellFlyout:HookScript("OnEnter", OffFrameHandler) SpellFlyout:HookScript("OnLeave", OffFrameHandler) self.__faderHook = true end for i=1, NUM_ACTIONBAR_BUTTONS do --hopefully 12 is enough local button = _G["SpellFlyoutButton"..i] if not button then break end button.__faderParent = frame if not button.__faderHook then button:HookScript("OnEnter", OffFrameHandler) button:HookScript("OnLeave", OffFrameHandler) button.__faderHook = true end end end SpellFlyout:HookScript("OnShow", SpellFlyoutOnShow) ]]-- function rLib:CreateFrameFader(frame, faderConfig) if frame.faderConfig then return end frame.faderConfig = faderConfig CreateFaderAnimation(frame) if faderConfig.trigger and faderConfig.trigger == "OnShow" then frame:HookScript("OnShow", OnShow) --I know setting the alpha on a hidden frame does not really make sense but we need to set the fader to "out" --sadly a delay on the OnHide is impossible. we get the benefit of the fadeIn though. frame:HookScript("OnHide", OnHide) else frame:EnableMouse(true) frame:HookScript("OnEnter", FrameHandler) frame:HookScript("OnLeave", FrameHandler) FrameHandler(frame) end end function rLib:CreateButtonFrameFader(frame, buttonList, faderConfig) rLib:CreateFrameFader(frame, faderConfig) if faderConfig.trigger and faderConfig.trigger == "OnShow" then return end for i, button in next, buttonList do if not button.__faderParent then button.__faderParent = frame button:HookScript("OnEnter", OffFrameHandler) button:HookScript("OnLeave", OffFrameHandler) end end end