vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:

local dewdrop = AceLibrary("Dewdrop-2.0")
local compost = AceLibrary("Compost-2.0")
local console = AceLibrary("AceConsole-2.0")

local curraddon
local reasons, sortauthors, sortcategories, sorttags = {}, {}, {}, {}
local deps, tagstrings = {"Ace", "FuBar", "oRA"}, {
        Ace2 = "cff7fff7f.*Ace2",
        FuBar = "FuBar",
}


FuBar_ModMenuTuFu = AceLibrary("AceAddon-2.0"):new("AceEvent-2.0", "AceConsole-2.0", "AceDB-2.0", "FuBarPlugin-2.0")
FuBar_ModMenuTuFu:RegisterDB("ModMenuTuFuDB")
FuBar_ModMenuTuFu.hasIcon = "Interface\\Icons\\Trade_Engineering"
FuBar_ModMenuTuFu.overrideMenu = true
FuBar_ModMenuTuFu.hasNoText = true


local function ValidateAuthor(i, auth)
        return auth == GetAddOnMetadata(i, "Author")
end


local function ValidateCategory(i, cat)
        if cat == "Unknown" then cat = nil end
        return cat == "All Mods" or cat == GetAddOnMetadata(i, "X-Category")
end


local function ValidateDependant(i, dep)
        local _, title = GetAddOnInfo(i)
        if tagstrings[dep] and string.find(title, tagstrings[dep]) then return true end

        local d = compost:Acquire(GetAddOnDependencies(i))
        local found
        for _,v in pairs(d) do if v == dep then found = true end end
        compost:Reclaim(d)
        return found
end


function FuBar_ModMenuTuFu:OnInitialize()
        local authors, categories, tags = compost:Acquire(), compost:Acquire(), compost:Acquire()

        for i=1,GetNumAddOns() do
                local name, title, notes, enabled, loadable, reason, security = GetAddOnInfo(i)
                local isondemand = IsAddOnLoadOnDemand(i)
                local author = GetAddOnMetadata(i, "Author")
                local category = GetAddOnMetadata(i, "X-Category")
                local addname = self:GetOnDemandText(i)

                if author then authors[author] = true end
                if category then categories[category] = true end

                for dep in pairs(tagstrings) do if ValidateDependant(i, dep) then tags[dep] = true end end
                for _,dep in pairs(deps) do if ValidateDependant(i, dep) then tags[dep] = true end end
        end

        for i in pairs(authors) do table.insert(sortauthors, i) end
        for i in pairs(categories) do table.insert(sortcategories, i) end
        for i in pairs(tags) do table.insert(sorttags, i) end
        table.sort(sortauthors)
        table.sort(sortcategories)
        table.sort(sorttags)

        compost:ReclaimMulti(authors, categories, tags)
end


function FuBar_ModMenuTuFu:OnMenuRequest(level, v1, intip, v2, v3, v4)
        if level == 1 then
                dewdrop:AddLine("text", "By Category", "value", "By Category", "hasArrow", true)
                dewdrop:AddLine("text", "By Author", "value", "By Author", "hasArrow", true)
                dewdrop:AddLine("text", "By Dependancy", "value", "By Dependancy", "hasArrow", true)
                dewdrop:AddLine("text", "FuBar Options", "value", "FuBar Options", "hasArrow", true)
        elseif level == 2 then
                if v1 == "By Category" then
                        for _,i in ipairs(sortcategories) do dewdrop:AddLine("text", i, "value", i, "hasArrow", true) end
                        dewdrop:AddLine()
                        dewdrop:AddLine("text", "Unknown", "value", "Unknown", "hasArrow", true)
                        dewdrop:AddLine()
                        dewdrop:AddLine("text", "All Mods", "value", "All Mods", "hasArrow", true)
                elseif v1 == "By Author" then
                        for _,i in ipairs(sortauthors) do dewdrop:AddLine("text", i, "value", i, "hasArrow", true) end
                elseif v1 == "By Dependancy" then
                        for _,i in ipairs(sorttags) do dewdrop:AddLine("text", i, "value", i, "hasArrow", true) end
                elseif v1 == "FuBar Options" then self:AddImpliedMenuOptions(2) end
        elseif self:AddImpliedMenuOptions(2) then
        elseif level == 3 then
                if v2 == "By Category" then self:BuildAddonMenu(v1, ValidateCategory)
                elseif v2 == "By Author" then self:BuildAddonMenu(v1, ValidateAuthor)
                elseif v2 == "By Dependancy" then self:BuildAddonMenu(v1, ValidateDependant) end
        else
                if level == 4 then curraddon = v1 end
                dewdrop:FeedAceOptionsTable(curraddon, 3)
        end
end


function FuBar_ModMenuTuFu:BuildAddonMenu(value, validator)
        for i=1,GetNumAddOns() do
                if validator(i, value) then
                        local name, title, notes = GetAddOnInfo(i)
                        local cmds = self:GetAddonCommandTable(name)
                        dewdrop:AddLine("text", self:GetOnDemandText(i), "func", self.HandleModClick, "arg1", self, "arg2", name,
                                "tooltipTitle", title, "tooltipText", notes, "hasArrow", cmds, "value", cmds)
                end
        end
end


function FuBar_ModMenuTuFu:GetAddonCommandTable(addon)
        for k,v in pairs(console.registry) do
                if type(v) == "table" and v.handler and v.handler.name == addon then
                        return v
                end
        end
end


function FuBar_ModMenuTuFu:HandleModClick(addon)
        local name, _, _, enabled = GetAddOnInfo(addon)

        if enabled then DisableAddOn(name)
        else EnableAddOn(name) end
end


local function getreason(r)
        if not reasons[r] then reasons[r] = TEXT(getglobal("ADDON_"..r)) end
        return reasons[r]
end


function FuBar_ModMenuTuFu:GetOnDemandText(i)
        local name, title, notes, enabled, loadable, reason, security = GetAddOnInfo(i)
        local loaded  = IsAddOnLoaded(i)
        local isondemand = IsAddOnLoadOnDemand(i)
        local color, note

        if reason == "DISABLED" then color, note = "|cff9d9d9d", getreason(reason) -- Grey
        elseif reason == "NOT_DEMAND_LOADED" then color, note = "|cff0070dd", getreason(reason) -- Blue
        elseif reason then color, note = "|cffff8000", getreason(reason) -- Orange
        elseif loadable and isondemand and not loaded and enabled then color, note = "|cff1eff00", "Loadable OnDemand" -- Green
        elseif loaded and not enabled then color, note = "|cffa335ee", "Disabled on reloadUI" -- Purple
        else return title end  -- White

        return string.format("%s%s %s(%s)|r", color, title, color, note)
end