You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
3.2 KiB
105 lines
3.2 KiB
|
5 years ago
|
local Type, Version = "WITDropDownMenu", 24
|
||
|
|
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
|
||
|
|
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
|
||
|
|
|
||
|
|
-- Lua APIs
|
||
|
|
local pairs, assert, type = pairs, assert, type
|
||
|
|
local min, max, floor, abs = math.min, math.max, math.floor, math.abs
|
||
|
|
|
||
|
|
-- WoW APIs
|
||
|
|
local CreateFrame, UIParent = CreateFrame, UIParent
|
||
|
|
|
||
|
|
--[[-----------------------------------------------------------------------------
|
||
|
|
Scripts
|
||
|
|
-------------------------------------------------------------------------------]]
|
||
|
|
local function DropDownMenu_OnLoad(dropDown, level, menuList)
|
||
|
|
if menuList then
|
||
|
|
for key, item in pairs(menuList) do
|
||
|
|
if not item.IsVisible or item.IsVisible(item.ActionArg) then
|
||
|
|
local hasChildren = item.Children ~= nil and #(item.Children) > 0
|
||
|
|
local info = UIDropDownMenu_CreateInfo()
|
||
|
|
info.hasArrow = hasChildren
|
||
|
|
info.notCheckable = true
|
||
|
|
info.disabled = item.IsEnabled and (not item.IsEnabled(item.ActionArg))
|
||
|
|
info.text = item.DisplayName or item.Name
|
||
|
|
info.menuList = item.Children
|
||
|
|
info.func = function (self, arg1)
|
||
|
|
if item.Action then
|
||
|
|
item.Action(arg1)
|
||
|
|
end
|
||
|
|
|
||
|
|
--UIDROPDOWNMENU_OPEN_MENU
|
||
|
|
|
||
|
|
for key, _ in pairs(dropDown.obj.frame) do
|
||
|
|
--print(key)
|
||
|
|
end
|
||
|
|
|
||
|
|
if level and level > 1 then
|
||
|
|
dropDown.obj:Show()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
info.arg1 = item.ActionArg
|
||
|
|
|
||
|
|
UIDropDownMenu_AddButton(info, level)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local function Init(frame)
|
||
|
|
UIDropDownMenu_Initialize(frame, DropDownMenu_OnLoad)
|
||
|
|
end
|
||
|
|
|
||
|
|
--[[-----------------------------------------------------------------------------
|
||
|
|
Methods
|
||
|
|
-------------------------------------------------------------------------------]]
|
||
|
|
local methods = {
|
||
|
|
["OnAcquire"] = function(self)
|
||
|
|
self.frame:Hide()
|
||
|
|
self.anchor = nil
|
||
|
|
end,
|
||
|
|
|
||
|
|
["Show"] = function(self)
|
||
|
|
if not self.Initialized then
|
||
|
|
UIDropDownMenu_Initialize(self.frame, DropDownMenu_OnLoad)
|
||
|
|
end
|
||
|
|
|
||
|
|
ToggleDropDownMenu(1, nil, self.frame, self.anchor.frame or self.anchor, self.offsetX, self.offsetY, self.menuList)
|
||
|
|
|
||
|
|
self.Initialized = true
|
||
|
|
end,
|
||
|
|
|
||
|
|
["SetAnchor"] = function(self, anchorFrame, offsetX, offsetY)
|
||
|
|
self.anchor = anchorFrame
|
||
|
|
self.offsetX = offsetX or self.offsetX or 0
|
||
|
|
self.offsetY = offsetY or self.offsetY or 0
|
||
|
|
end,
|
||
|
|
|
||
|
|
["SetMenuList"] = function(self, menuList)
|
||
|
|
self.menuList = menuList
|
||
|
|
end
|
||
|
|
}
|
||
|
|
|
||
|
|
--[[-----------------------------------------------------------------------------
|
||
|
|
Constructor
|
||
|
|
-------------------------------------------------------------------------------]]
|
||
|
|
local function Constructor()
|
||
|
|
local frame = CreateFrame("Frame", nil, UIParent, "UIDropDownMenuTemplate")
|
||
|
|
--local num = AceGUI:GetNextWidgetNum(Type)
|
||
|
|
|
||
|
|
local widget = {
|
||
|
|
frame = frame,
|
||
|
|
type = Type
|
||
|
|
}
|
||
|
|
|
||
|
|
for method, func in pairs(methods) do
|
||
|
|
widget[method] = func
|
||
|
|
end
|
||
|
|
|
||
|
|
frame.obj = widget
|
||
|
|
|
||
|
|
return AceGUI:RegisterAsWidget(widget)
|
||
|
|
end
|
||
|
|
|
||
|
|
AceGUI:RegisterWidgetType(Type, Constructor, Version)
|