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.

166 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
4 years ago
-- propper formatting
tag = string.upper(tag);
4 years ago
-- 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
4 years ago
ctxMenu[tag] = item;
item.MENU_ID = tag;
4 years ago
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
4 years ago
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);
4 years ago
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