Skip to content

Commit 9a8f526

Browse files
committed
feat: hide all open bottom panels at once instead of closing them individually
1 parent 5a4d95a commit 9a8f526

3 files changed

Lines changed: 54 additions & 13 deletions

File tree

src/extensionsIntegrated/NoDistractions/main.js

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -87,20 +87,20 @@ define(function (require, exports, module) {
8787
* hide all open panels
8888
*/
8989
function _hidePanelsIfRequired() {
90-
var panelIDs = WorkspaceManager.getAllPanelIDs();
9190
_previouslyOpenPanelIDs = [];
92-
// Loop until no visible panels remain. In a tabbed system, hiding the
93-
// active tab may reveal the next tab, so we must iterate.
94-
let hiddenSomething = true;
95-
while (hiddenSomething) {
96-
hiddenSomething = false;
97-
for (let i = 0; i < panelIDs.length; i++) {
98-
let panel = WorkspaceManager.getPanelForID(panelIDs[i]);
99-
if (panel && panel.isVisible()) {
100-
panel.hide();
101-
_previouslyOpenPanelIDs.push(panelIDs[i]);
102-
hiddenSomething = true;
103-
}
91+
92+
// Batch-hide all open bottom panel tabs in one pass, avoiding O(n)
93+
// intermediate tab activations and layout recalcs.
94+
let hiddenBottomPanels = WorkspaceManager.hideAllOpenBottomPanels();
95+
_previouslyOpenPanelIDs = hiddenBottomPanels;
96+
97+
// Hide any remaining visible panels (e.g. plugin side-panels)
98+
let panelIDs = WorkspaceManager.getAllPanelIDs();
99+
for (let i = 0; i < panelIDs.length; i++) {
100+
let panel = WorkspaceManager.getPanelForID(panelIDs[i]);
101+
if (panel && panel.isVisible()) {
102+
panel.hide();
103+
_previouslyOpenPanelIDs.push(panelIDs[i]);
104104
}
105105
}
106106
}

src/view/PanelView.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,12 +376,52 @@ define(function (require, exports, module) {
376376
return _openIds.slice();
377377
}
378378

379+
/**
380+
* Hides every open bottom panel tab in a single batch
381+
* @return {string[]} The IDs of panels that were open (useful for restoring later).
382+
*/
383+
function hideAllOpenPanels() {
384+
if (_openIds.length === 0) {
385+
return [];
386+
}
387+
let closedIds = _openIds.slice();
388+
389+
// Remove visual active state from every panel
390+
for (let i = 0; i < closedIds.length; i++) {
391+
let panel = _panelMap[closedIds[i]];
392+
if (panel) {
393+
panel.$panel.removeClass("active-bottom-panel");
394+
}
395+
}
396+
397+
// Clear internal state BEFORE hiding the container so the
398+
// panelCollapsed handler sees an empty _openIds and doesn't
399+
// redundantly update the stacks.
400+
_openIds = [];
401+
_activeId = null;
402+
403+
if (_$container && _$container.is(":visible")) {
404+
Resizer.hide(_$container[0]);
405+
}
406+
407+
_updateBottomPanelTabBar();
408+
409+
// Fire one EVENT_PANEL_HIDDEN per panel for stack tracking.
410+
// No intermediate EVENT_PANEL_SHOWN events are emitted.
411+
for (let i = 0; i < closedIds.length; i++) {
412+
exports.trigger(EVENT_PANEL_HIDDEN, closedIds[i]);
413+
}
414+
415+
return closedIds;
416+
}
417+
379418
EventDispatcher.makeEventDispatcher(exports);
380419

381420
// Public API
382421
exports.Panel = Panel;
383422
exports.init = init;
384423
exports.getOpenBottomPanelIDs = getOpenBottomPanelIDs;
424+
exports.hideAllOpenPanels = hideAllOpenPanels;
385425
//events
386426
exports.EVENT_PANEL_HIDDEN = EVENT_PANEL_HIDDEN;
387427
exports.EVENT_PANEL_SHOWN = EVENT_PANEL_SHOWN;

src/view/WorkspaceManager.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,7 @@ define(function (require, exports, module) {
664664
exports.getAllPanelIDs = getAllPanelIDs;
665665
exports.getPanelForID = getPanelForID;
666666
exports.getOpenBottomPanelIDs = PanelView.getOpenBottomPanelIDs;
667+
exports.hideAllOpenBottomPanels = PanelView.hideAllOpenPanels;
667668
exports.addEscapeKeyEventHandler = addEscapeKeyEventHandler;
668669
exports.removeEscapeKeyEventHandler = removeEscapeKeyEventHandler;
669670
exports._setMockDOM = _setMockDOM;

0 commit comments

Comments
 (0)