Quantcast
local MyModData = {}
local MyMODEVariablesToTrack = {} -- format{[0] = {table = someTable, }}
local MyModChildFrames = {}

local ipairs, pairs, next, tonumber, tostring, type, print, string = ipairs, pairs, next, tonumber, tostring, type, print, string

local _G = _G

local MyMod_MEATATABLE_KEY = "$mt "

function MyMod_OnLoad(self)
    print("load")
    MyMod_LoadData(_G)
    local prevButton;
    self.scrollFrame.update = MyModScrollBar_Update;
    --[[
    for i = 1, (700 / 16) do
        local frame = CreateFrame("FRAME", "MyModEntry" .. i, self, "MyModEntryTemplate");
        if i == 1 then
            frame:SetPoint("TOPLEFT", MyModScrollBar, "TOPLEFT", 8, 0)
        else
            frame:SetPoint("TOPLEFT", MyModChildFrames[i - 1], "BOTTOMLEFT")
        end

        --MyModChildFrames[i] = frame
    end--]]

    HybridScrollFrame_CreateButtons(self.scrollFrame, "MyModEntryTemplate", 0, -2);
    MyModScrollBar:Show()
end

function MyMod_LoadData(data, saveParent)
    local i = 1

    local NewMyModData = {}


    for k, v in pairs(data) do
        if k ~= 0 then -- skip userdata
        NewMyModData[i] = k
        i = i + 1
        else
            NewMyModData[i] = "$__userdata" .. tostring(v)
        end
    end

    local mt = getmetatable(data)
    if mt then
        for k, v in pairs(mt.__index) do
            NewMyModData[i] = MyMod_MEATATABLE_KEY .. k
            i = i + 1
        end
    end

    function bykey(a, b)
        return tostring(a) < tostring(b)
    end

    table.sort(NewMyModData, bykey)

    NewMyModData.count = table.getn(NewMyModData)

    if saveParent then
        NewMyModData["parent"] = MyModData
    end

    if mt then
        NewMyModData["meta"] = mt.__index
    end
    NewMyModData["src"] = data
    MyModData = NewMyModData


    print(#MyModData .. " == " .. MyModData.count)
end

function MyMod_Table_Length(T)
    local count = 0
    for _ in pairs(T) do count = count + 1 end
    return count
end

function MyModScrollBar_Update()
    print("ok: " )
    local lineplusoffset ; -- an index into our data calculated from the scroll offset

    local scrollFrame = MyModScrollBar
    local buttons = scrollFrame.buttons;
    local offset = HybridScrollFrame_GetOffset(scrollFrame)

    for k, v in pairs(buttons) do

        lineplusoffset = k + offset;
        if lineplusoffset <= MyModData.count then
            MyMod_UpdateListItem(v, MyModData[lineplusoffset])

            v:Show();
        else
            v:Hide();
        end
    end

    HybridScrollFrame_Update(scrollFrame, MyModData.count * 16, 700);

    print("UPDATED")
end

function MyMod_Back_Button_Click()
    print("und0")
    if MyModData.parent then
        print("undo")
        MyModData = MyModData.parent
        MyModScrollBar_Update()
    end
end

function MyModEntry_ValueForKey(key)
    local value = MyModData["src"][key]
    local fromMT = false
    if not value and MyModData["meta"] then -- and key~= nil and string.len(key)>  string.len(MyMod_MEATATABLE_KEY) + 1 then
    key = string.sub(key, string.len(MyMod_MEATATABLE_KEY) + 1)
    value = MyModData["meta"][key]
    fromMT = true
    end
    --print(key .." ".. string.sub(key, string.len(MyMod_MEATATABLE_KEY)))

    return value, fromMT
end

function MyMod_UpdateListItem(node, key)
    local button = node.mainButton;


    local value, fromMT = MyModEntry_ValueForKey(key)




    local valueType = type(value)
    --local valueTypeStr = valueType
    --node:SetText(valueTypeStr .. ": " .. tostring(key));
    if valueType == "table" then


        -- print("function info: " .. tostring(type(info)))

        button:SetText(MyMod_Table_Length(value) .. " table " .. ": " .. tostring(key));
        button:SetNormalFontObject("GameFontGreen");
    elseif valueType == "userdata" then
        button:SetText(valueType .. ": " .. tostring(key));
        button:SetNormalFontObject("GameFontDisable");
    elseif valueType == "number" then
        button:SetText(valueType .. ": " .. tostring(key) .. " = " .. tostring(value));
        button:SetNormalFontObject("NumberFontNormalYellow");
    elseif valueType == "string" then
        button:SetText(valueType .. ": " .. tostring(key));
        button:SetNormalFontObject("GameFontRed");
    elseif valueType == "function" then

        button:SetText(valueType .. ": " .. tostring(key) .. " = " .. tostring(value));
        button:SetNormalFontObject("GameFontWhite");
    else
        button:SetText(valueType .. ": " .. tostring(key) .. " = " .. tostring(value));
        button:SetNormalFontObject("GameFontDisable");
    end



    if valueType == "table" or valueType == "userdata" then
        button:SetScript("OnMouseUp", function(self, button, down)
            print("click")
            -- local info = getmetatable(value)
            MyMod_LoadData(value, true)
            MyModScrollBar:SetVerticalScroll(0)
            MyModScrollBar_Update()
        end)
    elseif valueType == "function" then
        button:SetScript("OnMouseUp", function(self, button, down)
            print("click")
            local result = value()
            local resultType = type(result)
            local additionalInfo = ""
            if resultType == "string" or resultType == "number" then
                additionalInfo = tostring(result)
            end

            print("returns:  " .. resultType .. " " .. additionalInfo)
        end)
    else
        button:SetScript("OnMouseUp", nil)
    end
end