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.

101 lines
2.5 KiB

--[[
AutoHideController.lua
@Author : DengSir (tdaddon@163.com)
@Link : https://dengsir.github.io
]]
local MAJOR, MINOR = 'AutoHideController', 2
local GUI = LibStub('tdGUI-1.0')
local AutoHideController, oldminor, ns = GUI:NewClass(MAJOR, MINOR, 'Frame')
if not AutoHideController then return end
LibStub('AceTimer-3.0'):Embed(AutoHideController)
ns._Objects = ns._Objects or {}
ns.ESCHandler = ns.ESCHandler or CreateFrame('Frame', nil, UIParent)
ns.ESCHandler:Hide()
ns.ESCHandler:SetScript('OnKeyDown', function(self, key)
local found = false
if key == GetBindingKey('TOGGLEGAMEMENU') then
for object in pairs(ns._Objects) do
if object:IsVisible() then
object:OnTimer()
found = true
end
end
self:Hide()
end
self:SetPropagateKeyboardInput(not found)
end)
function AutoHideController:Constructor()
self:SetScript('OnUpdate', self.OnUpdate)
self:SetScript('OnHide', self.OnTimer)
self:SetScript('OnShow', self.OnShow)
ns._Objects[self] = true
end
function AutoHideController:GetOwner()
return self:GetParent():GetOwner()
end
function AutoHideController:IsOwnerVisible()
return self:GetOwner() and self:GetOwner():IsVisible()
end
function AutoHideController:IsOwnerOver()
return self:GetOwner() and self:GetOwner():IsMouseOver()
end
function AutoHideController:IsMenuOver()
return self:GetParent():IsMouseOver()
end
function AutoHideController:OnUpdate(elapsed)
if self:Fire('OnUpdateCheck') then
return self:OnTimer()
end
self.updater = (self.updater or 0) - elapsed
if self.updater > 0 then
return
end
self.updater = 0.5
if self:IsOwnerOver() or self:IsMenuOver() then
self:CancelTimer()
else
self:StartTimer()
end
end
function AutoHideController:OnTimer()
self:GetParent():Hide()
self:CancelTimer()
end
function AutoHideController:CancelTimer()
if self.timer then
self.timer:Cancel()
self.timer = nil
end
end
function AutoHideController:StartTimer()
if not self.timer then
self.timer = C_Timer.NewTimer(self:GetAutoHideDelay(), function() self:OnTimer() end)
end
end
function AutoHideController:OnShow()
ns.ESCHandler:Show()
end
function AutoHideController:SetAutoHideDelay(delay)
self.autoHideDelay = delay
end
function AutoHideController:GetAutoHideDelay()
return self.autoHideDelay or 1.5
end