From 287bd40210a405b0665da897d673e1ad6a69bd1d Mon Sep 17 00:00:00 2001 From: HonorGoG Date: Thu, 9 Aug 2018 16:32:51 -0700 Subject: [PATCH] - Fixing git mistake. --- Titan/TitanMovable.lua | 775 ++++++++++++++++++++++++++++++++ TitanLocation/TitanLocation.lua | 577 ++++++++++++++++++++++++ TitanPerformance/TitanPerformance.lua | 796 +++++++++++++++++++++++++++++++++ 3 files changed, 2148 insertions(+) create mode 100755 Titan/TitanMovable.lua create mode 100644 TitanLocation/TitanLocation.lua create mode 100644 TitanPerformance/TitanPerformance.lua diff --git a/Titan/TitanMovable.lua b/Titan/TitanMovable.lua new file mode 100755 index 0000000..6cce7b1 --- /dev/null +++ b/Titan/TitanMovable.lua @@ -0,0 +1,775 @@ +--[[ File +NAME: TitanMovable.lua +DESC: Contains the routines to adjust the Blizzard frames to make room for the Titan bars the user has selected. +There are a select set of Blizzard frames at the top of screen and at the bottom of the screen that Titan will move. +Each frame adjusted has an entry in TitanMovableData. TitanMovableData is local and not directly accessible via addons. +However addons can tell Titan to not adjust some or all frames using TitanUtils_AddonAdjust(frame, bool). Addons that replace all or parts of the Blizzard UI use this. + +The user can turn turn on / off the adjusting of all top frames or all bottom frames. +In addition the user can select to turn off / on adjusting of select top frames (minimap or ticket frame) or select bottom frames (chat / log or bags) +:DESC +--]] +-- Globals + +-- Locals +local _G = getfenv(0); +local InCombatLockdown = _G.InCombatLockdown; + +--[[ Titan +Declare the Ace routines + local AceTimer = LibStub("AceTimer-3.0") + i.e. TitanPanelAce.ScheduleTimer("LDBToTitanSetText", TitanLDBRefreshButton, 2); + or + i.e. TitanPanelAce:ScheduleTimer(TitanLDBRefreshButton, 2); + + Be careful that the 'self' is proper to cancel timers!!! +--]] +local TitanPanelAce = LibStub("AceAddon-3.0"):NewAddon("TitanPanel", "AceHook-3.0", "AceTimer-3.0") + +--Determines the optimal magic number based on resolution +--local menuBarTop = 55; +--local width, height = string.match((({GetScreenResolutions()})[GetCurrentResolution()] or ""), "(%d+).-(%d+)"); +--if ( tonumber(width) / tonumber(height ) > 4/3 ) then + --Widescreen resolution +-- menuBarTop = 75; +--end + +--[[From Resike to prevent tainting stuff to override the SetPoint calls securely. +hooksecurefunc(FrameRef, "SetPoint", function(self) + if self.moving then + return + end + self.moving = true + self:SetMovable(true) + self:SetUserPlaced(true) + self:ClearAllPoints() + self:SetPoint("CENTER", UIParent, "CENTER", 0, 0) + self:SetMovable(false) + self.moving = nil +end) +--]] + +--[[ Titan +TitanMovable is a local table that is cleared then filled with the frames Titan needs to check and adjust, if necessary, with each 'adjust frame' check. +--]] +local TitanMovable = {}; +--[[ Titan +NAME: TitanMovableData table +DESC: TitanMovableData is a local table that holds each frame Titan may need to adjust. It also has the anchor points and offsets needed to make room for the Titan bar(s) + +The index is the frame name. Each record contains: +frameName - frame name (string) to adjust +frameArchor - the frame anchor point +xArchor - anchor relative to the frameName +y - any additional adjustment in the y axis +position - top or bottom +addonAdj - true if another addon is taking responsibility of adjusting this frame, if false Titan will use the user setttings to adjust or not +:DESC +--]] +local TitanMovableData = { + PlayerFrame = {frameName = "PlayerFrame", frameArchor = "TOPLEFT", xArchor = "LEFT", y = -4, + position = TITAN_PANEL_PLACE_TOP, addonAdj = false}, + TargetFrame = {frameName = "TargetFrame", frameArchor = "TOPLEFT", xArchor = "LEFT", y = -4, + position = TITAN_PANEL_PLACE_TOP, addonAdj = false}, + PartyMemberFrame1 = {frameName = "PartyMemberFrame1", frameArchor = "TOPLEFT", xArchor = "LEFT", y = -128, + position = TITAN_PANEL_PLACE_TOP, addonAdj = false}, + TicketStatusFrame = {frameName = "TicketStatusFrame", frameArchor = "TOPRIGHT", xArchor = "RIGHT", y = 0, + position = TITAN_PANEL_PLACE_TOP, addonAdj = false}, + BuffFrame = {frameName = "BuffFrame", frameArchor = "TOPRIGHT", xArchor = "RIGHT", y = -13, + position = TITAN_PANEL_PLACE_TOP, addonAdj = false}, + MinimapCluster = {frameName = "MinimapCluster", frameArchor = "TOPRIGHT", xArchor = "RIGHT", y = 0, + position = TITAN_PANEL_PLACE_TOP, addonAdj = false}, +-- WorldStateAlwaysUpFrame = {frameName = "WorldStateAlwaysUpFrame", frameArchor = "TOP", xArchor = "CENTER", y = -15, +-- position = TITAN_PANEL_PLACE_TOP, addonAdj = false}, + MainMenuBar = {frameName = "MainMenuBar", frameArchor = "BOTTOM", xArchor = "CENTER", y = 0, + position = TITAN_PANEL_PLACE_BOTTOM, addonAdj = false}, + MultiBarRight = {frameName = "MultiBarRight", frameArchor = "BOTTOMRIGHT", xArchor = "RIGHT", y = 98, + position = TITAN_PANEL_PLACE_BOTTOM, addonAdj = false}, + OverrideActionBar = {frameName = "OverrideActionBar", frameArchor = "BOTTOM", xArchor = "CENTER", y = 0, + position = TITAN_PANEL_PLACE_BOTTOM, addonAdj = false}, + MicroButtonAndBagsBar = {frameName = "MicroButtonAndBagsBar", frameArchor = "BOTTOMRIGHT", xArchor = "RIGHT", y = 0, + position = TITAN_PANEL_PLACE_BOTTOM, addonAdj = false}, +} + +--[[ local +NAME: TitanMovableFrame_CheckThisFrame +DESC: Add the given frame to the list so it will be checked. Once 'full' the table will be looped through to see if the frame must be moved or not. +VAR: frameName - frame to check +OUT: None +NOTE: +- The frame is added to TitanMovable. +:NOTE +--]] +local function TitanMovableFrame_CheckThisFrame(frameName) + -- For safety check if the frame is in the table to adjust + if TitanMovableData[frameName] then + table.insert(TitanMovable, frameName) + end +end + +--[[ Titan +NAME: TitanMovable_AdjustTimer +DESC: Cancel then add the given timer. The timer must be in TitanTimers. +VAR: ttype - The timer type (string) as defined in TitanTimers +OUT: None +--]] +function TitanMovable_AdjustTimer(ttype) + local timer = TitanTimers[ttype] + if timer then + TitanPanelAce.CancelAllTimers(timer.obj) + TitanPanelAce.ScheduleTimer(timer.obj, timer.callback, timer.delay) + end +end + +--[[ Titan +NAME: TitanMovable_AddonAdjust +DESC: Set the given frame to be adjusted or not by another addon. This is called from TitanUtils for a developer API. +VAR: frame - frame name (string) +VAR: bool - true (addon will adjust) or false (Titan will use its settings) +OUT: None +--]] +function TitanMovable_AddonAdjust(frame, bool) + for index, value in pairs(TitanMovableData) do + frameData = value + if frameData then + frameName = frameData.frameName; + end + + if (frame == frameName) then + frameData.addonAdj = bool + end + end +end + +--[[ API +NAME: TitanMovable_GetPanelYOffset +DESC: Get the Y axis offset Titan needs (1 or 2 bars) at the given position - top or bottom. +VAR: framePosition - TITAN_PANEL_PLACE_TOP or TITAN_PANEL_PLACE_BOTTOM +OUT: Y axis offset, in pixels +NOTE: +- The prefered method to determine the Y offset needed by using TitanUtils_GetBarAnchors(). +:NOTE +--]] +function TitanMovable_GetPanelYOffset(framePosition) -- used by other addons + -- Both top & bottom are figured out but only the + -- requested postion is returned + local barnum_top = 0; + local barnum_bot = 0 + + -- If user has the top adjust set then determine the + -- top offset + if not TitanPanelGetVar("ScreenAdjust") then + if TitanPanelGetVar("Bar_Show") then + barnum_top = 1 + end + if TitanPanelGetVar("Bar2_Show") then + barnum_top = 2 + end + end + -- If user has the top adjust set then determine the + -- bottom offset + if not TitanPanelGetVar("AuxScreenAdjust") then + if TitanPanelGetVar("AuxBar_Show") then + barnum_bot = 1 + end + if TitanPanelGetVar("AuxBar2_Show") then + barnum_bot = 2 + end + end + + local scale = TitanPanelGetVar("Scale") + -- return the requested offset + -- 0 will be returned if the user has not bars showing + -- or the scale is not valid + if scale and framePosition then + if framePosition == TITAN_PANEL_PLACE_TOP then + return (-TITAN_PANEL_BAR_HEIGHT * scale)*(barnum_top); + elseif framePosition == TITAN_PANEL_PLACE_BOTTOM then + return (TITAN_PANEL_BAR_HEIGHT * scale)*(barnum_bot)-1; + -- no idea why -1 is needed... seems anchoring to bottom is off a pixel + end + end + return 0 +end + +--[[ local +NAME: TitanMovableFrame_GetXOffset +DESC: Get the x axis offset Titan needs to adjust the given frame. +VAR: frame - frame object +VAR: point - "LEFT" / "RIGHT" / "TOP" / "BOTTOM" / "CENTER" +OUT: int - X axis offset, in pixels +--]] +local function TitanMovableFrame_GetXOffset(frame, point) + -- A valid frame and point is required + -- Determine a proper X offset using the given point (position) + local ret = 0 -- In case the inputs were invalid or the point was not relevant to the frame then return 0 + if frame and point then + if point == "LEFT" and frame:GetLeft() and UIParent:GetLeft() then + ret = frame:GetLeft() - UIParent:GetLeft(); + elseif point == "RIGHT" and frame:GetRight() and UIParent:GetRight() then + ret = frame:GetRight() - UIParent:GetRight(); + elseif point == "TOP" and frame:GetTop() and UIParent:GetTop() then + ret = frame:GetTop() - UIParent:GetTop(); + elseif point == "BOTTOM" and frame:GetBottom() and UIParent:GetBottom() then + ret = frame:GetBottom() - UIParent:GetBottom(); + elseif point == "CENTER" and frame:GetLeft() and frame:GetRight() + and UIParent:GetLeft() and UIParent:GetRight() then + local framescale = frame.GetScale and frame:GetScale() or 1; + ret = (frame:GetLeft()* framescale + frame:GetRight() + * framescale - UIParent:GetLeft() - UIParent:GetRight()) / 2; + end + end + + return ret +end + +--[[ Titan +NAME: TitanMovableFrame_CheckFrames +DESC: Determine the frames that may need to be moved at the given position. +VAR: position - TITAN_PANEL_PLACE_TOP / TITAN_PANEL_PLACE_BOTTOM / TITAN_PANEL_PLACE_BOTH +OUT: None +--]] +function TitanMovableFrame_CheckFrames(position) + -- reset the frames to move + TitanMovable = {}; + + -- check top as requested + if (position == TITAN_PANEL_PLACE_TOP) + or position == TITAN_PANEL_PLACE_BOTH then + -- Move PlayerFrame + TitanMovableFrame_CheckThisFrame(PlayerFrame:GetName()) + + -- Move TargetFrame + TitanMovableFrame_CheckThisFrame(TargetFrame:GetName()) + + -- Move PartyMemberFrame + TitanMovableFrame_CheckThisFrame(PartyMemberFrame1:GetName()) + + -- Move TicketStatusFrame + if TitanPanelGetVar("TicketAdjust") then + TitanMovableFrame_CheckThisFrame(TicketStatusFrame:GetName()) + end + + -- Move MinimapCluster + if not CleanMinimap then + if not TitanPanelGetVar("MinimapAdjust") then + TitanMovableFrame_CheckThisFrame(MinimapCluster:GetName()) + end + end + -- Move BuffFrame + TitanMovableFrame_CheckThisFrame(BuffFrame:GetName()) + + -- Move UIWidgetTopCenterContainerFrame + TitanMovableFrame_CheckThisFrame(UIWidgetTopCenterContainerFrame:GetName()); + +--[[ -- Move OrderHallCommandBar + if OrderHallCommandBar then + TitanMovableFrame_CheckThisFrame(OrderHallCommandBar:GetName()); + end]]-- + end + + -- check bottom as requested + if (position == TITAN_PANEL_PLACE_BOTTOM) + or position == TITAN_PANEL_PLACE_BOTH then + + -- Move MainMenuBar + TitanMovableFrame_CheckThisFrame(MainMenuBar:GetName()); + + -- Move OverrideActionBar + TitanMovableFrame_CheckThisFrame(OverrideActionBar:GetName()); + + -- Move MicroButtonAndBagsBar + TitanMovableFrame_CheckThisFrame(MicroButtonAndBagsBar:GetName()); + end +end + +--[[ Titan +NAME: TitanMovableFrame_MoveFrames +DESC: Actually adjust the frames at the given position. +VAR: position - TITAN_PANEL_PLACE_TOP / TITAN_PANEL_PLACE_BOTTOM / TITAN_PANEL_PLACE_BOTH +OUT: None +--]] +function TitanMovableFrame_MoveFrames(position) + -- Once the frames to check have been collected, + -- move them as needed. + local frameData, frame, frameName, frameArchor, xArchor, y, xOffset, yOffset, panelYOffset; + + -- Collect the frames we need to move + TitanMovableFrame_CheckFrames(position); + + -- move them... + if not InCombatLockdown() then + local adj_frame = true + for index, value in pairs(TitanMovable) do + adj_frame = true -- assume the frame is to be adjusted + frameData = TitanMovableData[value]; + if frameData then + frame = _G[frameData.frameName]; + frameName = frameData.frameName; + frameArchor = frameData.frameArchor; + end + + if (frame and (frame:IsUserPlaced())) + then + -- The user has positioned the frame + adj_frame = false + end + if frameData.addonAdj then + -- An addon has taken control of the frame + adj_frame = false + end + + if adj_frame then + xArchor = frameData.xArchor; + y = frameData.y; + + panelYOffset = TitanMovable_GetPanelYOffset(frameData.position); + xOffset = TitanMovableFrame_GetXOffset(frame, xArchor); + + -- properly adjust buff frame(s) if GM Ticket is visible + + -- Use IsShown rather than IsVisible. In some cases (after closing + -- full screen map) the ticket may not yet be visible. + if (frameName == "BuffFrame") + and TicketStatusFrame:IsShown() + and TitanPanelGetVar("TicketAdjust") then + yOffset = (-TicketStatusFrame:GetHeight()) + + panelYOffset + else + yOffset = y + panelYOffset; + end + + -- properly adjust MinimapCluster if its border is hidden + if frameName == "MinimapCluster" + and MinimapBorderTop + and not MinimapBorderTop:IsShown() then + yOffset = yOffset + (MinimapBorderTop:GetHeight() * 3/5) - 5 + end + + -- adjust the MainMenuBar according to its scale + if frameName == "MainMenuBar" and MainMenuBar:IsVisible() then + local framescale = MainMenuBar:GetScale() or 1; + yOffset = yOffset / framescale; + if ( StatusTrackingBarManager:GetNumberVisibleBars() == 2 ) then + yOffset = yOffset + 17; + elseif ( StatusTrackingBarManager:GetNumberVisibleBars() == 1 ) then + yOffset = yOffset + 14; + end + end + + -- account for Reputation Status Bar (doh) + local playerlevel = UnitLevel("player"); + if frameName == "MultiBarRight" + and ReputationWatchStatusBar:IsVisible() + and playerlevel < _G["MAX_PLAYER_LEVEL"] then + yOffset = yOffset + 8; + end + + frame:ClearAllPoints(); + frame:SetPoint(frameArchor, "UIParent", frameArchor, + xOffset, yOffset); + else + --Leave frame where it is as it has been moved by a user + end + -- Move bags as needed + UpdateContainerFrameAnchors(); + end + else + -- nothing to do + end +end + +--[[ Titan +NAME: TitanAdjustBottomFrames +DESC: Adjust the frames at TITAN_PANEL_PLACE_BOTTOM. +VAR: None +OUT: None +--]] +function TitanAdjustBottomFrames() + TitanPanel_AdjustFrames(TITAN_PANEL_PLACE_BOTTOM, true) +end + +--[[ Titan +NAME: Titan_FCF_UpdateDockPosition +DESC: Secure post hook to help adjust the chat / log frame. +VAR: None +OUT: None +NOTE: +- This is required because Blizz adjusts the chat frame relative to other frames so some of the Blizz code is copied. +- If in combat or if the user has moved the chat frame then no action is taken. +- The frame is adjusted in the Y axis only. +:NOTE +--]] +local function Titan_FCF_UpdateDockPosition() + if not Titan__InitializedPEW + or not TitanPanelGetVar("LogAdjust") + or TitanPanelGetVar("AuxScreenAdjust") then + return + end + + if not InCombatLockdown() or (InCombatLockdown() + and not _G["DEFAULT_CHAT_FRAME"]:IsProtected()) then + local panelYOffset = TitanMovable_GetPanelYOffset(TITAN_PANEL_PLACE_BOTTOM); + local scale = TitanPanelGetVar("Scale"); + if scale then + panelYOffset = panelYOffset + (24 * scale) -- after 3.3.5 an additional adjust was needed. why? idk + end + +--[[ Blizz code + if _G["DEFAULT_CHAT_FRAME"]:IsUserPlaced() then + if _G["SIMPLE_CHAT"] ~= "1" then return end + end + + local chatOffset = 85 + panelYOffset; + if GetNumShapeshiftForms() > 0 or HasPetUI() or PetHasActionBar() then + if MultiBarBottomLeft:IsVisible() then + chatOffset = chatOffset + 55; + else + chatOffset = chatOffset + 15; + end + elseif MultiBarBottomLeft:IsVisible() then + chatOffset = chatOffset + 15; + end + _G["DEFAULT_CHAT_FRAME"]:SetPoint("BOTTOMLEFT", "UIParent", "BOTTOMLEFT", 32, chatOffset); + FCF_DockUpdate(); +--]] + if ( DEFAULT_CHAT_FRAME:IsUserPlaced() ) then + return; + end + + local chatOffset = 85 + panelYOffset; -- Titan change to adjust Y offset + if ( GetNumShapeshiftForms() > 0 or HasPetUI() or PetHasActionBar() ) then + if ( MultiBarBottomLeft:IsShown() ) then + chatOffset = chatOffset + 55; + else + chatOffset = chatOffset + 15; + end + elseif ( MultiBarBottomLeft:IsShown() ) then + chatOffset = chatOffset + 15; + end + DEFAULT_CHAT_FRAME:SetPoint("BOTTOMLEFT", "UIParent", "BOTTOMLEFT", + 32, chatOffset); + FCF_DockUpdate(); + end +end + +--[[ Titan +NAME: Titan_ContainerFrames_Relocate +DESC: Secure post hook to help adjust the bag frames. +VAR: None +OUT: None +NOTE: +- The frame is adjusted in the Y axis only. +- The Blizz routine "ContainerFrames_Relocate" should be examined for any conditions it checks and any changes to the SetPoint. +If Blizz changes the anchor points the SetPoint here must change as well!! +The Blizz routine calculates X & Y offsets to UIParent (screen) so there is not need to store the prior offsets. +Like the Blizz routine we search through the visible bags. Unlike the Blizz routine we only care about the first of each column to adjust for Titan. +This way the Blizz code does not need to be copied here. +:NOTE +--]] +local function Titan_ContainerFrames_Relocate() + if not TitanPanelGetVar("BagAdjust") then + return + end + + local panelYOffset = TitanMovable_GetPanelYOffset(TITAN_PANEL_PLACE_BOTTOM) + local off_y = 10000 -- something ridiculously high + local bottom_y = 0 + local right_x = 0 + + for index, frameName in ipairs(ContainerFrame1.bags) do + frame = _G[frameName]; + if frame:GetBottom() then bottom_y = frame:GetBottom() end + if ( bottom_y < off_y ) then + -- Start a new column + right_x = frame:GetRight() + frame:ClearAllPoints(); + frame:SetPoint("BOTTOMRIGHT", frame:GetParent(), + "BOTTOMLEFT", -- changed because we are taking the current x value + right_x, -- x is not adjusted + bottom_y + panelYOffset -- y + ) + end + off_y = bottom_y + end +end + +--[[ Titan +NAME: TitanMovableFrame_AdjustBlizzardFrames +DESC: Calls the helper routines to adjust the chat / log frame and bag frames. +VAR: None +OUT: None +NOTE: +- This is required because Blizz (or addons) could adjust the chat frame outside the events that Titan registers for. +- If in combat or if the user has moved the chat frame then no action is taken. +- The frame is adjusted in the Y axis only. +:NOTE +--]] +local function TitanMovableFrame_AdjustBlizzardFrames() + if not InCombatLockdown() then + Titan_FCF_UpdateDockPosition(); + Titan_ContainerFrames_Relocate(); + end +end + +--[[ Titan +NAME: Titan_AdjustUIScale +DESC: Adjust the scale of Titan bars and plugins to the user selected scaling. This is called by the secure post hooks to the 'Video Options Frame'. +VAR: None +OUT: None +--]] +local function Titan_AdjustUIScale() + Titan_AdjustScale() +end + +--[[ Titan +NAME: Titan_Hook_Adjust_Both +DESC: Adjust top and bottom frames. This is called by the secure post hooks. +VAR: None +OUT: None +NOTE: +- Starts a timer () which is a callback to Titan_ManageFramesNew. +- These could arrive quickly. To prevent many adjusts from stacking, cancel any pending then queue this one. +:NOTE +--]] +local function Titan_Hook_Adjust_Both() + TitanMovable_AdjustTimer("Adjust") +end + +--[[ Titan +NAME: TitanPanel_AdjustFrames +DESC: Adjust the frames at the given position. +VAR: position - TITAN_PANEL_PLACE_TOP / TITAN_PANEL_PLACE_BOTTOM / TITAN_PANEL_PLACE_BOTH +VAR: blizz - true or false +OUT: None +NOTE: +- if blizz is true then the post hook code for chat / log frame and the bag frames is run +:NOTE +--]] +function TitanPanel_AdjustFrames(position, blizz) + -- Adjust frame positions top only, bottom only, or both + TitanMovableFrame_MoveFrames(position) + + -- move the Blizzard frames if requested + if blizz and position == (TITAN_PANEL_PLACE_BOTTOM or TITAN_PANEL_PLACE_TOP) then + TitanMovableFrame_AdjustBlizzardFrames() + end +end + +--[[ Titan +NAME: Titan_ManageFramesNew +DESC: Adjust the frames at TITAN_PANEL_PLACE_BOTH. +VAR: None +OUT: None +--]] +function Titan_ManageFramesNew() + TitanPanel_AdjustFrames(TITAN_PANEL_PLACE_BOTH, false) + return +end + +--[[ Titan +NAME: Titan_AdjustScale +DESC: Update the bars and plugins to the user selected scale. +VAR: None +OUT: None +NOTE: +- Ensure Titan has done its initialization before this is run. +:NOTE +--]] +function Titan_AdjustScale() + -- Only adjust if Titan is fully initialized + if Titan__InitializedPEW then + TitanPanel_SetScale(); + + TitanPanel_ClearAllBarTextures() + TitanPanel_CreateBarTextures() + + for idx,v in pairs (TitanBarData) do + TitanPanel_SetTexture(TITAN_PANEL_DISPLAY_PREFIX..TitanBarData[idx].name + , TITAN_PANEL_PLACE_TOP); + end + + TitanPanelBarButton_DisplayBarsWanted() + TitanPanel_RefreshPanelButtons(); + end +end + +function Titan_ManageFramesTest1() + if Titan__InitializedPEW then + -- We know the desired bars are now drawn so we can adjust + if InCombatLockdown() then + else +--TitanDebug ("Titan_ManageFramesTest1 ") + left = floor(OverrideActionBar:GetLeft() + 0.5) + left = GetScreenWidth() / 2 + bot = floor(OverrideActionBar:GetBottom() + 0.5) +TitanDebug("... OverrideActionBar " +..(bot or "?").." " +..(left or "?").." " +) + point, relFrame, relPoint, xOff, yOff = OverrideActionBar:GetPoint(OverrideActionBar:GetNumPoints()) + OverrideActionBar:ClearAllPoints() + OverrideActionBar:SetPoint("BOTTOM", TitanPanelBottomAnchor, "TOP", left, 0) + OverrideActionBar:SetPoint(point, relFrame, relPoint, xOff, TitanPanelBottomAnchor:GetTop()+0) + left = OverrideActionBar:GetCenter() + bot = OverrideActionBar:GetBottom() +TitanDebug("... OverrideActionBar " +..(bot or "?").." " +..(left or "?").." " +) + + end + end +-- There is a chance the person stays in combat so this could +-- keep looping... +end + +function Titan_GetFrameOrigPositions() + local orig = {} + local frameData + local point, relTo, relPoint, xOff, yOff = "", {}, "", 0, 0 + local relFrame = "" + for index, value in pairs(TitanMovableData) do + frameData = TitanMovableData[index]; + if frameData then + point, relTo, relPoint, xOff, yOff = "", {}, "", 0, 0 + frame = _G[frameData.frameName]; + point, relTo, relPoint, xOff, yOff = frame:GetPoint(frame:GetNumPoints()) +TitanDebug("Orig: " +..frameData.frameName.." " +..relTo:GetName() or "?".." " +) + orig = { + point = point, + relTo = relTo, + relPoint = relPoint, + xOff = xOff, + yOff = yOff, + } + TitanMovableOrig[frameData.frameName] = orig + end + end +end + +function Titan_SetFrameOrigPositions() + local left = 0 + local bot = 0 + -- TESTING!!! +TitanDebug("TESTING!!: Setting frames to Titan anchor " +..(TitanPanelBottomAnchor:GetTop() or "?").." " +) + left = MainMenuBar:GetLeft() + left = GetScreenWidth() / 2 + bot = MainMenuBar:GetBottom() +TitanDebug("... MainMenuBar " +..(bot or "?").." " +..(left or "?").." " +) +-- local point, relFrame, relPoint, xOff, yOff = MainMenuBar:GetPoint(MainMenuBar:GetNumPoints()) + MainMenuBar:ClearAllPoints() + MainMenuBar:SetPoint("BOTTOM", TitanPanelBottomAnchor, "TOP", left, 0) +-- MainMenuBar:SetPoint(point, relFrame, relPoint, xOff, TitanPanelBottomAnchor:GetTop()+0) + left = MainMenuBar:GetLeft() + bot = MainMenuBar:GetBottom() +TitanDebug("... MainMenuBar " +..(bot or "?").." " +..(left or "?").." " +) + + left = floor(OverrideActionBar:GetLeft() + 0.5) + left = GetScreenWidth() / 2 + bot = floor(OverrideActionBar:GetBottom() + 0.5) +TitanDebug("... OverrideActionBar " +..(bot or "?").." " +..(left or "?").." " +) +-- point, relFrame, relPoint, xOff, yOff = OverrideActionBar:GetPoint(OverrideActionBar:GetNumPoints()) + OverrideActionBar:ClearAllPoints() + OverrideActionBar:SetPoint("BOTTOM", TitanPanelBottomAnchor, "TOP", left, 0) +-- OverrideActionBar:SetPoint(point, relFrame, relPoint, xOff, TitanPanelBottomAnchor:GetTop()+0) + left = OverrideActionBar:GetCenter() + bot = OverrideActionBar:GetBottom() +TitanDebug("... OverrideActionBar " +..(bot or "?").." " +..(left or "?").." " +) + + if false then + left = MultiBarRight:GetLeft() + MultiBarRight:ClearAllPoints() + MultiBarRight:SetPoint("BOTTOMLEFT", TitanPanelBottomAnchor, "TOP", left, 98) + + left = TargetFrame:GetLeft() + TargetFrame:ClearAllPoints() + TargetFrame:SetPoint("TOPLEFT", TitanPanelTopAnchor, "BOTTOM", left, -4) + + left = PlayerFrame:GetLeft() + PlayerFrame:ClearAllPoints() + PlayerFrame:SetPoint("TOPLEFT", TitanPanelTopAnchor, "BOTTOM", left, -4) + + left = PartyMemberFrame1:GetLeft() + PartyMemberFrame1:ClearAllPoints() + PartyMemberFrame1:SetPoint("TOPLEFT", TitanPanelTopAnchor, "BOTTOM", left, -128) + + left = TicketStatusFrame:GetLeft() + TicketStatusFrame:ClearAllPoints() + TicketStatusFrame:SetPoint("TOPLEFT", TitanPanelTopAnchor, "BOTTOM", left, 0) + + left = BuffFrame:GetLeft() + BuffFrame:ClearAllPoints() + BuffFrame:SetPoint("TOPLEFT", TitanPanelTopAnchor, "BOTTOM", left, -13) + + left = MinimapCluster:GetLeft() + MinimapCluster:ClearAllPoints() + MinimapCluster:SetPoint("TOPLEFT", TitanPanelTopAnchor, "BOTTOM", left, 0) + end +end + +--[[ Titan +NAME: TitanMovable_SecureFrames +DESC: Once Titan is initialized create the post hooks we need to help adjust frames properly. +VAR: None +OUT: None +NOTE: +- The secure post hooks are required because Blizz adjusts frames Titan is interested in at times other than the events Titan registers for. +- This used to be inline code but was moved to a routine to avoid errors as Titan loaded. +:NOTE +--]] +function TitanMovable_SecureFrames() + if not TitanPanelAce:IsHooked("FCF_UpdateDockPosition", Titan_FCF_UpdateDockPosition) then + TitanPanelAce:SecureHook("FCF_UpdateDockPosition", Titan_FCF_UpdateDockPosition) -- FloatingChatFrame + end + if not TitanPanelAce:IsHooked("UIParent_ManageFramePositions", Titan_Hook_Adjust_Both) then + TitanPanelAce:SecureHook("UIParent_ManageFramePositions", Titan_Hook_Adjust_Both) -- UIParent.lua + TitanPanel_AdjustFrames(TITAN_PANEL_PLACE_BOTTOM, false) + end + + if not TitanPanelAce:IsHooked(TicketStatusFrame, "Show", Titan_Hook_Adjust_Both) then + -- Titan Hooks to Blizzard Frame positioning functions + --TitanPanelAce:SecureHook("TicketStatusFrame_OnShow", Titan_Hook_Adjust_Both) -- HelpFrame.xml + --TitanPanelAce:SecureHook("TicketStatusFrame_OnHide", Titan_Hook_Adjust_Both) -- HelpFrame.xml + TitanPanelAce:SecureHook(TicketStatusFrame, "Show", Titan_Hook_Adjust_Both) -- HelpFrame.xml + TitanPanelAce:SecureHook(TicketStatusFrame, "Hide", Titan_Hook_Adjust_Both) -- HelpFrame.xml + TitanPanelAce:SecureHook(MainMenuBar, "Show", Titan_Hook_Adjust_Both) -- HelpFrame.xml + TitanPanelAce:SecureHook(MainMenuBar, "Hide", Titan_Hook_Adjust_Both) -- HelpFrame.xml + TitanPanelAce:SecureHook(OverrideActionBar, "Show", Titan_Hook_Adjust_Both) -- HelpFrame.xml + TitanPanelAce:SecureHook(OverrideActionBar, "Hide", Titan_Hook_Adjust_Both) -- HelpFrame.xml +-- TitanPanelAce:SecureHook(OverrideActionBar, "Show", Titan_ManageFramesTest1) -- HelpFrame.xml +-- TitanPanelAce:SecureHook(OverrideActionBar, "Hide", Titan_ManageFramesTest1) -- HelpFrame.xml + TitanPanelAce:SecureHook("UpdateContainerFrameAnchors", Titan_ContainerFrames_Relocate) -- ContainerFrame.lua + TitanPanelAce:SecureHook(WorldMapFrame, "Hide", Titan_Hook_Adjust_Both) -- WorldMapFrame.lua + TitanPanelAce:SecureHook("BuffFrame_Update", Titan_Hook_Adjust_Both) -- BuffFrame.lua + end + + if not TitanPanelAce:IsHooked("VideoOptionsFrameOkay_OnClick", Titan_AdjustUIScale) then + -- Properly Adjust UI Scale if set + -- Note: These are the least intrusive hooks we could think of, to properly adjust the Titan Bar(s) + -- without having to resort to a SetCvar secure hook. Any addon using SetCvar should make sure to use the 3rd + -- argument in the API call and trigger the CVAR_UPDATE event with an appropriate argument so that other addons + -- can detect this behavior and fire their own functions (where applicable). + TitanPanelAce:SecureHook("VideoOptionsFrameOkay_OnClick", Titan_AdjustUIScale) -- VideoOptionsFrame.lua + TitanPanelAce:SecureHook(VideoOptionsFrame, "Hide", Titan_AdjustUIScale) -- VideoOptionsFrame.xml + end + +-- TitanPanelAce:SecureHook(OverrideActionBar, "SetPoint", Titan_ManageFramesTest1) -- +end diff --git a/TitanLocation/TitanLocation.lua b/TitanLocation/TitanLocation.lua new file mode 100644 index 0000000..b55df87 --- /dev/null +++ b/TitanLocation/TitanLocation.lua @@ -0,0 +1,577 @@ +-- ************************************************************************** +-- * TitanLocation.lua +-- * +-- * By: TitanMod, Dark Imakuni, Adsertor and the Titan Development Team +-- ************************************************************************** + +-- ******************************** Constants ******************************* +local _G = getfenv(0); +local TITAN_LOCATION_ID = "Location"; +local OFFSET_X = 0.0022 -- 0.0022; +local OFFSET_Y = -0.0262 -- -0.0262; +local cachedX = 0 +local cachedY = 0 +local updateTable = {TITAN_LOCATION_ID, TITAN_PANEL_UPDATE_BUTTON}; +-- ******************************** Variables ******************************* +local L = LibStub("AceLocale-3.0"):GetLocale("Titan", true) +local AceTimer = LibStub("AceTimer-3.0") +local LocationTimer = nil; +-- ******************************** Functions ******************************* + +-- ************************************************************************** +-- NAME : TitanPanelLocationButton_OnLoad() +-- DESC : Registers the plugin upon it loading +-- ************************************************************************** +function TitanPanelLocationButton_OnLoad(self) + self.registry = { + id = TITAN_LOCATION_ID, + category = "Built-ins", + version = TITAN_VERSION, + menuText = L["TITAN_LOCATION_MENU_TEXT"], + buttonTextFunction = "TitanPanelLocationButton_GetButtonText", + tooltipTitle = L["TITAN_LOCATION_TOOLTIP"], + tooltipTextFunction = "TitanPanelLocationButton_GetTooltipText", + icon = "Interface\\AddOns\\TitanLocation\\TitanLocation", + iconWidth = 16, + controlVariables = { + ShowIcon = true, + ShowLabelText = true, + ShowRegularText = false, + ShowColoredText = true, + DisplayOnRightSide = false + }, + savedVariables = { + ShowZoneText = 1, + ShowCoordsOnMap = true, + ShowCursorOnMap = true, + ShowLocOnMiniMap = 1, + ShowIcon = 1, + ShowLabelText = 1, + ShowColoredText = 1, + CoordsFormat1 = 1, + CoordsFormat2 = false, + CoordsFormat3 = false, + UpdateWorldmap = false, + } + }; + + self:RegisterEvent("ZONE_CHANGED"); + self:RegisterEvent("ZONE_CHANGED_INDOORS"); + self:RegisterEvent("ZONE_CHANGED_NEW_AREA"); + self:RegisterEvent("PLAYER_ENTERING_WORLD"); +end + +-- ************************************************************************** +-- NAME : TitanPanelLocationButton_OnShow() +-- DESC : Display button when plugin is visible +-- ************************************************************************** +function TitanPanelLocationButton_OnShow() + local mapID = C_Map.GetBestMapForUnit("player"); +<<<<<<< HEAD + if mapID ~= nil then + WorldMapFrame:SetMapID(mapID); + end +======= + WorldMapFrame:SetMapID(mapID); +>>>>>>> parent of b7802a1... Throw away... + TitanPanelLocation_HandleUpdater(); +end + +-- ************************************************************************** +-- NAME : TitanPanelLocationButton_OnHide() +-- DESC : Destroy repeating timer when plugin is hidden +-- ************************************************************************** +function TitanPanelLocationButton_OnHide() + AceTimer.CancelTimer("TitanPanelLocation", LocationTimer, true) + LocationTimer = nil; +end + +-- ************************************************************************** +-- NAME : TitanPanelLocationButton_GetButtonText(id) +-- DESC : Calculate coordinates and then display data on button +-- VARS : id = button ID +-- ************************************************************************** +function TitanPanelLocationButton_GetButtonText(id) + local button, id = TitanUtils_GetButton(id, true); + + button.px, button.py = TitanPanelGetPlayerMapPosition(); + -- cache coordinates for update checking later on + cachedX = button.px; + cachedY = button.py; + if button.px == nil then button.px = 0 end + if button.py == nil then button.py = 0 end + local locationText = ""; + if (TitanGetVar(TITAN_LOCATION_ID, "CoordsFormat1")) then + locationText = format(L["TITAN_LOCATION_FORMAT"], 100 * button.px, 100 * button.py); + elseif (TitanGetVar(TITAN_LOCATION_ID, "CoordsFormat2")) then + locationText = format(L["TITAN_LOCATION_FORMAT2"], 100 * button.px, 100 * button.py); + elseif (TitanGetVar(TITAN_LOCATION_ID, "CoordsFormat3")) then + locationText = format(L["TITAN_LOCATION_FORMAT3"], 100 * button.px, 100 * button.py); + end + + if button.px == 0 and button.py == 0 then + locationText = ""; + end + + if (TitanGetVar(TITAN_LOCATION_ID, "ShowZoneText")) then + if (TitanUtils_ToString(button.subZoneText) == '') then + if (button.zoneText == '') then + _, _, button.zoneText = C_Map.GetMapInfo(C_Map.GetBestMapUnit("player")); + end + locationText = TitanUtils_ToString(button.zoneText)..' '..locationText; + else + locationText = TitanUtils_ToString(button.subZoneText)..' '..locationText; + end + else + if button.px == 0 and button.py == 0 then + locationText = L["TITAN_LOCATION_NO_COORDS"]; + end + end + + local locationRichText; + if (TitanGetVar(TITAN_LOCATION_ID, "ShowColoredText")) then + if (TitanPanelLocationButton.isArena) then + locationRichText = TitanUtils_GetRedText(locationText); + elseif (TitanPanelLocationButton.pvpType == "friendly") then + locationRichText = TitanUtils_GetGreenText(locationText); + elseif (TitanPanelLocationButton.pvpType == "hostile") then + locationRichText = TitanUtils_GetRedText(locationText); + elseif (TitanPanelLocationButton.pvpType == "contested") then + locationRichText = TitanUtils_GetNormalText(locationText); + else + locationRichText = TitanUtils_GetNormalText(locationText); + end + else + locationRichText = TitanUtils_GetHighlightText(locationText); + end + + return L["TITAN_LOCATION_BUTTON_LABEL"], locationRichText; +end + +-- ************************************************************************** +-- NAME : TitanPanelLocationButton_GetTooltipText() +-- DESC : Display tooltip text +-- ************************************************************************** +function TitanPanelLocationButton_GetTooltipText() + local pvpInfoRichText; + + pvpInfoRichText = ""; + if (TitanPanelLocationButton.pvpType == "sanctuary") then + pvpInfoRichText = TitanUtils_GetGreenText(SANCTUARY_TERRITORY); + elseif (TitanPanelLocationButton.pvpType == "arena") then + TitanPanelLocationButton.subZoneText = TitanUtils_GetRedText(TitanPanelLocationButton.subZoneText); + pvpInfoRichText = TitanUtils_GetRedText(CONTESTED_TERRITORY); + elseif (TitanPanelLocationButton.pvpType == "friendly") then + pvpInfoRichText = TitanUtils_GetGreenText(format(FACTION_CONTROLLED_TERRITORY, TitanPanelLocationButton.factionName)); + elseif (TitanPanelLocationButton.pvpType == "hostile") then + pvpInfoRichText = TitanUtils_GetRedText(format(FACTION_CONTROLLED_TERRITORY, TitanPanelLocationButton.factionName)); + elseif (TitanPanelLocationButton.pvpType == "contested") then + pvpInfoRichText = TitanUtils_GetRedText(CONTESTED_TERRITORY); + else + --pvpInfoRichText = TitanUtils_GetNormalText(CONTESTED_TERRITORY); + end + + return "".. + L["TITAN_LOCATION_TOOLTIP_ZONE"].."\t"..TitanUtils_GetHighlightText(TitanPanelLocationButton.zoneText).."\n".. + TitanUtils_Ternary((TitanPanelLocationButton.subZoneText == ""), "", L["TITAN_LOCATION_TOOLTIP_SUBZONE"].."\t"..TitanUtils_GetHighlightText(TitanPanelLocationButton.subZoneText).."\n").. + TitanUtils_Ternary((pvpInfoRichText == ""), "", L["TITAN_LOCATION_TOOLTIP_PVPINFO"].."\t"..pvpInfoRichText.."\n").. + "\n".. + TitanUtils_GetHighlightText(L["TITAN_LOCATION_TOOLTIP_HOMELOCATION"]).."\n".. + L["TITAN_LOCATION_TOOLTIP_INN"].."\t"..TitanUtils_GetHighlightText(GetBindLocation()).."\n".. + TitanUtils_GetGreenText(L["TITAN_LOCATION_TOOLTIP_HINTS_1"]).."\n".. + TitanUtils_GetGreenText(L["TITAN_LOCATION_TOOLTIP_HINTS_2"]); +end + +-- ************************************************************************** +-- NAME : TitanPanelLocationButton_OnEvent() +-- DESC : Parse events registered to plugin and act on them +-- ************************************************************************** +function TitanPanelLocationButton_OnEvent(self, event, ...) + if event == "PLAYER_ENTERING_WORLD" then + if not TitanGetVar(TITAN_LOCATION_ID, "ShowLocOnMiniMap") and MinimapBorderTop and MinimapBorderTop:IsShown() then + TitanPanelLocationButton_LocOnMiniMap() + end + end + if TitanGetVar(TITAN_LOCATION_ID, "UpdateWorldmap") then + local mapID = C_Map.GetBestMapForUnit("player") +<<<<<<< HEAD + if mapID ~= nil then + WorldMapFrame:SetMapID(mapID); + end +======= + WorldMapFrame:SetMapID(mapID) +>>>>>>> parent of b7802a1... Throw away... + end + TitanPanelLocationButton_UpdateZoneInfo(self); + TitanPanelPluginHandle_OnUpdate(updateTable); + TitanPanelLocation_HandleUpdater(); +end + +-- function to throttle down unnecessary updates +function TitanPanelLocationButton_CheckForUpdate() + local mapID = C_Map.GetBestMapForUnit("player") + local tempx, tempy = TitanPanelGetPlayerMapPosition(); + if tempx ~= cachedX or tempy ~= cachedY then + TitanPanelPluginHandle_OnUpdate(updateTable); + end +end + +-- ************************************************************************** +-- NAME : TitanPanelLocation_HandleUpdater() +-- DESC : Check to see if you are inside an instance +-- ************************************************************************** +function TitanPanelLocation_HandleUpdater() + if TitanPanelLocationButton:IsVisible() and not LocationTimer then + LocationTimer = AceTimer.ScheduleRepeatingTimer("TitanPanelLocation", TitanPanelLocationButton_CheckForUpdate, 0.5) + end +end + +-- ************************************************************************** +-- NAME : TitanPanelLocationButton_OnClick(button) +-- DESC : Copies coordinates to chat line for shift-LeftClick +-- VARS : button = value of action +-- ************************************************************************** +function TitanPanelLocationButton_OnClick(self, button) + if (button == "LeftButton") then + if (IsShiftKeyDown()) then + local activeWindow = ChatEdit_GetActiveWindow(); + if ( activeWindow ) then + if (TitanGetVar(TITAN_LOCATION_ID, "CoordsFormat1")) then + message = TitanUtils_ToString(self.zoneText).." ".. + format(L["TITAN_LOCATION_FORMAT"], 100 * self.px, 100 * self.py); + elseif (TitanGetVar(TITAN_LOCATION_ID, "CoordsFormat2")) then + message = TitanUtils_ToString(self.zoneText).." ".. + format(L["TITAN_LOCATION_FORMAT2"], 100 * self.px, 100 * self.py); + elseif (TitanGetVar(TITAN_LOCATION_ID, "CoordsFormat3")) then + message = TitanUtils_ToString(self.zoneText).." ".. + format(L["TITAN_LOCATION_FORMAT3"], 100 * self.px, 100 * self.py); + end + activeWindow:Insert(message); + end + else + --WorldMap_ToggleSizeUp(); + if (not GetCVarBool("miniWorldMap")) then + --/; # Deprecated in WoW 8.0.1 + end + ToggleFrame(WorldMapFrame); + end + end +--[[ +-- Works great when map is small. When map is large, Titan stays on top. +-- Sometimes other buttons stay on top of map. +-- Think we'd have to adjust strata of anything touched by TitanMovable + if (button == "LeftButton") then + if ( WORLDMAP_SETTINGS.size == WORLDMAP_WINDOWED_SIZE ) then + if ( WorldMapFrame:IsVisible() ) then + WorldMapFrame:Hide() + else + WorldMapFrame:Show() + end + end + end +--]] +end + +-- ************************************************************************** +-- NAME : TitanPanelLocationButton_UpdateZoneInfo() +-- DESC : Update data on button +-- ************************************************************************** +function TitanPanelLocationButton_UpdateZoneInfo(self) + local _ = nil + self.zoneText = GetZoneText(); + self.subZoneText = GetSubZoneText(); + --self.minimapZoneText = GetMinimapZoneText(); + self.pvpType, _, self.factionName = GetZonePVPInfo(); +end + +-- ************************************************************************** +-- NAME : TitanPanelRightClickMenu_PrepareLocationMenu() +-- DESC : Display rightclick menu options +-- ************************************************************************** +function TitanPanelRightClickMenu_PrepareLocationMenu() + local info + + -- level 2 + if _G["L_UIDROPDOWNMENU_MENU_LEVEL"] == 2 then + if _G["L_UIDROPDOWNMENU_MENU_VALUE"] == "Options" then + TitanPanelRightClickMenu_AddTitle(L["TITAN_PANEL_OPTIONS"], _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + info = {}; + info.text = L["TITAN_LOCATION_MENU_SHOW_ZONE_ON_PANEL_TEXT"]; + info.func = TitanPanelLocationButton_ToggleDisplay; + info.checked = TitanGetVar(TITAN_LOCATION_ID, "ShowZoneText"); + L_UIDropDownMenu_AddButton(info, _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + + info = {}; + info.text = L["TITAN_LOCATION_MENU_SHOW_COORDS_ON_MAP_TEXT"]; + info.func = TitanPanelLocationButton_ToggleLocationOnMap; + info.checked = TitanGetVar(TITAN_LOCATION_ID, "ShowCoordsOnMap"); + L_UIDropDownMenu_AddButton(info, _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + + info = {}; + info.text = L["TITAN_LOCATION_MENU_SHOW_LOC_ON_MINIMAP_TEXT"]; + info.func = TitanPanelLocationButton_ToggleLocOnMiniMap; + info.checked = TitanGetVar(TITAN_LOCATION_ID, "ShowLocOnMiniMap"); + info.disabled = InCombatLockdown() + L_UIDropDownMenu_AddButton(info, _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + + 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() + L_UIDropDownMenu_AddButton(info, _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + end + if _G["L_UIDROPDOWNMENU_MENU_VALUE"] == "CoordFormat" then + TitanPanelRightClickMenu_AddTitle(L["TITAN_LOCATION_FORMAT_COORD_LABEL"], _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + info = {}; + info.text = L["TITAN_LOCATION_FORMAT_LABEL"]; + info.func = function() + TitanSetVar(TITAN_LOCATION_ID, "CoordsFormat1", 1); + TitanSetVar(TITAN_LOCATION_ID, "CoordsFormat2", nil); + TitanSetVar(TITAN_LOCATION_ID, "CoordsFormat3", nil); + TitanPanelButton_UpdateButton(TITAN_LOCATION_ID); + end + info.checked = TitanGetVar(TITAN_LOCATION_ID, "CoordsFormat1"); + L_UIDropDownMenu_AddButton(info, _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + + info = {}; + info.text = L["TITAN_LOCATION_FORMAT2_LABEL"]; + info.func = function() + TitanSetVar(TITAN_LOCATION_ID, "CoordsFormat1", nil); + TitanSetVar(TITAN_LOCATION_ID, "CoordsFormat2", 1); + TitanSetVar(TITAN_LOCATION_ID, "CoordsFormat3", nil); + TitanPanelButton_UpdateButton(TITAN_LOCATION_ID); + end + info.checked = TitanGetVar(TITAN_LOCATION_ID, "CoordsFormat2"); + L_UIDropDownMenu_AddButton(info, _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + + info = {}; + info.text = L["TITAN_LOCATION_FORMAT3_LABEL"]; + info.func = function() + TitanSetVar(TITAN_LOCATION_ID, "CoordsFormat1", nil); + TitanSetVar(TITAN_LOCATION_ID, "CoordsFormat2", nil); + TitanSetVar(TITAN_LOCATION_ID, "CoordsFormat3", 1); + TitanPanelButton_UpdateButton(TITAN_LOCATION_ID); + end + info.checked = TitanGetVar(TITAN_LOCATION_ID, "CoordsFormat3"); + L_UIDropDownMenu_AddButton(info, _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + end + return + end + + -- 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; + L_UIDropDownMenu_AddButton(info); + + info = {}; + info.notCheckable = true + info.text = L["TITAN_LOCATION_FORMAT_COORD_LABEL"]; + info.value = "CoordFormat" + info.hasArrow = 1; + L_UIDropDownMenu_AddButton(info); + + TitanPanelRightClickMenu_AddSpacer(); + TitanPanelRightClickMenu_AddToggleIcon(TITAN_LOCATION_ID); + TitanPanelRightClickMenu_AddToggleLabelText(TITAN_LOCATION_ID); + TitanPanelRightClickMenu_AddToggleColoredText(TITAN_LOCATION_ID); + TitanPanelRightClickMenu_AddSpacer(); + TitanPanelRightClickMenu_AddCommand(L["TITAN_PANEL_MENU_HIDE"], TITAN_LOCATION_ID, TITAN_PANEL_MENU_FUNC_HIDE); +end + +-- ************************************************************************** +-- NAME : TitanPanelLocationButton_ToggleDisplay() +-- DESC : Set option to show zone text +-- ************************************************************************** +function TitanPanelLocationButton_ToggleDisplay() + TitanToggleVar(TITAN_LOCATION_ID, "ShowZoneText"); + TitanPanelButton_UpdateButton(TITAN_LOCATION_ID); +end + +-- ************************************************************************** +-- NAME : TitanPanelLocationButton_ToggleLocationOnMap() +-- DESC : Set option to show player coordinates on map +-- ************************************************************************** +function TitanPanelLocationButton_ToggleLocationOnMap() + TitanToggleVar(TITAN_LOCATION_ID, "ShowCoordsOnMap"); + if (TitanGetVar(TITAN_LOCATION_ID, "ShowCoordsOnMap")) then + TitanMapPlayerLocation:Show(); + else + TitanMapPlayerLocation:Hide(); + end +end + +-- ************************************************************************** +-- NAME : TitanPanelLocationButton_ToggleCursorLocationOnMap() +-- DESC : Set option to show cursor coordinates on map +-- ************************************************************************** +function TitanPanelLocationButton_ToggleCursorLocationOnMap() + TitanToggleVar(TITAN_LOCATION_ID, "ShowCursorOnMap"); + if (TitanGetVar(TITAN_LOCATION_ID, "ShowCursorOnMap")) then + TitanMapCursorLocation:Show(); + else + TitanMapCursorLocation:Hide(); + end +end + +function TitanPanelLocationButton_ToggleLocOnMiniMap() + TitanToggleVar(TITAN_LOCATION_ID, "ShowLocOnMiniMap"); + TitanPanelLocationButton_LocOnMiniMap() +end + +function TitanPanelLocationButton_LocOnMiniMap() + if TitanGetVar(TITAN_LOCATION_ID, "ShowLocOnMiniMap") then + MinimapBorderTop:Show() + MinimapZoneTextButton:Show() + MiniMapWorldMapButton:Show() + else + MinimapBorderTop:Hide() + MinimapZoneTextButton:Hide() + MiniMapWorldMapButton:Hide() + end + -- adjust MiniMap frame if needed + TitanMovableFrame_CheckFrames(1); + TitanMovableFrame_MoveFrames(1, TitanPanelGetVar("ScreenAdjust")); +end + +-- ************************************************************************** +-- NAME : TitanPanelLocationButton_ToggleColor() +-- DESC : Set option to show colored text +-- ************************************************************************** +function TitanPanelLocationButton_ToggleColor() + TitanToggleVar(TITAN_LOCATION_ID, "ShowColoredText"); + TitanPanelButton_UpdateButton(TITAN_LOCATION_ID); +end + +-- ************************************************************************** +-- NAME : TitanMapFrame_OnUpdate() +-- DESC : Update coordinates on map +-- ************************************************************************** +function TitanMapFrame_OnUpdate(self, elapsed) + -- using :Hide / :Show prevents coords from running + -- TitanMapFrame:Hide() -- hide parent + + -- Determine the text to show for player coords + +--[[ + if WorldMapFrame:IsVisible() then + TitanMapPlayerLocation:SetText(""); + else + self.px, self.py = TitanPanelGetPlayerMapPosition(); + if self.px == nil then self.px = 0 end + if self.py == nil then self.py = 0 end + if self.px == 0 and self.py == 0 then + playerLocationText = L["TITAN_LOCATION_NO_COORDS"] + else + if (TitanGetVar(TITAN_LOCATION_ID, "CoordsFormat1")) then + playerLocationText = format(L["TITAN_LOCATION_FORMAT"], 100 * self.px, 100 * self.py); + elseif (TitanGetVar(TITAN_LOCATION_ID, "CoordsFormat2")) then + playerLocationText = format(L["TITAN_LOCATION_FORMAT2"], 100 * self.px, 100 * self.py); + elseif (TitanGetVar(TITAN_LOCATION_ID, "CoordsFormat3")) then + playerLocationText = format(L["TITAN_LOCATION_FORMAT3"], 100 * self.px, 100 * self.py); + end + end + TitanMapPlayerLocation:SetText(format(L["TITAN_LOCATION_MAP_PLAYER_COORDS_TEXT"], TitanUtils_GetHighlightText(playerLocationText))); + end +]] + if WorldMapFrame:IsMaximized() then + self.px, self.py = TitanPanelGetPlayerMapPosition(); + if self.px == nil then self.px = 0 end + if self.py == nil then self.py = 0 end + if self.px == 0 and self.py == 0 then + playerLocationText = L["TITAN_LOCATION_NO_COORDS"] + else + if (TitanGetVar(TITAN_LOCATION_ID, "CoordsFormat1")) then + playerLocationText = format(L["TITAN_LOCATION_FORMAT"], 100 * self.px, 100 * self.py); + elseif (TitanGetVar(TITAN_LOCATION_ID, "CoordsFormat2")) then + playerLocationText = format(L["TITAN_LOCATION_FORMAT2"], 100 * self.px, 100 * self.py); + elseif (TitanGetVar(TITAN_LOCATION_ID, "CoordsFormat3")) then + playerLocationText = format(L["TITAN_LOCATION_FORMAT3"], 100 * self.px, 100 * self.py); + end + end + TitanMapPlayerLocation:SetText(format(L["TITAN_LOCATION_MAP_PLAYER_COORDS_TEXT"], TitanUtils_GetHighlightText(playerLocationText))); + else + TitanMapPlayerLocation:SetText(""); + end + + -- Determine the text to show for cursor coords + + -- calc cursor position on the map + local cursorLocationText, playerLocationText; + local x, y = GetCursorPosition(); + x = x / WorldMapFrame:GetEffectiveScale(); + y = y / WorldMapFrame:GetEffectiveScale(); + + local centerX, centerY = WorldMapFrame:GetCenter(); + local width = WorldMapFrame:GetWidth(); + local height = WorldMapFrame:GetHeight(); + local cx = ((x - (centerX - (width/2))) / width) -- OFFSET_X + local cy = ((centerY + (height/2) - y ) / height) -- OFFSET_Y + -- cut off if the cursor coords are beyond the map, show 0,0 + if cx < 0 or cx > 1 or cy < 0 or cy > 1 then + cx = 0 + cy = 0 + end + -- per the user requested format + if (TitanGetVar(TITAN_LOCATION_ID, "CoordsFormat1")) then + cursorLocationText = format(L["TITAN_LOCATION_FORMAT"], 100 * cx, 100 * cy); + elseif (TitanGetVar(TITAN_LOCATION_ID, "CoordsFormat2")) then + cursorLocationText = format(L["TITAN_LOCATION_FORMAT2"], 100 * cx, 100 * cy); + elseif (TitanGetVar(TITAN_LOCATION_ID, "CoordsFormat3")) then + cursorLocationText = format(L["TITAN_LOCATION_FORMAT3"], 100 * cx, 100 * cy); + end + if (TitanGetVar(TITAN_LOCATION_ID, "ShowCoordsOnMap")) then + TitanMapCursorLocation:SetText(format(L["TITAN_LOCATION_MAP_CURSOR_COORDS_TEXT"], + TitanUtils_GetHighlightText(cursorLocationText))); + else + TitanMapCursorLocation:SetText(""); + end + + -- Determine where to show the text + + -- * + TitanMapPlayerLocation:ClearAllPoints() +--[[ + if ( WorldMapFrame:IsVisible() ) then + -- ** + TitanMapPlayerLocation:SetPoint("TOPLEFT", WorldMapFrame, "TOPLEFT", 75, -12) + else + x_offset = (WorldMapFrame:GetWidth() / 1.6) -- left fifth of map + - (TitanMapPlayerLocation:GetWidth() / 1.8) -- center of coords + TitanMapPlayerLocation:SetPoint("BOTTOMLEFT", WorldMapFrame, "BOTTOMLEFT", x_offset, 10) + end +]] + if WorldMapFrame:IsMaximized() then + x_offset = (WorldMapFrame:GetWidth() / 1.6) -- left fifth of map + - (TitanMapPlayerLocation:GetWidth() / 1.8) -- center of coords + TitanMapPlayerLocation:SetPoint("BOTTOMLEFT", WorldMapFrame, "BOTTOMLEFT", x_offset, 10) + else + TitanMapPlayerLocation:SetPoint("TOPLEFT", WorldMapFrame, "TOPLEFT", 75, -12) + end +end + +-- ************************************************************************** +-- NAME : TitanPanelGetPlayerMapPosition() +-- DESC : Get the player coordinates +-- VARS : x = location on x axis, y = location on y axis +-- ************************************************************************** +function TitanPanelGetPlayerMapPosition() + 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 diff --git a/TitanPerformance/TitanPerformance.lua b/TitanPerformance/TitanPerformance.lua new file mode 100644 index 0000000..1754d8e --- /dev/null +++ b/TitanPerformance/TitanPerformance.lua @@ -0,0 +1,796 @@ +-- ************************************************************************** +-- * TitanPerformance.lua +-- * +-- * By: TitanMod, Dark Imakuni, Adsertor and the Titan Development Team +-- ************************************************************************** + +-- ******************************** Constants ******************************* +local TITAN_PERFORMANCE_ID = "Performance"; +local TITAN_PERF_FRAME_SHOW_TIME = 0.5; +local updateTable = {TITAN_PERFORMANCE_ID, TITAN_PANEL_UPDATE_ALL}; + +local TITAN_FPS_THRESHOLD_TABLE = { + Values = { 20, 30 }, + Colors = { RED_FONT_COLOR, NORMAL_FONT_COLOR, GREEN_FONT_COLOR }, +} +local TITAN_LATENCY_THRESHOLD_TABLE = { + Values = { PERFORMANCEBAR_LOW_LATENCY, PERFORMANCEBAR_MEDIUM_LATENCY }, + Colors = { GREEN_FONT_COLOR, NORMAL_FONT_COLOR, RED_FONT_COLOR }, +} +local TITAN_MEMORY_RATE_THRESHOLD_TABLE = { + Values = { 1, 2 }, + Colors = { GREEN_FONT_COLOR, NORMAL_FONT_COLOR, RED_FONT_COLOR }, +} + +-- ******************************** Variables ******************************* +local _G = getfenv(0); +local topAddOns; +local memUsageSinceGC = {}; +local counter = 1; --counter for active addons +local L = LibStub("AceLocale-3.0"):GetLocale("Titan", true) +local AceTimer = LibStub("AceTimer-3.0") +local PerfTimer = nil; +-- ******************************** Functions ******************************* + +-- ************************************************************************** +-- NAME : TitanPanelPerformanceButton_OnLoad() +-- DESC : Registers the plugin upon it loading +-- ************************************************************************** +function TitanPanelPerformanceButton_OnLoad(self) + self.registry = { + id = TITAN_PERFORMANCE_ID, + category = "Built-ins", + version = TITAN_VERSION, + menuText = L["TITAN_PERFORMANCE_MENU_TEXT"], + buttonTextFunction = "TitanPanelPerformanceButton_GetButtonText"; + tooltipCustomFunction = TitanPanelPerformanceButton_SetTooltip; + icon = "Interface\\AddOns\\TitanPerformance\\TitanPerformance", + iconWidth = 16, + controlVariables = { + ShowIcon = true, + ShowLabelText = true, + ShowRegularText = false, + ShowColoredText = true, + DisplayOnRightSide = false, + }, + savedVariables = { + ShowFPS = 1, + ShowLatency = 1, + ShowWorldLatency = 1, + ShowMemory = 1, + ShowAddonMemory = false, + ShowAddonIncRate = false, + NumOfAddons = 5, + AddonMemoryType = 1, + ShowIcon = 1, + ShowLabelText = false, + ShowColoredText = 1, + } + }; + + self.fpsSampleCount = 0; + self:RegisterEvent("PLAYER_ENTERING_WORLD"); +end + +function TitanPanelPerformanceButton_OnShow() + if not PerfTimer then + PerfTimer = AceTimer.ScheduleRepeatingTimer("TitanPanelPerformance", TitanPanelPerformanceButtonHandle_OnUpdate, 1.5 ) + end +end + +function TitanPanelPerformanceButton_OnHide() + AceTimer.CancelTimer("TitanPanelPerformance", PerfTimer, true) + PerfTimer = nil; +end + +-- ************************************************************************** +-- NAME : TitanPanelPerformanceButton_OnUpdate(elapsed) +-- DESC : Update button data +-- VARS : elapsed = +-- ************************************************************************** +function TitanPanelPerformanceButtonHandle_OnUpdate() + TitanPanelPluginHandle_OnUpdate(updateTable); + if not (TitanPanelRightClickMenu_IsVisible()) and _G["TitanPanelPerfControlFrame"]:IsVisible() and not (MouseIsOver(_G["TitanPanelPerfControlFrame"])) then + _G["TitanPanelPerfControlFrame"]:Hide(); + end +end + +function TitanPanelPerformanceButton_OnEvent(self, event, ...) + if event == "PLAYER_ENTERING_WORLD" then + local i; + topAddOns = {} + -- scan how many addons are active + local count = GetNumAddOns(); + local ActiveAddons = 0; +<<<<<<< HEAD + local NumOfAddons = TitanGetVar(TITAN_PERFORMANCE_ID, "NumOfAddons"); + if NumOfAddons == nil then + NumOfAddons = 5; + TitanSetVar(TITAN_PERFORMANCE_ID, "NumOfAddons", 5); + end +======= +>>>>>>> parent of b7802a1... Throw away... + for i=1, count do + if IsAddOnLoaded(i) then + ActiveAddons = ActiveAddons + 1; + end + end +<<<<<<< HEAD +--TitanDebug("NumOfAddons: " .. TitanGetVar(TITAN_PERFORMANCE_ID, "NumOfAddons")); + if ActiveAddons < NumOfAddons then + counter = ActiveAddons; + else + counter = NumOfAddons; +======= + +--TitanDebug("NumOfAddons: " .. TitanGetVar(TITAN_PERFORMANCE_ID, "NumOfAddons")); +--TitanDebug("ActiveAddons: " .. ActiveAddons); + + if ActiveAddons < TitanGetVar(TITAN_PERFORMANCE_ID, "NumOfAddons") then + counter = ActiveAddons; + else + counter = TitanGetVar(TITAN_PERFORMANCE_ID, "NumOfAddons"); +>>>>>>> parent of b7802a1... Throw away... + end + --set the counter to the proper number of active addons that are being monitored + for i=1, counter do + topAddOns[i] = {name = '', value = 0} + end + end +end + +-- ************************************************************************** +-- NAME : TitanPanelPerformanceButton_GetButtonText(id) +-- DESC : Calculate performance based logic for button text +-- VARS : id = button ID +-- ************************************************************************** +function TitanPanelPerformanceButton_GetButtonText(id) + local button = _G["TitanPanelPerformanceButton"]; + local color, fpsRichText, latencyRichText, memoryRichText; + local showFPS = TitanGetVar(TITAN_PERFORMANCE_ID, "ShowFPS"); + local showLatency = TitanGetVar(TITAN_PERFORMANCE_ID, "ShowLatency"); + local showWorldLatency = TitanGetVar(TITAN_PERFORMANCE_ID, "ShowWorldLatency") + local showMemory = TitanGetVar(TITAN_PERFORMANCE_ID, "ShowMemory"); + + -- Update real time data + TitanPanelPerformanceButton_UpdateData() + + -- FPS text + if ( showFPS ) then + local fpsText = format(L["TITAN_FPS_FORMAT"], button.fps); + if ( TitanGetVar(TITAN_PERFORMANCE_ID, "ShowColoredText") ) then + color = TitanUtils_GetThresholdColor(TITAN_FPS_THRESHOLD_TABLE, button.fps); + fpsRichText = TitanUtils_GetColoredText(fpsText, color); + else + fpsRichText = TitanUtils_GetHighlightText(fpsText); + end + end + + -- Latency text + latencyRichText = "" + if ( showLatency ) then + local latencyText = format(L["TITAN_LATENCY_FORMAT"], button.latencyHome); + if ( TitanGetVar(TITAN_PERFORMANCE_ID, "ShowColoredText") ) then + color = TitanUtils_GetThresholdColor(TITAN_LATENCY_THRESHOLD_TABLE, button.latencyHome); + latencyRichText = TitanUtils_GetColoredText(latencyText, color); + else + latencyRichText = TitanUtils_GetHighlightText(latencyText) + end + end + + if ( showWorldLatency ) then + local latencyWorldText = format(L["TITAN_LATENCY_FORMAT"], button.latencyWorld); + if ( showLatency ) then + latencyRichText = latencyRichText.."/" + end + if ( TitanGetVar(TITAN_PERFORMANCE_ID, "ShowColoredText") ) then + color = TitanUtils_GetThresholdColor(TITAN_LATENCY_THRESHOLD_TABLE, button.latencyWorld); + latencyRichText = latencyRichText..TitanUtils_GetColoredText(latencyWorldText, color); + else + latencyRichText = latencyRichText..TitanUtils_GetHighlightText(latencyWorldText); + end + end + + -- Memory text + if ( showMemory ) then + local memoryText = format(L["TITAN_MEMORY_FORMAT"], button.memory/1024); + memoryRichText = TitanUtils_GetHighlightText(memoryText); + end + + if ( showFPS ) then + if ( showLatency or showWorldLatency ) then + if ( showMemory ) then + return L["TITAN_FPS_BUTTON_LABEL"], fpsRichText, L["TITAN_LATENCY_BUTTON_LABEL"], latencyRichText, L["TITAN_MEMORY_BUTTON_LABEL"], memoryRichText; + else + return L["TITAN_FPS_BUTTON_LABEL"], fpsRichText, L["TITAN_LATENCY_BUTTON_LABEL"], latencyRichText; + end + else + if ( showMemory ) then + return L["TITAN_FPS_BUTTON_LABEL"], fpsRichText, L["TITAN_MEMORY_BUTTON_LABEL"], memoryRichText; + else + return L["TITAN_FPS_BUTTON_LABEL"], fpsRichText; + end + end + else + if ( showLatency or showWorldLatency ) then + if ( showMemory ) then + return L["TITAN_LATENCY_BUTTON_LABEL"], latencyRichText, L["TITAN_MEMORY_BUTTON_LABEL"], memoryRichText; + else + return L["TITAN_LATENCY_BUTTON_LABEL"], latencyRichText; + end + else + if ( showMemory ) then + return L["TITAN_MEMORY_BUTTON_LABEL"], memoryRichText; + else + return; + end + end + end +end + +-- ************************************************************************** +-- NAME : Stats_UpdateAddonsList(self, watchingCPU) +-- DESC : Execute garbage collection for Leftclick on button +-- ************************************************************************** +local function Stats_UpdateAddonsList(self, watchingCPU) + if(watchingCPU) then + UpdateAddOnCPUUsage() + else + UpdateAddOnMemoryUsage() + end + + local total = 0 + local i,j,k; + local showAddonRate = TitanGetVar(TITAN_PERFORMANCE_ID, "ShowAddonIncRate"); + for i=1, GetNumAddOns() do + local value = (watchingCPU and GetAddOnCPUUsage(i)) or GetAddOnMemoryUsage(i) + local name = GetAddOnInfo(i) + total = total + value + + for j,addon in ipairs(topAddOns) do + if(value > addon.value) then + for k = counter, 1, -1 do + if(k == j) then + topAddOns[k].value = value + topAddOns[k].name = GetAddOnInfo(i) + break + elseif(k ~= 1) then + topAddOns[k].value = topAddOns[k-1].value + topAddOns[k].name = topAddOns[k-1].name + end + end + break + end + end + end + + GameTooltip:AddLine(' ') + + if (total > 0) then + if(watchingCPU) then + GameTooltip:AddLine('|cffffffff'..L["TITAN_PERFORMANCE_ADDON_CPU_USAGE_LABEL"]) + else + GameTooltip:AddLine('|cffffffff'..L["TITAN_PERFORMANCE_ADDON_MEM_USAGE_LABEL"]) + end + + if not watchingCPU then + if (showAddonRate == 1) then + GameTooltip:AddDoubleLine(LIGHTYELLOW_FONT_COLOR_CODE..L["TITAN_PERFORMANCE_ADDON_NAME_LABEL"],LIGHTYELLOW_FONT_COLOR_CODE..L["TITAN_PERFORMANCE_ADDON_USAGE_LABEL"].."/"..L["TITAN_PERFORMANCE_ADDON_RATE_LABEL"]..":") + else + GameTooltip:AddDoubleLine(LIGHTYELLOW_FONT_COLOR_CODE..L["TITAN_PERFORMANCE_ADDON_NAME_LABEL"],LIGHTYELLOW_FONT_COLOR_CODE..L["TITAN_PERFORMANCE_ADDON_USAGE_LABEL"]..":") + end + end + + if watchingCPU then + GameTooltip:AddDoubleLine(LIGHTYELLOW_FONT_COLOR_CODE..L["TITAN_PERFORMANCE_ADDON_NAME_LABEL"],LIGHTYELLOW_FONT_COLOR_CODE..L["TITAN_PERFORMANCE_ADDON_USAGE_LABEL"]..":") + end + + for _,addon in ipairs(topAddOns) do + if(watchingCPU) then + local diff = addon.value/total * 100; + local incrate = ""; + incrate = format("(%.2f%%)", diff); + if (showAddonRate == 1) then + GameTooltip:AddDoubleLine(NORMAL_FONT_COLOR_CODE..addon.name," |cffffffff"..format("%.3f",addon.value)..L["TITAN_MILLISECOND"].." "..GREEN_FONT_COLOR_CODE..incrate); + else + GameTooltip:AddDoubleLine(NORMAL_FONT_COLOR_CODE..addon.name," |cffffffff"..format("%.3f",addon.value)..L["TITAN_MILLISECOND"]); + end + else + local diff = addon.value - (memUsageSinceGC[addon.name]) + if diff < 0 or memUsageSinceGC[addon.name]== 0 then + memUsageSinceGC[addon.name] = addon.value; + end + local incrate = ""; + if diff > 0 then + incrate = format("(+%.2f) "..L["TITAN_KILOBYTES_PER_SECOND"], diff); + end + if (showAddonRate == 1) then + if TitanGetVar(TITAN_PERFORMANCE_ID, "AddonMemoryType") == 1 then + GameTooltip:AddDoubleLine(NORMAL_FONT_COLOR_CODE..addon.name," |cffffffff"..format(L["TITAN_MEMORY_FORMAT"], addon.value/1000).." "..GREEN_FONT_COLOR_CODE..incrate) + else + if addon.value > 1000 then + GameTooltip:AddDoubleLine(NORMAL_FONT_COLOR_CODE..addon.name," |cffffffff"..format(L["TITAN_MEMORY_FORMAT"], addon.value/1000).." "..GREEN_FONT_COLOR_CODE..incrate) + else + GameTooltip:AddDoubleLine(NORMAL_FONT_COLOR_CODE..addon.name," |cffffffff"..format(L["TITAN_MEMORY_FORMAT_KB"], addon.value).." "..GREEN_FONT_COLOR_CODE..incrate) + end + end + else + if TitanGetVar(TITAN_PERFORMANCE_ID, "AddonMemoryType") == 1 then + GameTooltip:AddDoubleLine(NORMAL_FONT_COLOR_CODE..addon.name," |cffffffff"..format(L["TITAN_MEMORY_FORMAT"], addon.value/1000)) + else + if addon.value > 1000 then + GameTooltip:AddDoubleLine(NORMAL_FONT_COLOR_CODE..addon.name," |cffffffff"..format(L["TITAN_MEMORY_FORMAT"], addon.value/1000)) + else + GameTooltip:AddDoubleLine(NORMAL_FONT_COLOR_CODE..addon.name," |cffffffff"..format(L["TITAN_MEMORY_FORMAT_KB"], addon.value)) + end + end + end + end + end + + GameTooltip:AddLine(' ') + + if(watchingCPU) then + GameTooltip:AddDoubleLine(LIGHTYELLOW_FONT_COLOR_CODE..L["TITAN_PERFORMANCE_ADDON_TOTAL_CPU_USAGE_LABEL"], format("%.3f",total)..L["TITAN_MILLISECOND"]) + else + if TitanGetVar(TITAN_PERFORMANCE_ID, "AddonMemoryType") == 1 then + GameTooltip:AddDoubleLine(LIGHTYELLOW_FONT_COLOR_CODE..L["TITAN_PERFORMANCE_ADDON_TOTAL_MEM_USAGE_LABEL"],format(L["TITAN_MEMORY_FORMAT"], total/1000)) + else + if total > 1000 then + GameTooltip:AddDoubleLine(LIGHTYELLOW_FONT_COLOR_CODE..L["TITAN_PERFORMANCE_ADDON_TOTAL_MEM_USAGE_LABEL"], format(L["TITAN_MEMORY_FORMAT"], total/1000)) + else + GameTooltip:AddDoubleLine(LIGHTYELLOW_FONT_COLOR_CODE..L["TITAN_PERFORMANCE_ADDON_TOTAL_MEM_USAGE_LABEL"], format(L["TITAN_MEMORY_FORMAT_KB"], total)) + end + end + end + end +end + +-- ************************************************************************** +-- NAME : TitanPanelPerformanceButton_SetTooltip() +-- DESC : Display tooltip text +-- ************************************************************************** +function TitanPanelPerformanceButton_SetTooltip() + local button = _G["TitanPanelPerformanceButton"]; + local showFPS = TitanGetVar(TITAN_PERFORMANCE_ID, "ShowFPS"); + local showLatency = TitanGetVar(TITAN_PERFORMANCE_ID, "ShowLatency"); + local showWorldLatency = TitanGetVar(TITAN_PERFORMANCE_ID, "ShowWorldLatency") + local showMemory = TitanGetVar(TITAN_PERFORMANCE_ID, "ShowMemory"); + local showAddonMemory = TitanGetVar(TITAN_PERFORMANCE_ID, "ShowAddonMemory"); + + -- Tooltip title + GameTooltip:SetText(L["TITAN_PERFORMANCE_TOOLTIP"], HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b); + + -- FPS tooltip + if ( showFPS ) then + local fpsText = format(L["TITAN_FPS_FORMAT"], button.fps); + local avgFPSText = format(L["TITAN_FPS_FORMAT"], button.avgFPS); + local minFPSText = format(L["TITAN_FPS_FORMAT"], button.minFPS); + local maxFPSText = format(L["TITAN_FPS_FORMAT"], button.maxFPS); + + GameTooltip:AddLine("\n"); + GameTooltip:AddLine(TitanUtils_GetHighlightText(L["TITAN_FPS_TOOLTIP"])); + GameTooltip:AddDoubleLine(L["TITAN_FPS_TOOLTIP_CURRENT_FPS"], TitanUtils_GetHighlightText(fpsText)); + GameTooltip:AddDoubleLine(L["TITAN_FPS_TOOLTIP_AVG_FPS"], TitanUtils_GetHighlightText(avgFPSText)); + GameTooltip:AddDoubleLine(L["TITAN_FPS_TOOLTIP_MIN_FPS"], TitanUtils_GetHighlightText(minFPSText)); + GameTooltip:AddDoubleLine(L["TITAN_FPS_TOOLTIP_MAX_FPS"], TitanUtils_GetHighlightText(maxFPSText)); + end + + -- Latency tooltip + if ( showLatency or showWorldLatency ) then + local latencyText = format(L["TITAN_LATENCY_FORMAT"], button.latencyHome); + local latencyWorldText = format(L["TITAN_LATENCY_FORMAT"], button.latencyWorld); + local bandwidthInText = format(L["TITAN_LATENCY_BANDWIDTH_FORMAT"], button.bandwidthIn); + local bandwidthOutText = format(L["TITAN_LATENCY_BANDWIDTH_FORMAT"], button.bandwidthOut); + + GameTooltip:AddLine("\n"); + GameTooltip:AddLine(TitanUtils_GetHighlightText(L["TITAN_LATENCY_TOOLTIP"])); + if showLatency then GameTooltip:AddDoubleLine(L["TITAN_LATENCY_TOOLTIP_LATENCY_HOME"], TitanUtils_GetHighlightText(latencyText)); end + if showWorldLatency then GameTooltip:AddDoubleLine(L["TITAN_LATENCY_TOOLTIP_LATENCY_WORLD"], TitanUtils_GetHighlightText(latencyWorldText)); end + GameTooltip:AddDoubleLine(L["TITAN_LATENCY_TOOLTIP_BANDWIDTH_IN"], TitanUtils_GetHighlightText(bandwidthInText)); + GameTooltip:AddDoubleLine(L["TITAN_LATENCY_TOOLTIP_BANDWIDTH_OUT"], TitanUtils_GetHighlightText(bandwidthOutText)); + end + + -- Memory tooltip + if ( showMemory ) then + local memoryText = format(L["TITAN_MEMORY_FORMAT"], button.memory/1024); + local initialMemoryText = format(L["TITAN_MEMORY_FORMAT"], button.initialMemory/1024); + local sessionTime = time() - button.startSessionTime; + local rateRichText, timeToGCRichText, rate, timeToGC, color; + if ( sessionTime == 0 ) then + rateRichText = TitanUtils_GetHighlightText("N/A"); + else + rate = (button.memory - button.initialMemory) / sessionTime; + color = TitanUtils_GetThresholdColor(TITAN_MEMORY_RATE_THRESHOLD_TABLE, rate); + rateRichText = TitanUtils_GetColoredText(format(L["TITAN_MEMORY_RATE_FORMAT"], rate), color); + end + if ( button.memory == button.initialMemory ) then + timeToGCRichText = TitanUtils_GetHighlightText("N/A"); + end + + GameTooltip:AddLine("\n"); + GameTooltip:AddLine(TitanUtils_GetHighlightText(L["TITAN_MEMORY_TOOLTIP"])); + GameTooltip:AddDoubleLine(L["TITAN_MEMORY_TOOLTIP_CURRENT_MEMORY"], TitanUtils_GetHighlightText(memoryText)); + GameTooltip:AddDoubleLine(L["TITAN_MEMORY_TOOLTIP_INITIAL_MEMORY"], TitanUtils_GetHighlightText(initialMemoryText)); + GameTooltip:AddDoubleLine(L["TITAN_MEMORY_TOOLTIP_INCREASING_RATE"], rateRichText); + end + + if ( showAddonMemory == 1 ) then + for _,i in pairs(topAddOns) do + i.name = ''; + i.value = 0; + end + Stats_UpdateAddonsList(self, GetCVar('scriptProfile') == '1' and not IsModifierKeyDown()) + end + + GameTooltip:AddLine(TitanUtils_GetGreenText(L["TITAN_PERFORMANCE_TOOLTIP_HINT"])); +end + +-- ************************************************************************** +-- NAME : TitanPanelRightClickMenu_PreparePerformanceMenu() +-- DESC : Display rightclick menu options +-- ************************************************************************** +function TitanPanelRightClickMenu_PreparePerformanceMenu() + local info + + -- level 3 + if _G["L_UIDROPDOWNMENU_MENU_LEVEL"] == 3 and _G["L_UIDROPDOWNMENU_MENU_VALUE"]== "AddonControlFrame" then + TitanPanelPerfControlFrame:Show() + return + end + + -- level 2 + if _G["L_UIDROPDOWNMENU_MENU_LEVEL"] == 2 then + if _G["L_UIDROPDOWNMENU_MENU_VALUE"] == "Options" then + TitanPanelRightClickMenu_AddTitle(L["TITAN_PANEL_OPTIONS"], _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + + local temptable = {TITAN_PERFORMANCE_ID, "ShowFPS"}; + info = {}; + info.text = L["TITAN_PERFORMANCE_MENU_SHOW_FPS"]; + info.value = temptable; + info.func = function() + TitanPanelRightClickMenu_ToggleVar(temptable) + end + info.checked = TitanGetVar(TITAN_PERFORMANCE_ID, "ShowFPS"); + info.keepShownOnClick = 1; + L_UIDropDownMenu_AddButton(info, _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + + local temptable = {TITAN_PERFORMANCE_ID, "ShowLatency"}; + info = {}; + info.text = L["TITAN_PERFORMANCE_MENU_SHOW_LATENCY"]; + info.value = temptable; + info.func = function() + TitanPanelRightClickMenu_ToggleVar(temptable) + end + info.checked = TitanGetVar(TITAN_PERFORMANCE_ID, "ShowLatency"); + info.keepShownOnClick = 1; + L_UIDropDownMenu_AddButton(info, _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + + local temptable = {TITAN_PERFORMANCE_ID, "ShowWorldLatency"}; + info = {}; + info.text = L["TITAN_PERFORMANCE_MENU_SHOW_LATENCY_WORLD"]; + info.value = temptable; + info.func = function() + TitanPanelRightClickMenu_ToggleVar(temptable) + end + info.checked = TitanGetVar(TITAN_PERFORMANCE_ID, "ShowWorldLatency"); + info.keepShownOnClick = 1; + L_UIDropDownMenu_AddButton(info, _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + + local temptable = {TITAN_PERFORMANCE_ID, "ShowMemory"}; + info = {}; + info.text = L["TITAN_PERFORMANCE_MENU_SHOW_MEMORY"]; + info.value = temptable; + info.func = function() + TitanPanelRightClickMenu_ToggleVar(temptable) + end + info.checked = TitanGetVar(TITAN_PERFORMANCE_ID, "ShowMemory"); + info.keepShownOnClick = 1; + L_UIDropDownMenu_AddButton(info, _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + end + + if _G["L_UIDROPDOWNMENU_MENU_VALUE"] == "AddonUsage" then + TitanPanelRightClickMenu_AddTitle(L["TITAN_PERFORMANCE_ADDONS"], _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + + local temptable = {TITAN_PERFORMANCE_ID, "ShowAddonMemory"}; + info = {}; + info.text = L["TITAN_PERFORMANCE_MENU_SHOW_ADDONS"]; + info.value = temptable; + info.func = function() + TitanPanelRightClickMenu_ToggleVar(temptable) + end + info.checked = TitanGetVar(TITAN_PERFORMANCE_ID, "ShowAddonMemory"); + info.keepShownOnClick = 1; + L_UIDropDownMenu_AddButton(info, _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + + local temptable = {TITAN_PERFORMANCE_ID, "ShowAddonIncRate"}; + info = {}; + info.text = L["TITAN_PERFORMANCE_MENU_SHOW_ADDON_RATE"]; + info.value = temptable; + info.func = function() + TitanPanelRightClickMenu_ToggleVar(temptable) + end + info.checked = TitanGetVar(TITAN_PERFORMANCE_ID, "ShowAddonIncRate"); + info.keepShownOnClick = 1; + L_UIDropDownMenu_AddButton(info, _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + + info = {}; + info.notCheckable = true + info.text = L["TITAN_PERFORMANCE_CONTROL_TOOLTIP"]..LIGHTYELLOW_FONT_COLOR_CODE..tostring(TitanGetVar(TITAN_PERFORMANCE_ID, "NumOfAddons")); + info.value = "AddonControlFrame" + info.hasArrow = 1; + L_UIDropDownMenu_AddButton(info, _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + end + + if _G["L_UIDROPDOWNMENU_MENU_VALUE"] == "AddonMemoryFormat" then + TitanPanelRightClickMenu_AddTitle(L["TITAN_PERFORMANCE_ADDON_MEM_FORMAT_LABEL"], _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + info = {}; + info.text = L["TITAN_MEGABYTE"]; + info.checked = function() if TitanGetVar(TITAN_PERFORMANCE_ID, "AddonMemoryType") == 1 then return true else return nil end + end + info.func = function() TitanSetVar(TITAN_PERFORMANCE_ID, "AddonMemoryType", 1) end + L_UIDropDownMenu_AddButton(info, _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + info = {}; + info.text = L["TITAN_MEMORY_KBMB_LABEL"]; + info.checked = function() if TitanGetVar(TITAN_PERFORMANCE_ID, "AddonMemoryType") == 2 then return true else return nil end + end + info.func = function() TitanSetVar(TITAN_PERFORMANCE_ID, "AddonMemoryType", 2) end + L_UIDropDownMenu_AddButton(info, _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + end + + if _G["L_UIDROPDOWNMENU_MENU_VALUE"] == "CPUProfiling" then + if ( GetCVar("scriptProfile") == "1" ) then + TitanPanelRightClickMenu_AddTitle(L["TITAN_PERFORMANCE_MENU_CPUPROF_LABEL"]..": "..GREEN_FONT_COLOR_CODE..L["TITAN_PANEL_MENU_ENABLED"], _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + info = {}; + info.text = L["TITAN_PERFORMANCE_MENU_CPUPROF_LABEL_OFF"]..GREEN_FONT_COLOR_CODE..L["TITAN_PANEL_MENU_RELOADUI"]; + info.func = function() SetCVar("scriptProfile", "0", 1) ReloadUI() end + L_UIDropDownMenu_AddButton(info, _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + else + TitanPanelRightClickMenu_AddTitle(L["TITAN_PERFORMANCE_MENU_CPUPROF_LABEL"]..": "..RED_FONT_COLOR_CODE..L["TITAN_PANEL_MENU_DISABLED"], _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + info = {}; + info.text = L["TITAN_PERFORMANCE_MENU_CPUPROF_LABEL_ON"]..GREEN_FONT_COLOR_CODE..L["TITAN_PANEL_MENU_RELOADUI"]; + info.func = function() SetCVar("scriptProfile", "1", 1) ReloadUI() end + L_UIDropDownMenu_AddButton(info, _G["L_UIDROPDOWNMENU_MENU_LEVEL"]); + end + end + return + end + + -- level 1 + TitanPanelRightClickMenu_AddTitle(TitanPlugins[TITAN_PERFORMANCE_ID].menuText); + + info = {}; + info.notCheckable = true + info.text = L["TITAN_PANEL_OPTIONS"]; + info.value = "Options" + info.hasArrow = 1; + L_UIDropDownMenu_AddButton(info); + + info = {}; + info.notCheckable = true + info.text = L["TITAN_PERFORMANCE_ADDONS"]; + info.value = "AddonUsage" + info.hasArrow = 1; + L_UIDropDownMenu_AddButton(info); + + info = {}; + info.notCheckable = true + info.text = L["TITAN_PERFORMANCE_ADDON_MEM_FORMAT_LABEL"]; + info.value = "AddonMemoryFormat" + info.hasArrow = 1; + L_UIDropDownMenu_AddButton(info); + + info = {}; + info.notCheckable = true + info.text = L["TITAN_PERFORMANCE_MENU_CPUPROF_LABEL"]; + info.value = "CPUProfiling" + info.hasArrow = 1; + L_UIDropDownMenu_AddButton(info); + + TitanPanelRightClickMenu_AddSpacer(); + TitanPanelRightClickMenu_AddToggleIcon(TITAN_PERFORMANCE_ID); + TitanPanelRightClickMenu_AddToggleLabelText(TITAN_PERFORMANCE_ID); + TitanPanelRightClickMenu_AddToggleColoredText(TITAN_PERFORMANCE_ID); + TitanPanelRightClickMenu_AddSpacer(); + TitanPanelRightClickMenu_AddCommand(L["TITAN_PANEL_MENU_HIDE"], TITAN_PERFORMANCE_ID, TITAN_PANEL_MENU_FUNC_HIDE); +end + +-- ************************************************************************** +-- NAME : TitanPanelPerformanceButton_UpdateData() +-- DESC : Update button data +-- ************************************************************************** +function TitanPanelPerformanceButton_UpdateData() + local button = _G["TitanPanelPerformanceButton"]; + local showFPS = TitanGetVar(TITAN_PERFORMANCE_ID, "ShowFPS"); + local showLatency = TitanGetVar(TITAN_PERFORMANCE_ID, "ShowLatency"); + local showWorldLatency = TitanGetVar(TITAN_PERFORMANCE_ID, "ShowWorldLatency") + local showMemory = TitanGetVar(TITAN_PERFORMANCE_ID, "ShowMemory"); + local showAddonMemory = TitanGetVar(TITAN_PERFORMANCE_ID, "ShowAddonMemory"); + + -- FPS Data + if ( showFPS ) then + button.fps = GetFramerate(); + button.fpsSampleCount = button.fpsSampleCount + 1; + if (button.fpsSampleCount == 1) then + button.minFPS = button.fps; + button.maxFPS = button.fps; + button.avgFPS = button.fps; + else + if (button.fps < button.minFPS) then + button.minFPS = button.fps; + elseif (button.fps > button.maxFPS) then + button.maxFPS = button.fps; + end + button.avgFPS = (button.avgFPS * (button.fpsSampleCount - 1) + button.fps) / button.fpsSampleCount; + end + end + + -- Latency Data + if ( showLatency or showWorldLatency ) then + -- bandwidthIn, bandwidthOut, latencyHome, latencyWorld = GetNetStats(); + button.bandwidthIn, button.bandwidthOut, button.latencyHome, button.latencyWorld = GetNetStats(); + end + + -- Memory data + if ( showMemory ) or (showAddonMemory == 1) then + local previousMemory = button.memory; + button.memory, button.gcThreshold = gcinfo(); + if ( not button.startSessionTime ) then + -- Initial data + local i; + button.startSessionTime = time(); + button.initialMemory = button.memory; + + for i = 1, GetNumAddOns() do + memUsageSinceGC[GetAddOnInfo(i)] = GetAddOnMemoryUsage(i) + end + elseif (previousMemory and button.memory and previousMemory > button.memory) then + -- Reset data after garbage collection + local k,i; + button.startSessionTime = time(); + button.initialMemory = button.memory; + + for k in pairs(memUsageSinceGC) do + memUsageSinceGC[k] = nil + end + + for i = 1, GetNumAddOns() do + memUsageSinceGC[GetAddOnInfo(i)] = GetAddOnMemoryUsage(i) + end + end + end +end + +-- ************************************************************************** +-- NAME : TitanPanelPerformanceButton_ResetMemory() +-- DESC : Reset the memory monitoring values +-- ************************************************************************** +--function TitanPanelPerformanceButton_ResetMemory() + -- local button = _G["TitanPanelPerformanceButton"]; + --button.memory, button.gcThreshold = gcinfo(); + --button.initialMemory = button.memory; + --button.startSessionTime = time(); +--end + + +-- ************************************************************************** +-- NAME : TitanPanelPerformanceButton_OnClick() +-- DESC : Execute garbage collection for Leftclick on button +-- ************************************************************************** +function TitanPanelPerformanceButton_OnClick(self, button) + if button == "LeftButton" then + collectgarbage('collect'); + end +end + +-- ************************************************************************** +-- NAME : TitanPanelPerfControlSlider_OnEnter() +-- DESC : Display tooltip on entering slider +-- ************************************************************************** +function TitanPanelPerfControlSlider_OnEnter(self) + self.tooltipText = TitanOptionSlider_TooltipText(L["TITAN_PERFORMANCE_CONTROL_TOOLTIP"], TitanGetVar(TITAN_PERFORMANCE_ID, "NumOfAddons")); + GameTooltip:SetOwner(self, "ANCHOR_BOTTOMLEFT"); + GameTooltip:SetText(self.tooltipText, nil, nil, nil, nil, 1); +end + +-- ************************************************************************** +-- NAME : TitanPanelPerfControlSlider_OnLeave() +-- DESC : Hide tooltip after leaving slider +-- ************************************************************************** +function TitanPanelPerfControlSlider_OnLeave(self) + self.tooltipText = nil; + GameTooltip:Hide(); +end + +-- ************************************************************************** +-- NAME : TitanPanelPerfControlSlider_OnShow() +-- DESC : Display slider tooltip +-- ************************************************************************** +function TitanPanelPerfControlSlider_OnShow(self) + _G[self:GetName().."Text"]:SetText(TitanGetVar(TITAN_PERFORMANCE_ID, "NumOfAddons")); + _G[self:GetName().."High"]:SetText(L["TITAN_PERFORMANCE_CONTROL_LOW"]); + _G[self:GetName().."Low"]:SetText(L["TITAN_PERFORMANCE_CONTROL_HIGH"]); + self:SetMinMaxValues(1, 40); + self:SetValueStep(1); + self:SetValue(41 - TitanGetVar(TITAN_PERFORMANCE_ID, "NumOfAddons")); + TitanPanelPerfControlFrame:SetBackdropColor(0, 0, 0, 1) + + TitanPanelPerfControlFrame:ClearAllPoints(); + TitanPanelPerfControlFrame:SetPoint("LEFT", "DropDownList2Button4ExpandArrow","RIGHT", 9/DropDownList2Button4ExpandArrow:GetScale(),0); + local offscreenX, offscreenY = TitanUtils_GetOffscreen(TitanPanelPerfControlFrame); + if offscreenX == -1 or offscreenX == 0 then + TitanPanelPerfControlFrame:ClearAllPoints(); + TitanPanelPerfControlFrame:SetPoint("LEFT", "DropDownList2Button4ExpandArrow","RIGHT", 9/DropDownList2Button4ExpandArrow:GetScale(),0); + else + TitanPanelPerfControlFrame:ClearAllPoints(); + TitanPanelPerfControlFrame:SetPoint("RIGHT", "DropDownList2","LEFT", 3/DropDownList2Button4ExpandArrow:GetScale(),0); + end +end + +-- ************************************************************************** +-- NAME : TitanPanelPerfControlSlider_OnValueChanged(arg1) +-- DESC : Display slider tooltip text +-- VARS : arg1 = positive or negative change to apply +-- ************************************************************************** +function TitanPanelPerfControlSlider_OnValueChanged(self, a1) + _G[self:GetName().."Text"]:SetText(41 - self:GetValue()); + + if a1 == -1 then + self:SetValue(self:GetValue() + 1); + end + + if a1 == 1 then + self:SetValue(self:GetValue() - 1); + end + + TitanSetVar(TITAN_PERFORMANCE_ID, "NumOfAddons", 41 - self:GetValue()); + + local i; + topAddOns = {}; + -- scan how many addons are active + local count = GetNumAddOns(); + local ActiveAddons = 0; + for i=1, count do + if IsAddOnLoaded(i) then + ActiveAddons = ActiveAddons + 1; + end + end + + if ActiveAddons < TitanGetVar(TITAN_PERFORMANCE_ID, "NumOfAddons") then + counter = ActiveAddons; + else + counter = TitanGetVar(TITAN_PERFORMANCE_ID, "NumOfAddons"); + end + + --set the counter to the proper number of active addons that are being monitored + for i=1, counter do + topAddOns[i] = {name = '', value = 0} + end + + -- Update GameTooltip + if (self.tooltipText) then + self.tooltipText = TitanOptionSlider_TooltipText(L["TITAN_PERFORMANCE_CONTROL_TOOLTIP"], 41 - self:GetValue()); + GameTooltip:SetText(self.tooltipText, nil, nil, nil, nil, 1); + end +end + +-- ************************************************************************** +-- NAME : TitanPanelPerfControlFrame_OnLoad() +-- DESC : Create performance option frame +-- ************************************************************************** +function TitanPanelPerfControlFrame_OnLoad(self) + _G[self:GetName().."Title"]:SetText(L["TITAN_PERFORMANCE_CONTROL_TITLE"]); + self:SetBackdropBorderColor(1, 1, 1); + self:SetBackdropColor(0, 0, 0, 1); +end + +-- ************************************************************************** +-- NAME : TitanPanelPerfControlFrame_OnUpdate(elapsed) +-- DESC : If dropdown is visible, see if its timer has expired. If so, hide frame +-- VARS : elapsed = +-- ************************************************************************** +function TitanPanelPerfControlFrame_OnUpdate(self, elapsed) + if not MouseIsOver(_G["TitanPanelPerfControlFrame"]) and not MouseIsOver (_G["DropDownList2Button4"]) and not MouseIsOver (_G["DropDownList2Button4ExpandArrow"]) then + TitanUtils_CheckFrameCounting(self, elapsed); + end +end \ No newline at end of file -- 1.7.9.5