@theia/terminal-manager 1.70.0-next.21 → 1.70.0-next.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/browser/terminal-manager-frontend-contribution.d.ts +6 -0
- package/lib/browser/terminal-manager-frontend-contribution.d.ts.map +1 -1
- package/lib/browser/terminal-manager-frontend-contribution.js +13 -1
- package/lib/browser/terminal-manager-frontend-contribution.js.map +1 -1
- package/lib/browser/terminal-manager-tree-model.d.ts +10 -4
- package/lib/browser/terminal-manager-tree-model.d.ts.map +1 -1
- package/lib/browser/terminal-manager-tree-model.js +55 -9
- package/lib/browser/terminal-manager-tree-model.js.map +1 -1
- package/lib/browser/terminal-manager-tree-widget.d.ts.map +1 -1
- package/lib/browser/terminal-manager-tree-widget.js +6 -1
- package/lib/browser/terminal-manager-tree-widget.js.map +1 -1
- package/lib/browser/terminal-manager-types.d.ts +8 -0
- package/lib/browser/terminal-manager-types.d.ts.map +1 -1
- package/lib/browser/terminal-manager-types.js +10 -1
- package/lib/browser/terminal-manager-types.js.map +1 -1
- package/lib/browser/terminal-manager-types.spec.d.ts +2 -0
- package/lib/browser/terminal-manager-types.spec.d.ts.map +1 -0
- package/lib/browser/terminal-manager-types.spec.js +100 -0
- package/lib/browser/terminal-manager-types.spec.js.map +1 -0
- package/lib/browser/terminal-manager-widget.d.ts +4 -1
- package/lib/browser/terminal-manager-widget.d.ts.map +1 -1
- package/lib/browser/terminal-manager-widget.js +44 -8
- package/lib/browser/terminal-manager-widget.js.map +1 -1
- package/package.json +5 -5
- package/src/browser/terminal-manager-frontend-contribution.ts +13 -1
- package/src/browser/terminal-manager-tree-model.ts +63 -7
- package/src/browser/terminal-manager-tree-widget.tsx +7 -2
- package/src/browser/terminal-manager-types.spec.ts +107 -0
- package/src/browser/terminal-manager-types.ts +12 -0
- package/src/browser/terminal-manager-widget.ts +55 -12
|
@@ -32,7 +32,7 @@ import {
|
|
|
32
32
|
Widget,
|
|
33
33
|
WidgetManager,
|
|
34
34
|
} from '@theia/core/lib/browser';
|
|
35
|
-
import { Emitter, nls } from '@theia/core';
|
|
35
|
+
import { Disposable, DisposableCollection, Emitter, nls } from '@theia/core';
|
|
36
36
|
import { UUID } from '@theia/core/shared/@lumino/coreutils';
|
|
37
37
|
import { TerminalWidget, TerminalWidgetOptions } from '@theia/terminal/lib/browser/base/terminal-widget';
|
|
38
38
|
import { TerminalWidgetImpl } from '@theia/terminal/lib/browser/terminal-widget-impl';
|
|
@@ -92,6 +92,8 @@ export class TerminalManagerWidget extends BaseWidget implements StatefulWidget,
|
|
|
92
92
|
terminalWidgets = new Map<TerminalManagerTreeTypes.TerminalKey, TerminalWidget>();
|
|
93
93
|
/** By terminal ID to work from widget to internal metadata. */
|
|
94
94
|
terminalWidgetIdsToNodeIds = new Map<string, TerminalManagerTreeTypes.TerminalKey>();
|
|
95
|
+
/** Track disposables per terminal to prevent memory leaks. */
|
|
96
|
+
protected terminalDisposables = new Map<TerminalManagerTreeTypes.TerminalKey, DisposableCollection>();
|
|
95
97
|
|
|
96
98
|
protected readonly onDidChangeTrackableWidgetsEmitter = new Emitter<Widget[]>();
|
|
97
99
|
readonly onDidChangeTrackableWidgets = this.onDidChangeTrackableWidgetsEmitter.event;
|
|
@@ -299,7 +301,7 @@ export class TerminalManagerWidget extends BaseWidget implements StatefulWidget,
|
|
|
299
301
|
groupPanel.addWidget(widget);
|
|
300
302
|
const pagePanel = this.createPagePanel();
|
|
301
303
|
pagePanel.addWidget(groupPanel);
|
|
302
|
-
this.treeWidget.model.addTerminalPage(terminalKey, groupPanel.id, pagePanel.id);
|
|
304
|
+
this.treeWidget.model.addTerminalPage(terminalKey, groupPanel.id, pagePanel.id, widget.title.label);
|
|
303
305
|
return pagePanel;
|
|
304
306
|
}
|
|
305
307
|
}
|
|
@@ -307,19 +309,44 @@ export class TerminalManagerWidget extends BaseWidget implements StatefulWidget,
|
|
|
307
309
|
protected addTerminalReference(widget: TerminalWidget, nodeId: TerminalManagerTreeTypes.TerminalKey): void {
|
|
308
310
|
this.terminalWidgets.set(nodeId, widget);
|
|
309
311
|
this.terminalWidgetIdsToNodeIds.set(widget.id, nodeId);
|
|
312
|
+
|
|
313
|
+
// Create disposable collection for this terminal
|
|
314
|
+
const disposables = new DisposableCollection();
|
|
315
|
+
|
|
316
|
+
// Track title label changes with proper disposal
|
|
317
|
+
let currentLabel = widget.title.label;
|
|
318
|
+
const titleChangeHandler = () => {
|
|
319
|
+
if (widget.title.label !== currentLabel) {
|
|
320
|
+
currentLabel = widget.title.label;
|
|
321
|
+
this.treeWidget.model.updateTerminalLabel(nodeId, currentLabel);
|
|
322
|
+
}
|
|
323
|
+
};
|
|
324
|
+
widget.title.changed.connect(titleChangeHandler);
|
|
325
|
+
disposables.push(Disposable.create(() => widget.title.changed.disconnect(titleChangeHandler)));
|
|
326
|
+
|
|
327
|
+
this.terminalDisposables.set(nodeId, disposables);
|
|
310
328
|
}
|
|
311
329
|
|
|
312
330
|
protected removeTerminalReferenceByWidgetId(widgetId: string): boolean {
|
|
313
331
|
const nodeId = this.terminalWidgetIdsToNodeIds.get(widgetId);
|
|
314
|
-
if (nodeId === undefined) {return false; }
|
|
315
|
-
|
|
332
|
+
if (nodeId === undefined) { return false; }
|
|
333
|
+
this.removeTerminalReferenceByNodeId(nodeId);
|
|
334
|
+
return true;
|
|
316
335
|
}
|
|
317
336
|
|
|
318
337
|
protected removeTerminalReferenceByNodeId(nodeId: TerminalManagerTreeTypes.TerminalKey): boolean {
|
|
319
338
|
const widget = this.terminalWidgets.get(nodeId);
|
|
320
|
-
if (!widget) {return false; }
|
|
339
|
+
if (!widget) { return false; }
|
|
321
340
|
this.terminalWidgets.delete(nodeId);
|
|
322
341
|
this.terminalWidgetIdsToNodeIds.delete(widget.id);
|
|
342
|
+
|
|
343
|
+
// Dispose signal connections
|
|
344
|
+
const disposables = this.terminalDisposables.get(nodeId);
|
|
345
|
+
if (disposables) {
|
|
346
|
+
disposables.dispose();
|
|
347
|
+
this.terminalDisposables.delete(nodeId);
|
|
348
|
+
}
|
|
349
|
+
|
|
323
350
|
return true;
|
|
324
351
|
}
|
|
325
352
|
|
|
@@ -359,11 +386,12 @@ export class TerminalManagerWidget extends BaseWidget implements StatefulWidget,
|
|
|
359
386
|
}
|
|
360
387
|
|
|
361
388
|
protected handlePageAdded(pageId: TerminalManagerTreeTypes.PageId): void {
|
|
362
|
-
|
|
363
|
-
if (pagePanel) {
|
|
364
|
-
this.
|
|
365
|
-
this.update();
|
|
389
|
+
let pagePanel = this.pagePanels.get(pageId);
|
|
390
|
+
if (!pagePanel) {
|
|
391
|
+
pagePanel = this.createPagePanel(pageId);
|
|
366
392
|
}
|
|
393
|
+
this.terminalPanelWrapper.addWidget(pagePanel);
|
|
394
|
+
this.update();
|
|
367
395
|
}
|
|
368
396
|
|
|
369
397
|
protected handlePageDeleted(pagePanelId: TerminalManagerTreeTypes.PageId): void {
|
|
@@ -399,7 +427,7 @@ export class TerminalManagerWidget extends BaseWidget implements StatefulWidget,
|
|
|
399
427
|
this.onDidChangeTrackableWidgetsEmitter.fire(this.getTrackableWidgets());
|
|
400
428
|
const groupPanel = this.createTerminalGroupPanel();
|
|
401
429
|
groupPanel.addWidget(widget);
|
|
402
|
-
this.treeWidget.model.addTerminalGroup(terminalId, groupPanel.id, pageId);
|
|
430
|
+
this.treeWidget.model.addTerminalGroup(terminalId, groupPanel.id, pageId, widget.title.label);
|
|
403
431
|
}
|
|
404
432
|
}
|
|
405
433
|
|
|
@@ -466,7 +494,7 @@ export class TerminalManagerWidget extends BaseWidget implements StatefulWidget,
|
|
|
466
494
|
|
|
467
495
|
protected clearTerminalReferences(panel: TerminalManagerTreeTypes.GroupSplitPanel): void {
|
|
468
496
|
for (const terminal of panel.widgets) {
|
|
469
|
-
|
|
497
|
+
this.removeTerminalReferenceByWidgetId(terminal.id);
|
|
470
498
|
}
|
|
471
499
|
}
|
|
472
500
|
|
|
@@ -475,7 +503,18 @@ export class TerminalManagerWidget extends BaseWidget implements StatefulWidget,
|
|
|
475
503
|
const newTerminalId = TerminalManagerTreeTypes.generateTerminalKey(widget);
|
|
476
504
|
this.addTerminalReference(widget, newTerminalId);
|
|
477
505
|
this.onDidChangeTrackableWidgetsEmitter.fire(this.getTrackableWidgets());
|
|
478
|
-
this.treeWidget.model.addTerminal(newTerminalId, groupId);
|
|
506
|
+
this.treeWidget.model.addTerminal(newTerminalId, groupId, widget.title.label);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
addTerminalToTasksPage(widget: Widget): void {
|
|
511
|
+
if (widget instanceof TerminalWidgetImpl) {
|
|
512
|
+
const terminalKey = TerminalManagerTreeTypes.generateTerminalKey(widget);
|
|
513
|
+
this.addTerminalReference(widget, terminalKey);
|
|
514
|
+
this.onDidChangeTrackableWidgetsEmitter.fire(this.getTrackableWidgets());
|
|
515
|
+
const groupPanel = this.createTerminalGroupPanel();
|
|
516
|
+
groupPanel.addWidget(widget);
|
|
517
|
+
this.treeWidget.model.addTerminalToTasksPage(terminalKey, groupPanel.id, widget.title.label);
|
|
479
518
|
}
|
|
480
519
|
}
|
|
481
520
|
|
|
@@ -725,6 +764,10 @@ export class TerminalManagerWidget extends BaseWidget implements StatefulWidget,
|
|
|
725
764
|
}
|
|
726
765
|
|
|
727
766
|
override dispose(): void {
|
|
767
|
+
// Dispose all remaining signal connections
|
|
768
|
+
this.terminalDisposables.forEach(disposables => disposables.dispose());
|
|
769
|
+
this.terminalDisposables.clear();
|
|
770
|
+
|
|
728
771
|
this.toDispose.dispose();
|
|
729
772
|
super.dispose();
|
|
730
773
|
this.terminalWidgets.clear();
|