Quantcast

chat vanishing fix revised

Steven Jackson [07-13-15 - 01:02]
chat vanishing fix revised
Filename
SVUI_!Core/system/dock.lua
SVUI_Chat/SVUI_Chat.lua
diff --git a/SVUI_!Core/system/dock.lua b/SVUI_!Core/system/dock.lua
index f14327a..c10a9b4 100644
--- a/SVUI_!Core/system/dock.lua
+++ b/SVUI_!Core/system/dock.lua
@@ -252,6 +252,28 @@ local function SaveCurrentDimensions(button)
 	end
 end

+local function LoadSavedDimensions(button)
+	local saved = MOD.private.Dimensions[button:GetName()];
+	if(saved and (type(saved) == "string") and (saved ~= 'TBD')) then
+		local anchor1, anchorParent, anchor2, xPos, yPos, width, height = split("|", saved)
+		button:ClearAllPoints()
+		button:SetPoint(anchor1, anchorParent, anchor2, xPos, yPos)
+
+		local frame = button.FrameLink;
+		if(frame) then
+			frame:ClearAllPoints();
+			frame:SetPoint("BOTTOMLEFT", button, "TOPLEFT", -3, 6);
+			if((not width) or (not height)) then
+				width, height = frame:GetSize()
+			end
+			frame:SetSize(width, height)
+			if(frame.UpdateBackdrop) then
+				frame:UpdateBackdrop()
+			end
+		end
+	end
+end
+
 local function ScreenBorderVisibility()
 	if SV.db.Dock.bottomPanel then
 		SVUIDock_BottomBorder:Show()
@@ -455,6 +477,7 @@ CORE FUNCTIONS
 ]]--
 _G.ToggleSuperDockLeft = function(self, button)
 	GameTooltip:Hide()
+	local activeDock = MOD.private.Active.BottomLeft
 	if(button and IsAltKeyDown()) then
 		SV:StaticPopup_Show('RESETDOCKS_CHECK')
 	elseif(button and button == 'RightButton') then
@@ -474,19 +497,19 @@ _G.ToggleSuperDockLeft = function(self, button)
 		end
 		MOD.BottomLeft.Bar:Update()
 		MOD:UpdateDockBackdrops()
-		SV.Events:Trigger("DOCK_EXPANDED", "BottomLeft");
+		SV.Events:Trigger("DOCK_EXPANDED", "BottomLeft", activeDock);
 	else
 		if MOD.private.LeftFaded then
 			MOD.private.LeftFaded = nil;
 			MOD.BottomLeft:FadeIn(0.2, MOD.BottomLeft:GetAlpha(), 1)
 			MOD.BottomLeft.Bar:FadeIn(0.2, MOD.BottomLeft.Bar:GetAlpha(), 1)
-			SV.Events:Trigger("DOCK_FADE_IN", "BottomLeft");
+			SV.Events:Trigger("DOCK_FADE_IN", "BottomLeft", activeDock);
 			PlaySoundFile([[sound\doodad\be_scryingorb_explode.ogg]])
 		else
 			MOD.private.LeftFaded = true;
 			MOD.BottomLeft:FadeOut(0.2, MOD.BottomLeft:GetAlpha(), 0)
 			MOD.BottomLeft.Bar:FadeOut(0.2, MOD.BottomLeft.Bar:GetAlpha(), 0)
-			SV.Events:Trigger("DOCK_FADE_OUT", "BottomLeft");
+			SV.Events:Trigger("DOCK_FADE_OUT", "BottomLeft", activeDock);
 			PlaySoundFile([[sound\doodad\be_scryingorb_explode.ogg]])
 		end
 	end
@@ -494,6 +517,7 @@ end

 _G.ToggleSuperDockRight = function(self, button)
 	GameTooltip:Hide()
+	local activeDock = MOD.private.Active.BottomRight
 	if(button and IsAltKeyDown()) then
 		SV:StaticPopup_Show('RESETDOCKS_CHECK')
 	elseif(button and button == 'RightButton') then
@@ -513,19 +537,19 @@ _G.ToggleSuperDockRight = function(self, button)
 		end
 		MOD.BottomRight.Bar:Update()
 		MOD:UpdateDockBackdrops()
-		SV.Events:Trigger("DOCK_EXPANDED", "BottomRight");
+		SV.Events:Trigger("DOCK_EXPANDED", "BottomRight", activeDock);
 	else
 		if MOD.private.RightFaded then
 			MOD.private.RightFaded = nil;
 			MOD.BottomRight:FadeIn(0.2, MOD.BottomRight:GetAlpha(), 1)
 			MOD.BottomRight.Bar:FadeIn(0.2, MOD.BottomRight.Bar:GetAlpha(), 1)
-			SV.Events:Trigger("DOCK_FADE_IN", "BottomRight");
+			SV.Events:Trigger("DOCK_FADE_IN", "BottomRight", activeDock);
 			PlaySoundFile([[sound\doodad\be_scryingorb_explode.ogg]])
 		else
 			MOD.private.RightFaded = true;
 			MOD.BottomRight:FadeOut(0.2, MOD.BottomRight:GetAlpha(), 0)
 			MOD.BottomRight.Bar:FadeOut(0.2, MOD.BottomRight.Bar:GetAlpha(), 0)
-			SV.Events:Trigger("DOCK_FADE_OUT", "BottomRight");
+			SV.Events:Trigger("DOCK_FADE_OUT", "BottomRight", activeDock);
 			PlaySoundFile([[sound\doodad\be_scryingorb_explode.ogg]])
 		end
 	end
@@ -538,10 +562,10 @@ _G.ToggleSuperDocks = function()
 		MOD.private.RightFaded = nil;
 		MOD.BottomLeft:FadeIn(0.2, MOD.BottomLeft:GetAlpha(), 1)
 		MOD.BottomLeft.Bar:FadeIn(0.2, MOD.BottomLeft.Bar:GetAlpha(), 1)
-		SV.Events:Trigger("DOCK_FADE_IN", "BottomLeft");
+		SV.Events:Trigger("DOCK_FADE_IN", "BottomLeft", MOD.private.Active.BottomLeft);
 		MOD.BottomRight:FadeIn(0.2, MOD.BottomRight:GetAlpha(), 1)
 		MOD.BottomRight.Bar:FadeIn(0.2, MOD.BottomRight.Bar:GetAlpha(), 1)
-		SV.Events:Trigger("DOCK_FADE_IN", "BottomRight");
+		SV.Events:Trigger("DOCK_FADE_IN", "BottomRight", MOD.private.Active.BottomRight);
 		PlaySoundFile([[sound\doodad\be_scryingorb_explode.ogg]])
 	else
 		MOD.private.AllFaded = true;
@@ -561,12 +585,12 @@ function MOD:EnterFade()
 	if MOD.private.LeftFaded then
 		self.BottomLeft:FadeIn(0.2, self.BottomLeft:GetAlpha(), 1)
 		self.BottomLeft.Bar:FadeIn(0.2, self.BottomLeft.Bar:GetAlpha(), 1)
-		SV.Events:Trigger("DOCK_FADE_IN", "BottomLeft");
+		SV.Events:Trigger("DOCK_FADE_IN", "BottomLeft", MOD.private.Active.BottomLeft);
 	end
 	if MOD.private.RightFaded then
 		self.BottomRight:FadeIn(0.2, self.BottomRight:GetAlpha(), 1)
 		self.BottomRight.Bar:FadeIn(0.2, self.BottomRight.Bar:GetAlpha(), 1)
-		SV.Events:Trigger("DOCK_FADE_IN", "BottomRight");
+		SV.Events:Trigger("DOCK_FADE_IN", "BottomRight", MOD.private.Active.BottomRight);
 	end
 end

@@ -743,6 +767,7 @@ end

 local function ShowDockletWindow(button, location)
 	if((not button) or (not button.FrameLink)) then return end
+	--print(button:GetName())
 	local window = button.FrameLink
 	window:FadeIn(0.1, 0, 1)
 	if(not InCombatLockdown()) then	window:SetFrameLevel(5) end
@@ -774,6 +799,7 @@ local function ResetAllDockletWindows(dockbar, button)
 	if(button and button.GetName) then
 		currentButton = button:GetName()
 	end
+	--print('ResetAllDockletWindows: ' .. currentButton)
 	for nextName,nextButton in pairs(buttonList) do
 		if(nextName ~= currentButton) then
 			if(nextButton.FrameLink) then
@@ -1105,6 +1131,27 @@ local function UpdateAllLayouts()
 	end
 end

+local function SetFloatingDock(dock)
+	local name = dock:GetName();
+	dock:SetDocked(false);
+	dock:Show();
+	MOD.private.Locations[name] = "Floating";
+	dock.isFloating = true;
+	SaveCurrentPosition(dock);
+	if(ShowDockletWindow(dock, "Floating")) then
+		ActivateDockletButton(dock);
+	end
+	if(dock.FrameLink) then
+		dock.FrameLink:ClearAllPoints();
+		dock.FrameLink:SetPoint("BOTTOMLEFT", dock, "TOPLEFT", -3, 6);
+		dock.FrameLink:SetResizable(true);
+		dock.FrameLink:Show();
+		dock.FrameLink.resize:Show();
+	end
+	LoadSavedDimensions(dock);
+	UpdateAllLayouts()
+end
+
 local DockButton_OnDragStart = function(self)
 	if(IsShiftKeyDown() and (not InCombatLockdown())) then
 		GameTooltip:Hide();
@@ -1128,24 +1175,9 @@ local DockButton_OnDragStop = function(self)
 	local previous = MOD.private.Locations[name];
 	self.OrderIndex = 0;
 	if((not DRAG_TARGETBAR) and self.CanFloat) then
-		print(name .. ' Floating')
-		self:SetDocked(false);
-		self:Show();
-		MOD.private.Locations[name] = "Floating";
-		self.isFloating = true;
-		SaveCurrentPosition(self);
-		if(ShowDockletWindow(self, "Floating")) then
-			ActivateDockletButton(self);
-		end
-		if(self.FrameLink) then
-			self.FrameLink:ClearAllPoints();
-			self.FrameLink:SetPoint("BOTTOMLEFT", self, "TOPLEFT", -3, 6);
-			self.FrameLink:SetResizable(true);
-			self.FrameLink.resize:Show();
-		end
-		UpdateAllLayouts()
+		SetFloatingDock(self)
 	else
-		print(name .. ' Docked')
+		--print(name .. ' Docked')
 		local target = DRAG_TARGETBAR;
 		if(not target) then
 			target = MOD[previous];
@@ -1274,6 +1306,7 @@ local DockButton_SetDocked = function(self, attach)
 	local name = self:GetName()
 	local lastKnownLocation = MOD.private.Disabled[name];
 	if((not self.Parent) and (not lastKnownLocation)) then return end
+	local lookup = MOD.private.Locations[name];
 	local parent = self.Parent;
 	if(attach) then
 		if(lastKnownLocation and MOD[lastKnownLocation]) then
@@ -1282,10 +1315,12 @@ local DockButton_SetDocked = function(self, attach)
 		MOD.private.Disabled[name] = nil;
 		if(not parent.Add) then return end
 		parent:Add(self)
+		if(lookup and (lookup == "Floating")) then
+			SetFloatingDock(self);
+		end
 		--print(name .. ' Added')
 	else
 		--print('DockButton_SetDocked REMOVE '..name)
-		local lookup = MOD.private.Locations[name];
 		if(lookup and (lookup == "Floating")) then
 			self.OrderIndex = 0;
 			self:Hide();
@@ -1575,6 +1610,9 @@ local DockletResize_OnMouseUp = function(self)
 	self.parent:ClearAllPoints()
 	self.parent:SetPoint("BOTTOMLEFT", self.parent.Button, "TOPLEFT", -3, 6)
 	SaveCurrentDimensions(self.parent.Button);
+	if(self.parent.PostResizeCallback) then
+		self.parent.PostResizeCallback(self.parent);
+	end
 end

 local Docklet_SetClickCallbacks = function(self, ...)
@@ -1599,13 +1637,16 @@ local Docklet_IsEnabled = function(self)
 	return result;
 end

-local Docklet_SetVisibilityCallbacks = function(self, onshow, onhide)
+local Docklet_SetVisibilityCallbacks = function(self, onshow, onhide, onsize)
 	if(onshow and (type(onshow) == 'function')) then
 		self.PostShowCallback = onshow;
 	end
 	if(onhide and (type(onhide) == 'function')) then
 		self.PostHideCallback = onhide;
 	end
+	if(onsize and (type(onsize) == 'function')) then
+		self.PostResizeCallback = onsize;
+	end
 end

 function MOD:NewDocklet(location, globalName, readableName, texture, onenter)
@@ -1667,6 +1708,8 @@ function MOD:NewDocklet(location, globalName, readableName, texture, onenter)
 	frame.resize:SetScript("OnMouseDown", DockletResize_OnMouseDown);
 	frame.resize:SetScript("OnMouseUp", DockletResize_OnMouseUp);

+	LoadSavedDimensions(frame.Button);
+
 	return frame
 end
 --[[
@@ -1793,25 +1836,7 @@ local function LoadAllDocklets()
 			button:Show();

 			if(MOD.private.Dimensions) then
-				local saved = MOD.private.Dimensions[name];
-				if(saved and (type(saved) == "string") and (saved ~= 'TBD')) then
-					local anchor1, anchorParent, anchor2, xPos, yPos, width, height = split("|", saved)
-					button:ClearAllPoints()
-					button:SetPoint(anchor1, anchorParent, anchor2, xPos, yPos)
-
-					local frame = button.FrameLink;
-					if(frame) then
-						frame:ClearAllPoints();
-						frame:SetPoint("BOTTOMLEFT", button, "TOPLEFT", -3, 6);
-						if((not width) or (not height)) then
-							width, height = frame:GetSize()
-						end
-						frame:SetSize(width, height)
-						if(frame.UpdateBackdrop) then
-							frame:UpdateBackdrop()
-						end
-					end
-				end
+				LoadSavedDimensions(button);
 			end

 			if(ShowDockletWindow(button, location)) then
diff --git a/SVUI_Chat/SVUI_Chat.lua b/SVUI_Chat/SVUI_Chat.lua
index 9e6c7a6..c4708be 100644
--- a/SVUI_Chat/SVUI_Chat.lua
+++ b/SVUI_Chat/SVUI_Chat.lua
@@ -469,6 +469,7 @@ end

 function MOD:FadeLines(frame)
 	--print('Fading Lines for '..frame:GetName())
+	if(frame.___isFaded) then return end
 	for i = select("#", frame:GetRegions()), 1, -1 do
 		local region = select(i, frame:GetRegions())
 		if region:GetObjectType() == "FontString" then
@@ -673,20 +674,28 @@ do

 	local ChatDock_HideCallback = function(self)
 		--print('ChatDock_HideCallback ' .. self:GetName())
+		--print('ChatDock_HideCallback: ' .. self.Button:GetName())
 		local chat = self.Owner;
 		MOD:FadeLines(chat)
 		chat:FadeOut(0.2, chat:GetAlpha(), 0, true)
-		--chat:ForceHide(true)
+		chat:ForceHide(true)
 	end

 	local ChatDock_ShowCallback = function(self)
 		--print('ChatDock_ShowCallback ' .. self:GetName())
 		local chat = self.Owner;
 		MOD:ShowLines(chat)
-		--chat:ForceHide(false)
+		chat:ForceHide(false)
 		chat:FadeIn(0.2, chat:GetAlpha(), 1)
 	end

+	local ChatDock_ResizeCallback = function(self)
+		local chat = self.Owner;
+		chat:ClearAllPoints();
+		chat:SetAllPoints(self);
+		--chat:SetSize(self:GetSize());
+	end
+
 	local ChatDock_LeftClickCallback = function(self,button)
 		local chatTab = self.link
 		local chatFrame = _G[("ChatFrame%d"):format(chatTab:GetID())];
@@ -751,12 +760,12 @@ do
 					tinsert(t, { text = RENAME_CHAT_WINDOW, func = function() CURRENT_CHAT_FRAME_ID = chatID; FCF_RenameChatWindow_Popup(); end });
 					tinsert(t, { text = CHAT_CONFIGURATION, func = function() CURRENT_CHAT_FRAME_ID = chatID; ShowUIPanel(ChatConfigFrame); end });
 				end
-				tinsert(t, { text = CLOSE_CHAT_WINDOW, func = function() CURRENT_CHAT_FRAME_ID = chatID; MOD:CloseChatWindow(); end });
+				tinsert(t, { text = CLOSE_CHAT_WINDOW, func = function() CURRENT_CHAT_FRAME_ID = chatID; FCF_Close(); end });
 				return t;
 			end
 		end

-		chat.Dock:SetVisibilityCallbacks(ChatDock_ShowCallback, ChatDock_HideCallback);
+		chat.Dock:SetVisibilityCallbacks(ChatDock_ShowCallback, ChatDock_HideCallback, ChatDock_ResizeCallback);
 		chat.Dock:SetClickCallbacks(ChatDock_LeftClickCallback, false, ChatDock_ExtendedOptions);
 		-------------------------------------------
 		SV:FontManager(chat, "chatdialog", "LEFT")
@@ -778,7 +787,7 @@ do

 		chat:RemoveTextures(true)
 		chat:SetBackdropColor(0,0,0,0)
-		chat:SetBackdropBorderColor(0,0,0,0)
+		chat:SetBackdropBorderColor(1,0,0,1)

 		_G[chatName.."ButtonFrame"]:Die()
 		-------------------------------------------
@@ -952,13 +961,16 @@ do
 	end

 	local _forced_SetPoint = function(self, a1, p, a2, x, y)
-		if((a1 ~= 'CENTER') or (a2 ~= 'CENTER') or (x ~= 0) or (y ~= 0)) then
+		if(not self.Dock) then return end
+		if((a1 ~= 'LEFT') or (a2 ~= 'LEFT') or (x ~= 0) or (y ~= 0)) then
 			self:ClearAllPoints()
-			self:SetPoint('CENTER', p, 'CENTER', 0, 0)
+			self:SetPoint('LEFT', p, 'LEFT', 0, 0)
+			self:SetSize(self.Dock:GetSize());
 		end
 	end

-	function MOD:RefreshChatFrames(forced)
+	function MOD:RefreshChatFrames(event, forced)
+		--print(event)
 		if ((not forced) and (refreshLocked and (IsMouseButtonDown("LeftButton") or InCombatLockdown()))) then return; end

 		for i,name in pairs(CHAT_FRAMES) do
@@ -978,7 +990,7 @@ do
 			    tile = false,
 			    tileSize = 0,
 			    edgeFile = [[Interface\AddOns\SVUI_!Core\assets\textures\EMPTY]],
-			    edgeSize = 0,
+			    edgeSize = 1,
 			    insets =
 			    {
 			        left = 0,
@@ -991,10 +1003,19 @@ do
 			chat:SetBackdropBorderColor(0,0,0,0);

 			chat:ClearAllPoints();
-			chat:SetPoint("CENTER", chat.Dock, "CENTER", 0, 0);
-			chat:SetSize(CHAT_WIDTH - 4, CHAT_HEIGHT - 4);
+			chat:SetAllPoints(chat.Dock);
+			-- chat:SetPoint("TOPLEFT", chat.Dock, "TOPLEFT", 0, 0);
+			-- chat:SetPoint("BOTTOMLEFT", chat.Dock, "BOTTOMLEFT", 0, 0);
+			-- chat:SetPoint("TOPRIGHT", chat.Dock, "TOPRIGHT", 0, 0);
+			-- chat:SetPoint("BOTTOMRIGHT", chat.Dock, "BOTTOMRIGHT", 0, 0);
+			--chat:SetSize(CHAT_WIDTH - 4, CHAT_HEIGHT - 4);

-			FCF_SavePositionAndDimensions(chat)
+			--FCF_SavePositionAndDimensions(chat)
+
+			--/svdf ChatFrame11
+			--/svdf SVUI_ChatFrameDock11
+			-- /script ChatFrame11:ClearAllPoints();
+			-- /script ChatFrame11:WrapPoints(SVUI_ChatFrameDock11,10,10);

 			--tab.Holder.CanFloat = true;
 			--tabText:Hide()
@@ -1011,7 +1032,7 @@ do
 			end

 			if(not chat.hookedHyperLinks) then
-				NewHook(chat, "SetPoint", _forced_SetPoint)
+				--NewHook(chat, "SetPoint", _forced_SetPoint)
 				chat:HookScript('OnHyperlinkEnter', _hook_OnHyperlinkEnter)
 				chat:HookScript('OnHyperlinkLeave', _hook_OnHyperlinkLeave)
 				chat:HookScript('OnMessageScrollChanged', _hook_OnMessageScrollChanged)
@@ -1022,14 +1043,22 @@ do
 			end

 			chat.isDocked = nil;
+			chat.hasBeenFaded = nil;
 			chat.isUninteractable = true;
-			FCF_SetLocked(chat, true);
+			SetChatWindowLocked(i, true);
 			chat.oldAlpha = 0;
-			FCF_FadeInChatFrame(chat);
+			--FCF_FadeInChatFrame(chat);
 			local dockingKey = chat.Dock:GetName()
-			chat.Dock.Button:SetDocked(MOD.private.activeTabs[dockingKey])
 			SetChatWindowUninteractable(i, false)
+			chat.Dock.Button:SetDocked(MOD.private.activeTabs[dockingKey])
 		end
+
+		-- for name,isset in pairs(MOD.private.activeTabs) do
+		-- 	if(not _G[name]) then
+		-- 		MOD.private.activeTabs[name] = nil
+		-- 	end
+		-- end
+
 		refreshLocked = true
 	end
 end
@@ -1076,17 +1105,11 @@ local function OpenNewSVUIChatFrame(newname)
 			SetChatWindowShown(i, true);

 			-- Dock the frame by default
-			FCF_DockFrame(chatFrame, (#FCFDock_GetChatFrames(GENERAL_CHAT_DOCK)+1), true);
-			FCF_FadeInChatFrame(FCFDock_GetSelectedWindow(GENERAL_CHAT_DOCK));
+			-- FCF_DockFrame(chatFrame, (#FCFDock_GetChatFrames(GENERAL_CHAT_DOCK)+1), true);
+			-- FCF_FadeInChatFrame(FCFDock_GetSelectedWindow(GENERAL_CHAT_DOCK));

-			chatFrame.isDocked = nil;
-			chatFrame.isUninteractable = true;
-
-			FCF_CopyChatSettings(chatFrame, DEFAULT_CHAT_FRAME);
-			chatFrame.Dock:UpdateBackdrop()
+			--FCF_CopyChatSettings(chatFrame, DEFAULT_CHAT_FRAME);
 			MOD.private.activeTabs[key] = true
-			-- print('OpenNewSVUIChatFrame '..newname)
-			chatFrame.Dock:SetDocked(true)

 			MOD.RefreshChatFrames()
 			return;
@@ -1094,18 +1117,6 @@ local function OpenNewSVUIChatFrame(newname)
 	end
 end

-function MOD:CloseChatWindow()
-	local chatFrame = _G["ChatFrame" .. CURRENT_CHAT_FRAME_ID]
-	if(chatFrame) then
-		if(chatFrame.Dock) then
-			local key = format("SVUI_ChatFrameDock%d", chatFrame:GetID())
-			chatFrame.Dock:SetDocked(false)
-			MOD.private.activeTabs[key] = nil;
-		end
-		FCF_Close(chatFrame)
-	end
-end
-
 function MOD:ResetChatWindows()
 	wipe(MOD.private.activeTabs);

@@ -1377,7 +1388,7 @@ function MOD:PET_BATTLE_CLOSE()
 		local chat = _G[frameName]
 		if chat and _G[frameName.."Tab"]:GetText():match(PET_BATTLE_COMBAT_LOG) then
 			CURRENT_CHAT_FRAME_ID = chat:GetID();
-			MOD:CloseChatWindow();
+			FCF_Close();
 		end
 	end
 end
@@ -1472,8 +1483,11 @@ do
 	end

 	local _hook_FCF_Close = function(self)
-		if((not self) or (not self.Dock)) then return end
-		self.Dock:SetDocked(false)
+		local chatFrame = self or _G["ChatFrame" .. CURRENT_CHAT_FRAME_ID]
+		if((not chatFrame) or (not chatFrame.Dock)) then return end
+		local key = format("SVUI_ChatFrameDock%d", chatFrame:GetID())
+		chatFrame.Dock:SetDocked(false)
+		MOD.private.activeTabs[key] = nil;
 	end

 	local _hook_FCF_Tab_OnClick = function(self)
@@ -1484,25 +1498,50 @@ do

 	local _hook_FCF_OpenTemporaryWindow = function(chatType, chatTarget, sourceChatFrame, selectWindow)
 		--print('_hook_FCF_OpenTemporaryWindow')
-		local chatFrame, chatID;
 		for id, chatFrameName in pairs(CHAT_FRAMES) do
 			local frame = _G[chatFrameName];
-			if ( frame.isTemporary ) then
-				chatFrame = frame;
-				chatID = id;
-				local key = format("SVUI_ChatFrameDock%d", chatID)
-				MOD.private.activeTabs[key] = true
+			local key = format("SVUI_ChatFrameDock%d", id)
+			if ( frame.isTemporary and (not MOD.private.activeTabs[key]) ) then
+				MOD.private.activeTabs[key] = true;
+				if(frame.Dock) then
+					frame.oldAlpha = 0;
+					frame.Dock:UpdateBackdrop();
+					frame:ClearAllPoints();
+					frame:SetAllPoints(frame.Dock);
+				end;
 				break;
 			end
 		end
+		MOD.RefreshChatFrames();
+		--print(chatFrame:GetName())
+	end

-		if(chatFrame) then
-			chatFrame.oldAlpha = 0;
-			chatFrame.Dock:UpdateBackdrop();
-			chatFrame.Dock:SetDocked(true);
-			MOD.RefreshChatFrames();
+	local _hook_FCF_DockFrame = function()
+		--print('_hook_FCF_DockFrame')
+		MOD.RefreshChatFrames();
+	end
+
+	local _hook_FCF_FadeInChatFrame = function(chat)
+		chat:ForceHide(false)
+	end
+
+	local _hook_FCF_FadeOutChatFrame = function(chat)
+		chat:ForceHide(true)
+	end
+
+	_G.FCFDock_UpdateTabs = function(dock, forceUpdate)
+		if ( not dock.isDirty and not forceUpdate ) then
+			return;
 		end
-		--print(chatFrame:GetName())
+
+		for index, chatFrame in ipairs(dock.DOCKED_CHAT_FRAMES) do
+			local chatTab = _G[chatFrame:GetName().."Tab"];
+			chatTab:Show();
+		end
+
+		dock.isDirty = false;
+
+		return FCFDock_ScrollToSelectedTab(dock);
 	end

 	function SetAllChatHooks()
@@ -1517,10 +1556,14 @@ do
 		NewHook(GeneralDockManager, 'SetPoint', _hook_GDMFrameSetPoint)
 		NewHook(GeneralDockManagerScrollFrame, 'SetPoint', _hook_GDMScrollSetPoint)
 		--NewHook("FCF_SetWindowColor", _hook_FCF_SetWindowColor)
-		--NewHook("FCF_SetWindowAlpha", OpenNewSVUIChatFrame)
+		--NewHook("FCFDock_UpdateTabs", function() print('FCFDock_UpdateTabs') end)

 		NewHook("FCF_Close", _hook_FCF_Close)
 		NewHook("ChatEdit_UpdateHeader", _hook_OnUpdateHeader)
+
+		-- TESTING
+		--NewHook("FCF_FadeInChatFrame", _hook_FCF_FadeInChatFrame)
+		--NewHook("FCF_FadeOutChatFrame", _hook_FCF_FadeOutChatFrame)
 	end
 end

@@ -1561,10 +1604,6 @@ function MOD:UpdateLocals()
 	end
 end

-local function ProxyExpand()
-	MOD:RefreshChatFrames(true);
-end
-
 local function ExpandChatDock(location)
 	if(not location) then return end
 	local needsUpdate = false;
@@ -1574,21 +1613,25 @@ local function ExpandChatDock(location)
 			needsUpdate = true;
 		end
 	end
-	if(needsUpdate) then SV.Timers:ExecuteTimer(ProxyExpand, 0.1); end
+	if(needsUpdate) then SV.Timers:ExecuteTimer(MOD.RefreshChatFrames, 0.1); end
 end

-local function DockFadeInChat(location)
+local function DockFadeInChat(location, default)
+	--print('DockFadeInChat ' .. location)
 	if(not location) then return end
 	for _, name in pairs(CHAT_FRAMES) do
 		local chat = _G[name];
 		if(chat and (location == chat.Dock.Parent.Bar.Data.Location)) then
-			MOD:ShowLines(chat)
-			chat:FadeIn(0.2, chat:GetAlpha(), 1)
+			if(chat.Dock and (default == chat.Dock.Button:GetName())) then
+				MOD:ShowLines(chat)
+				chat:FadeIn(0.2, chat:GetAlpha(), 1)
+			end
 		end
 	end
 end

 local function DockFadeOutChat(location)
+	--print('DockFadeOutChat ' .. location)
 	if(not location) then return end
 	for _, name in pairs(CHAT_FRAMES) do
 		local chat = _G[name];
@@ -1600,7 +1643,7 @@ local function DockFadeOutChat(location)
 end

 function MOD:ReLoad()
-	self:RefreshChatFrames(true)
+	self:RefreshChatFrames('RELOAD', true)
 end

 function MOD:Load()
@@ -1640,7 +1683,7 @@ function MOD:Load()
 		end
 	end

-	self:RefreshChatFrames(true)
+	self:RefreshChatFrames('LOAD', true)
 	SetParseHandlers()

 	_G.CombatLogQuickButtonFrame_Custom:SetParent(ChatFrame2.Dock)