vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
-- AddonMenu (Satrina@Stormrage)
-- An embedded library to support addon configuration menus in the SELF menu
-- See AddonMenu.txt for usage

local version = 1.5

if not AddonMenu or (AddonMenu.version < version) then

        local prevAddonMenu = AddonMenu
        
        AddonMenu = {
                version = version,
                debug = nil,
                
                --------------------
                -- User functions --
                --------------------
        
                --
                -- AddMenuItem
                -- Add text as a menu option to the addon menu callback will be invoked when the user selects it
                --
                AddMenuItem = function(self, name, callbackFunc, submenu)
                        self:Init()
                        if not submenu then 
                                table.insert(UnitPopupMenus["ADDON_MENU"], 1, name)
                        else
                                if not UnitPopupMenus[submenu] then
                                        if self.debug then
                                                ChatFrame1:AddMessage("AddMenuItem: Adding submenu |cff00ff00"..submenu.."|r")
                                        end
                                        table.insert(UnitPopupMenus["ADDON_MENU"], 1, submenu)
                                        UnitPopupButtons[submenu] = { text = TEXT(submenu), dist = 0, nested = 1 }
                                        UnitPopupMenus[submenu] = { "CANCEL" }
                                end
                                table.insert(UnitPopupMenus[submenu], 1, name)
                        end
                        if self.debug then
                                ChatFrame1:AddMessage("AddMenuItem: Adding menu item |cff00ff00"..name.."|r")
                        end
                        UnitPopupButtons[name] = { text = TEXT(name), dist = 0 }
                        self:InsertCallback(name, callbackFunc)
                end,
        
                -------------------------------------------
                -- Users should not call these functions --
                -------------------------------------------
        
                --
                -- AddonMenuName
                -- Return the localised text for the addon menu name
                --
                AddonMenuName = function(self)
                        -- if (GetLocale() == "deDE") then
                        --      return "GermanText"
                        -- elseif (GetLocale() == "frFR") then
                        --      return "FrenchText"
                        -- else
                        return "Addons"
                        -- end
                end,
                
                --
                -- InsertCallback
                -- Insert a callback into the hook table
                --
                InsertCallback = function(self, item, callbackFunc)
                        for index,entry in pairs(self.callbacks) do
                                if entry.name == item then
                                        return
                                end
                        end
                        table.insert(self.callbacks, {name = item, func = callbackFunc})
                end,
                
                --
                -- UnitPopup_OnClick
                -- If the menu item clicked is in the hook table, call its callback
                -- Otherwise call the global UnitPopup_OnClick
                --
                UnitPopup_OnClick = function()
                        for index,entry in AddonMenu.callbacks do
                                if (this.value == entry.name) then
                                        entry.func()
                                        return
                                end
                        end
                        AddonMenu.unitPopupOnClick()
                end,

                -- 
                -- UnitPopup_ShowMenu
                -- Override the original function with a copy of itself, making two small changes to support a third level of nesting.
                -- Very ugly.
                -- Unless we're in the self menu and above the first level of nesting, though, just passthrough
                -- 
                UnitPopup_ShowMenu = function(dropdownMenu, which, unit, name, userData)
                        if (UIDROPDOWNMENU_MENU_LEVEL > 1) and (which == "SELF") then
                                -- Init variables
                                dropdownMenu.which = which;
                                dropdownMenu.unit = unit;
                                if ( unit and not name ) then
                                        name = UnitName(unit);
                                end
                                dropdownMenu.name = name;
                                dropdownMenu.userData = userData;
                        
                                -- Determine which buttons should be shown or hidden
                                UnitPopup_HideButtons();
                                
                                -- If only one menu item (the cancel button) then don't show the menu
                                local count = 0;
                                for index, value in UnitPopupMenus[which] do
                                        if( UnitPopupShown[index] == 1 and value ~= "CANCEL" ) then
                                                count = count + 1;
                                        end
                                end
                                if ( count < 1 ) then
                                        return;
                                end
                        
                                -- Determine which loot method and which loot threshold are selected and set the corresponding buttons to the same text
                                dropdownMenu.selectedLootMethod = UnitLootMethod[GetLootMethod()].text;
                                UnitPopupButtons["LOOT_METHOD"].text = dropdownMenu.selectedLootMethod;
                                UnitPopupButtons["LOOT_METHOD"].tooltipText = UnitLootMethod[GetLootMethod()].tooltipText;
                                dropdownMenu.selectedLootThreshold = getglobal("ITEM_QUALITY"..GetLootThreshold().."_DESC");
                                UnitPopupButtons["LOOT_THRESHOLD"].text = dropdownMenu.selectedLootThreshold;
                                -- This allows player to view loot settings if he's not the leader
                                if ( ((GetNumPartyMembers() > 0) or (GetNumRaidMembers() > 0)) and IsPartyLeader() ) then
                                        -- If this is true then player is the party leader
                                        UnitPopupButtons["LOOT_METHOD"].nested = 1;
                                        UnitPopupButtons["LOOT_THRESHOLD"].nested = 1;
                                else
                                        UnitPopupButtons["LOOT_METHOD"].nested = nil;
                                        UnitPopupButtons["LOOT_THRESHOLD"].nested = nil;
                                end
                        
                                -- If level 2 dropdown
                                local info;
                                local color;
                                local icon;
                                if ( UIDROPDOWNMENU_MENU_LEVEL > 1 ) then
                                        dropdownMenu.which = UIDROPDOWNMENU_MENU_VALUE;
                                        for index, value in UnitPopupMenus[UIDROPDOWNMENU_MENU_VALUE] do
                                                info = {};
                                                info.text = UnitPopupButtons[value].text;
                                                info.owner = UIDROPDOWNMENU_MENU_VALUE;
                                                -- Set the text color
                                                color = UnitPopupButtons[value].color;
                                                if ( color ) then
                                                        info.textR = color.r;
                                                        info.textG = color.g;
                                                        info.textB = color.b;
                                                end
                                                -- Icons
                                                info.icon = UnitPopupButtons[value].icon;
                                                info.tCoordLeft = UnitPopupButtons[value].tCoordLeft;
                                                info.tCoordRight = UnitPopupButtons[value].tCoordRight;
                                                info.tCoordTop = UnitPopupButtons[value].tCoordTop;
                                                info.tCoordBottom = UnitPopupButtons[value].tCoordBottom;
                                                -- Checked conditions
                                                if ( info.text == dropdownMenu.selectedLootMethod  ) then
                                                        info.checked = 1;
                                                elseif ( info.text == dropdownMenu.selectedLootThreshold ) then
                                                        info.checked = 1;
                                                elseif ( strsub(value, 1, 12) == "RAID_TARGET_" ) then
                                                        local raidTargetIndex = GetRaidTargetIndex(unit);
                                                        if ( raidTargetIndex == index ) then
                                                                info.checked = 1;
                                                        end
                                                end
                
                                                if ( UnitPopupButtons[value].nested ) then
                                                         info.hasArrow = 1;
                                                end
                                                
                                                info.value = value;
                                                info.func = UnitPopup_OnClick;
                                                -- Setup newbie tooltips
                                                info.tooltipTitle = UnitPopupButtons[value].text;
                                                info.tooltipText = getglobal("NEWBIE_TOOLTIP_UNIT_"..value);
                                                UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
                                        end
                                        return;                 
                                end
                        
                                -- Add dropdown title
                                if ( unit or name ) then
                                        info = {};
                                        if ( name ) then
                                                info.text = name;
                                        else
                                                info.text = TEXT(UNKNOWN);
                                        end
                                        info.isTitle = 1;
                                        info.notCheckable = 1;
                                        UIDropDownMenu_AddButton(info);
                                end
                                
                                -- Show the buttons which are used by this menu
                                local tooltipText;
                                for index, value in UnitPopupMenus[which] do
                                        if( UnitPopupShown[index] == 1 ) then
                                                info = {};
                                                info.text = UnitPopupButtons[value].text;
                                                info.value = value;
                                                info.owner = which;
                                                info.func = UnitPopup_OnClick;
                                                if ( not UnitPopupButtons[value].checkable ) then
                                                        info.notCheckable = 1;
                                                end
                                                -- Text color
                                                if ( value == "LOOT_THRESHOLD" ) then
                                                        -- Set the text color
                                                        color = ITEM_QUALITY_COLORS[GetLootThreshold()];
                                                        info.textR = color.r;
                                                        info.textG = color.g;
                                                        info.textB = color.b;
                                                else
                                                        color = UnitPopupButtons[value].color;
                                                        if ( color ) then
                                                                info.textR = color.r;
                                                                info.textG = color.g;
                                                                info.textB = color.b;
                                                        end
                                                end
                                                -- Icons
                                                info.icon = UnitPopupButtons[value].icon;
                                                info.tCoordLeft = UnitPopupButtons[value].tCoordLeft;
                                                info.tCoordRight = UnitPopupButtons[value].tCoordRight;
                                                info.tCoordTop = UnitPopupButtons[value].tCoordTop;
                                                info.tCoordBottom = UnitPopupButtons[value].tCoordBottom;
                                                -- Checked conditions
                                                if ( strsub(value, 1, 12) == "RAID_TARGET_" ) then
                                                        local raidTargetIndex = GetRaidTargetIndex("target");
                                                        if ( raidTargetIndex == index ) then
                                                                info.checked = 1;
                                                        end
                                                end
                                                if ( UnitPopupButtons[value].nested ) then
                                                        info.hasArrow = 1;
                                                end
                                                
                                                -- Setup newbie tooltips
                                                info.tooltipTitle = UnitPopupButtons[value].text;
                                                tooltipText = getglobal("NEWBIE_TOOLTIP_UNIT_"..value);
                                                if ( not tooltipText ) then
                                                        tooltipText = UnitPopupButtons[value].tooltipText;
                                                end
                                                info.tooltipText = tooltipText;
                                                UIDropDownMenu_AddButton(info);
                                        end
                                end
                                PlaySound("igMainMenuOpen");
                        else
                                AddonMenu.origShowMenu(dropdownMenu, which, unit, name, userData)
                        end
                end,
        
                -- 
                -- Initialisation
                -- 
                Init = function(self)
                        if not self.initialised then
                                if self.debug then
                                        ChatFrame1:AddMessage(string.format("AddMenuitem: Initializing version |cff00ff00%.1f|r", self.version))
                                end
                                if prevAddonMenu then
                                        if self.debug then
                                                ChatFrame1:AddMessage(string.format("AddMenuitem: Migrating data from AddonMenu version %.1f", prevAddonMenu.version))
                                        end
                                        self.callbacks = prevAddonMenu.callbacks
                                        self.submenus = prevAddonMenu.submenus
                                        self.nextSubmenuID = prevAddonMenu.nextSubmenuID
                                        self.unitPopupOnClick = prevAddonMenu.unitPopupOnClick
                                        if prevAddonMenu.origShowMenu then
                                                self.origShowMenu = prevAddonMenu.origShowMenu
                                        else
                                                self.origShowMenu = getglobal("UnitPopup_ShowMenu")
                                        end
                                        prevAddonMenu = {}
                                else
                                        self.callbacks = {}
                                        self.submenus = {}
                                        self.nextSubmenuID = 200
                                        self.unitPopupOnClick = getglobal("UnitPopup_OnClick")
                                        self.origShowMenu = getglobal("UnitPopup_ShowMenu")
                                        UnitPopupButtons["ADDON_MENU"] = { text = self:AddonMenuName(), dist = 0, nested = 1 }
                                        table.insert(UnitPopupMenus["SELF"], table.getn(UnitPopupMenus["SELF"]), "ADDON_MENU")
                                        UnitPopupMenus["ADDON_MENU"] = {}
                                end
                                UnitPopup_OnClick = self.UnitPopup_OnClick
                                UnitPopup_ShowMenu = self.UnitPopup_ShowMenu
                                self.initialised = true
                        end
                end
        }
end

Generated by GNU Enscript 1.6.5.90.