diff --git a/src/vs/workbench/browser/parts/views/panelViewlet.ts b/src/vs/workbench/browser/parts/views/panelViewlet.ts index 03fb2022e2ced148831571b3705110b2ac81d789..f9717eccef29649ca6d8ee93d0d90dbae610c5b0 100644 --- a/src/vs/workbench/browser/parts/views/panelViewlet.ts +++ b/src/vs/workbench/browser/parts/views/panelViewlet.ts @@ -134,7 +134,7 @@ interface IViewletPanelItem { export class PanelViewlet extends Viewlet { - protected lastFocusedPanel: ViewletPanel | undefined; + private lastFocusedPanel: ViewletPanel | undefined; private panelItems: IViewletPanelItem[] = []; private panelview: PanelView; @@ -195,7 +195,11 @@ export class PanelViewlet extends Viewlet { if (this.lastFocusedPanel) { this.lastFocusedPanel.focus(); } else if (this.panelItems.length > 0) { - this.panelItems[0].panel.focus(); + for (const { panel } of this.panelItems) { + if (panel.isExpanded()) { + panel.focus(); + } + } } } @@ -213,8 +217,13 @@ export class PanelViewlet extends Viewlet { addPanel(panel: ViewletPanel, size: number, index = this.panelItems.length - 1): void { const disposables: IDisposable[] = []; const onDidFocus = panel.onDidFocus(() => this.lastFocusedPanel = panel, null, disposables); + const onDidChange = panel.onDidChange(() => { + if (panel === this.lastFocusedPanel && !panel.isExpanded()) { + this.lastFocusedPanel = undefined; + } + }, null, disposables); const styler = attachPanelStyler(panel, this.themeService); - const disposable = combinedDisposable([onDidFocus, styler]); + const disposable = combinedDisposable([onDidFocus, styler, onDidChange]); const panelItem: IViewletPanelItem = { panel, disposable }; this.panelItems.splice(index, 0, panelItem); diff --git a/src/vs/workbench/browser/parts/views/viewsViewlet.ts b/src/vs/workbench/browser/parts/views/viewsViewlet.ts index 7bc93ba609f0887b2f91e7ae6df114211016c4b3..a7cdde07173d2ebc24a80c35eb51bbd1b97f0c0f 100644 --- a/src/vs/workbench/browser/parts/views/viewsViewlet.ts +++ b/src/vs/workbench/browser/parts/views/viewsViewlet.ts @@ -347,16 +347,23 @@ export class ViewsViewlet extends PanelViewlet { super.shutdown(); } - toggleViewVisibility(id: string, visible?: boolean): void { + toggleViewVisibility(id: string): void { const view = this.getView(id); let viewState = this.viewsStates.get(id); - if (!viewState || (visible === true && view) || (visible === false && !view)) { + if (!viewState) { return; } viewState.isHidden = !!view; - this.updateViews(); + this.updateViews() + .then(() => { + if (!viewState.isHidden) { + this.getView(id).focus(); + } else { + this.focus(); + } + }); } private onViewsRegistered(views: IViewDescriptor[]): void { diff --git a/src/vs/workbench/parts/files/electron-browser/explorerViewlet.ts b/src/vs/workbench/parts/files/electron-browser/explorerViewlet.ts index b7b9b3cd8d8e41d120e0a56bb85d449fb214731b..7d3b763b318a379ba9551f6432ee7ebf5eb47001 100644 --- a/src/vs/workbench/parts/files/electron-browser/explorerViewlet.ts +++ b/src/vs/workbench/parts/files/electron-browser/explorerViewlet.ts @@ -226,67 +226,6 @@ export class ExplorerViewlet extends PersistentViewsViewlet implements IExplorer return super.setVisible(visible); } - public focus(): void { - const hasOpenedEditors = !!this.editorGroupService.getStacksModel().activeGroup; - - let openEditorsView = this.getOpenEditorsView(); - if (this.lastFocusedPanel && this.lastFocusedPanel.isExpanded() && this.hasSelectionOrFocus(this.lastFocusedPanel as ViewsViewletPanel)) { - if (this.lastFocusedPanel !== openEditorsView || hasOpenedEditors) { - this.lastFocusedPanel.focus(); - return; - } - } - - if (this.hasSelectionOrFocus(openEditorsView) && hasOpenedEditors) { - return openEditorsView.focus(); - } - - let explorerView = this.getExplorerView(); - if (this.hasSelectionOrFocus(explorerView)) { - return explorerView.focus(); - } - - if (openEditorsView && openEditorsView.isExpanded() && hasOpenedEditors) { - return openEditorsView.focus(); // we have entries in the opened editors view to focus on - } - - if (explorerView && explorerView.isExpanded()) { - return explorerView.focus(); - } - - let emptyView = this.getEmptyView(); - if (emptyView && emptyView.isExpanded()) { - return emptyView.focusBody(); - } - - super.focus(); - } - - private hasSelectionOrFocus(view: ViewsViewletPanel): boolean { - if (!view) { - return false; - } - - if (!view.isExpanded()) { - return false; - } - - if (view instanceof ExplorerView) { - const viewer = view.getViewer(); - if (!viewer) { - return false; - } - - return !!viewer.getFocus() || (viewer.getSelection() && viewer.getSelection().length > 0); - - } - if (view instanceof OpenEditorsView && !!view.getList()) { - return view.getList().isDOMFocused(); - } - - return false; - } - public getActionRunner(): IActionRunner { if (!this.actionRunner) { this.actionRunner = new ActionRunner(this.viewletState); diff --git a/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts b/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts index d1971cbbbb4a12d3727b81e934b4ce9cf4f84962..ed1edf09a3effa4ef74a62e6e32e543dc0c82549 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts +++ b/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts @@ -216,6 +216,11 @@ export class OpenEditorsView extends ViewsViewletPanel { }); } + public focus(): void { + this.list.domFocus(); + super.focus(); + } + public getList(): WorkbenchList { return this.list; }