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.
164 lines
4.9 KiB
164 lines
4.9 KiB
local AS, L, S, R = unpack(AddOnSkins)
|
|
|
|
local ES = AS.EmbedSystem
|
|
|
|
local _G = _G
|
|
local format = format
|
|
local strmatch = strmatch
|
|
local strsub = strsub
|
|
|
|
local CreateFrame = CreateFrame
|
|
local FCF_IsValidChatFrame = FCF_IsValidChatFrame
|
|
local FCF_IsChatWindowIndexActive = FCF_IsChatWindowIndexActive
|
|
local FCF_GetChatWindowInfo = FCF_GetChatWindowInfo
|
|
local UIParent = UIParent
|
|
local InCombatLockdown, UnitAffectingCombat = InCombatLockdown, UnitAffectingCombat
|
|
local NUM_CHAT_WINDOWS = NUM_CHAT_WINDOWS
|
|
|
|
ES.ChatFrameHider = CreateFrame('Frame')
|
|
ES.ChatFrameHider:Hide()
|
|
|
|
ES.Main = CreateFrame('Frame', 'EmbedSystem_MainWindow', UIParent)
|
|
ES.Left = CreateFrame('Frame', 'EmbedSystem_LeftWindow', ES.Main)
|
|
ES.Right = CreateFrame('Frame', 'EmbedSystem_RightWindow', ES.Main)
|
|
|
|
ES.Windows = { ES.Main, ES.Left, ES.Right }
|
|
|
|
if not FCF_IsChatWindowIndexActive then
|
|
function FCF_IsChatWindowIndexActive(chatWindowIndex)
|
|
local shown = select(7, FCF_GetChatWindowInfo(chatWindowIndex));
|
|
if shown then
|
|
return true;
|
|
end
|
|
|
|
local chatFrame = _G["ChatFrame"..chatWindowIndex];
|
|
return (chatFrame and chatFrame.isDocked);
|
|
end
|
|
end
|
|
|
|
local ChatTabInfo = { NONE = 'NONE'}
|
|
function ES:GetChatWindowInfo()
|
|
for i = 1, NUM_CHAT_WINDOWS do
|
|
if i ~= 2 and FCF_IsChatWindowIndexActive(i) then
|
|
ChatTabInfo["ChatFrame"..i] = _G["ChatFrame"..i.."Tab"]:GetText()
|
|
else
|
|
ChatTabInfo["ChatFrame"..i] = nil
|
|
end
|
|
end
|
|
return ChatTabInfo
|
|
end
|
|
|
|
function ES:ToggleChatFrame(Hide)
|
|
local ChatFrame = AS:CheckOption('HideChatFrame')
|
|
local frame, tab = _G[ChatFrame], _G[ChatFrame..'Tab']
|
|
if ChatFrame == 'NONE' or not FCF_IsValidChatFrame(frame) then return end
|
|
|
|
if Hide then
|
|
if frame:GetParent() ~= ES.ChatFrameHider and tab:GetParent() ~= ES.ChatFrameHider then
|
|
frame.OriginalParent, tab.OriginalParent = frame:GetParent(), tab:GetParent()
|
|
end
|
|
|
|
frame:SetParent(ES.ChatFrameHider)
|
|
tab:SetParent(ES.ChatFrameHider)
|
|
else
|
|
if frame.OriginalParent then
|
|
frame:SetParent(frame.OriginalParent)
|
|
tab:SetParent(tab.OriginalParent)
|
|
|
|
frame.OriginalParent, tab.OriginalParent = nil, nil
|
|
end
|
|
end
|
|
end
|
|
|
|
function ES:Initialize()
|
|
if (AS:CheckOption('EmbedSystem') or AS:CheckOption('EmbedSystemDual')) and ES.Hooks and ES.Resize then
|
|
if (AS:CheckOption('EmbedSystem') and AS:CheckOption('EmbedSystemDual')) then
|
|
AS:SetOption('EmbedSystem', false)
|
|
AS:SetOption('EmbedSystemDual', false)
|
|
end
|
|
|
|
ES:Hooks()
|
|
ES:Resize()
|
|
AS:Delay(1, function() ES:Check(true) end)
|
|
|
|
ES.Main:HookScript('OnShow', ES.Show)
|
|
ES.Main:HookScript('OnHide', ES.Hide)
|
|
|
|
ES:RegisterEvent('PLAYER_REGEN_ENABLED')
|
|
ES:RegisterEvent('PLAYER_REGEN_DISABLED')
|
|
|
|
UIParent:HookScript('OnShow', function()
|
|
if AS:CheckOption('EmbedIsHidden') or AS:CheckOption('EmbedOoC') then
|
|
ES:Hide()
|
|
else
|
|
ES:Show()
|
|
end
|
|
end)
|
|
end
|
|
end
|
|
|
|
function ES:Toggle(shown)
|
|
ES.Main:SetShown(shown)
|
|
if AS:CheckOption('EmbedSystemDual') then
|
|
ES.Left:SetShown(shown)
|
|
ES.Right:SetShown(shown)
|
|
end
|
|
end
|
|
|
|
function ES:Show()
|
|
ES:Toggle(true)
|
|
ES:ToggleChatFrame(true)
|
|
end
|
|
|
|
function ES:Hide()
|
|
ES:Toggle(false)
|
|
ES:ToggleChatFrame(false)
|
|
end
|
|
|
|
function AS:CheckEmbed(AddOn)
|
|
if AS:CheckAddOn(AddOn) and (AS:CheckOption('EmbedSystem') or AS:CheckOption('EmbedSystemDual')) and (strmatch(AS:CheckOption('EmbedMain'), AddOn) or strmatch(AS:CheckOption('EmbedLeft'), AddOn) or strmatch(AS:CheckOption('EmbedRight'), AddOn)) then
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
function ES:Check(Message)
|
|
if not (AS:CheckOption('EmbedSystem') or AS:CheckOption('EmbedSystemDual')) then return end
|
|
|
|
ES:Resize()
|
|
ES.Main:SetShown(not (AS:CheckOption('EmbedIsHidden') or AS:CheckOption('EmbedOoC')))
|
|
|
|
for _, Window in next, ES.Windows do
|
|
Window:SetFrameStrata(strsub(AS:CheckOption('EmbedFrameStrata'), 3))
|
|
Window:SetFrameLevel(AS:CheckOption('EmbedFrameLevel'))
|
|
end
|
|
|
|
if AS:CheckEmbed('Details') then ES:Details() end
|
|
if AS:CheckEmbed('Omen') then ES:Omen() end
|
|
if AS:CheckEmbed('Skada') then ES:Skada() end
|
|
if AS:CheckEmbed('TinyDPS') then ES:TinyDPS() end
|
|
if AS:CheckEmbed('Recount') then ES:Recount() end
|
|
|
|
if Message and AS:CheckOption('EmbedSystemMessage') then
|
|
if AS:CheckOption('EmbedMain') then AS:Print(format(L["Embed System: Main: '%s'"], AS:CheckOption('EmbedMain'))) end
|
|
if AS:CheckOption('EmbedSystemDual') then AS:Print(format(L["Embed System: Left: '%s' | Right: '%s'"], AS:CheckOption('EmbedLeft'), AS:CheckOption('EmbedRight'))) end
|
|
end
|
|
end
|
|
|
|
function ES:PLAYER_REGEN_DISABLED()
|
|
if AS:CheckOption('EmbedOoC') then
|
|
ES:Toggle(true)
|
|
end
|
|
end
|
|
|
|
function ES:PLAYER_REGEN_ENABLED()
|
|
if AS:CheckOption('EmbedOoC') then
|
|
AS:Delay(AS:CheckOption('EmbedOoCDelay'), function()
|
|
local inCombat = InCombatLockdown() or UnitAffectingCombat('player') or UnitAffectingCombat('pet')
|
|
if not inCombat then
|
|
ES:Toggle(false)
|
|
end
|
|
end)
|
|
end
|
|
end
|
|
|