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.

184 lines
6.0 KiB

local AS = unpack(_G.AddOnSkins)
local _G = _G
local format = format
local pairs = pairs
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 hooksecurefunc = hooksecurefunc
local UIParent = UIParent
local NUM_CHAT_WINDOWS = NUM_CHAT_WINDOWS
AS.ChatFrameHider = CreateFrame('Frame')
AS.ChatFrameHider:Hide()
local EmbedSystem_MainWindow, EmbedSystem_LeftWindow, EmbedSystem_RightWindow
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
function AS:GetChatWindowInfo()
local ChatTabInfo = { NONE = 'NONE'}
for i = 1, NUM_CHAT_WINDOWS do
if i ~= 2 and FCF_IsChatWindowIndexActive(i) then
ChatTabInfo["ChatFrame"..i] = _G["ChatFrame"..i.."Tab"]:GetText()
end
end
return ChatTabInfo
end
function AS:ToggleChatFrame(Hide)
local ChatFrame = AS:CheckOption('HideChatFrame')
if ChatFrame == 'NONE' then return end
if Hide then
if _G[ChatFrame]:GetParent() ~= AS.ChatFrameHider and _G[ChatFrame..'Tab']:GetParent() ~= AS.ChatFrameHider then
_G[ChatFrame].OriginalParent = _G[ChatFrame]:GetParent()
_G[ChatFrame..'Tab'].OriginalParent = _G[ChatFrame..'Tab']:GetParent()
end
_G[ChatFrame]:SetParent(AS.ChatFrameHider)
_G[ChatFrame..'Tab']:SetParent(AS.ChatFrameHider)
else
if _G[ChatFrame].OriginalParent then
_G[ChatFrame]:SetParent(_G[ChatFrame].OriginalParent)
_G[ChatFrame..'Tab']:SetParent(_G[ChatFrame..'Tab'].OriginalParent)
_G[ChatFrame].OriginalParent = nil
_G[ChatFrame..'Tab'].OriginalParent = nil
end
end
end
function AS:EmbedInit()
if (AS:CheckOption('EmbedSystem') or AS:CheckOption('EmbedSystemDual')) and AS.EmbedSystemHooks and AS.EmbedSystem_WindowResize then
if not AS.EmbedSystemCreated then
EmbedSystem_MainWindow = CreateFrame('Frame', 'EmbedSystem_MainWindow', UIParent)
EmbedSystem_LeftWindow = CreateFrame('Frame', 'EmbedSystem_LeftWindow', EmbedSystem_MainWindow)
EmbedSystem_RightWindow = CreateFrame('Frame', 'EmbedSystem_RightWindow', EmbedSystem_MainWindow)
AS.EmbedSystemCreated = true
if (AS:CheckOption('EmbedSystem') and AS:CheckOption('EmbedSystemDual')) then
AS:SetOption('EmbedSystem', false)
AS:SetOption('EmbedSystemDual', false)
end
if AS:CheckOption('HideChatFrame') ~= 'NONE' and not FCF_IsValidChatFrame(_G[AS:CheckOption('HideChatFrame')]) then
AS:SetOption('HideChatFrame', 'NONE')
end
AS:EmbedSystemHooks()
AS:EmbedSystem_WindowResize()
AS:Delay(1, function() AS:Embed_Check(true) end)
EmbedSystem_MainWindow:HookScript('OnShow', AS.Embed_Show)
EmbedSystem_MainWindow:HookScript('OnHide', AS.Embed_Hide)
AS:RegisterEvent('PLAYER_REGEN_DISABLED', 'EmbedEnterCombat')
AS:RegisterEvent('PLAYER_REGEN_ENABLED', 'EmbedExitCombat')
UIParent:HookScript('OnShow', function()
if AS:CheckOption('EmbedIsHidden') or AS:CheckOption('EmbedOoC') then
AS:Embed_Hide()
else
AS:Embed_Show()
end
end)
for _, Function in pairs({"FCF_Close", "FCF_OpenNewWindow", "FCF_SetWindowName"}) do
hooksecurefunc(Function, function()
if AS:CheckOption('HideChatFrame') ~= 'NONE' and not FCF_IsValidChatFrame(_G[AS:CheckOption('HideChatFrame')]) then
AS:SetOption('HideChatFrame', 'NONE')
end
end)
end
end
end
end
function AS:Embed_Show()
EmbedSystem_MainWindow:Show()
if AS:CheckOption('EmbedSystemDual') then
EmbedSystem_LeftWindow:Show()
EmbedSystem_RightWindow:Show()
end
AS:ToggleChatFrame(true)
end
function AS:Embed_Hide()
EmbedSystem_MainWindow:Hide()
if AS:CheckOption('EmbedSystemDual') then
EmbedSystem_LeftWindow:Hide()
EmbedSystem_RightWindow:Hide()
end
AS: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 AS:Embed_Check(Message)
if not (AS:CheckOption('EmbedSystem') or AS:CheckOption('EmbedSystemDual')) then return end
if not AS.EmbedSystemCreated then
AS:EmbedInit()
Message = true
end
AS:EmbedSystem_WindowResize()
EmbedSystem_MainWindow:SetShown(not (AS:CheckOption('EmbedIsHidden') or AS:CheckOption('EmbedOoC')))
for _, Window in pairs({EmbedSystem_MainWindow, EmbedSystem_LeftWindow, EmbedSystem_RightWindow}) do
Window:SetFrameStrata(strsub(AS:CheckOption('EmbedFrameStrata'), 3))
Window:SetFrameLevel(AS:CheckOption('EmbedFrameLevel'))
end
if AS:CheckEmbed('Details') then AS:Embed_Details() end
if AS:CheckEmbed('Omen') then AS:Embed_Omen() end
if AS:CheckEmbed('Skada') then AS:Embed_Skada() end
if AS:CheckEmbed('TinyDPS') then AS:Embed_TinyDPS() end
if AS:CheckEmbed('Recount') then AS:Embed_Recount() end
if Message and AS:CheckOption('EmbedSystemMessage') then
Message = format("Main: '%s'", AS:CheckOption('EmbedMain'))
if AS:CheckOption('EmbedSystemDual') then Message = format("Left: '%s' | Right: '%s'", AS:CheckOption('EmbedLeft'), AS:CheckOption('EmbedRight')) end
AS:Print(format('Embed System: - %s', Message))
end
end
local EmbedOoCCombatStart
function AS:EmbedEnterCombat()
EmbedOoCCombatStart = true
if AS:CheckOption('EmbedOoC') then
EmbedSystem_MainWindow:Show()
end
end
function AS:EmbedExitCombat()
EmbedOoCCombatStart = false
if AS:CheckOption('EmbedOoC') then
AS:Delay(AS:CheckOption('EmbedOoCDelay'), function()
if not EmbedOoCCombatStart then
EmbedSystem_MainWindow:Hide()
end
end)
end
end