---@diagnostic disable: duplicate-set-field --[[ -- ************************************************************************** -- * TitanLocation.lua -- * -- * 2023 Dec : Merged with Classic versions. Classic map does not include -- * the quest log so the placement of coord on the map, if selected, is a -- * bit more work. -- * -- * By: The Titan Panel Development Team -- ************************************************************************** --]] -- ******************************** Constants ******************************* local _G = getfenv(0); local TITAN_LOCATION_ID = "Location"; local TITAN_BUTTON = "TitanPanel" .. TITAN_LOCATION_ID .. "Button" local TITAN_MAP_FRAME = "TitanMapFrame" local TITAN_LOCATION_VERSION = TITAN_VERSION; local addon_conflict = false -- used for addon conflicts local updateTable = { TITAN_LOCATION_ID, TITAN_PANEL_UPDATE_BUTTON }; -- ******************************** Variables ******************************* local AceTimer = LibStub("AceTimer-3.0") local L = LibStub("AceLocale-3.0"):GetLocale(TITAN_ID, true) local LocationTimer = {}; local LocationTimerRunning = false local debug_flow = false local place = { zoneText = "", subZoneText = "", pvpType = "", factionName = "", px = 0, py = 0, -- to save a few cpu cycles when map is up show_on_map = false, coords_style = "", coords_label = "", player_format = "", cursor_format = "", } ---@diagnostic disable-next-line: deprecated local GetZonePVP = C_PvP.GetZonePVPInfo or GetZonePVPInfo -- For Classic versions -- ******************************** Functions ******************************* local function debug_msg(Message) local msg = "" local stamp = date("%H:%M:%S") -- date("%m/%d/%y %H:%M:%S") local milli = GetTime() -- seconds with millisecond precision (float) local milli_str = string.format("%0.2F", milli - math.modf(milli)) msg = msg .. TitanUtils_GetGoldText(stamp .. milli_str .. " " .. TITAN_LOCATION_ID .. ": ") msg = msg .. TitanUtils_GetGreenText(Message) DEFAULT_CHAT_FRAME:AddMessage(msg) -- DEFAULT_CHAT_FRAME:AddMessage(TITAN_LOCATION_ID..": " .. Message, 1.00, 0.49, 0.04) end ---local Register event if not already registered ---@param plugin Button ---@param event string local function RegEvent(plugin, event) if plugin:IsEventRegistered(event) then -- already registered else plugin:RegisterEvent(event) end end ---local Registers / unregisters (action) events the plugin needs ---@param action string ---@param reason string local function Events(action, reason) local plugin = _G[TITAN_BUTTON] if action == "register" then RegEvent(plugin, "ZONE_CHANGED") RegEvent(plugin, "ZONE_CHANGED_INDOORS") RegEvent(plugin, "ZONE_CHANGED_NEW_AREA") elseif action == "unregister" then plugin:UnregisterEvent("ZONE_CHANGED") plugin:UnregisterEvent("ZONE_CHANGED_INDOORS") plugin:UnregisterEvent("ZONE_CHANGED_NEW_AREA") else -- action unknown ??? end if debug_flow then local msg = "Events" .. " " .. tostring(action) .. "" .. " " .. tostring(reason) .. "" debug_msg(msg) else -- not requested end end ---local Get the player coordinates on x,y axis of the map of the zone / area they are in. ---@return number | nil X ---@return number | nil Y local function GetPlayerMapPosition() local mapID = C_Map.GetBestMapForUnit("player") if mapID == nil then return nil, nil end local position = C_Map.GetPlayerMapPosition(mapID, "player") if position == nil then return nil, nil else return position:GetXY() end end ---local Function to throttle down unnecessary updates local function CheckForPositionUpdate() local mapID = C_Map.GetBestMapForUnit("player") local tempx, tempy = GetPlayerMapPosition() -- If unknown then use 0,0 if tempx == nil then place.px = 0 tempx = 0 end if tempy == nil then place.py = 0 tempy = 0 end -- If the same then do not update the text to save a few cycles. if tempx ~= place.px or tempy ~= place.py then place.px = tempx place.py = tempy TitanPanelPluginHandle_OnUpdate(updateTable); end end ---local Update zone info of current toon ---@param self Button local function ZoneUpdate(self) local _ = nil place.zoneText = GetZoneText(); place.subZoneText = GetSubZoneText(); place.pvpType, _, place.factionName = GetZonePVP(); TitanPanelPluginHandle_OnUpdate(updateTable); end ---local Set textg coord on map per user selection ---@param player string ---@param cursor string local function SetCoordText(player, cursor) local player_frame = TitanMapPlayerLocation local cursor_frame = TitanMapCursorLocation local world_frame = WorldMapFrame player_frame:SetText(player or ""); cursor_frame:SetText(cursor or ""); if TITAN_ID == "TitanClassic" then -- Determine where to show the text player_frame:ClearAllPoints() cursor_frame:ClearAllPoints() local mloc = TitanGetVar(TITAN_LOCATION_ID, "CoordsLoc") if mloc == "Top" then if WorldMapFrame:IsMaximized() then TitanMapPlayerLocation:SetPoint("TOPLEFT", WorldMapFrame.BorderFrame, "TOPLEFT", 10, -5) else TitanMapPlayerLocation:SetPoint("TOPLEFT", WorldMapFrame.MiniBorderFrame, "TOPLEFT", 20, -33) end TitanMapCursorLocation:SetPoint("RIGHT", WorldMapFrame.MaximizeMinimizeFrame, "LEFT", 0, 0) elseif mloc == "Bottom" then player_frame:SetPoint("BOTTOMRIGHT", world_frame, "BOTTOM", -10, 10) cursor_frame:SetPoint("BOTTOMLEFT", world_frame, "BOTTOM", 0, 10) else -- Correct to the default of bottom TitanSetVar(TITAN_LOCATION_ID, "CoordsLoc", "Bottom") player_frame:SetPoint("BOTTOMRIGHT", world_frame, "BOTTOM", -10, 10) cursor_frame:SetPoint("BOTTOMLEFT", world_frame, "BOTTOM", 0, 10) end else -- current retail -- Position the text local anchor = world_frame.BorderFrame.MaximizeMinimizeFrame if world_frame:IsMaximized() then -- map should be 'full' screen player_frame:ClearAllPoints(); cursor_frame:ClearAllPoints(); player_frame:SetPoint("RIGHT", anchor, "LEFT", 0, 0) cursor_frame:SetPoint("TOP", player_frame, "BOTTOM", 0, -5) world_frame.TitanSize = "large" else player_frame:ClearAllPoints(); cursor_frame:ClearAllPoints(); player_frame:SetPoint("RIGHT", anchor, "LEFT", 0, 0) cursor_frame:SetPoint("LEFT", world_frame.BorderFrame.Tutorial, "RIGHT", 0, 0) world_frame.TitanSize = "small" end end end ---local Show / hide the location above the mini map per user settings ---@param reason string local function LocOnMiniMap(reason) if TitanGetVar(TITAN_LOCATION_ID, "ShowLocOnMiniMap") then MinimapBorderTop:Show() MinimapZoneTextButton:Show() else MinimapBorderTop:Hide() MinimapZoneTextButton:Hide() MiniMapWorldMapButton:Hide() end -- adjust MiniMap frame if needed if reason == "config" then TitanPanel_AdjustFrames(false, "Location"); else -- 2024 Jan - Do not adjust; allow Titan to handle on PEW end end ---local Update coordinates on map. This called every tick of timer while map is open. ---@param self Button ---@param elapsed number local function TitanMapCoords_OnUpdate(self, elapsed) -- Determine the text to show for player coords -- This routine will do a LOT of checking for 'invalid' returns to prevent spraying errors at the user. local cursorLocationText = "" local playerLocationText = "" if debug_flow then cursorLocationText = "-C-" playerLocationText = "-P-" else -- use default end if place.show_on_map then place.px, place.py = GetPlayerMapPosition(); if place.px == nil then -- invalid map / timing / ... ? -- Show something to user... playerLocationText = L["TITAN_LOCATION_NO_COORDS"] else -- format coords per the user requested format playerLocationText = format(place.coords_style, 100 * place.px, 100 * place.py); end -- Add label or not per user choice playerLocationText = (format(place.player_format, TitanUtils_GetHighlightText(playerLocationText))); -- Determine cursor coords REGARDLESS of map shown. -- The player may not be in that map / zone / area. local cx, cy = 0, 0 local inside = false -- Use the global / screen cursor position to confirm the cursor is over the map, -- then use a normalized cursor position if cursor is over map; accounts for map zooming cx, cy = GetCursorPosition() local left, bottom, width, height = WorldMapFrame.ScrollContainer:GetScaledRect(); if left == nil then -- invalid map ? -- Show something to user... cursorLocationText = L["TITAN_LOCATION_NO_COORDS"] else if (cx > left and cy > bottom and cx < left + width and cy < bottom + height) then inside = true -- Get normalized cursor on map cx, cy = WorldMapFrame:GetNormalizedCursorPosition(); cx, cy = cx or 0, cy or 0; else -- cursor outside map cx, cy = 0, 0 end -- format coords per the user requested format cursorLocationText = format(place.coords_style, 100 * cx, 100 * cy) --[[ local msg = "_OnUpdate" .. " " .. tostring(inside) .. "" .. " [" .. (format("%.2f", left or 0)) .. "" .. " " .. (format("%.2f", (bottom) or 0)) .. "" .. " " .. (format("%.2f", (left + width) or 0)) .. "" .. " " .. (format("%.2f", (bottom + height) or 0)) .. "]" .. " " .. (format("%.2f", cx)) .. "" .. " " .. (format("%.2f", cy)) .. "" debug_msg(msg) --]] end -- Add label or not per user choice cursorLocationText = (format(place.cursor_format, TitanUtils_GetHighlightText(cursorLocationText))) else -- use defaults, saving a few cpu cycles end --[[ local msg = "_OnUpdate" .. " " .. tostring(playerLocationText) .. "" .. " " .. tostring(cursorLocationText) .. "" debug_msg(msg) --]] SetCoordText(playerLocationText, cursorLocationText) end ---local Set the coordinates text for player and cursor if user requested. ---'start' Sets the OnShow and OnHide for the coords frame. ---'stop' Clears the OnShow and OnHide for the coords frame. ---OnShow and OnHide are triggered when world map is opened because it is the parent frame. ---@param action string start | stop local function CoordFrames(action) if addon_conflict then -- Do not attempt coords else local frame = _G[TITAN_MAP_FRAME] place.show_on_map = (TitanGetVar(TITAN_LOCATION_ID, "ShowCoordsOnMap") and true or false) if place.show_on_map then if action == "start" then -- Save a few cycles on update by grabbing the Titan options here place.coords_style = TitanGetVar(TITAN_LOCATION_ID, "CoordsFormat") place.coords_label = TitanGetVar(TITAN_LOCATION_ID, "CoordsLabel") if place.coords_label then place.player_format = L["TITAN_LOCATION_MAP_PLAYER_COORDS_TEXT"] place.cursor_format = L["TITAN_LOCATION_MAP_CURSOR_COORDS_TEXT"] else place.player_format = "%s" place.cursor_format = "%s" end local function updateFunc() TitanMapCoords_OnUpdate(frame, 0.07); -- simulating an OnUpdate call end frame:SetScript("OnShow", function() frame.updateTicker = frame.updateTicker or C_Timer.NewTicker(0.07, updateFunc); if WorldMapFrame:IsMaximized() then WorldMapFrame.TitanSize = "large" WorldMapFrame.TitanSizePrev = "none" else WorldMapFrame.TitanSize = "small" WorldMapFrame.TitanSizePrev = "none" end end); frame:SetScript("OnHide", function() if (frame.updateTicker) then frame.updateTicker:Cancel(); frame.updateTicker = nil; end end); elseif action == "stop" then -- stop timer, hooks are not needed frame:SetScript("OnShow", nil) frame:SetScript("OnHide", nil) SetCoordText("", "") -- cleanup else -- action unknown ??? end else -- user did not request so save a few cycles end end if debug_flow then local msg = "CoordFrames" .. " " .. tostring(action) .. "" .. " " .. tostring(place.show_on_map) .. "" .. " " .. tostring(addon_conflict) .. "" debug_msg(msg) else -- not requested end end ---local Adds player and cursor coords to the WorldMapFrame, unless the player has CT_MapMod local function CreateMapFrames() if _G[TITAN_MAP_FRAME] then return -- if already created end -- avoid an addon conflict if (_G["CT_MapMod"]) then addon_conflict = true return; end if debug_flow then local msg = "CreateMapFrames" -- .." "..tostring(reason).."" debug_msg(msg) else -- not requested end -- create the frame to hold the font strings, and simulate an "OnUpdate" script handler using C_Timer for efficiency local frame = CreateFrame("FRAME", TITAN_MAP_FRAME, WorldMapFrame) frame:SetFrameStrata("DIALOG") -- DF need to raise the strata to be seen -- create the font strings and update their position based in minimizing/maximizing the main map local playertext = frame:CreateFontString("TitanMapPlayerLocation", "ARTWORK", "GameFontNormal"); local cursortext = frame:CreateFontString("TitanMapCursorLocation", "ARTWORK", "GameFontNormal"); playertext:ClearAllPoints(); cursortext:ClearAllPoints(); playertext:SetPoint("TOPRIGHT", WorldMapFrameCloseButton, "BOTTOMRIGHT", 0, 0) cursortext:SetPoint("TOP", playertext, "BOTTOM", 0, 0) end ---local Display button when plugin is visible ---@param self Button local function OnShow(self) if debug_flow then local msg = "_OnShow" -- .." "..tostring(reason).."" debug_msg(msg) else -- not requested end if LocationTimerRunning then -- Do not schedule a new one else LocationTimer = AceTimer:ScheduleRepeatingTimer(CheckForPositionUpdate, 0.5) end CreateMapFrames() -- as needed CoordFrames("start") -- start coords on map, if requested Events("register", "_OnShow") -- Zone may not be available yet, PEW event should correct ZoneUpdate(self); TitanPanelButton_UpdateButton(TITAN_LOCATION_ID); end ---local Destroy repeating timer when plugin is hidden ---@param self Button local function OnHide(self) AceTimer:CancelTimer(LocationTimer) LocationTimerRunning = false Events("unregister", "_OnHide") CoordFrames("stop") -- stop coords on map, if requested end ---local Calculate coordinates and then display data on button. ---@param id string ---@return string plugin_label ---@return string plugin_text local function GetButtonText(id) -- Jul 2024 : Made display only; vars assigned per timer or events. local button = TitanUtils_GetButton(id); local locationRichText = "" local zone_text = "" local subzone_text = "" local xy_text = "" if button then -- sanity check -- Set in order of display on plugin... -- Zone text, if requested if TitanGetVar(TITAN_LOCATION_ID, "ShowZoneText") then zone_text = TitanUtils_ToString(place.zoneText) .." "..TitanUtils_ToString(place.subZoneText) -- overwrite with subZone text, if requested if TitanGetVar(TITAN_LOCATION_ID, "ShowSubZoneText") then if place.subZoneText == "" then -- Show the zone instead else zone_text = TitanUtils_ToString(place.subZoneText) end else -- leave alone end else zone_text = "" end -- Coordinates text, if requested if TitanGetVar(TITAN_LOCATION_ID, "ShowCoordsText") then if place.px == 0 and place.py == 0 then xy_text = "" else xy_text = format(TitanGetVar(TITAN_LOCATION_ID, "CoordsFormat"), 100 * place.px, 100 * place.py) end else xy_text = ""; end -- seperator, if needed if ((zone_text:len() > 0) or (xy_text:len() > 0)) then zone_text = zone_text .. " " else -- no seperator needed end else locationRichText = "? id" end -- Color per type of zone (friendly, contested, hostile) locationRichText = zone_text..xy_text if (TitanGetVar(TITAN_LOCATION_ID, "ShowColoredText")) then if (place.isArena) then locationRichText = TitanUtils_GetRedText(locationRichText); elseif (place.pvpType == "friendly") then locationRichText = TitanUtils_GetGreenText(locationRichText); elseif (place.pvpType == "hostile") then locationRichText = TitanUtils_GetRedText(locationRichText); elseif (place.pvpType == "contested") then locationRichText = TitanUtils_GetNormalText(locationRichText); else locationRichText = TitanUtils_GetNormalText(locationRichText); end else locationRichText = TitanUtils_GetHighlightText(locationRichText); end return L["TITAN_LOCATION_BUTTON_LABEL"], locationRichText; end ---local Get tooltip text ---@return string formatted_tooltip local function GetTooltipText() local pvpInfoRichText; pvpInfoRichText = ""; if (place.pvpType == "sanctuary") then pvpInfoRichText = TitanUtils_GetGreenText(SANCTUARY_TERRITORY); elseif (place.pvpType == "arena") then place.subZoneText = TitanUtils_GetRedText(place.subZoneText); pvpInfoRichText = TitanUtils_GetRedText(CONTESTED_TERRITORY); elseif (place.pvpType == "friendly") then pvpInfoRichText = TitanUtils_GetGreenText(format(FACTION_CONTROLLED_TERRITORY, place.factionName)); elseif (place.pvpType == "hostile") then pvpInfoRichText = TitanUtils_GetRedText(format(FACTION_CONTROLLED_TERRITORY, place .factionName)); elseif (place.pvpType == "contested") then pvpInfoRichText = TitanUtils_GetRedText(CONTESTED_TERRITORY); else pvpInfoRichText = "" end -- build the tool tip local zone = TitanUtils_GetHighlightText(place.zoneText) or "" local sub_zone = TitanUtils_Ternary( (place.subZoneText == ""), "", L["TITAN_LOCATION_TOOLTIP_SUBZONE"] .. "\t" .. TitanUtils_GetHighlightText(place.subZoneText) .. "\n" ) local bind_loc = TitanUtils_GetHighlightText(GetBindLocation()) return "" .. L["TITAN_LOCATION_TOOLTIP_ZONE"] .. "\t" .. zone .. "\n" .. sub_zone .. "\n" .. TitanUtils_GetHighlightText(L["TITAN_LOCATION_TOOLTIP_HOMELOCATION"]) .. "\n" .. L["TITAN_LOCATION_TOOLTIP_INN"] .. "\t" .. bind_loc .. "\n" .. pvpInfoRichText .. "\n\n" .. TitanUtils_GetGreenText(L["TITAN_LOCATION_TOOLTIP_HINTS_1"]) .. "\n" .. TitanUtils_GetGreenText(L["TITAN_LOCATION_TOOLTIP_HINTS_2"]) end ---local Handle events registered to plugin ---@param self Button ---@param event string ---@param ... any local function OnEvent(self, event, ...) -- DF TODO See if we can turn off zone on minimap --[=[ --]=] if debug_flow then local msg = "_OnEvent" .. " " .. tostring(event) .. "" debug_msg(msg) else -- not requested end if TITAN_ID == "TitanClassic" then if event == "PLAYER_ENTERING_WORLD" then if not TitanGetVar(TITAN_LOCATION_ID, "ShowLocOnMiniMap") and MinimapBorderTop and MinimapBorderTop:IsShown() then LocOnMiniMap("PEW") end end if TitanGetVar(TITAN_LOCATION_ID, "ShowLocOnMiniMap") and MinimapBorderTop:IsShown() then if not MinimapZoneTextButton:IsShown() then MinimapZoneTextButton:Show() end end else -- no work needed end ZoneUpdate(self); --[[ --]] end ---local Handle events registered to plugin. Copies coordinates to chat line for shift-LeftClick ---@param self Button ---@param button string local function OnClick(self, button) if (button == "LeftButton") then if (IsShiftKeyDown()) then local activeWindow = ChatEdit_GetActiveWindow(); if (activeWindow) then local message = TitanUtils_ToString(place.zoneText) .. " " .. format(TitanGetVar(TITAN_LOCATION_ID, "CoordsFormat"), 100 * place.px, 100 * place.py); activeWindow:Insert(message); end else ToggleFrame(WorldMapFrame); end end end ---local Create right click menu local function CreateMenu() local info -- level 1 if TitanPanelRightClickMenu_GetDropdownLevel() == 1 then -- level 1 TitanPanelRightClickMenu_AddTitle(TitanPlugins[TITAN_LOCATION_ID].menuText); info = {}; info.notCheckable = true info.text = L["TITAN_PANEL_OPTIONS"]; info.value = "Options" info.hasArrow = 1; TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel()); info = {}; info.notCheckable = true info.text = L["TITAN_LOCATION_FORMAT_COORD_LABEL"]; info.value = "CoordFormat" info.hasArrow = 1; TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel()); info = {}; info.notCheckable = true info.text = "WorldMap" info.value = "WorldMap" info.hasArrow = 1; TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel()); TitanPanelRightClickMenu_AddControlVars(TITAN_LOCATION_ID) -- level 2 elseif TitanPanelRightClickMenu_GetDropdownLevel() == 2 then if TitanPanelRightClickMenu_GetDropdMenuValue() == "Options" then TitanPanelRightClickMenu_AddTitle(L["TITAN_PANEL_OPTIONS"], TitanPanelRightClickMenu_GetDropdownLevel()); info = {}; info.text = L["TITAN_LOCATION_MENU_SHOW_ZONE_ON_PANEL_TEXT"]; info.func = function() TitanToggleVar(TITAN_LOCATION_ID, "ShowZoneText"); TitanPanelButton_UpdateButton(TITAN_LOCATION_ID); end info.checked = TitanGetVar(TITAN_LOCATION_ID, "ShowZoneText"); TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel()); -- if TITAN_ID == "TitanClassic" then info = {}; info.text = L["TITAN_LOCATION_MENU_SHOW_SUBZONE_ON_PANEL_TEXT"]; info.func = function() TitanToggleVar(TITAN_LOCATION_ID, "ShowSubZoneText"); TitanPanelButton_UpdateButton(TITAN_LOCATION_ID); end info.checked = TitanGetVar(TITAN_LOCATION_ID, "ShowSubZoneText"); TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel()); -- else -- no work needed -- end info = {}; info.text = L["TITAN_LOCATION_MENU_SHOW_COORDS_ON_PANEL_TEXT"]; info.func = function() TitanToggleVar(TITAN_LOCATION_ID, "ShowCoordsText"); TitanPanelButton_UpdateButton(TITAN_LOCATION_ID); end info.checked = TitanGetVar(TITAN_LOCATION_ID, "ShowCoordsText"); TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel()); --[[ info = {}; info.text = L["TITAN_LOCATION_MENU_SHOW_COORDS_ON_MAP_TEXT"]; info.func = function() TitanToggleVar(TITAN_LOCATION_ID, "ShowCoordsOnMap"); if (TitanGetVar(TITAN_LOCATION_ID, "ShowCoordsOnMap")) then CoordFrames("start") else CoordFrames("stop") end end info.checked = TitanGetVar(TITAN_LOCATION_ID, "ShowCoordsOnMap"); TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel()); if TITAN_ID == "TitanClassic" then info = {}; info.text = L["TITAN_LOCATION_MENU_SHOW_LOC_ON_MINIMAP_TEXT"]; info.func = function() TitanToggleVar(TITAN_LOCATION_ID, "ShowLocOnMiniMap"); LocOnMiniMap("config") end info.checked = TitanGetVar(TITAN_LOCATION_ID, "ShowLocOnMiniMap"); info.disabled = InCombatLockdown() TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel()); else -- no work needed end info = {}; info.text = L["TITAN_LOCATION_MENU_UPDATE_WORLD_MAP"]; info.func = function() TitanToggleVar(TITAN_LOCATION_ID, "UpdateWorldmap"); end info.checked = TitanGetVar(TITAN_LOCATION_ID, "UpdateWorldmap"); info.disabled = InCombatLockdown() TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel()); --]] end if TitanPanelRightClickMenu_GetDropdMenuValue() == "CoordFormat" then TitanPanelRightClickMenu_AddTitle(L["TITAN_LOCATION_FORMAT_COORD_LABEL"], TitanPanelRightClickMenu_GetDropdownLevel()); info = {}; info.text = L["TITAN_LOCATION_FORMAT_LABEL"]; info.func = function() TitanSetVar(TITAN_LOCATION_ID, "CoordsFormat", L["TITAN_LOCATION_FORMAT"]); TitanPanelButton_UpdateButton(TITAN_LOCATION_ID); end info.checked = (TitanGetVar(TITAN_LOCATION_ID, "CoordsFormat") == L["TITAN_LOCATION_FORMAT"]) TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel()); info = {}; info.text = L["TITAN_LOCATION_FORMAT2_LABEL"]; info.func = function() TitanSetVar(TITAN_LOCATION_ID, "CoordsFormat", L["TITAN_LOCATION_FORMAT2"]); TitanPanelButton_UpdateButton(TITAN_LOCATION_ID); end info.checked = (TitanGetVar(TITAN_LOCATION_ID, "CoordsFormat") == L["TITAN_LOCATION_FORMAT2"]) TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel()); info = {}; info.text = L["TITAN_LOCATION_FORMAT3_LABEL"]; info.func = function() TitanSetVar(TITAN_LOCATION_ID, "CoordsFormat", L["TITAN_LOCATION_FORMAT3"]); TitanPanelButton_UpdateButton(TITAN_LOCATION_ID); end info.checked = (TitanGetVar(TITAN_LOCATION_ID, "CoordsFormat") == L["TITAN_LOCATION_FORMAT3"]) TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel()); end if TitanPanelRightClickMenu_GetDropdMenuValue() == "WorldMap" then TitanPanelRightClickMenu_AddTitle(L["TITAN_LOCATION_MENU_TEXT"], TitanPanelRightClickMenu_GetDropdownLevel()); info = {}; info.text = L["TITAN_LOCATION_MENU_SHOW_COORDS_ON_MAP_TEXT"]; info.func = function() TitanToggleVar(TITAN_LOCATION_ID, "ShowCoordsOnMap"); if (TitanGetVar(TITAN_LOCATION_ID, "ShowCoordsOnMap")) then CoordFrames("start") else CoordFrames("stop") end end info.checked = TitanGetVar(TITAN_LOCATION_ID, "ShowCoordsOnMap"); TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel()); info = {}; info.text = L["TITAN_LOCATION_MENU_UPDATE_WORLD_MAP"]; info.func = function() TitanToggleVar(TITAN_LOCATION_ID, "UpdateWorldmap"); end info.checked = TitanGetVar(TITAN_LOCATION_ID, "UpdateWorldmap"); info.disabled = InCombatLockdown() TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel()); if TITAN_ID == "TitanClassic" then info = {}; info.notCheckable = true info.text = L["TITAN_LOCATION_MENU_TEXT"]; info.value = "CoordsLoc" info.hasArrow = 1; TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel()); else -- no work needed end end -- level 3 elseif TitanPanelRightClickMenu_GetDropdownLevel() == 3 then if TitanPanelRightClickMenu_GetDropdMenuValue() == "CoordsLoc" then info = {}; info.text = L["TITAN_PANEL_MENU_BOTTOM"]; info.func = function() TitanSetVar(TITAN_LOCATION_ID, "CoordsLoc", "Bottom"); -- TitanPanelButton_UpdateButton(TITAN_LOCATION_ID); end info.checked = (TitanGetVar(TITAN_LOCATION_ID, "CoordsLoc") == "Bottom") TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel()); info = {}; info.text = L["TITAN_PANEL_MENU_TOP"]; info.func = function() TitanSetVar(TITAN_LOCATION_ID, "CoordsLoc", "Top"); -- TitanPanelButton_UpdateButton(TITAN_LOCATION_ID); end info.checked = (TitanGetVar(TITAN_LOCATION_ID, "CoordsLoc") == "Top") TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel()); end end end ---local Create the plugin .registry and register startign events ---@param self Button local function OnLoad(self) local notes = "" .. "Adds coordinates and location information to Titan Panel.\n" .. "Option Show Zone Text shows zone text - or not.\n" .. "- Show ONLY Subzone Text removes zone text from plugin.\n" -- .."- xxx.\n" self.registry = { id = TITAN_LOCATION_ID, category = "Built-ins", version = TITAN_LOCATION_VERSION, menuText = L["TITAN_LOCATION_MENU_TEXT"], menuTextFunction = CreateMenu, buttonTextFunction = GetButtonText, tooltipTitle = L["TITAN_LOCATION_TOOLTIP"], tooltipTextFunction = GetTooltipText, icon = "Interface\\AddOns\\TitanLocation\\TitanLocation", iconWidth = 16, notes = notes, controlVariables = { ShowIcon = true, ShowLabelText = true, ShowRegularText = false, ShowColoredText = true, DisplayOnRightSide = true, }, savedVariables = { ShowZoneText = 1, ShowSubZoneText = false, ShowCoordsText = true, ShowCoordsOnMap = true, ShowCursorOnMap = true, ShowLocOnMiniMap = 1, ShowIcon = 1, ShowLabelText = 1, ShowColoredText = 1, CoordsFormat = L["TITAN_LOCATION_FORMAT"], CoordsLoc = "Bottom", CoordsLabel = true, UpdateWorldmap = false, DisplayOnRightSide = false, } }; RegEvent(self, "PLAYER_ENTERING_WORLD") if debug_flow then local msg = "_OnLoad" -- .." "..tostring(reason).."" debug_msg(msg) else -- not requested end end ---local Create needed frames local function Create_Frames() if _G[TITAN_BUTTON] then return -- if already created end -- general container frame local f = CreateFrame("Frame", nil, UIParent) -- f:Hide() -- Titan plugin button local window = CreateFrame("Button", TITAN_BUTTON, f, "TitanPanelComboTemplate") window:SetFrameStrata("FULLSCREEN") -- Using SetScript("OnLoad", does not work OnLoad(window); -- TitanPanelButton_OnLoad(window); -- Titan XML template calls this... window:SetScript("OnShow", function(self) OnShow(self); TitanPanelButton_OnShow(self); end) window:SetScript("OnHide", function(self) OnHide(self) end) window:SetScript("OnEvent", function(self, event, ...) OnEvent(self, event, ...) end) window:SetScript("OnClick", function(self, button) OnClick(self, button); TitanPanelButton_OnClick(self, button); end) end Create_Frames()