From b0b608ecf509fdfb679fbca779c0332b46891400 Mon Sep 17 00:00:00 2001 From: phoenixide Date: Tue, 24 Dec 2024 16:47:02 +0530 Subject: [PATCH] fix: dropdowns doesnt close reliably and multiple dropdowns may come --- src/extensionsIntegrated/RecentProjects/main.js | 2 +- src/utils/DropdownEventHandler.js | 2 +- src/widgets/PopUpManager.js | 13 +++++++++++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/extensionsIntegrated/RecentProjects/main.js b/src/extensionsIntegrated/RecentProjects/main.js index f7d1a8db8a..af318fed3c 100644 --- a/src/extensionsIntegrated/RecentProjects/main.js +++ b/src/extensionsIntegrated/RecentProjects/main.js @@ -484,7 +484,7 @@ define(function (require, exports, module) { }) .appendTo($("body")); - PopUpManager.addPopUp($dropdown, cleanupDropdown, true); + PopUpManager.addPopUp($dropdown, cleanupDropdown, true, {closeCurrentPopups: true}); // TODO: should use capture, otherwise clicking on the menus doesn't close it. More fallout // from the fact that we can't use the Boostrap (1.4) dropdowns. diff --git a/src/utils/DropdownEventHandler.js b/src/utils/DropdownEventHandler.js index dcd380ee08..a005302e2a 100644 --- a/src/utils/DropdownEventHandler.js +++ b/src/utils/DropdownEventHandler.js @@ -147,7 +147,7 @@ define(function (require, exports, module) { if (this.$list) { this._registerMouseEvents(); - PopUpManager.addPopUp(this.$list, closeCallback, true); + PopUpManager.addPopUp(this.$list, closeCallback, true, {closeCurrentPopups: true}); } }; diff --git a/src/widgets/PopUpManager.js b/src/widgets/PopUpManager.js index d90b319dbf..f1a43fb136 100644 --- a/src/widgets/PopUpManager.js +++ b/src/widgets/PopUpManager.js @@ -45,12 +45,17 @@ define(function (require, exports, module) { * remove the popup from the _popUps array when the popup is closed. Specify false * when the popup is always persistant in the _popUps array. * @param {object} options - * @param {boolean} options.popupManagesFocus - set to true if the popup manages focus restore on close + * @param {boolean} [options.popupManagesFocus] - set to true if the popup manages focus restore on close + * @param {boolean} [options.closeCurrentPopups] - set to true if you want to dismiss all exiting popups before + * adding this. Useful when this should be the only popup visible. * */ function addPopUp($popUp, removeHandler, autoRemove, options) { autoRemove = autoRemove || false; options = options || {}; + if(options.closeCurrentPopups) { + closeAllPopups(); + } const popupManagesFocus = options.popupManagesFocus || false; _popUps.push($popUp[0]); @@ -130,7 +135,7 @@ define(function (require, exports, module) { function _keydownCaptureListener(keyEvent) { // Escape key or Alt key (Windows-only) if (keyEvent.keyCode !== KeyEvent.DOM_VK_ESCAPE && - !(keyEvent.keyCode === KeyEvent.DOM_VK_ALT && brackets.platform === "win")) { + !(keyEvent.keyCode === KeyEvent.DOM_VK_ALT && brackets.platform === "win")) { return; } @@ -184,10 +189,14 @@ define(function (require, exports, module) { WorkspaceManager.addEscapeKeyEventHandler("PopUpManager", _dontToggleWorkspacePanel); }); + function closeAllPopups() { + removeCurrentPopUp(); + } EventDispatcher.makeEventDispatcher(exports); exports.addPopUp = addPopUp; exports.removePopUp = removePopUp; + exports.closeAllPopups = closeAllPopups; exports.listenToContextMenu = listenToContextMenu; });