Quantcast

- Add back Global as Synch All

urnati [12-01-25 - 19:49]
- Add back Global as Synch All
- Fix Titan Config > Plugins Show / Hide
- Code cleanup
Filename
Titan/Titan.lua
Titan/TitanConfig.lua
Titan/TitanTemplate.lua
Titan/TitanUtils.lua
Titan/TitanVariables.lua
Titan/_TitanIDE.lua
diff --git a/Titan/Titan.lua b/Titan/Titan.lua
index d355eba..17ca730 100644
--- a/Titan/Titan.lua
+++ b/Titan/Titan.lua
@@ -366,7 +366,7 @@ function TitanPanel_PlayerEnteringWorld(reload)
 	-- This will set the bar(s) and enabled plugins (via OnShow).
 	Titan_Debug.Out('titan', 'p_e_w', "Synch plugin saved vars")

-	Titan_Debug.Out('titan', 'p_e_w', "Synch plugin saved vars")
+	Titan_Debug.Out('titan', 'p_e_w', "Set up player")
 	TitanVariables_UseSettings(nil, TitanUtils_GetPlayer(), TITAN_PROFILE_INIT)

 	Titan_Debug.Out('titan', 'p_e_w', "Init config data (right click menu)")
@@ -1371,7 +1371,7 @@ end
 ---Titan Force all plugins created from LDB addons, visible or not, to be on the right side of the Titan bar.
 --- Any visible plugin will be forced to the right side on the same bar it is currently on.
 function TitanPanelBarButton_ForceLDBLaunchersRight()
-	local plugin = {}
+	local plugin --= {}
 	for index, id in pairs(TitanPluginsIndex) do
 		plugin = TitanUtils_GetPlugin(id);
 		if plugin and plugin.ldb == "launcher"
@@ -1970,7 +1970,7 @@ local function BuildMainMenu(frame)
 	end
 	TitanPanelRightClickMenu_AddButton(info);

-	local res = TitanUtils_GetProfile()
+	local res = TitanVariables_GetProfile(TitanUtils_GetPlayer())
 	info = {};
 	info.notCheckable = true
 	info.text = res.cname
diff --git a/Titan/TitanConfig.lua b/Titan/TitanConfig.lua
index e9237d9..ef5799d 100644
--- a/Titan/TitanConfig.lua
+++ b/Titan/TitanConfig.lua
@@ -996,7 +996,7 @@ local function UpdateConfigAddons()
 							local name = info[1]
 							if v then -- Show / add
 								local bar = (TitanGetVar(name, "ForceBar") or TitanUtils_PickBar())
-								if type(bar) == string then -- sanity and IDE
+								if type(bar) == 'string' then -- sanity and IDE
 									---@diagnostic disable-next-line: param-type-mismatch
 									TitanUtils_AddButtonOnBar(bar, name)
 								end
@@ -1327,18 +1327,37 @@ local optionsChars = {
 	args = {}
 }

+local function SummaryText(profile)
+	local res = ""
+
+	if profile.ptype  == Titan_Global.profile.GLOBAL then
+		res = L["TITAN_PANEL_GLOBAL"].." : "..profile.cname
+	elseif profile.ptype  == Titan_Global.profile.SYNC then
+		res = L["TITAN_PANEL_MENU_PROFILE_SYNC"].." : "..profile.cname
+	elseif profile.ptype  == Titan_Global.profile.TOON then
+		res = L["TITAN_PANEL_MENU_PROFILE_CHARS"].." : "..Titan_Global.profile.NONE
+	else
+		res = "?".." : "..Titan_Global.profile.NONE
+	end
+
+	return res
+end
+
+-- These are here so the config function can see them (not sure this works...).
+local players = {} -- used for left side list of profiles
+local p_info  = {} -- used to hold info about each toon in players
+local p_sync  = {} -- profiles used as Sync
+
 ---Allow the user to load / delete / reset / sync profile data
 local function TitanUpdateChars()
-	local players = {} -- used for left side list of profiles
-	local p_info  = {} -- used to hold info about each toon in players
-	local p_sync  = {} -- profiles used as Sync
+	players = {} -- used for left side list of profiles
+	p_info  = {} -- used to hold info about each toon in players
+	p_sync  = {} -- profiles used as Sync

 	-- Rip through the players (with server name) to sort them
 	for index, id in pairs(TitanSettings.Players) do
 		table.insert(players, index);

-		TitanUtil_CheckProfile(index) -- ensure valid sync
-
 		-- collect some info on THIS toon for the config
 		local this_toon = {}

@@ -1353,6 +1372,8 @@ local function TitanUpdateChars()
 		end

 		this_toon.name = index
+		this_toon.profile = TitanVariables_GetProfile(index)
+		this_toon.summary = SummaryText(this_toon.profile)
 		this_toon.is_player = (index == TitanUtils_GetPlayer())
 		this_toon.sync_set = not (id.Panel["SyncWithProfile"] == Titan_Global.profile.NONE)
 		this_toon.sync_name = id.Panel["SyncWithProfile"]
@@ -1365,6 +1386,7 @@ local function TitanUpdateChars()
 	--		return a < b
 	--	end)

+
 	-- set up the options for the user
 	local args = optionsChars.args

@@ -1389,6 +1411,9 @@ local function TitanUpdateChars()
 	for idx = 1, #players do
 		local this_toon = p_info[idx]
 		local position = 100
+		-- Check for global profile being set
+		local g_sync = (this_toon.profile.ptype == Titan_Global.profile.GLOBAL)
+
 		args[this_toon.name] = {
 			type = "group",
 			name = this_toon.fancy_name,
@@ -1415,7 +1440,9 @@ local function TitanUpdateChars()
 		}
 		position = position + 1
 		local l_reason = ""
-		if this_toon.is_player then
+		if g_sync then
+			l_reason = "Sync All set"
+		elseif this_toon.is_player then
 			l_reason = L["TITAN_PANEL_MENU_LOAD_SETTINGS_ERR1"]
 		else
 			l_reason = "."
@@ -1430,18 +1457,18 @@ local function TitanUpdateChars()
 				TitanVariables_UseSettings(info[1], TitanUtils_GetPlayer(), TITAN_PROFILE_USE)
 			end,
 			-- does not make sense to load current character profile
-			disabled = this_toon.is_player,
+			disabled = (this_toon.is_player or g_sync),
 		}
 		position = position + 1
 		local del_reason = ""
-		if p_sync[this_toon.name] then
+		if g_sync then
+			del_reason = "" -- set above
+		elseif p_sync[this_toon.name] then
 			del_reason = L["TITAN_PANEL_MENU_PROFILE_DELETE_SETTINGS_ERR1"]
 		elseif this_toon.is_player then
 			del_reason = L["TITAN_PANEL_MENU_PROFILE_DELETE_SETTINGS_ERR2"]
-			--		elseif this_toon.sync_set then
-			--			del_reason = "Delete not allowed, Sync is set."
 		else
-			del_reason = "."
+			del_reason = ""
 		end
 		p_args.optiondelete = {
 			name = L["TITAN_PANEL_MENU_PROFILE_DELETE_SETTINGS"],
@@ -1460,9 +1487,9 @@ local function TitanUpdateChars()
 				AceConfigRegistry:NotifyChange("Titan Panel Addon Chars")
 			end,
 			-- can not delete current character profile
-			disabled = this_toon.is_player
-				--				or this_toon.sync_set
-				or p_sync[this_toon.name],
+			disabled = (this_toon.is_player
+				or g_sync
+				or p_sync[this_toon.name]),
 		}
 		position = position + 1
 		p_args.sp_30 = {
@@ -1509,23 +1536,22 @@ local function TitanUpdateChars()
 					.. " " .. tostring(Titan_Global.profile.TOON) .. ""
 					.. " > '" .. tostring(info[1]) .. "'"
 					.. " : '" .. tostring(TITAN_PROFILE_RESET) .. "'"
-					.. " | '" .. tostring(this_toon.is_player) .. "'"
+--					.. " | '" .. tostring(p_info[info[1]].is_player) .. "'"

 				Titan_Debug.Out('titan', 'profile', str)

-				-- Reset the profile
-				TitanSettings.Players[info[1]] = nil
-
 				if this_toon.is_player then
 					-- Change over to new profile
-					TitanVariables_UseSettings(nil, TitanUtils_GetPlayer(), TITAN_PROFILE_USE)
+					TitanVariables_UseSettings(nil, TitanUtils_GetPlayer(), TITAN_PROFILE_RESET)
 				else
 					-- Not this toon. Next time user plays this toon it will reset
+					TitanSettings.Players[info[1]] = nil
 				end

 				TitanUpdateChars()
 				AceConfigRegistry:NotifyChange("Titan Panel Addon Chars")
 			end,
+			disabled = (g_sync),
 		}
 		position = position + 1
 		p_args.sp_39 = {
@@ -1543,7 +1569,9 @@ local function TitanUpdateChars()
 		}
 		position = position + 1
 		local s_reason = ""
-		if this_toon.sync_set then
+		if g_sync then
+			s_reason = "" -- set above
+		elseif this_toon.sync_set then
 			s_reason = L["TITAN_PANEL_MENU_PROFILE_SYNC_ERR1"]
 		elseif this_toon.is_player then
 			s_reason = L["TITAN_PANEL_MENU_PROFILE_SYNC_ERR2"]
@@ -1558,7 +1586,7 @@ local function TitanUpdateChars()
 			--width = "full",
 			func = function(info, v)
 				local str = ""
-				TitanUtils_SetProfile(TitanUtils_GetPlayer(), Titan_Global.profile.SYNC, info[1])
+				TitanVariables_SetProfile(TitanUtils_GetPlayer(), Titan_Global.profile.SYNC, info[1])
 				str = str
 					.. " " .. tostring(Titan_Global.profile.SYNC) .. ""
 					.. " > '" .. tostring(info[1]) .. "'"
@@ -1566,12 +1594,13 @@ local function TitanUpdateChars()

 				Titan_Debug.Out('titan', 'profile', str)
 				-- Change over to new profile
-				TitanVariables_UseSettings(nil, info[1], TITAN_PROFILE_USE)
+--				TitanVariables_UseSettings(nil, info[1], TITAN_PROFILE_USE)
+				TitanVariables_UseSettings(nil, TitanUtils_GetPlayer(), TITAN_PROFILE_USE)
 				TitanUpdateChars()
 				AceConfigRegistry:NotifyChange("Titan Panel Addon Chars")
 			end,
 			-- cannot sync to yourself or if sync already set
-			disabled = this_toon.is_player or this_toon.sync_set,
+			disabled = (this_toon.is_player or this_toon.sync_set or g_sync),
 		}
 		position = position + 1
 		p_args.sync_clear = {
@@ -1581,16 +1610,16 @@ local function TitanUpdateChars()
 			type = "execute",
 			func = function(info, v)
 				local str = ""
-				TitanUtils_SetProfile(info[1], Titan_Global.profile.SYNC, Titan_Global.profile.NONE)
+				TitanVariables_SetProfile(info[1], Titan_Global.profile.SYNC, Titan_Global.profile.NONE)
 				str = str
 					.. " " .. tostring(Titan_Global.profile.SYNC) .. ""
 					.. " > '" .. tostring(info[1]) .. "'"
 					.. " : '" .. tostring(Titan_Global.profile.NONE) .. "'"
-					.. " | '" .. tostring(this_toon.is_player) .. "'"
+					.. " | '" .. tostring(p_info[info[1]].is_player) .. "'"

 				Titan_Debug.Out('titan', 'profile', str)

-				if this_toon.is_player then
+				if p_info[info[1]].is_player then
 					-- Change over to new profile
 					TitanVariables_UseSettings(nil, TitanUtils_GetPlayer(), TITAN_PROFILE_USE)
 				else
@@ -1600,29 +1629,126 @@ local function TitanUpdateChars()
 				TitanUpdateChars()
 				AceConfigRegistry:NotifyChange("Titan Panel Addon Chars")
 			end,
-			disabled = (not this_toon.sync_set),
+			disabled = (not this_toon.sync_set) or g_sync,
 		}
 		position = position + 1
-		p_args.sp_50 = {
+		p_args[tostring(position)] = {
 			type = "description",
 			name = " "..TitanUtils_GetHexText(s_reason, Titan_Global.colors.orange).."\n",
 			cmdHidden = true,
 			order = position,
 		}
 		position = position + 1
-		p_args.sp_51 = {
+		p_args[tostring(position)] = {
+			type = "description",
+			name = " ",--..TitanUtils_GetHexText(cs_reason, Titan_Global.colors.orange).."\n",
+			cmdHidden = true,
+			order = position,
+		}
+
+		--====
+		--==== Global section
+		position = position + 1
+		p_args.sync_all_title = {
+			type = "header",
+			name = TitanUtils_GetGoldText("Global"),
+			cmdHidden = true,
+			order = position,
+		}
+		position = position + 1
+		p_args.sync_all_with = {
+			name = "Sync All", --L["TITAN_PANEL_MENU_PROFILE_SYNC"],
+			desc = "Sync every toon to this profile", --L["TITAN_PANEL_MENU_PROFILE_SYNC_DESC"],
+			order = position,
+			type = "execute",
+			--width = "full",
+			func = function(info, v)
+				local str = ""
+				TitanVariables_SetProfile(TitanUtils_GetPlayer(), Titan_Global.profile.GLOBAL, info[1])
+				str = str
+					.. " " .. tostring(Titan_Global.profile.GLOBAL) .. ""
+					.. " > '" .. tostring(info[1]) .. "'"
+					.. " : '" .. tostring(TITAN_PROFILE_USE) .. "'"
+
+				Titan_Debug.Out('titan', 'profile', str)
+				-- Change over to new profile
+				TitanVariables_UseSettings(nil, TitanUtils_GetPlayer(), TITAN_PROFILE_USE)
+				TitanUpdateChars()
+				AceConfigRegistry:NotifyChange("Titan Panel Addon Chars")
+			end,
+			-- Can allows set global sync
+			--disabled = this_toon.is_player or this_toon.sync_set,
+		}
+		position = position + 1
+		p_args.sync_all_clear = {
+			name = "Clear Sync All", --L["TITAN_PANEL_MENU_PROFILE_CLEAR_SYNC"],
+			desc = "Revert to each toon's settings", --L["TITAN_PANEL_MENU_PROFILE_CLEAR_SYNC_DESC"],
+			order = position,
+			type = "execute",
+			func = function(info, v)
+				local str = ""
+				TitanVariables_SetProfile(TitanUtils_GetPlayer(), Titan_Global.profile.GLOBAL, Titan_Global.profile.NONE)
+				str = str
+					.. " " .. tostring(Titan_Global.profile.GLOBAL) .. ""
+					.. " : '" .. tostring(Titan_Global.profile.NONE) .. "'"
+				Titan_Debug.Out('titan', 'profile', str)
+
+				-- Change over to new profile
+				TitanVariables_UseSettings(nil, TitanUtils_GetPlayer(), TITAN_PROFILE_USE)
+
+				TitanUpdateChars()
+				AceConfigRegistry:NotifyChange("Titan Panel Addon Chars")
+			end,
+			disabled = (not g_sync),
+		}
+		position = position + 1
+		p_args.reset_all_this = {
+			name = "Reset Global Profile", --L["TITAN_PANEL_MENU_PROFILE_RESET"], --
+			desc = "Reset Global Profile to Defaults", --L["TITAN_PANEL_MENU_PROFILE_RESET_DESC"],
+			order = position,
+			type = "execute",
+			--						width = "0.5",
+			func = function(info, v)
+				local g_name = TitanPanelGetVar("GlobalProfileName")
+				local str = ""
+				str = str
+					.. " " .. tostring(Titan_Global.profile.TOON) .. ""
+					.. " > '" .. tostring(info[1]) .. "'"
+					.. " : '" .. tostring(TITAN_PROFILE_RESET) .. "'"
+					.. " | '" .. tostring(g_name) .. "'"
+
+				Titan_Debug.Out('titan', 'profile', str)
+
+				-- Reset the global profile
+--				TitanSettings.Players[g_name] = nil
+
+				-- Change to new profile
+				TitanVariables_UseSettings(nil, TitanUtils_GetPlayer(), TITAN_PROFILE_RESET)
+
+				TitanUpdateChars()
+				AceConfigRegistry:NotifyChange("Titan Panel Addon Chars")
+			end,
+			disabled = (not g_sync),
+		}
+		--[[
+		position = position + 1
+		p_args[tostring(position)] = {
 			type = "description",
 			name = " ",--..TitanUtils_GetHexText(cs_reason, Titan_Global.colors.orange).."\n",
 			cmdHidden = true,
 			order = position,
 		}
+		--]]
 		position = position + 1
-		p_args.sp_60 = {
+		p_args[tostring(position)] = {
 			type = "description",
 			name = "",
 			cmdHidden = true,
 			order = position,
 		}
+
+		--====
+		--==== Summary section
 		position = position + 1
 		p_args.setting_title = {
 			type = "header",
@@ -1633,7 +1759,7 @@ local function TitanUpdateChars()
 		position = position + 1
 		p_args.setting_sync = {
 			type = "description",
-			name = L["TITAN_PANEL_MENU_PROFILE_SYNC"].." : " .. this_toon.sync_name,
+			name = this_toon.summary,
 			cmdHidden = true,
 			order = position,
 		}
@@ -3108,19 +3234,30 @@ local help_list_topics = {
 					"- Profiles are part of Titan saved vars which are saved to disk on logout or reload.",
 					" ",
 					"- Titan 9.* Changed from a Global profile to a Sync scheme for greater flexibility.",
-					"A Global profile can be done by syncing all toons with the same profile.",
+					"A Global profile can be done : ",
+					"-- 1) by using Sync All.",
+					"-- 2) by syncing all toons with the same profile.",
 				},
 			},
 			{
 				sub = "Sync a profile",
 				lines = {
 					"- You may Sync a profile or multiple profiles to a profile. When you sync a profile any changes to bars and plugins are made to the Sync profile.",
-					"- To Sync a profile use Titan > Config > Profiles Click. Then select the profile to use. Then click Sync.",
+					"- To Sync a profile use Titan > Config > Profiles . Then select the profile to use. Then click Sync.",
 					"  Now Titan changes will be made to the Sync profile. ",
 					"  The settings for the current toon will be saved and used when the Sync is cleared.",
 				},
 			},
 			{
+				sub = "Sync All a profile",
+				lines = {
+					"- You may Sync All profiles to a profile. When you sync a profile any changes to bars and plugins are made to the Sync profile.",
+					"- To Sync All profiles use Titan > Config > Profiles . Then select the profile to use. Then click Sync All.",
+					"  Now Titan changes will be made to the Sync All profile. ",
+					"  The settings for the current toon will be saved and used when the Sync All is cleared.",
+				},
+			},
+			{
 				sub = "Clear Sync a profile",
 				lines = {
 					"- You may Clear Sync (remove) the current Sync being used by a profile.",
diff --git a/Titan/TitanTemplate.lua b/Titan/TitanTemplate.lua
index 89fa340..594bf28 100644
--- a/Titan/TitanTemplate.lua
+++ b/Titan/TitanTemplate.lua
@@ -596,7 +596,6 @@ function TitanPanelButton_OnClick(self, button)
 			TitanUtils_CloseAllControlFrames();
 			TitanPanelRightClickMenu_Close();

-			--			local position = TitanUtils_GetWhichBar(id)
 			if (isControlFrameShown) then
 				-- Note: This uses anchor points to place the control frame relative to the plugin on the screen.
 				local parent = self:GetName() -- plugin with the control frame
diff --git a/Titan/TitanUtils.lua b/Titan/TitanUtils.lua
index b80c30d..ca8afa7 100644
--- a/Titan/TitanUtils.lua
+++ b/Titan/TitanUtils.lua
@@ -671,7 +671,7 @@ function TitanUtils_GetPlugin(id)
 end

 ---Titan Return the bar the plugin is shown on.
----@param id string?
+---@param id string
 ---@return string? ShortName
 ---@return string? LocaleName
 function TitanUtils_GetWhichBar(id)
@@ -734,7 +734,8 @@ but was removed during DragonFlight to give users more flexibility.
 		end
 	end

-	if TitanGetVar(id, "DisplayOnRightSide") then
+	-- tostring is for IDE - id nil then check would return false
+	if TitanGetVar(tostring(id), "DisplayOnRightSide") then
 		found = true
 	end

@@ -1169,7 +1170,7 @@ function TitanUtils_NumToString(amount, thousands_separator, decimal_separator)
 	Handle the general cases of converting any number to a string with separators for plugins.
 	Titan usage is , / . or . / , although this will handle other schemes.
 	NOTE: Currently only positive, whole numbers are passed in from Titan (no fractional or negative).
-	NOTE: If ampount is 100 trillion or more then return the string as is to avoid very messy strings.
+	NOTE: If amount is 100 trillion or more then return the string as is to avoid very messy strings.
 		This is the behavior of Lua tostring.
 	NOTE: Do not use separator directly in gsub - it could be a pattern special char, resulting in unexpected behavior!
 	--]=]
@@ -1178,7 +1179,8 @@ function TitanUtils_NumToString(amount, thousands_separator, decimal_separator)

 	if type(amount) == "number" then
 		-- Break number into segments - minus, integer, and fractional
-		local i, j, minus, int, fraction = 0, 0, "", "", ""
+		local i, j
+		local minus, int, fraction = "", "", ""
 		if amount > 99999999999999 then -- 1 trillion - 1
 			int = tostring(amount)
 			-- leave as is and, if gold, congratulate the player!!!
@@ -1726,8 +1728,8 @@ local function TitanUtils_GetPrevButtonOnBar(bar, id, side)
 end

 ---Titan Add the given plugin to the given bar. Then reinit the plugins to show it properly.
----@param bar string Bar name to use
----@param id string Plugin to add
+---@param bar string? Bar name to use
+---@param id string? Plugin to add
 function TitanUtils_AddButtonOnBar(bar, id)
 	local frame_str = TitanVariables_GetFrameName(bar)
 	-- Add the button to the requested bar, if shown
@@ -1776,18 +1778,22 @@ function TitanUtils_ShiftButtonOnBarLeft(name)
 	local bar = TitanUtils_GetWhichBar(name)
 	local to_idx = nil

-	-- buttons on Left are placed L to R;
-	-- buttons on Right are placed R to L
-	if side and side == TITAN_LEFT then
-		to_idx = TitanUtils_GetPrevButtonOnBar(TitanUtils_GetWhichBar(name), name, side)
-	elseif side and side == TITAN_RIGHT then
-		to_idx = TitanUtils_GetNextButtonOnBar(TitanUtils_GetWhichBar(name), name, side)
-	end
-
-	if to_idx then
-		TitanUtils_SwapButtonOnBar(from_idx, to_idx);
+	if bar == nil then
+		-- not on a bar, do nothing
 	else
-		return
+		-- buttons on Left are placed L to R;
+		-- buttons on Right are placed R to L
+		if side and side == TITAN_LEFT then
+			to_idx = TitanUtils_GetPrevButtonOnBar(bar, name, side)
+		elseif side and side == TITAN_RIGHT then
+			to_idx = TitanUtils_GetNextButtonOnBar(bar, name, side)
+		end
+
+		if to_idx then
+			TitanUtils_SwapButtonOnBar(from_idx, to_idx);
+		else
+			-- at 'end' of buttons
+		end
 	end
 end

@@ -1800,18 +1806,22 @@ function TitanUtils_ShiftButtonOnBarRight(name)
 	local side = TitanPanel_GetPluginSide(name)
 	local bar = TitanUtils_GetWhichBar(name)

-	-- buttons on Left are placed L to R;
-	-- buttons on Right are placed R to L
-	if side and side == TITAN_LEFT then
-		to_idx = TitanUtils_GetNextButtonOnBar(bar, name, side)
-	elseif side and side == TITAN_RIGHT then
-		to_idx = TitanUtils_GetPrevButtonOnBar(bar, name, side)
-	end
-
-	if to_idx then
-		TitanUtils_SwapButtonOnBar(from_idx, to_idx);
+	if bar == nil then
+		-- not on a bar, do nothing
 	else
-		return
+		-- buttons on Left are placed L to R;
+		-- buttons on Right are placed R to L
+		if side and side == TITAN_LEFT then
+			to_idx = TitanUtils_GetNextButtonOnBar(bar, name, side)
+		elseif side and side == TITAN_RIGHT then
+			to_idx = TitanUtils_GetPrevButtonOnBar(bar, name, side)
+		end
+
+		if to_idx then
+			TitanUtils_SwapButtonOnBar(from_idx, to_idx);
+		else
+			-- at 'end' of buttons
+		end
 	end
 end

@@ -2495,13 +2505,15 @@ end
 ---@return string server_name or ""
 function TitanUtils_GetPlayer()
 	local playerName = UnitName("player");
-	local serverName = GetRealmName();
+	local serverName = GetRealmName()
 	local toon = "<>"

 	if (playerName == nil
 			or serverName == nil
 			or playerName == UKNOWNBEING) then
 		-- Do nothing if player name is not available
+		playerName = ""
+		serverName = ""
 	else
 		toon = playerName .. TITAN_AT .. serverName
 	end
@@ -2549,101 +2561,7 @@ function TitanUtils_ScreenSize()
 	return screen
 end

---====== Profile specifc routines
-
----Check the given profile ensuring any profile pointed to exists
----@param profile string
-function TitanUtil_CheckProfile(profile)
-	local str = "_CheckProfile [" .. tostring(profile) .. "]"
-
-	local sync = TitanSettings.Players[profile].Panel["SyncWithProfile"]
-	--	local play = TitanUtils_GetPlayer()
-
-	-- see if sync is set
-	str = str .. " s'" .. sync .. "'"
-	if (sync == Titan_Global.profile.NONE) then
-		-- Nothing to do
-	else
-		if TitanSettings.Players[profile] then
-			-- Nothing to do
-		else
-			-- Need to clear, the profile is not known...
-			TitanSettings.Players[profile].Panel["SyncWithProfile"] = Titan_Global.profile.NONE
-		end
-	end
-	str = str .. " > '" .. TitanSettings.Players[profile].Panel["SyncWithProfile"] .. "'"
-
-	Titan_Debug.Out('titan', 'profile', str)
-end
-
----@class Get_Profile_Result
----@field ptype string Type of profile being used
----@field pname string Name of profile being used
----@field cname string Name of profile being used color coded
----@field glob string Value of global profile
----@field sync string Value of sync profile
-
----Get the current profile per user settings with type and color-code version
----@param get_me? string
----@return table result Profile info
-function TitanUtils_GetProfile(get_me)
-	local ptype = ""
-	local profile = ""
-	local cprofile = ""
-	local res = {}
-
-	-- Used by config for loolup and Titan for current toon
-	if get_me == nil then
-		get_me = TitanUtils_GetPlayer()
-	end
-
-	local sync = TitanSettings.Players[get_me].Panel["SyncWithProfile"]
-	local play = get_me --TitanUtils_GetPlayer()
-
-	-- see if sync is set
-	if (sync == Titan_Global.profile.NONE) then
-		-- Use the current player
-		ptype = Titan_Global.profile.TOON
-		profile = play
-		cprofile = TitanUtils_GetHexText(profile, Titan_Global.colors.gold)
-	else
-		-- use the sync as set
-		ptype = Titan_Global.profile.SYNC
-		profile = sync
-		cprofile = TitanUtils_GetHexText(profile, Titan_Global.colors.green)
-	end
-
-	local str = "_GetProfile"
-		.. " " .. tostring(ptype) .. ""
-		.. " '" .. tostring(cprofile) .. "'"
-		.. " s'" .. tostring(sync) .. "'"
-		.. " t'" .. tostring(play) .. "'"
-	Titan_Debug.Out('titan', 'profile', str)
-
-	res.ptype = ptype
-	res.pname = profile
-	res.cname = cprofile
-	res.sync = sync
-	return res
-end
-
----Set the profile per user settings
----@param set_me? string
----@param ptype string
----@param to_profile string
-function TitanUtils_SetProfile(set_me, ptype, to_profile)
-	local str = "_SetProfile"
-		.. " [" .. tostring(set_me) .. "]"
-		.. " " .. tostring(ptype) .. ""
-		.. " to '" .. tostring(to_profile) .. "'"
-	Titan_Debug.Out('titan', 'profile', str)
-
-	if ptype == Titan_Global.profile.SYNC then
-		TitanSettings.Players[set_me].Panel["SyncWithProfile"] = to_profile
-	else
-		-- just current toon
-	end
-end
+--====== Export / Import specifc routines

 local function TrimString(string)
 	local from = string:match "^%s*()"
@@ -2666,7 +2584,7 @@ local function CopyToCompress(t1, t2)
 	return t1
 end

----Compress and serialize arbitrary data into a string
+---Titan Compress and serialize arbitrary data into a string
 ---@param data any
 ---@param dataType string print | comm
 ---@return string compressed could be ""
@@ -2696,7 +2614,7 @@ function TitanUtils_CompressData(data, dataType)
 	return ""
 end

----Decompress and unserialize a string into the Lua data it represents
+---Titan Decompress and unserialize a string into the Lua data it represents
 ---@param data any
 ---@param dataType string print | comm
 ---@return boolean
@@ -2854,10 +2772,9 @@ end
 ---Titan: Output the current list of registered plugins.
 function TitanDumpPluginList()
 	-- Just dump the current list of plugins
-	local plug_in = {}
 	for idx, value in pairs(TitanPluginsIndex) do
-		plug_in = TitanUtils_GetPlugin(TitanPluginsIndex[idx])
-		if plug_in then
+		local plug_in = TitanUtils_GetPlugin(TitanPluginsIndex[idx])
+		if type(plug_in) == 'table' then
 			TitanDebug("TitanDumpPluginList "
 				.. "'" .. tostring(idx) .. "'"
 				.. ": '" .. tostring(plug_in.id) .. "'"
diff --git a/Titan/TitanVariables.lua b/Titan/TitanVariables.lua
index 0cd7c74..16c518f 100644
--- a/Titan/TitanVariables.lua
+++ b/Titan/TitanVariables.lua
@@ -990,6 +990,141 @@ local function Check_Titan_settings()
 	end
 end

+---local Check the given profile ensuring any profile pointed to exists;
+--- This updates ONLY profile settings
+---@param profile string
+local function TitanVariables_ValidateProfile(profile)
+	local toon = profile --
+	if toon == nil then -- sanity check to return something valid
+		toon = TitanUtils_GetPlayer()
+	end
+
+	local glob = (TitanAllGetVar("GlobalProfileUse") == true)
+	local sync = TitanSettings.Players[toon].Panel["SyncWithProfile"]
+
+	local gcheck = ""
+	local scheck = ""
+
+	local str = "_ValidateProfile [" .. tostring(profile) .. "]"
+	str = str
+		.. " > '" .. tostring(toon) .. "'"
+		.. " g'" .. tostring(glob) .. "'"
+		.. " s'" .. tostring(sync) .. "'"
+	Titan_Debug.Out('titan', 'profile', str)
+	--
+	-- Validate profile against settings
+
+	-- First Global
+	if glob then
+		gcheck = TitanAllGetVar("GlobalProfileName")
+		if TitanSettings.Players[gcheck] then
+			-- Referenced profile exists
+		else
+			-- Need to clear, the profile is not known...
+			TitanAllSetVar("GlobalProfileUse", false)
+			glob = false
+		end
+	else
+		-- not global
+	end
+
+	-- Second Sync
+	-- Checking this separately ensures profile settings in saved vars stays consistent when a user
+	-- mixes global and sync over time.
+	if not (sync == Titan_Global.profile.NONE) then
+		scheck = TitanSettings.Players[toon].Panel["SyncWithProfile"]
+		if TitanSettings.Players[scheck].Panel then
+			-- Referenced profile exists
+		else
+			-- Need to clear, the profile is not known...
+			TitanSettings.Players[toon].Panel["SyncWithProfile"] = Titan_Global.profile.NONE
+			sync = Titan_Global.profile.NONE
+		end
+	else
+		-- not sync
+	end
+
+	-- Third Toon
+	-- The PEW process Titan will ensure the toon is whole
+
+	str = "..._ValidateProfile [" .. tostring(toon) .. "]"
+		.. "g [" .. tostring(gcheck) .. "] > "
+		.. " '" .. tostring(glob) .. "'"
+		.. "s [" .. tostring(scheck) .. "] > "
+		.. " '" .. tostring(sync) .. "'"
+	Titan_Debug.Out('titan', 'profile', str)
+end
+
+---Titan Get the current profile per user settings with type and color-code version;
+--- Priority is Global; Sync; current toon
+---@param get_me string
+---@return Get_Profile_Result res Profile info
+function TitanVariables_GetProfile(get_me)
+	local ptype = ""
+	local profile = ""
+	local cprofile = ""
+	local res = {}
+	local toon = get_me --
+
+	local glob = (TitanAllGetVar("GlobalProfileUse") == true)
+	local sync = TitanSettings.Players[toon].Panel["SyncWithProfile"]
+
+	--
+	-- Gather profile data per settings
+	if glob then
+		-- Use the global toon user as set
+		ptype = Titan_Global.profile.GLOBAL
+		profile = TitanAllGetVar("GlobalProfileName")
+		cprofile = TitanUtils_GetHexText(profile, Titan_Global.colors.orange)
+	elseif (sync == Titan_Global.profile.NONE) then
+		-- Use the current player
+		ptype = Titan_Global.profile.TOON
+		profile = toon
+		cprofile = TitanUtils_GetHexText(profile, Titan_Global.colors.gold)
+	else
+		-- use the sync as set
+		ptype = Titan_Global.profile.SYNC
+		profile = sync
+		cprofile = TitanUtils_GetHexText(profile, Titan_Global.colors.green)
+	end
+
+	local str = "_GetProfile"
+		.. " " .. tostring(ptype) .. ""
+		.. " '" .. tostring(cprofile) .. "'"
+		.. " g'" .. tostring(glob) .. "'"
+		.. " s'" .. tostring(sync) .. "'"
+		.. " t'" .. tostring(toon) .. "'"
+	Titan_Debug.Out('titan', 'profile', str)
+
+	res.ptype = ptype
+	res.pname = profile
+	res.cname = cprofile
+--	res.sync = sync
+	return res
+end
+
+---Titan Set the profile per user settings
+---@param set_me? string Profile to set / update
+---@param ptype string Type of profile being set: Global | Sync | Toon
+---@param to_profile string Profile to use
+function TitanVariables_SetProfile(set_me, ptype, to_profile)
+	local str = "_SetProfile"
+		.. " [" .. tostring(set_me) .. "]"
+		.. " " .. tostring(ptype) .. ""
+		.. " to '" .. tostring(to_profile) .. "'"
+	Titan_Debug.Out('titan', 'profile', str)
+
+	-- Nov 2025 : The change to Sync only touched a nerve :); adding back Global override...
+	if ptype == Titan_Global.profile.GLOBAL then
+		TitanAllSetVar("GlobalProfileUse", true)
+		TitanAllSetVar("GlobalProfileName", to_profile)
+	elseif ptype == Titan_Global.profile.SYNC then
+		TitanSettings.Players[set_me].Panel["SyncWithProfile"] = to_profile
+	else
+		-- just current toon
+	end
+end
+
 --- Ensure the given toon is ready to accept profile values; sync to defaults
 ---@param toon string Toon name <name>@<server>
 ---@param toon_table table From TitanSettings (saved vars)
@@ -1180,6 +1315,9 @@ function TitanVariables_InitTitanSettings()
 		-- New Oct 2025 : All toons instead of current toon (Init_player_settings)
 		Titan_Debug.Out('titan', 'profile', "Sync " .. idx .. " toon defaults (Panel)(BarVars)")
 		Check_toon_settings(idx, v)
+
+		-- Ensure profile vars are proper
+		TitanVariables_ValidateProfile(idx)
 	end
 	table.sort(Titan_Global.players, function(a, b)
 		return a < b
@@ -1234,10 +1372,10 @@ function TitanVariables_GetBarPos(frame_str)
 end

 ---Titan Build the frame name from the bar name
----@param bar_str string Short bar name
+---@param bar_str string? Short bar name
 ---@return string is_icon Bar frame name
 function TitanVariables_GetFrameName(bar_str)
-	return TITAN_PANEL_DISPLAY_PREFIX .. bar_str
+	return tostring(TITAN_PANEL_DISPLAY_PREFIX) .. bar_str
 end

 ---local Original : lua-users.org/wiki/CopyTable
@@ -1338,18 +1476,7 @@ local function Init_player_settings(from_profile, to_profile, action)

 			-- Get the profile Bar data...
 			TitanSettings.Players[to_profile]["BarVars"] = deepcopy(old_player["BarVars"])
-			--[[
-			if Titan_Global.titan.profile then
-				-- Apply the new bar positions
-				for idx, v in pairs(TitanBarData) do
-					local str = "BarVars "
-						.. " " .. tostring(v.name) .. ""
-						.. " " .. tostring(TitanSettings.Players[from_profile]["BarVars"][idx].show) .. ""
-						.. " " .. tostring(TitanSettings.Players[to_profile]["BarVars"][idx].show) .. ""
-			Titan_Debug.Out('titan', 'profile', str)
-				end
-			end
---]]
+
 			-- Copy the panel settings
 			for index, id in pairs(old_panel) do
 				TitanPanelSetVar(index, old_panel[index]);
@@ -1542,26 +1669,6 @@ function TitanVariables_SetPanelStrata(value)
 	end
 end

-local function Check_sync_profile(profile)
-	local str = "" -- for debug output if requested
-	local from_profile = nil
-	-- Assuming the var is set per prior init routines!!
-	local sync = TitanSettings.Players[profile].Panel.SyncWithProfile
-
-	if sync == Titan_Global.profile.NONE then
-		from_profile = profile -- no sync, use given profile
-	else
-		from_profile = sync -- use the sync profile, not the one passed
-	end
-
-	str = "_sync_profile"
-		.. " " .. tostring(profile) .. ""
-		.. " >> '" .. tostring(from_profile) .. "'"
-	Titan_Debug.Out('titan', 'profile', str)
-
-	return from_profile
-end
-
 ---Titan Set the Titan variables and plugin variables to the passed in profile.
 --- Called from the Titan right click menu
 --- profile is compared using 'lower' so the case does not matter
@@ -1572,10 +1679,10 @@ function TitanVariables_UseSettings(from, profile, action)
 	local str = "" -- for debug output if requested
 	local _ = nil -- for scope; do not care about this value

-	-- Oct 2025 :
-	-- Added 'from' to be explicit when needing a source profile
-	-- profile param is now required and represents the target profile
-	-- The target profile could be overridden by 'sync with' feature
+	-- Oct and Dec 2025 :
+	-- Added 'from' to be explicit when Load of a source profile
+	-- Profile param is now required - usually current player
+	-- The target profile could be overridden per global or sync featuresettings

 	local from_profile = from

@@ -1585,13 +1692,15 @@ function TitanVariables_UseSettings(from, profile, action)
 		.. " > '" .. tostring(profile) .. "'"
 	Titan_Debug.Out('titan', 'profile', str)

-	-- ==== Determine the profile to use based on action
-
+	-- ==== Determine the profile to use based on profile settings
+	local profile_info = TitanVariables_GetProfile(profile)
+	local profile_name = profile_info.pname
+--[[
 	-- User setting 'sync with' will cause profile to change to the user selected sync.
 	if action == TITAN_PROFILE_USE then
 		-- Will copy profile to current toon
 		-- Assumed to be NOT nil!
-		profile = Check_sync_profile(profile)
+		profile = profile_name
 	elseif action == TITAN_PROFILE_RESET then
 		-- Nuke given profile to defaults
 		-- Reset will clear global for ALL toons
@@ -1609,18 +1718,18 @@ function TitanVariables_UseSettings(from, profile, action)
 		Titan_Debug.Out('titan', 'profile', str)
 		profile = Check_sync_profile(profile)
 	end
-
+--]]
 	-- Find the profile in a case insensitive manner
 	local new_profile = ""
-	profile = string.lower(profile)
+	profile_name = string.lower(profile_name)
 	for index, id in pairs(TitanSettings.Players) do
-		if profile == string.lower(index) then
+		if profile_name == string.lower(index) then
 			new_profile = index
 		end
 	end
 	if new_profile == "" then
 		-- new toon to Titan; needs to be created
-		new_profile = TitanUtils_GetPlayer() --TitanSettings.Player
+		new_profile = TitanUtils_GetPlayer()
 		action = TITAN_PROFILE_RESET
 	end

diff --git a/Titan/_TitanIDE.lua b/Titan/_TitanIDE.lua
index 9a231df..97ddd06 100644
--- a/Titan/_TitanIDE.lua
+++ b/Titan/_TitanIDE.lua
@@ -149,8 +149,9 @@ C_Bank = {} -- 11.0.0 New Warbank - Hopefully WoW API extension will catch up so

 --====== Convince IDE we know what we are doing
 -- Lua allows table updates but the IDE complains about 'injecting' a field it does not know about.
--- Adding a function or variable to a frame in this case.

+
+--====== Adding a function or variable to a frame in this case.
 ---@class UIParent WoW frame
 ---@field GetScale function WoW region routine

@@ -182,6 +183,14 @@ C_Bank = {} -- 11.0.0 New Warbank - Hopefully WoW API extension will catch up so
 ---@field short_name string Placeholder for short bar name
 ---@field RegisterForClicks function Variable params missed by VS Code plugin

+--====== Profile output from Utils
+---@class Get_Profile_Result
+---@field ptype string Type of profile being used
+---@field pname string Name of profile being used
+---@field cname string Name of profile being used color coded
+---@field glob string Value of global profile
+---@field sync string Value of sync profile
+
 --====== Ace Drop down menu
 L_UIDROPDOWNMENU_MENU_LEVEL = 1
 L_UIDROPDOWNMENU_MENU_VALUE = 1