@theia/output 1.68.0-next.34 → 1.68.0-next.48
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.
|
@@ -2,21 +2,39 @@ import '../../src/browser/style/output.css';
|
|
|
2
2
|
import { SelectionService } from '@theia/core/lib/common/selection-service';
|
|
3
3
|
import { MonacoEditorProvider } from '@theia/monaco/lib/browser/monaco-editor-provider';
|
|
4
4
|
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
|
5
|
-
import { Message, BaseWidget, DockPanel, Widget, StatefulWidget } from '@theia/core/lib/browser';
|
|
5
|
+
import { Message, BaseWidget, DockPanel, Widget, StatefulWidget, StorageService } from '@theia/core/lib/browser';
|
|
6
6
|
import { OutputChannelManager } from './output-channel';
|
|
7
7
|
import { Emitter, Event } from '@theia/core';
|
|
8
8
|
export declare class OutputWidget extends BaseWidget implements StatefulWidget {
|
|
9
9
|
static readonly ID = "outputView";
|
|
10
10
|
static readonly LABEL: string;
|
|
11
|
+
static readonly SELECTED_CHANNEL_STORAGE_KEY = "output-widget-selected-channel";
|
|
11
12
|
protected readonly selectionService: SelectionService;
|
|
12
13
|
protected readonly editorProvider: MonacoEditorProvider;
|
|
13
14
|
protected readonly outputChannelManager: OutputChannelManager;
|
|
15
|
+
protected readonly storageService: StorageService;
|
|
14
16
|
protected _state: OutputWidget.State;
|
|
15
17
|
protected readonly editorContainer: DockPanel;
|
|
16
18
|
protected readonly toDisposeOnSelectedChannelChanged: DisposableCollection;
|
|
17
19
|
protected readonly onStateChangedEmitter: Emitter<OutputWidget.State>;
|
|
18
20
|
constructor();
|
|
19
21
|
protected init(): void;
|
|
22
|
+
/**
|
|
23
|
+
* Restore the selected channel from storage (used when widget is reopened).
|
|
24
|
+
* State restoration has higher priority, so this only applies if state restoration hasn't already
|
|
25
|
+
* set a selectedChannelName or pendingSelectedChannelName.
|
|
26
|
+
*/
|
|
27
|
+
protected restoreSelectedChannelFromStorage(): Promise<void>;
|
|
28
|
+
dispose(): void;
|
|
29
|
+
/**
|
|
30
|
+
* Try to restore the pending channel if it matches the newly added channel.
|
|
31
|
+
*/
|
|
32
|
+
protected tryRestorePendingChannel(addedChannelName: string): void;
|
|
33
|
+
/**
|
|
34
|
+
* Clear any pending channel restoration.
|
|
35
|
+
* Called when the user explicitly selects a channel, so we don't override their choice.
|
|
36
|
+
*/
|
|
37
|
+
protected clearPendingChannelRestore(): void;
|
|
20
38
|
storeState(): object;
|
|
21
39
|
restoreState(oldState: object & Partial<OutputWidget.State>): void;
|
|
22
40
|
protected get state(): OutputWidget.State;
|
|
@@ -44,6 +62,9 @@ export declare class OutputWidget extends BaseWidget implements StatefulWidget {
|
|
|
44
62
|
export declare namespace OutputWidget {
|
|
45
63
|
interface State {
|
|
46
64
|
locked?: boolean;
|
|
65
|
+
selectedChannelName?: string;
|
|
66
|
+
/** Channel name waiting to be restored when it becomes available */
|
|
67
|
+
pendingSelectedChannelName?: string;
|
|
47
68
|
}
|
|
48
69
|
}
|
|
49
70
|
//# sourceMappingURL=output-widget.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output-widget.d.ts","sourceRoot":"","sources":["../../src/browser/output-widget.ts"],"names":[],"mappings":"AAgBA,OAAO,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"output-widget.d.ts","sourceRoot":"","sources":["../../src/browser/output-widget.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,6 @@ exports.OutputWidget = void 0;
|
|
|
20
20
|
const tslib_1 = require("tslib");
|
|
21
21
|
require("../../src/browser/style/output.css");
|
|
22
22
|
const inversify_1 = require("@theia/core/shared/inversify");
|
|
23
|
-
const algorithm_1 = require("@theia/core/shared/@lumino/algorithm");
|
|
24
23
|
const browser_1 = require("@theia/editor/lib/browser");
|
|
25
24
|
const monaco_editor_1 = require("@theia/monaco/lib/browser/monaco-editor");
|
|
26
25
|
const selection_service_1 = require("@theia/core/lib/common/selection-service");
|
|
@@ -36,6 +35,7 @@ let OutputWidget = class OutputWidget extends browser_2.BaseWidget {
|
|
|
36
35
|
static { OutputWidget_1 = this; }
|
|
37
36
|
static { this.ID = 'outputView'; }
|
|
38
37
|
static { this.LABEL = nls_1.nls.localizeByDefault('Output'); }
|
|
38
|
+
static { this.SELECTED_CHANNEL_STORAGE_KEY = 'output-widget-selected-channel'; }
|
|
39
39
|
constructor() {
|
|
40
40
|
super();
|
|
41
41
|
this._state = { locked: false };
|
|
@@ -54,24 +54,108 @@ let OutputWidget = class OutputWidget extends browser_2.BaseWidget {
|
|
|
54
54
|
}
|
|
55
55
|
init() {
|
|
56
56
|
this.toDispose.pushAll([
|
|
57
|
-
this.outputChannelManager.onChannelAdded(() =>
|
|
57
|
+
this.outputChannelManager.onChannelAdded(({ name }) => {
|
|
58
|
+
this.tryRestorePendingChannel(name);
|
|
59
|
+
this.refreshEditorWidget();
|
|
60
|
+
}),
|
|
58
61
|
this.outputChannelManager.onChannelDeleted(() => this.refreshEditorWidget()),
|
|
59
62
|
this.outputChannelManager.onChannelWasHidden(() => this.refreshEditorWidget()),
|
|
60
|
-
this.outputChannelManager.onChannelWasShown(({ preserveFocus }) =>
|
|
63
|
+
this.outputChannelManager.onChannelWasShown(({ preserveFocus }) => {
|
|
64
|
+
// User explicitly showed a channel, clear any pending restoration
|
|
65
|
+
// so we don't override their choice when the pending channel is registered later
|
|
66
|
+
this.clearPendingChannelRestore();
|
|
67
|
+
this.refreshEditorWidget({ preserveFocus: !!preserveFocus });
|
|
68
|
+
}),
|
|
69
|
+
this.outputChannelManager.onSelectedChannelChanged(() => this.refreshEditorWidget()),
|
|
61
70
|
this.toDisposeOnSelectedChannelChanged,
|
|
62
71
|
this.onStateChangedEmitter,
|
|
63
72
|
this.onStateChanged(() => this.update())
|
|
64
73
|
]);
|
|
74
|
+
this.restoreSelectedChannelFromStorage();
|
|
65
75
|
this.refreshEditorWidget();
|
|
66
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Restore the selected channel from storage (used when widget is reopened).
|
|
79
|
+
* State restoration has higher priority, so this only applies if state restoration hasn't already
|
|
80
|
+
* set a selectedChannelName or pendingSelectedChannelName.
|
|
81
|
+
*/
|
|
82
|
+
async restoreSelectedChannelFromStorage() {
|
|
83
|
+
const storedChannelName = await this.storageService.getData(OutputWidget_1.SELECTED_CHANNEL_STORAGE_KEY);
|
|
84
|
+
// Only apply storage restoration if state restoration hasn't provided a channel
|
|
85
|
+
if (storedChannelName && !this._state.selectedChannelName && !this._state.pendingSelectedChannelName) {
|
|
86
|
+
const channel = this.outputChannelManager.getVisibleChannels().find(ch => ch.name === storedChannelName);
|
|
87
|
+
if (channel) {
|
|
88
|
+
this.outputChannelManager.selectedChannel = channel;
|
|
89
|
+
this.refreshEditorWidget();
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
// Channel not yet available, store as pending
|
|
93
|
+
this._state = { ...this._state, pendingSelectedChannelName: storedChannelName };
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
dispose() {
|
|
98
|
+
// Save the selected channel to storage before disposing
|
|
99
|
+
const channelName = this.selectedChannel?.name;
|
|
100
|
+
if (channelName) {
|
|
101
|
+
this.storageService.setData(OutputWidget_1.SELECTED_CHANNEL_STORAGE_KEY, channelName);
|
|
102
|
+
}
|
|
103
|
+
super.dispose();
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Try to restore the pending channel if it matches the newly added channel.
|
|
107
|
+
*/
|
|
108
|
+
tryRestorePendingChannel(addedChannelName) {
|
|
109
|
+
const pendingName = this._state.pendingSelectedChannelName;
|
|
110
|
+
if (pendingName && pendingName === addedChannelName) {
|
|
111
|
+
const channel = this.outputChannelManager.getVisibleChannels().find(ch => ch.name === pendingName);
|
|
112
|
+
if (channel) {
|
|
113
|
+
this.outputChannelManager.selectedChannel = channel;
|
|
114
|
+
this.clearPendingChannelRestore();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Clear any pending channel restoration.
|
|
120
|
+
* Called when the user explicitly selects a channel, so we don't override their choice.
|
|
121
|
+
*/
|
|
122
|
+
clearPendingChannelRestore() {
|
|
123
|
+
if (this._state.pendingSelectedChannelName) {
|
|
124
|
+
this._state = { ...this._state, pendingSelectedChannelName: undefined };
|
|
125
|
+
}
|
|
126
|
+
}
|
|
67
127
|
storeState() {
|
|
68
|
-
|
|
128
|
+
const { locked, selectedChannelName } = this.state;
|
|
129
|
+
const result = { locked };
|
|
130
|
+
// Store the selected channel name, preferring the actual current selection
|
|
131
|
+
// over any pending restoration that hasn't completed yet
|
|
132
|
+
if (this.selectedChannel) {
|
|
133
|
+
result.selectedChannelName = this.selectedChannel.name;
|
|
134
|
+
}
|
|
135
|
+
else if (selectedChannelName) {
|
|
136
|
+
result.selectedChannelName = selectedChannelName;
|
|
137
|
+
}
|
|
138
|
+
return result;
|
|
69
139
|
}
|
|
70
140
|
restoreState(oldState) {
|
|
71
141
|
const copy = (0, core_1.deepClone)(this.state);
|
|
72
142
|
if (oldState.locked) {
|
|
73
143
|
copy.locked = oldState.locked;
|
|
74
144
|
}
|
|
145
|
+
if (oldState.selectedChannelName) {
|
|
146
|
+
copy.selectedChannelName = oldState.selectedChannelName;
|
|
147
|
+
// Try to restore the selected channel in the manager if it exists
|
|
148
|
+
const channels = this.outputChannelManager.getVisibleChannels();
|
|
149
|
+
const channel = channels.find(ch => ch.name === oldState.selectedChannelName);
|
|
150
|
+
if (channel) {
|
|
151
|
+
this.outputChannelManager.selectedChannel = channel;
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
// Channel not yet available (e.g., registered by an extension that loads later).
|
|
155
|
+
// Store as pending and wait for it to be added.
|
|
156
|
+
copy.pendingSelectedChannelName = oldState.selectedChannelName;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
75
159
|
this.state = copy;
|
|
76
160
|
}
|
|
77
161
|
get state() {
|
|
@@ -127,7 +211,7 @@ let OutputWidget = class OutputWidget extends browser_2.BaseWidget {
|
|
|
127
211
|
onResize(message) {
|
|
128
212
|
super.onResize(message);
|
|
129
213
|
browser_2.MessageLoop.sendMessage(this.editorContainer, browser_2.Widget.ResizeMessage.UnknownSize);
|
|
130
|
-
for (const widget of
|
|
214
|
+
for (const widget of this.editorContainer.widgets()) {
|
|
131
215
|
browser_2.MessageLoop.sendMessage(widget, browser_2.Widget.ResizeMessage.UnknownSize);
|
|
132
216
|
}
|
|
133
217
|
}
|
|
@@ -189,7 +273,7 @@ let OutputWidget = class OutputWidget extends browser_2.BaseWidget {
|
|
|
189
273
|
return new browser_1.EditorWidget(editor, this.selectionService);
|
|
190
274
|
}
|
|
191
275
|
get editorWidget() {
|
|
192
|
-
for (const widget of
|
|
276
|
+
for (const widget of this.editorContainer.children()) {
|
|
193
277
|
if (widget instanceof browser_1.EditorWidget) {
|
|
194
278
|
return widget;
|
|
195
279
|
}
|
|
@@ -216,6 +300,10 @@ tslib_1.__decorate([
|
|
|
216
300
|
(0, inversify_1.inject)(output_channel_1.OutputChannelManager),
|
|
217
301
|
tslib_1.__metadata("design:type", output_channel_1.OutputChannelManager)
|
|
218
302
|
], OutputWidget.prototype, "outputChannelManager", void 0);
|
|
303
|
+
tslib_1.__decorate([
|
|
304
|
+
(0, inversify_1.inject)(browser_2.StorageService),
|
|
305
|
+
tslib_1.__metadata("design:type", Object)
|
|
306
|
+
], OutputWidget.prototype, "storageService", void 0);
|
|
219
307
|
tslib_1.__decorate([
|
|
220
308
|
(0, inversify_1.postConstruct)(),
|
|
221
309
|
tslib_1.__metadata("design:type", Function),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output-widget.js","sourceRoot":"","sources":["../../src/browser/output-widget.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;;AAEhF,8CAA4C;AAC5C,4DAAiF;AACjF,
|
|
1
|
+
{"version":3,"file":"output-widget.js","sourceRoot":"","sources":["../../src/browser/output-widget.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theia/output",
|
|
3
|
-
"version": "1.68.0-next.
|
|
3
|
+
"version": "1.68.0-next.48+c13611b3f",
|
|
4
4
|
"description": "Theia - Output Extension",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@theia/core": "1.68.0-next.
|
|
7
|
-
"@theia/editor": "1.68.0-next.
|
|
8
|
-
"@theia/monaco": "1.68.0-next.
|
|
6
|
+
"@theia/core": "1.68.0-next.48+c13611b3f",
|
|
7
|
+
"@theia/editor": "1.68.0-next.48+c13611b3f",
|
|
8
|
+
"@theia/monaco": "1.68.0-next.48+c13611b3f",
|
|
9
9
|
"@theia/monaco-editor-core": "1.96.302",
|
|
10
10
|
"p-queue": "^8.0.1",
|
|
11
11
|
"tslib": "^2.6.2"
|
|
@@ -49,5 +49,5 @@
|
|
|
49
49
|
"nyc": {
|
|
50
50
|
"extends": "../../configs/nyc.json"
|
|
51
51
|
},
|
|
52
|
-
"gitHead": "
|
|
52
|
+
"gitHead": "c13611b3f07bfc3d2c7525d8488283ff3e575422"
|
|
53
53
|
}
|
|
@@ -16,13 +16,12 @@
|
|
|
16
16
|
|
|
17
17
|
import '../../src/browser/style/output.css';
|
|
18
18
|
import { inject, injectable, postConstruct } from '@theia/core/shared/inversify';
|
|
19
|
-
import { toArray } from '@theia/core/shared/@lumino/algorithm';
|
|
20
19
|
import { EditorWidget } from '@theia/editor/lib/browser';
|
|
21
20
|
import { MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor';
|
|
22
21
|
import { SelectionService } from '@theia/core/lib/common/selection-service';
|
|
23
22
|
import { MonacoEditorProvider } from '@theia/monaco/lib/browser/monaco-editor-provider';
|
|
24
23
|
import { Disposable, DisposableCollection } from '@theia/core/lib/common/disposable';
|
|
25
|
-
import { Message, BaseWidget, DockPanel, Widget, MessageLoop, StatefulWidget, codicon } from '@theia/core/lib/browser';
|
|
24
|
+
import { Message, BaseWidget, DockPanel, Widget, MessageLoop, StatefulWidget, codicon, StorageService } from '@theia/core/lib/browser';
|
|
26
25
|
import { OutputUri } from '../common/output-uri';
|
|
27
26
|
import { OutputChannelManager, OutputChannel } from './output-channel';
|
|
28
27
|
import { Emitter, Event, deepClone } from '@theia/core';
|
|
@@ -34,6 +33,7 @@ export class OutputWidget extends BaseWidget implements StatefulWidget {
|
|
|
34
33
|
|
|
35
34
|
static readonly ID = 'outputView';
|
|
36
35
|
static readonly LABEL = nls.localizeByDefault('Output');
|
|
36
|
+
static readonly SELECTED_CHANNEL_STORAGE_KEY = 'output-widget-selected-channel';
|
|
37
37
|
|
|
38
38
|
@inject(SelectionService)
|
|
39
39
|
protected readonly selectionService: SelectionService;
|
|
@@ -44,6 +44,9 @@ export class OutputWidget extends BaseWidget implements StatefulWidget {
|
|
|
44
44
|
@inject(OutputChannelManager)
|
|
45
45
|
protected readonly outputChannelManager: OutputChannelManager;
|
|
46
46
|
|
|
47
|
+
@inject(StorageService)
|
|
48
|
+
protected readonly storageService: StorageService;
|
|
49
|
+
|
|
47
50
|
protected _state: OutputWidget.State = { locked: false };
|
|
48
51
|
protected readonly editorContainer: DockPanel;
|
|
49
52
|
protected readonly toDisposeOnSelectedChannelChanged = new DisposableCollection();
|
|
@@ -66,19 +69,91 @@ export class OutputWidget extends BaseWidget implements StatefulWidget {
|
|
|
66
69
|
@postConstruct()
|
|
67
70
|
protected init(): void {
|
|
68
71
|
this.toDispose.pushAll([
|
|
69
|
-
this.outputChannelManager.onChannelAdded(() =>
|
|
72
|
+
this.outputChannelManager.onChannelAdded(({ name }) => {
|
|
73
|
+
this.tryRestorePendingChannel(name);
|
|
74
|
+
this.refreshEditorWidget();
|
|
75
|
+
}),
|
|
70
76
|
this.outputChannelManager.onChannelDeleted(() => this.refreshEditorWidget()),
|
|
71
77
|
this.outputChannelManager.onChannelWasHidden(() => this.refreshEditorWidget()),
|
|
72
|
-
this.outputChannelManager.onChannelWasShown(({ preserveFocus }) =>
|
|
78
|
+
this.outputChannelManager.onChannelWasShown(({ preserveFocus }) => {
|
|
79
|
+
// User explicitly showed a channel, clear any pending restoration
|
|
80
|
+
// so we don't override their choice when the pending channel is registered later
|
|
81
|
+
this.clearPendingChannelRestore();
|
|
82
|
+
this.refreshEditorWidget({ preserveFocus: !!preserveFocus });
|
|
83
|
+
}),
|
|
84
|
+
this.outputChannelManager.onSelectedChannelChanged(() => this.refreshEditorWidget()),
|
|
73
85
|
this.toDisposeOnSelectedChannelChanged,
|
|
74
86
|
this.onStateChangedEmitter,
|
|
75
87
|
this.onStateChanged(() => this.update())
|
|
76
88
|
]);
|
|
89
|
+
this.restoreSelectedChannelFromStorage();
|
|
77
90
|
this.refreshEditorWidget();
|
|
78
91
|
}
|
|
79
92
|
|
|
93
|
+
/**
|
|
94
|
+
* Restore the selected channel from storage (used when widget is reopened).
|
|
95
|
+
* State restoration has higher priority, so this only applies if state restoration hasn't already
|
|
96
|
+
* set a selectedChannelName or pendingSelectedChannelName.
|
|
97
|
+
*/
|
|
98
|
+
protected async restoreSelectedChannelFromStorage(): Promise<void> {
|
|
99
|
+
const storedChannelName = await this.storageService.getData<string>(OutputWidget.SELECTED_CHANNEL_STORAGE_KEY);
|
|
100
|
+
// Only apply storage restoration if state restoration hasn't provided a channel
|
|
101
|
+
if (storedChannelName && !this._state.selectedChannelName && !this._state.pendingSelectedChannelName) {
|
|
102
|
+
const channel = this.outputChannelManager.getVisibleChannels().find(ch => ch.name === storedChannelName);
|
|
103
|
+
if (channel) {
|
|
104
|
+
this.outputChannelManager.selectedChannel = channel;
|
|
105
|
+
this.refreshEditorWidget();
|
|
106
|
+
} else {
|
|
107
|
+
// Channel not yet available, store as pending
|
|
108
|
+
this._state = { ...this._state, pendingSelectedChannelName: storedChannelName };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
override dispose(): void {
|
|
114
|
+
// Save the selected channel to storage before disposing
|
|
115
|
+
const channelName = this.selectedChannel?.name;
|
|
116
|
+
if (channelName) {
|
|
117
|
+
this.storageService.setData(OutputWidget.SELECTED_CHANNEL_STORAGE_KEY, channelName);
|
|
118
|
+
}
|
|
119
|
+
super.dispose();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Try to restore the pending channel if it matches the newly added channel.
|
|
124
|
+
*/
|
|
125
|
+
protected tryRestorePendingChannel(addedChannelName: string): void {
|
|
126
|
+
const pendingName = this._state.pendingSelectedChannelName;
|
|
127
|
+
if (pendingName && pendingName === addedChannelName) {
|
|
128
|
+
const channel = this.outputChannelManager.getVisibleChannels().find(ch => ch.name === pendingName);
|
|
129
|
+
if (channel) {
|
|
130
|
+
this.outputChannelManager.selectedChannel = channel;
|
|
131
|
+
this.clearPendingChannelRestore();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Clear any pending channel restoration.
|
|
138
|
+
* Called when the user explicitly selects a channel, so we don't override their choice.
|
|
139
|
+
*/
|
|
140
|
+
protected clearPendingChannelRestore(): void {
|
|
141
|
+
if (this._state.pendingSelectedChannelName) {
|
|
142
|
+
this._state = { ...this._state, pendingSelectedChannelName: undefined };
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
80
146
|
storeState(): object {
|
|
81
|
-
|
|
147
|
+
const { locked, selectedChannelName } = this.state;
|
|
148
|
+
const result: OutputWidget.State = { locked };
|
|
149
|
+
// Store the selected channel name, preferring the actual current selection
|
|
150
|
+
// over any pending restoration that hasn't completed yet
|
|
151
|
+
if (this.selectedChannel) {
|
|
152
|
+
result.selectedChannelName = this.selectedChannel.name;
|
|
153
|
+
} else if (selectedChannelName) {
|
|
154
|
+
result.selectedChannelName = selectedChannelName;
|
|
155
|
+
}
|
|
156
|
+
return result;
|
|
82
157
|
}
|
|
83
158
|
|
|
84
159
|
restoreState(oldState: object & Partial<OutputWidget.State>): void {
|
|
@@ -86,6 +161,19 @@ export class OutputWidget extends BaseWidget implements StatefulWidget {
|
|
|
86
161
|
if (oldState.locked) {
|
|
87
162
|
copy.locked = oldState.locked;
|
|
88
163
|
}
|
|
164
|
+
if (oldState.selectedChannelName) {
|
|
165
|
+
copy.selectedChannelName = oldState.selectedChannelName;
|
|
166
|
+
// Try to restore the selected channel in the manager if it exists
|
|
167
|
+
const channels = this.outputChannelManager.getVisibleChannels();
|
|
168
|
+
const channel = channels.find(ch => ch.name === oldState.selectedChannelName);
|
|
169
|
+
if (channel) {
|
|
170
|
+
this.outputChannelManager.selectedChannel = channel;
|
|
171
|
+
} else {
|
|
172
|
+
// Channel not yet available (e.g., registered by an extension that loads later).
|
|
173
|
+
// Store as pending and wait for it to be added.
|
|
174
|
+
copy.pendingSelectedChannelName = oldState.selectedChannelName;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
89
177
|
this.state = copy;
|
|
90
178
|
}
|
|
91
179
|
|
|
@@ -146,7 +234,7 @@ export class OutputWidget extends BaseWidget implements StatefulWidget {
|
|
|
146
234
|
protected override onResize(message: Widget.ResizeMessage): void {
|
|
147
235
|
super.onResize(message);
|
|
148
236
|
MessageLoop.sendMessage(this.editorContainer, Widget.ResizeMessage.UnknownSize);
|
|
149
|
-
for (const widget of
|
|
237
|
+
for (const widget of this.editorContainer.widgets()) {
|
|
150
238
|
MessageLoop.sendMessage(widget, Widget.ResizeMessage.UnknownSize);
|
|
151
239
|
}
|
|
152
240
|
}
|
|
@@ -219,7 +307,7 @@ export class OutputWidget extends BaseWidget implements StatefulWidget {
|
|
|
219
307
|
}
|
|
220
308
|
|
|
221
309
|
private get editorWidget(): EditorWidget | undefined {
|
|
222
|
-
for (const widget of
|
|
310
|
+
for (const widget of this.editorContainer.children()) {
|
|
223
311
|
if (widget instanceof EditorWidget) {
|
|
224
312
|
return widget;
|
|
225
313
|
}
|
|
@@ -240,6 +328,9 @@ export class OutputWidget extends BaseWidget implements StatefulWidget {
|
|
|
240
328
|
export namespace OutputWidget {
|
|
241
329
|
export interface State {
|
|
242
330
|
locked?: boolean;
|
|
331
|
+
selectedChannelName?: string;
|
|
332
|
+
/** Channel name waiting to be restored when it becomes available */
|
|
333
|
+
pendingSelectedChannelName?: string;
|
|
243
334
|
}
|
|
244
335
|
}
|
|
245
336
|
|