local E, L, V, P, G = unpack(ElvUI) local EMB = E:NewModule("EmbedSystem") local AS = E:GetModule("AddOnSkins") local _G = _G local pairs = pairs local floor = math.floor local lower, match = string.lower, string.match local tinsert = table.insert local hooksecurefunc = hooksecurefunc local NUM_CHAT_WINDOWS = NUM_CHAT_WINDOWS function EMB:GetChatWindowInfo() local chatTabInfo = {["NONE"] = "NONE"} for i = 1, NUM_CHAT_WINDOWS do chatTabInfo["ChatFrame"..i] = _G["ChatFrame"..i.."Tab"]:GetText() end return chatTabInfo end function EMB:ToggleChatFrame(hide) local chatFrame = E.db.addOnSkins.embed.hideChat if chatFrame == "NONE" then return end if hide then _G[chatFrame].originalParent = _G[chatFrame]:GetParent() _G[chatFrame]:SetParent(E.HiddenFrame) _G[chatFrame.."Tab"].originalParent = _G[chatFrame.."Tab"]:GetParent() _G[chatFrame.."Tab"]:SetParent(E.HiddenFrame) else if _G[chatFrame].originalParent then _G[chatFrame]:SetParent(_G[chatFrame].originalParent) _G[chatFrame.."Tab"]:SetParent(_G[chatFrame.."Tab"].originalParent) end end end function EMB:EmbedShow() if _G[self.leftFrame.frameName] then _G[self.leftFrame.frameName]:Show() end if E.db.addOnSkins.embed.embedType == "DOUBLE" then if _G[self.rightFrame.frameName] then _G[self.rightFrame.frameName]:Show() end end self:ToggleChatFrame(true) self.switchButton:SetAlpha(1) end function EMB:EmbedHide() if _G[self.leftFrame.frameName] then _G[self.leftFrame.frameName]:Hide() end if E.db.addOnSkins.embed.embedType == "DOUBLE" then if _G[self.rightFrame.frameName] then _G[self.rightFrame.frameName]:Hide() end end self:ToggleChatFrame(false) self.switchButton:SetAlpha(0.6) end function EMB:CheckEmbed(addon) local db = E.db.addOnSkins.embed local left, right, embed = lower(db.leftWindow), lower(db.rightWindow), lower(addon) if AS:IsAddonEnabled(addon) and ((db.embedType == "SINGLE" and match(left, embed)) or db.embedType == "DOUBLE" and (match(left, embed) or match(right, embed))) then return true else return false end end function EMB:EmbedUpdate() if E.db.addOnSkins.embed.embedType == "DISABLE" then return end if not self.embedCreated then self:EmbedCreate() end self:WindowResize() if self:CheckEmbed("Omen") then self:EmbedOmen() end if self:CheckEmbed("Recount") then self:EmbedRecount() end if self:CheckEmbed("Skada") then self:EmbedSkada() end if self:CheckEmbed("Details") then self:EmbedDetails() end end function EMB:SetHooks() hooksecurefunc(E:GetModule("Chat"), "PositionChat", function(self, override) if override then EMB:EmbedUpdate() end end) hooksecurefunc(E:GetModule("Layout"), "ToggleChatPanels", function() EMB:EmbedUpdate() end) hooksecurefunc(LeftChatPanel, "fadeFunc", function() LeftChatPanel:Hide() if not E.db.addOnSkins.embed.rightChatPanel then EMB.switchButton:Hide() end end) hooksecurefunc(RightChatPanel, "fadeFunc", function() RightChatPanel:Hide() if E.db.addOnSkins.embed.rightChatPanel then EMB.switchButton:Hide() end end) local rightChatToggleOnClickOriginal = RightChatToggleButton:GetScript("OnClick") RightChatToggleButton:RegisterForClicks("AnyDown") RightChatToggleButton:SetScript("OnClick", function(self, btn) if btn == "RightButton" then if E.db.addOnSkins.embed.rightChatPanel then if EMB.mainFrame:IsShown() then EMB.mainFrame:Hide() else EMB.mainFrame:Show() end end else rightChatToggleOnClickOriginal(self, btn) end EMB:UpdateSwitchButton() end) RightChatToggleButton:HookScript("OnEnter", function() if E.db.addOnSkins.embed.rightChatPanel then GameTooltip:AddDoubleLine(L["Right Click:"], L["Toggle Embedded Addon"], 1, 1, 1) GameTooltip:Show() EMB:UpdateSwitchButton() end end) local leftChatToggleOnClickOriginal = LeftChatToggleButton:GetScript("OnClick") LeftChatToggleButton:RegisterForClicks("AnyDown") LeftChatToggleButton:SetScript("OnClick", function(self, btn) if btn == "RightButton" then if not E.db.addOnSkins.embed.rightChatPanel then if EMB.mainFrame:IsShown() then EMB.mainFrame:Hide() else EMB.mainFrame:Show() end end else leftChatToggleOnClickOriginal(self, btn) end EMB:UpdateSwitchButton() end) LeftChatToggleButton:HookScript("OnEnter", function() if not E.db.addOnSkins.embed.rightChatPanel then GameTooltip:AddDoubleLine(L["Right Click:"], L["Toggle Embedded Addon"], 1, 1, 1) GameTooltip:Show() EMB:UpdateSwitchButton() end end) end function EMB:WindowResize() if not self.embedCreated then return end local db = E.db.addOnSkins.embed local SPACING = E.Border + E.Spacing local chatPanel = db.rightChatPanel and RightChatPanel or LeftChatPanel local chatTab = db.rightChatPanel and RightChatTab or LeftChatTab local chatData = db.rightChatPanel and RightChatDataPanel or LeftChatToggleButton local topRight = chatData == RightChatDataPanel and (E.db.datatexts.rightChatPanel and "TOPLEFT" or "BOTTOMLEFT") or chatData == LeftChatToggleButton and (E.db.datatexts.leftChatPanel and "TOPLEFT" or "BOTTOMLEFT") local yOffset = (chatData == RightChatDataPanel and E.db.datatexts.rightChatPanel and SPACING) or (chatData == LeftChatToggleButton and E.db.datatexts.leftChatPanel and SPACING) or 0 local xOffset = (E.db.chat.panelBackdrop == "RIGHT" and db.rightChatPanel and 0) or (E.db.chat.panelBackdrop == "LEFT" and not db.rightChatPanel and 0) or (E.db.chat.panelBackdrop == "SHOWBOTH" and 0) or E.Border*3 - E.Spacing local isDouble = db.embedType == "DOUBLE" self.mainFrame:SetParent(chatPanel) self.mainFrame:ClearAllPoints() self.mainFrame:Point("BOTTOMLEFT", chatData, topRight, 0, yOffset) self.mainFrame:Point("TOPRIGHT", chatTab, db.belowTopTab and "BOTTOMRIGHT" or "TOPRIGHT", xOffset, db.belowTopTab and -SPACING or 0) if isDouble then self.leftFrame:ClearAllPoints() self.leftFrame:Point("TOPLEFT", self.mainFrame) self.leftFrame:Point("BOTTOMRIGHT", self.mainFrame, "BOTTOMRIGHT", -(self.mainFrame:GetWidth() - db.leftWindowWidth + SPACING), 0) self.rightFrame:ClearAllPoints() self.rightFrame:Point("TOPLEFT", self.leftFrame, "TOPRIGHT", SPACING, 0) self.rightFrame:Point("BOTTOMRIGHT", self.mainFrame) else self.leftFrame:ClearAllPoints() self.leftFrame:Point("TOPLEFT", self.mainFrame) self.leftFrame:Point("BOTTOMRIGHT", self.mainFrame) end self:UpdateSwitchButton() if IsAddOnLoaded("ElvUI_Config") then E.Options.args.addOnSkins.args.embed.args.leftWindowWidth.min = floor(chatPanel:GetWidth() * .25) E.Options.args.addOnSkins.args.embed.args.leftWindowWidth.max = floor(chatPanel:GetWidth() * .75) end end function EMB:UpdateSwitchButton() local db = E.db.addOnSkins.embed local chatPanel = db.rightChatPanel and RightChatPanel or LeftChatPanel local chatTab = db.rightChatPanel and RightChatTab or LeftChatTab local isDouble = db.embedType == "DOUBLE" self.switchButton:SetParent(chatPanel) if db.belowTopTab and chatPanel:IsShown() then self.switchButton:Show() self.switchButton.text:SetText(isDouble and db.leftWindow.." / "..db.rightWindow or db.leftWindow) self.switchButton:ClearAllPoints() if E.Chat.RightChatWindowID and _G["ChatFrame"..E.Chat.RightChatWindowID.."Tab"]:IsVisible() then self.switchButton:Point("LEFT", _G["ChatFrame"..E.Chat.RightChatWindowID.."Tab"], "RIGHT", 0, 0) else self.switchButton:Point(db.rightChatPanel and "LEFT" or "RIGHT", chatTab, 5, 4) end elseif self.switchButton:IsShown() then self.switchButton:Hide() end end function EMB:EmbedCreate() if self.embedCreated then return end self.mainFrame = CreateFrame("Frame", "ElvUI_AddOnSkins_Embed_MainWindow", UIParent) self.leftFrame = CreateFrame("Frame", "ElvUI_AddOnSkins_Embed_LeftWindow", self.mainFrame) self.rightFrame = CreateFrame("Frame", "ElvUI_AddOnSkins_Embed_RightWindow", self.mainFrame) self.switchButton = CreateFrame("Button", "ElvUI_AddOnSkins_Embed_SwitchButton", UIParent) self.switchButton:Size(120, 32) self.switchButton:RegisterForClicks("AnyUp") self.switchButton.text = self.switchButton:CreateFontString(nil, "OVERLAY") self.switchButton.text:FontTemplate(E.LSM:Fetch("font", E.db.chat.tabFont), E.db.chat.tabFontSize, E.db.chat.tabFontOutline) self.switchButton.text:SetTextColor(unpack(E["media"].rgbvaluecolor)) self.switchButton.text:SetPoint("LEFT", 16, -5) self.switchButton:SetScript("OnClick", function(self, button) if EMB.mainFrame:IsShown() then EMB.mainFrame:Hide() self:SetAlpha(0.6) else EMB.mainFrame:Show() self:SetAlpha(1) end EMB:UpdateSwitchButton() end) self.switchButton:SetScript("OnMouseDown", function(self) self.text:Point("LEFT", 18, -7) end) self.switchButton:SetScript("OnMouseUp", function(self) self.text:Point("LEFT", 16, -5) end) self.mainFrame:SetScript("OnShow", function() EMB:EmbedShow() end) self.mainFrame:SetScript("OnHide", function() EMB:EmbedHide() end) self.embedCreated = true self:SetHooks() self:ToggleChatFrame(false) self:EmbedUpdate() end if AS:IsAddonLODorEnabled("Recount") then function EMB:EmbedRecount() local parent = self.leftFrame if E.db.addOnSkins.embed.embedType == "DOUBLE" then parent = E.db.addOnSkins.embed.rightWindow == "Recount" and self.rightFrame or self.leftFrame end parent.frameName = "Recount_MainWindow" Recount_MainWindow:SetParent(parent) Recount_MainWindow:ClearAllPoints() Recount_MainWindow:SetPoint("TOPLEFT", parent, "TOPLEFT", E.PixelMode and -1 or 0, E.PixelMode and 8 or 7) Recount_MainWindow:SetPoint("BOTTOMRIGHT", parent, "BOTTOMRIGHT", E.PixelMode and 1 or 0, E.PixelMode and -1 or 0) Recount.db.profile.Locked = true Recount.db.profile.Scaling = 1 Recount.db.profile.ClampToScreen = true Recount.db.profile.FrameStrata = "2-LOW" Recount:SetStrataAndClamp() Recount:LockWindows(true) Recount_MainWindow:StartSizing("BOTTOMLEFT") Recount_MainWindow:StopMovingOrSizing() Recount:ResizeMainWindow() end end if AS:IsAddonLODorEnabled("Omen") then function EMB:EmbedOmen() local parent = self.leftFrame if E.db.addOnSkins.embed.embedType == "DOUBLE" then parent = E.db.addOnSkins.embed.rightWindow == "Omen" and self.rightFrame or self.leftFrame end parent.frameName = "OmenAnchor" local db = Omen.db db.profile.Scale = 1 db.profile.Bar.Spacing = 1 db.profile.Background.EdgeSize = 1 db.profile.Background.BarInset = 1 -- db.profile.TitleBar.Height = 22 db.profile.TitleBar.UseSameBG = true db.profile.ShowWith.UseShowWith = false db.profile.Locked = true db.profile.TitleBar.ShowTitleBar = true db.profile.FrameStrata = "2-LOW" OmenAnchor:SetParent(parent) OmenAnchor:ClearAllPoints() OmenAnchor:SetAllPoints() if not self.omenHooked then hooksecurefunc(Omen, "SetAnchors", function(self, useDB) if useDB then self.Anchor:SetParent(parent) self.Anchor:SetInside(parent, 0, 0) end end) self.omenHooked = true end Omen:UpdateBackdrop() end end if AS:IsAddonLODorEnabled("Skada") then EMB.skadaWindows = {} local function EmbedWindow(window, width, height, point, relativeFrame, relativePoint, ofsx, ofsy) if not window then return end local barmod = Skada.displays["bar"] window.db.barwidth = width window.db.spark = false window.db.barslocked = true window.db.enablebackground = true window.bargroup:SetParent(relativeFrame) window.bargroup:SetFrameStrata("LOW") if Skada.revisited then local offsety = window.db.reversegrowth and -E.Border or E.Border window.db.scale = 1 window.db.background.height = height - (E.Border * 2) window.bargroup.ClearAllPoints = nil window.bargroup:ClearAllPoints() window.bargroup.ClearAllPoints = E.noop window.bargroup.SetPoint = nil window.bargroup:SetPoint(point, relativeFrame, relativePoint, ofsx, -offsety) window.bargroup.SetPoint = E.noop if window.bargroup.backdrop then window.bargroup.backdrop:SetFrameStrata("LOW") window.bargroup.backdrop:SetFrameLevel(window.bargroup:GetFrameLevel() - 1) end else window.db.background.height = height - (window.db.enabletitle and window.db.barheight or -(E.Border + E.Spacing)) - (E.Border + E.Spacing) window.db.enablebackground = true window.bargroup:ClearAllPoints() window.bargroup:SetPoint(point, relativeFrame, relativePoint, ofsx, window.db.reversegrowth and ofsy or -ofsy) window.bargroup.bgframe:SetFrameStrata("LOW") window.bargroup.bgframe:SetFrameLevel(window.bargroup:GetFrameLevel() - 1) end barmod.ApplySettings(barmod, window) if Skada.revisited then window:Toggle() end end function EMB:EmbedSkada() wipe(self.skadaWindows) for _, window in ipairs(Skada:GetWindows()) do tinsert(self.skadaWindows, window) end local db = E.db.addOnSkins.embed local numberToEmbed = 0 if db.embedType == "SINGLE" then numberToEmbed = 1 elseif db.embedType == "DOUBLE" then if db.rightWindow == "Skada" then numberToEmbed = numberToEmbed + 1 end if db.leftWindow == "Skada" then numberToEmbed = numberToEmbed + 1 end end local point if numberToEmbed == 1 then local parent = self.leftFrame if db.embedType == "DOUBLE" then parent = db.rightWindow == "Skada" and self.rightFrame or self.leftFrame end point = self.skadaWindows[1].db.reversegrowth and "BOTTOMLEFT" or "TOPLEFT" EmbedWindow(self.skadaWindows[1], parent:GetWidth() -(E.Border*2), parent:GetHeight(), point, parent, point, E.Border, E.Border) elseif numberToEmbed == 2 then point = self.skadaWindows[1].db.reversegrowth and "BOTTOMLEFT" or "TOPLEFT" EmbedWindow(self.skadaWindows[1], self.leftFrame:GetWidth() -(E.Border*2), self.leftFrame:GetHeight(), point, self.leftFrame, point, E.Border, E.Border) if not self.skadaWindows[2] then E:Print("Please Create Skada Windows 2") return end point = self.skadaWindows[2].db.reversegrowth and "BOTTOMRIGHT" or "TOPRIGHT" EmbedWindow(self.skadaWindows[2], self.rightFrame:GetWidth() -(E.Border*2), self.rightFrame:GetHeight(), point, self.rightFrame, point, -E.Border, E.Border) end end end if AS:IsAddonLODorEnabled("Details") then local Details = _G._details or _G._detalhes local numberToEmbed = 0 EMB.DetailsInstances = {} local listener = Details:CreateEventListener() listener:RegisterEvent("DETAILS_INSTANCE_OPEN") listener:RegisterEvent("DETAILS_INSTANCE_CLOSE") function listener:OnDetailsEvent(event, instance) if event == "DETAILS_INSTANCE_CLOSE" then if instance._ElvUIEmbed and _G.DetailsOptionsWindow and _G.DetailsOptionsWindow:IsShown() then Details:Msg("You just closed a window Embed on ElvUI, if wasn't intended click on Reopen.") --> need localization end elseif event == "DETAILS_INSTANCE_OPEN" then if instance._ElvUIEmbed then if #EMB.DetailsInstances >= 2 then EMB.DetailsInstances[1]:UngroupInstance() EMB.DetailsInstances[2]:UngroupInstance() EMB.DetailsInstances[1].baseframe:ClearAllPoints() EMB.DetailsInstances[2].baseframe:ClearAllPoints() EMB.DetailsInstances[1]:RestoreMainWindowPosition() EMB.DetailsInstances[2]:RestoreMainWindowPosition() end end end end local function EmbedWindow(window, width, height, point, relativeFrame, relativePoint, ofsx, ofsy) if not window then return end if not window:IsEnabled() then window:EnableInstance() end window._ElvUIEmbed = true if window.bars_grow_direction == 2 then ofsy = -2 else ofsy = -20 end window:UngroupInstance() window.baseframe:ClearAllPoints() window.baseframe:SetParent(relativeFrame) window.baseframe:SetFrameStrata(relativeFrame:GetFrameStrata()) window.baseframe:SetFrameLevel(relativeFrame:GetFrameLevel()) ofsx = ofsx - 1 if window.show_statusbar then height = height - 13 end window:SetSize(width, height - 20) window.baseframe:SetPoint(point, relativeFrame, relativePoint, ofsx, ofsy) window:SaveMainWindowPosition() window:RestoreMainWindowPosition() window:LockInstance(true) if window:GetId() == 1 then DetailsRowFrame1:SetParent(DetailsBaseFrame1) DetailsRowFrame1:SetFrameLevel(DetailsBaseFrame1:GetFrameLevel() + 1) elseif window:GetId() == 2 then DetailsRowFrame2:SetParent(DetailsBaseFrame2) DetailsRowFrame2:SetFrameLevel(DetailsBaseFrame2:GetFrameLevel() + 1) end if window:GetSegment() ~= 0 then window:SetDisplay(0) end end function EMB:EmbedDetails() wipe(self.DetailsInstances) for _, instance in Details:ListInstances() do tinsert(self.DetailsInstances, instance) end local db = E.db.addOnSkins.embed numberToEmbed = 0 if db.embedType == "SINGLE" then numberToEmbed = 1 end if db.embedType == "DOUBLE" then if db.rightWindow == "Details" then numberToEmbed = numberToEmbed + 1 end if db.leftWindow == "Details" then numberToEmbed = numberToEmbed + 1 end end if Details:GetMaxInstancesAmount() < numberToEmbed then Details:SetMaxInstancesAmount(numberToEmbed) end local instances_amount = Details:GetNumInstancesAmount() for i = instances_amount + 1, numberToEmbed do local new_instance = Details:CreateInstance(i) if type(new_instance) == "table" then tinsert(self.DetailsInstances, new_instance) end end if numberToEmbed == 1 then local parent = self.leftFrame if db.embedType == "DOUBLE" then parent = db.rightWindow == "Details" and self.rightFrame or self.leftFrame end EmbedWindow(self.DetailsInstances[1], parent:GetWidth() - (E.Border*2), parent:GetHeight(), "TOPLEFT", parent, "TOPLEFT", 2, 0) if self.DetailsInstances[2] then self.DetailsInstances[2]._ElvUIEmbed = nil end elseif numberToEmbed == 2 then EmbedWindow(self.DetailsInstances[1], self.leftFrame:GetWidth() - (E.Border*2), self.leftFrame:GetHeight(), "TOPLEFT", self.leftFrame, "TOPLEFT", E.Border, E.Border) EmbedWindow(self.DetailsInstances[2], self.rightFrame:GetWidth() - (E.Border*2), self.rightFrame:GetHeight(), "TOPRIGHT", self.rightFrame, "TOPRIGHT", -E.Border, E.Border) end end end function EMB:Initialize() if E.db.addOnSkins.embed.embedType == "DISABLE" then return end self:EmbedCreate() end local function InitializeCallback() EMB:Initialize() end E:RegisterModule(EMB:GetName(), InitializeCallback)