Quantcast
--[[
##############################################################################
_____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 ___/\\\/////////\\\_\/\\\_______\/\\\_\/\\\_______\/\\\_\/////\\\///__      #
  __\//\\\______\///__\//\\\______/\\\__\/\\\_______\/\\\_____\/\\\_____     #
   ___\////\\\__________\//\\\____/\\\___\/\\\_______\/\\\_____\/\\\_____    #
    ______\////\\\________\//\\\__/\\\____\/\\\_______\/\\\_____\/\\\_____   #
     _________\////\\\______\//\\\/\\\_____\/\\\_______\/\\\_____\/\\\_____  #
      __/\\\______\//\\\______\//\\\\\______\//\\\______/\\\______\/\\\_____ #
       _\///\\\\\\\\\\\/________\//\\\________\///\\\\\\\\\/____/\\\\\\\\\\\_#
        ___\///////////___________\///___________\/////////_____\///////////_#
##############################################################################
S U P E R - V I L L A I N - U I   By: Munglunch                              #
##############################################################################
##########################################################
LOCALIZED LUA FUNCTIONS
##########################################################
]]--
--[[ GLOBALS ]]--
local _G = _G;
local unpack    = _G.unpack;
local select    = _G.select;
local pairs     = _G.pairs;
local type      = _G.type;
local tostring  = _G.tostring;
local tonumber  = _G.tonumber;
local tinsert   = _G.tinsert;
local string    = _G.string;
local math      = _G.math;
local table     = _G.table;
--[[ STRING METHODS ]]--
local format, find, lower, match = string.format, string.find, string.lower, string.match;
--[[ MATH METHODS ]]--
local floor, abs, min, max = math.floor, math.abs, math.min, math.max;
--[[ TABLE METHODS ]]--
local tremove, tcopy, twipe, tsort, tconcat, tdump = table.remove, table.copy, table.wipe, table.sort, table.concat, table.dump;
--[[
##########################################################
GET ADDON DATA
##########################################################
]]--
local SV, L = unpack(SVUI);
local ErrorStorage = {}
BINDING_HEADER_SVUIDEBUG = "Supervillain UI: Debugger";
--[[
##########################################################
CUSTOM MESSAGE WINDOW
##########################################################
]]--
function SVUI_ScriptError_OnLoad()
    SVUI_ScriptError.Source = "";
    SVUI_ScriptError:SetFixedPanelTemplate("Transparent")
    SVUI_ScriptErrorDialog:SetFixedPanelTemplate("Transparent")
    SVUI_ScriptErrorDialog.Input:SetScript("OnTextChanged", function(self, userInput)
        if userInput then return end
        local _, max = SVUI_ScriptErrorDialogScrollBar:GetMinMaxValues()
        for i = 1, max do
          ScrollFrameTemplate_OnMouseWheel(SVUI_ScriptErrorDialog, -1)
        end
    end)
    _G["SVUI_ScriptError"]:RegisterForDrag("LeftButton");
end

function SVUI_ScriptError_OnShow()
    if SVUI_ScriptError.Source then
        local txt = SVUI_ScriptError.Source;
        SVUI_ScriptError.Title:SetText(txt);
    end
end
--[[
##########################################################
OTHER SLASH COMMANDS
##########################################################
]]--
local function GetOriginalContext()
    UIParentLoadAddOn("Blizzard_DebugTools")
    local orig_DevTools_RunDump = DevTools_RunDump
    local originalContext
    DevTools_RunDump = function(value, context)
        originalContext = context
    end
    DevTools_Dump("")
    DevTools_RunDump = orig_DevTools_RunDump
    return originalContext
end

local function SV_Dump(value)
    local context = GetOriginalContext()
    local buffer = ""
    context.Write = function(self, msg)
        buffer = buffer.."\n"..msg
    end

    DevTools_RunDump(value, context)
    return buffer.."\n"..table.dump(value)
end

local function DebugDump(any)
    if type(any)=="string" then
        return any
    elseif type(any) == "table" then
        return SV_Dump(any)
    elseif any==nil or type(any)=="number" then
        return tostring(any)
    end
    return any
end

local function DebugOutput(msg)
    if not SVUI_ScriptError:IsShown() then
        SVUI_ScriptError:Show()
    end
    local outputString = SVUI_ScriptErrorDialog.Input:GetText()
    outputString = outputString .. "\n" .. msg
    tinsert(ErrorStorage,msg);
    SVUI_ScriptErrorDialog.Input:SetText(outputString)
end

local function ShowDebug(header, ...)
    local value = (header and format("Debug %s: ", header)) or "Debug: "
    value = format("|cff11ff11 %s|r", value)
    for i = 1, select('#', ...), 2 do
        local name = select(i, ...)
        local var = DebugDump(select(i+1, ...))
        value = format("%s %s = ", value, name)..var
    end
    SVUI_ScriptError.Source = header;
    DebugOutput(value)
end

function DebugThisFrame(arg)
    local outputString = " ";
    if arg then
        arg = _G[arg] or GetMouseFocus()
    else
        arg = GetMouseFocus()
    end
    if arg and (arg.GetName and arg:GetName()) then
        local point, relativeTo, relativePoint, xOfs, yOfs = arg:GetPoint()
        outputString = outputString.."|cffCC0000----------------------------".."\n"
        outputString = outputString.."|cffCC00FF--Mouseover Frame".."|r".."\n"
        outputString = outputString.."|cffCC0000----------------------------|r".."\n"
        outputString = outputString.."|cff00D1FF".."Name: |cffFFD100"..arg:GetName().."\n"
        if arg:GetParent() and arg:GetParent():GetName() then
            outputString = outputString.."|cff00D1FF".."Parent: |cffFFD100"..arg:GetParent():GetName().."\n"
        end
        outputString = outputString.."|cff00D1FF".."Width: |cffFFD100"..format("%.2f",arg:GetWidth()).."\n"
        outputString = outputString.."|cff00D1FF".."Height: |cffFFD100"..format("%.2f",arg:GetHeight()).."\n"
        outputString = outputString.."|cff00D1FF".."Strata: |cffFFD100"..arg:GetFrameStrata().."\n"
        outputString = outputString.."|cff00D1FF".."Level: |cffFFD100"..arg:GetFrameLevel().."\n"
        outputString = outputString.."|cff00D1FF".."IsShown: |cffFFD100"..tostring(arg:IsShown()).."\n"
        if xOfs then
            outputString = outputString.."|cff00D1FF".."X: |cffFFD100"..format("%.2f",xOfs).."\n"
        end
        if yOfs then
            outputString = outputString.."|cff00D1FF".."Y: |cffFFD100"..format("%.2f",yOfs).."\n"
        end
        if relativeTo and relativeTo:GetName() then
            outputString = outputString.."|cff00D1FF".."Point: |cffFFD100"..point.."|r anchored to "..relativeTo:GetName().."'s |cffFFD100"..relativePoint.."\n"
        end
        local bg = arg:GetBackdrop()
        if type(bg) == "table" then
            outputString = outputString.."|cffFF9900>> BACKDROP --------------------------|r".."\n"
            outputString = outputString..tdump(bg).."\n"
        end
        if arg._template then
            outputString = outputString.."Template Name: |cff00FF55"..arg._template.."\n"
        end
        if arg.Panel then
            local cpt, crt, crp, cxo, cyo = arg.Panel:GetPoint()
            outputString = outputString.."|cffFF8800>> backdropFrame --------------------------|r".."\n"
            outputString = outputString.."|cff00D1FF".."Width: |cffFFD100"..format("%.2f",arg.Panel:GetWidth()).."\n"
            outputString = outputString.."|cff00D1FF".."Height: |cffFFD100"..format("%.2f",arg.Panel:GetHeight()).."\n"
            outputString = outputString.."|cff00D1FF".."Strata: |cffFFD100"..arg.Panel:GetFrameStrata().."\n"
            outputString = outputString.."|cff00D1FF".."Level: |cffFFD100"..arg.Panel:GetFrameLevel().."\n"
            if cxo then
                outputString = outputString.."|cff00D1FF".."X: |cffFFD100"..format("%.2f",cxo).."\n"
            end
            if cyo then
                outputString = outputString.."|cff00D1FF".."Y: |cffFFD100"..format("%.2f",cyo).."\n"
            end
            if crt and crt:GetName() then
                outputString = outputString.."|cff00D1FF".."Point: |cffFFD100"..cpt.."|r anchored to "..crt:GetName().."'s |cffFFD100"..crp.."\n"
            end
            bg = arg.Panel:GetBackdrop()
            if type(bg) == "table" then
                outputString = outputString.."|cffFF9900>> BACKDROP --------------------------|r".."\n"
                outputString = outputString..tdump(bg).."\n"
            end
            if arg._skin then
                local cpt, crt, crp, cxo, cyo = arg._skin:GetPoint()
                outputString = outputString.."|cffFF7700>> backdropTexture --------------------------|r".."\n"
                outputString = outputString.."|cff00D1FF".."Width: |cffFFD100"..format("%.2f",arg._skin:GetWidth()).."\n"
                outputString = outputString.."|cff00D1FF".."Height: |cffFFD100"..format("%.2f",arg._skin:GetHeight()).."\n"
                if cxo then
                    outputString = outputString.."|cff00D1FF".."X: |cffFFD100"..format("%.2f",cxo).."\n"
                end
                if cyo then
                    outputString = outputString.."|cff00D1FF".."Y: |cffFFD100"..format("%.2f",cyo).."\n"
                end
                if crt and crt:GetName() then
                    outputString = outputString.."|cff00D1FF".."Point: |cffFFD100"..cpt.."|r anchored to "..crt:GetName().."'s |cffFFD100"..crp.."\n"
                end
                bg = arg._skin:GetTexture()
                if bg then
                    outputString = outputString.."|cff00D1FF".."Texture: |cffFFD100"..bg.."\n"
                end
            end
        end
        local childFrames = { arg:GetChildren() }
        if #childFrames > 0 then
            outputString = outputString.."|cffCC00FF>>>> Child Frames----------------------------".."|r".."\n".."\n"
            for _, child in ipairs(childFrames) do
                local cpt, crt, crp, cxo, cyo = child:GetPoint()
                if child:GetName() then
                    outputString = outputString.."\n\n|cff00FF55++"..child:GetName().."|r".."\n"
                else
                    outputString = outputString.."\n\n|cff99FF55+!!+".."Anonymous Frame".."|r".."\n"
                end
                outputString = outputString.."|cffCC00FF----------------------------|r".."\n"
                outputString = outputString.."|cff00D1FF".."Width: |cffFFD100"..format("%.2f",child:GetWidth()).."\n"
                outputString = outputString.."|cff00D1FF".."Height: |cffFFD100"..format("%.2f",child:GetHeight()).."\n"
                outputString = outputString.."|cff00D1FF".."Strata: |cffFFD100"..child:GetFrameStrata().."\n"
                outputString = outputString.."|cff00D1FF".."Level: |cffFFD100"..child:GetFrameLevel().."\n"
                if cxo then
                    outputString = outputString.."|cff00D1FF".."X: |cffFFD100"..format("%.2f",cxo).."\n"
                end
                if cyo then
                    outputString = outputString.."|cff00D1FF".."Y: |cffFFD100"..format("%.2f",cyo).."\n"
                end
                if crt and crt:GetName() then
                    outputString = outputString.."|cff00D1FF".."Point: |cffFFD100"..cpt.."|r anchored to "..crt:GetName().."'s |cffFFD100"..crp.."\n"
                end
                bg = child:GetBackdrop()
                if type(bg) == "table" then
                    outputString = outputString.."|cffFF9900>> BACKDROP --------------------------|r".."\n"
                    outputString = outputString..tdump(bg).."\n"
                end
                if child._template then
                    outputString = outputString.."Template Name: |cff00FF55"..child._template.."\n"
                end
                if child.Panel then
                    local cpt, crt, crp, cxo, cyo = child.Panel:GetPoint()
                    outputString = outputString.."|cffFF8800>> backdropFrame --------------------------|r".."\n"
                    outputString = outputString.."|cff00D1FF".."Width: |cffFFD100"..format("%.2f",child.Panel:GetWidth()).."\n"
                    outputString = outputString.."|cff00D1FF".."Height: |cffFFD100"..format("%.2f",child.Panel:GetHeight()).."\n"
                    outputString = outputString.."|cff00D1FF".."Strata: |cffFFD100"..child.Panel:GetFrameStrata().."\n"
                    outputString = outputString.."|cff00D1FF".."Level: |cffFFD100"..child.Panel:GetFrameLevel().."\n"
                    if cxo then
                        outputString = outputString.."|cff00D1FF".."X: |cffFFD100"..format("%.2f",cxo).."\n"
                    end
                    if cyo then
                        outputString = outputString.."|cff00D1FF".."Y: |cffFFD100"..format("%.2f",cyo).."\n"
                    end
                    if crt and crt:GetName() then
                        outputString = outputString.."|cff00D1FF".."Point: |cffFFD100"..cpt.."|r anchored to "..crt:GetName().."'s |cffFFD100"..crp.."\n"
                    end
                    bg = child.Panel:GetBackdrop()
                    if type(bg) == "table" then
                        outputString = outputString.."|cffFF9900>> BACKDROP --------------------------|r".."\n"
                        outputString = outputString..tdump(bg).."\n"
                    end
                    if child._skin then
                        local cpt, crt, crp, cxo, cyo = child._skin:GetPoint()
                        outputString = outputString.."|cffFF7700>> backdropTexture --------------------------|r".."\n"
                        outputString = outputString.."|cff00D1FF".."Width: |cffFFD100"..format("%.2f",child._skin:GetWidth()).."\n"
                        outputString = outputString.."|cff00D1FF".."Height: |cffFFD100"..format("%.2f",child._skin:GetHeight()).."\n"
                        if cxo then
                            outputString = outputString.."|cff00D1FF".."X: |cffFFD100"..format("%.2f",cxo).."\n"
                        end
                        if cyo then
                            outputString = outputString.."|cff00D1FF".."Y: |cffFFD100"..format("%.2f",cyo).."\n"
                        end
                        if crt and crt:GetName() then
                            outputString = outputString.."|cff00D1FF".."Point: |cffFFD100"..cpt.."|r anchored to "..crt:GetName().."'s |cffFFD100"..crp.."\n"
                        end
                        bg = child._skin:GetTexture()
                        if bg then
                            outputString = outputString.."|cffFF9900----------------------------|r".."\n"
                            outputString = outputString..bg.."\n"
                        end
                        outputString = outputString.."|cffCC0000----------------------------|r".."\n"
                    end
                end
            end
            outputString = outputString.."\n\n"
        end
    elseif arg == nil or arg == "" then
        outputString = outputString.."Invalid frame name".."\n"
    else
        outputString = outputString.."Could not find frame info".."\n"
    end
    DebugOutput(outputString)
end
SLASH_SVUI_FRAME_DEBUG1 = "/svdf"
SlashCmdList["SVUI_FRAME_DEBUG"] = DebugThisFrame;