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.
165 lines
4.3 KiB
165 lines
4.3 KiB
local WIM = WIM;
|
|
|
|
local DDM = WIM.libs.DropDownMenu;
|
|
DDM.SOUNDKIT = SOUNDKIT -- temporary fix until LibDropDownMenu is patched
|
|
|
|
-- imports
|
|
local _G = _G;
|
|
local table = table;
|
|
local string = string;
|
|
local pairs = pairs;
|
|
local type = type;
|
|
local UIDropDownMenu_AddButton = DDM.UIDropDownMenu_AddButton;
|
|
local UIDropDownMenu_CreateInfo = DDM.UIDropDownMenu_CreateInfo
|
|
local UIDropDownMenu_Initialize = DDM.UIDropDownMenu_Initialize;
|
|
local ToggleDropDownMenu = DDM.ToggleDropDownMenu;
|
|
|
|
-- set namespace
|
|
setfenv(1, WIM);
|
|
|
|
local menuFrame = DDM.Create_DropDownMenu("WIM3_ContextMenu", _G.UIParent)
|
|
menuFrame:SetParent(_G.UIParent);
|
|
menuFrame:SetPoint("TOP", -80, -200);
|
|
menuFrame:Hide();
|
|
|
|
ctxMenu = {};
|
|
|
|
local MENU_ID = 0;
|
|
|
|
local CurMenu;
|
|
|
|
local function getMenuByTitle(text)
|
|
for key, val in pairs(ctxMenu) do
|
|
if(val.text == text) then
|
|
return key;
|
|
end
|
|
end
|
|
return;
|
|
end
|
|
|
|
local function addMenuItem(tag, info)
|
|
-- required checks
|
|
if(type(info) ~= "table" and not info.text) then
|
|
if(type(tag) == "table" and tag.text) then
|
|
MENU_ID = MENU_ID + 1;
|
|
return addMenuItem("MENU_ITEM"..MENU_ID, tag);
|
|
else
|
|
return;
|
|
end
|
|
end
|
|
if(type(tag) ~= "string") then
|
|
return;
|
|
end
|
|
if(tag == "") then
|
|
MENU_ID = MENU_ID + 1;
|
|
return addMenuItem("MENU_ITEM"..MENU_ID, info);
|
|
end
|
|
if(ctxMenu[string.upper(tag)]) then
|
|
return ctxMenu[string.upper(tag)];
|
|
end
|
|
|
|
-- propper formatting
|
|
tag = string.upper(tag);
|
|
|
|
-- load data into its own table. we will send this back to the user later.
|
|
local item = {};
|
|
for key, val in pairs(info) do
|
|
item[key] = val;
|
|
end
|
|
|
|
ctxMenu[tag] = item;
|
|
item.MENU_ID = tag;
|
|
|
|
item.AddSubItem = function(self, menuItem, insertAt)
|
|
if(type(menuItem) == "string") then
|
|
menuItem = ctxMenu[string.upper(menuItem)];
|
|
if(not menuItem) then
|
|
return;
|
|
end
|
|
end
|
|
if(not (type(menuItem) == "table" and menuItem.MENU_ID)) then
|
|
return;
|
|
end
|
|
|
|
if(not self.menuTable) then
|
|
self.menuTable = {};
|
|
end
|
|
if(insertAt) then
|
|
table.insert(self.menuTable, insertAt, menuItem.MENU_ID);
|
|
else
|
|
table.insert(self.menuTable, menuItem.MENU_ID);
|
|
end
|
|
self.hasArrow = true;
|
|
self.value = self.MENU_ID;
|
|
return true;
|
|
end
|
|
return item;
|
|
end
|
|
|
|
local function initializeMenu(frame, level, menuTable)
|
|
level = level or DDM.UIDROPDOWNMENU_MENU_LEVEL;
|
|
if(level > 1 and DDM.UIDROPDOWNMENU_MENU_VALUE) then
|
|
CurMenu = ctxMenu[DDM.UIDROPDOWNMENU_MENU_VALUE];
|
|
end
|
|
if(not CurMenu) then
|
|
dPrint("ContextMenu Error - Menu not set.");
|
|
return; -- menu not set
|
|
end
|
|
dPrint("Initializing Menu - level "..level);
|
|
local items = CurMenu.menuTable;
|
|
if(not items) then
|
|
return;
|
|
end
|
|
for i=1, #items do
|
|
local info = {};
|
|
for key, val in pairs(ctxMenu[items[i]]) do
|
|
info[key] = val;
|
|
end
|
|
if(not ctxMenu[items[i]].hidden) then
|
|
UIDropDownMenu_AddButton(info, level);
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
-- global API
|
|
|
|
function PopContextMenu(tag, parent)
|
|
if(type(tag) ~= "string") then
|
|
return;
|
|
end
|
|
tag = string.upper(tag);
|
|
|
|
local id = ctxMenu[tag];
|
|
if(id) then
|
|
DDM.CloseDropDownMenus();
|
|
dPrint("Popping menu ["..tag.."]");
|
|
CurMenu = id;
|
|
DDM.UIDROPDOWNMENU_MENU_VALUE = nil;
|
|
if(WIM.Menu) then
|
|
WIM.Menu:Hide();
|
|
end
|
|
UIDropDownMenu_Initialize(menuFrame, initializeMenu);
|
|
ToggleDropDownMenu(1, 1, menuFrame, parent, 0, 0);
|
|
DDM.UIDropDownMenu_SetButtonWidth(menuFrame, 25);
|
|
DDM.UIDropDownMenu_SetWidth(menuFrame, 25, 5);
|
|
_G.PlaySound(1115);
|
|
else
|
|
dPrint("Menu ["..tag.."] not found!")
|
|
end
|
|
end
|
|
|
|
function AddContextMenu(tag, info)
|
|
local item = addMenuItem(tag, info)
|
|
if(item) then
|
|
dPrint("Menu ["..item.MENU_ID.."] registered with ContextMenu.");
|
|
else
|
|
dPrint("Menu failed to register with ContextMenu.")
|
|
end
|
|
return item;
|
|
end
|
|
|
|
function GetContextMenu(tag)
|
|
return ctxMenu[tag or "<NIL>"];
|
|
end
|
|
|
|
|