Skip to content

Commit

Permalink
chore: raise events when menus, submenus and menu items are added
Browse files Browse the repository at this point in the history
  • Loading branch information
abose committed Jan 3, 2025
1 parent e081f62 commit 7706142
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 7 deletions.
29 changes: 29 additions & 0 deletions src/command/Menus.js
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,24 @@ define(function (require, exports, module) {
*/
const EVENT_BEFORE_SUB_MENU_CLOSE = "beforeSubMenuClose";

/**
* Event triggered when a menu or menu is added
* @event EVENT_MENU_ADDED
*/
const EVENT_MENU_ADDED = "menuAdded";

/**
* Event triggered when a menu or submenu is added
* @event EVENT_SUB_MENU_ADDED
*/
const EVENT_SUB_MENU_ADDED = "subMenuAdded";

/**
* Event triggered when a menu item is added
* @event EVENT_MENU_ITEM_ADDED
*/
const EVENT_MENU_ITEM_ADDED = "menuItemAdded";



// Define each section as a separate constant
Expand Down Expand Up @@ -761,6 +779,9 @@ define(function (require, exports, module) {
menuItem._nameChanged();
}

const menuId = self.id;
exports.trigger(EVENT_MENU_ITEM_ADDED, menuId, commandID, menuItem);

return menuItem;
};

Expand Down Expand Up @@ -910,6 +931,8 @@ define(function (require, exports, module) {
_insertInList($("li#" + StringUtils.jQueryIdEscape(this.id) + " > ul.dropdown-menu"),
$menuItem, position, $relativeElement);

exports.trigger(EVENT_SUB_MENU_ADDED, id, menu);

return menu;
};

Expand Down Expand Up @@ -1302,6 +1325,7 @@ define(function (require, exports, module) {
PopUpManager.addPopUp($popUp, closeAll, false);

_addAltMenuShortcut(name, id);
exports.trigger(EVENT_MENU_ADDED, id, menu);

return menu;
}
Expand Down Expand Up @@ -1713,6 +1737,8 @@ define(function (require, exports, module) {
});
});

EventDispatcher.makeEventDispatcher(exports);

// Deprecated menu ids
DeprecationWarning.deprecateConstant(ContextMenuIds, "WORKING_SET_MENU", "WORKING_SET_CONTEXT_MENU");
DeprecationWarning.deprecateConstant(ContextMenuIds, "WORKING_SET_SETTINGS_MENU", "WORKING_SET_CONFIG_MENU");
Expand Down Expand Up @@ -1747,4 +1773,7 @@ define(function (require, exports, module) {
exports.EVENT_BEFORE_CONTEXT_MENU_CLOSE = EVENT_BEFORE_CONTEXT_MENU_CLOSE;
exports.EVENT_BEFORE_SUB_MENU_OPEN = EVENT_BEFORE_SUB_MENU_OPEN;
exports.EVENT_BEFORE_SUB_MENU_CLOSE = EVENT_BEFORE_SUB_MENU_CLOSE;
exports.EVENT_MENU_ADDED = EVENT_MENU_ADDED;
exports.EVENT_SUB_MENU_ADDED = EVENT_SUB_MENU_ADDED;
exports.EVENT_MENU_ITEM_ADDED = EVENT_MENU_ITEM_ADDED;
});
53 changes: 46 additions & 7 deletions test/spec/Menu-integ-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,18 +60,30 @@ define(function (require, exports, module) {
return testWindow.$("#titlebar > ul.nav").children();
}

it("should add new menu in last position of list", async function () {
it("should add new menu in last position of list and get menu events", async function () {
const testMenuID = "menu-unittest1";
let idAdded, menuAdded;
Menus.on(Menus.EVENT_MENU_ADDED+".test1", (_evt, _id, _menu)=>{
if(_id !== testMenuID) {
return;
}
idAdded = _id;
menuAdded = _menu;
});
var $listItems = getTopMenus();
expect($listItems.length).toBeGreaterThan(0);

var menuCountOriginal = $listItems.length;
var menu = Menus.addMenu("Custom1", "menu-unittest1");
var menu = Menus.addMenu("Custom1", testMenuID);
expect(menu).toBeTruthy();
expect(menu).toBeDefined();

$listItems = getTopMenus(); // refresh
expect($listItems.length).toBe(menuCountOriginal + 1);
expect($($listItems[menuCountOriginal]).attr("id")).toBe("menu-unittest1");
expect($($listItems[menuCountOriginal]).attr("id")).toBe(testMenuID);
expect(idAdded).toBe(testMenuID);
expect(menuAdded.id).toBe(testMenuID);
Menus.off(Menus.EVENT_MENU_ADDED+".test1");
});

it("should add new menu in first position of list", async function () {
Expand Down Expand Up @@ -157,22 +169,38 @@ define(function (require, exports, module) {
describe("Add Menu Items", function () {

it("should add new menu items", async function () {
var menu = Menus.addMenu("MenuItem Menu 0", "menuitem-unittest0");
const utMenuID = "menuitem-unittest0";
var menu = Menus.addMenu("MenuItem Menu 0", utMenuID);
var listSelector = "#menuitem-unittest0 > ul";
var $listItems = testWindow.$(listSelector).children();
expect($listItems.length).toBe(0);

const testCmd = "Menu-test.command00";
let addedOnMenu, commandItemAdded, menuItemAdded;
Menus.on(Menus.EVENT_MENU_ITEM_ADDED+".addTest", (_evt, _menuID, _cmdID, _menuItem)=>{
if(_cmdID !== testCmd) {
return;
}
addedOnMenu = _menuID;
commandItemAdded = _cmdID;
menuItemAdded = _menuItem;
});

// add new menu item to empty menu
CommandManager.register("Brackets Test Command Custom 0", "Menu-test.command00", function () {});
var menuItem = menu.addMenuItem("Menu-test.command00");
CommandManager.register("Brackets Test Command Custom 0", testCmd, function () {});
var menuItem = menu.addMenuItem(testCmd);
expect(menuItem).toBeTruthy();
expect(menuItem).toBeDefined();

$listItems = testWindow.$(listSelector).children();
expect($listItems.length).toBe(1);
expect($($listItems[0]).length).toBe(1);

expect(addedOnMenu).toBe(utMenuID);
expect(commandItemAdded).toBe(testCmd);
expect(menuItemAdded.getCommand().getID()).toBe(testCmd);
Menus.off(Menus.EVENT_MENU_ITEM_ADDED+".addTest");

// Periods (aka "dots") are allowed in HTML identifiers, but jQuery interprets
// them as the start of a class selector, so they need to be escaped
expect($($listItems[0]).find("a#menuitem-unittest0-Menu-test\\.command00").length).toBe(1);
Expand Down Expand Up @@ -659,13 +687,24 @@ define(function (require, exports, module) {
describe("Add a context submenu", function() {
it("should add new context submenu", async function() {
menuId = "context-menu-custom-addSubmenu-1";
subMenuId = "submenu-custom-addSubmenu-1";
let idAdded, menuAdded;
Menus.on(Menus.EVENT_SUB_MENU_ADDED+".subTest", (_evt, _id, _menu)=>{
if(_id !== subMenuId) {
return;
}
idAdded = _id;
menuAdded = _menu;
});
menu = Menus.registerContextMenu(menuId);

subMenuId = "submenu-custom-addSubmenu-1";
subMenu = menu.addSubMenu("submenu", subMenuId);

expect(subMenu).toBeTruthy();
expect(subMenu.parentMenuItem).toBeTruthy();
expect(idAdded).toBe(subMenuId);
expect(menuAdded.id).toBe(subMenuId);
Menus.off(Menus.EVENT_MENU_ADDED+".subTest");

// check if new submenu is empty
var children = testWindow.$("#submenu-custom-addSubmenu-1 > ul").children();
Expand Down

0 comments on commit 7706142

Please sign in to comment.