Skip to content

Commit 9b3d137

Browse files
committed
Only show Forward a Port... when view would otherwise be empty
Part of microsoft#86064
1 parent 65985c1 commit 9b3d137

1 file changed

Lines changed: 19 additions & 11 deletions

File tree

src/vs/workbench/contrib/remote/browser/tunnelView.ts

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -56,24 +56,31 @@ export interface ITunnelViewModel {
5656
readonly forwarded: TunnelItem[];
5757
readonly detected: TunnelItem[];
5858
readonly candidates: Promise<TunnelItem[]>;
59-
readonly input: ITunnelItem | ITunnelGroup | undefined;
59+
readonly input: TunnelItem;
6060
groups(): Promise<ITunnelGroup[]>;
6161
}
6262

6363
export class TunnelViewModel extends Disposable implements ITunnelViewModel {
6464
private _onForwardedPortsChanged: Emitter<void> = new Emitter();
6565
public onForwardedPortsChanged: Event<void> = this._onForwardedPortsChanged.event;
6666
private model: TunnelModel;
67-
private _input: ITunnelItem | ITunnelGroup | undefined;
67+
private _input: TunnelItem;
6868

6969
constructor(
70-
@IRemoteExplorerService remoteExplorerService: IRemoteExplorerService) {
70+
@IRemoteExplorerService private readonly remoteExplorerService: IRemoteExplorerService) {
7171
super();
7272
this.model = remoteExplorerService.tunnelModel;
7373
this._register(this.model.onForwardPort(() => this._onForwardedPortsChanged.fire()));
7474
this._register(this.model.onClosePort(() => this._onForwardedPortsChanged.fire()));
7575
this._register(this.model.onPortName(() => this._onForwardedPortsChanged.fire()));
7676
this._register(this.model.onCandidatesChanged(() => this._onForwardedPortsChanged.fire()));
77+
this._input = {
78+
label: nls.localize('remote.tunnelsView.add', "Forward a Port..."),
79+
tunnelType: TunnelType.Add,
80+
remoteHost: 'localhost',
81+
remotePort: 0,
82+
description: ''
83+
};
7784
}
7885

7986
async groups(): Promise<ITunnelGroup[]> {
@@ -100,20 +107,20 @@ export class TunnelViewModel extends Disposable implements ITunnelViewModel {
100107
items: candidates
101108
});
102109
}
103-
if (!this._input) {
104-
this._input = {
105-
label: nls.localize('remote.tunnelsView.add', "Forward a Port..."),
106-
tunnelType: TunnelType.Add,
107-
};
110+
if (groups.length === 0) {
111+
groups.push(this._input);
108112
}
109-
groups.push(this._input);
110113
return groups;
111114
}
112115

113116
get forwarded(): TunnelItem[] {
114-
return Array.from(this.model.forwarded.values()).map(tunnel => {
117+
const forwarded = Array.from(this.model.forwarded.values()).map(tunnel => {
115118
return new TunnelItem(TunnelType.Forwarded, tunnel.remoteHost, tunnel.remotePort, tunnel.localAddress, tunnel.closeable, tunnel.name, tunnel.description);
116119
});
120+
if (this.remoteExplorerService.getEditableData(undefined)) {
121+
forwarded.push(this._input);
122+
}
123+
return forwarded;
117124
}
118125

119126
get detected(): TunnelItem[] {
@@ -135,7 +142,7 @@ export class TunnelViewModel extends Disposable implements ITunnelViewModel {
135142
});
136143
}
137144

138-
get input(): ITunnelItem | ITunnelGroup | undefined {
145+
get input(): TunnelItem {
139146
return this._input;
140147
}
141148

@@ -522,6 +529,7 @@ export class TunnelPanel extends ViewPane {
522529
this.tunnelCloseableContext.set(!!node.closeable);
523530
} else {
524531
this.tunnelTypeContext.set(TunnelType.Add);
532+
this.tunnelCloseableContext.set(false);
525533
}
526534

527535
const actions: IAction[] = [];

0 commit comments

Comments
 (0)