diff --git a/src/vs/workbench/browser/actions/toggleSidebarVisibility.ts b/src/vs/workbench/browser/actions/toggleSidebarVisibility.ts index e31853b1973..a5d1f667ac7 100644 --- a/src/vs/workbench/browser/actions/toggleSidebarVisibility.ts +++ b/src/vs/workbench/browser/actions/toggleSidebarVisibility.ts @@ -30,9 +30,7 @@ export class ToggleSidebarVisibilityAction extends Action { public run(): TPromise { const hideSidebar = this.partService.isVisible(Parts.SIDEBAR_PART); - this.partService.setSideBarHidden(hideSidebar); - - return TPromise.as(null); + return this.partService.setSideBarHidden(hideSidebar); } } diff --git a/src/vs/workbench/browser/layout.ts b/src/vs/workbench/browser/layout.ts index 09ac060b7f4..14e69c320a8 100644 --- a/src/vs/workbench/browser/layout.ts +++ b/src/vs/workbench/browser/layout.ts @@ -5,6 +5,8 @@ 'use strict'; import { Dimension, Builder } from 'vs/base/browser/builder'; +import { TPromise } from 'vs/base/common/winjs.base'; +import * as errors from 'vs/base/common/errors'; import { Part } from 'vs/workbench/browser/part'; import { QuickOpenController } from 'vs/workbench/browser/parts/quickopen/quickOpenController'; import { Sash, ISashEvent, IVerticalSashLayoutProvider, IHorizontalSashLayoutProvider, Orientation } from 'vs/base/browser/ui/sash/sash'; @@ -144,6 +146,7 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal let sidebarPosition = this.partService.getSideBarPosition(); let isSidebarVisible = this.partService.isVisible(Parts.SIDEBAR_PART); let newSashWidth = (sidebarPosition === Position.LEFT) ? this.startSidebarWidth + e.currentX - startX : this.startSidebarWidth - e.currentX + startX; + let promise = TPromise.as(null); // Sidebar visible if (isSidebarVisible) { @@ -151,7 +154,7 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal // Automatically hide side bar when a certain threshold is met if (newSashWidth + HIDE_SIDEBAR_WIDTH_THRESHOLD < this.computedStyles.sidebar.minWidth) { let dragCompensation = DEFAULT_MIN_SIDEBAR_PART_WIDTH - HIDE_SIDEBAR_WIDTH_THRESHOLD; - this.partService.setSideBarHidden(true); + promise = this.partService.setSideBarHidden(true); startX = (sidebarPosition === Position.LEFT) ? Math.max(this.activitybarWidth, e.currentX - dragCompensation) : Math.min(e.currentX + dragCompensation, this.workbenchSize.width - this.activitybarWidth); this.sidebarWidth = this.startSidebarWidth; // when restoring sidebar, restore to the sidebar width we started from } @@ -169,12 +172,12 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal (sidebarPosition === Position.RIGHT && startX - e.currentX >= this.computedStyles.sidebar.minWidth)) { this.startSidebarWidth = this.computedStyles.sidebar.minWidth - (sidebarPosition === Position.LEFT ? e.currentX - startX : startX - e.currentX); this.sidebarWidth = this.computedStyles.sidebar.minWidth; - this.partService.setSideBarHidden(false); + promise = this.partService.setSideBarHidden(false); } } if (doLayout) { - this.layout(); + promise.done(() => this.layout(), errors.onUnexpectedError); } }); @@ -235,8 +238,7 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal let optimalWidth = activeViewlet && activeViewlet.getOptimalWidth(); this.sidebarWidth = Math.max(DEFAULT_MIN_SIDEBAR_PART_WIDTH, optimalWidth || 0); this.storageService.store(WorkbenchLayout.sashXWidthSettingsKey, this.sidebarWidth, StorageScope.GLOBAL); - this.partService.setSideBarHidden(false); - this.layout(); + this.partService.setSideBarHidden(false).done(() => this.layout(), errors.onUnexpectedError); }); } diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts index 7cee0fd511a..ba253f8beee 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts @@ -8,7 +8,6 @@ import 'vs/css!./media/activityaction'; import nls = require('vs/nls'); import DOM = require('vs/base/browser/dom'); -import errors = require('vs/base/common/errors'); import { TPromise } from 'vs/base/common/winjs.base'; import { Builder, $ } from 'vs/base/browser/builder'; import { DelayedDragHandler } from 'vs/base/browser/dnd'; @@ -93,13 +92,11 @@ export class ViewletActivityAction extends ActivityAction { // Hide sidebar if selected viewlet already visible if (sideBarVisible && activeViewlet && activeViewlet.getId() === this.viewlet.id) { - this.partService.setSideBarHidden(true); - } else { - this.viewletService.openViewlet(this.viewlet.id, true).done(null, errors.onUnexpectedError); - this.activate(); + return this.partService.setSideBarHidden(true); } - return TPromise.as(true); + return this.viewletService.openViewlet(this.viewlet.id, true) + .then(() => this.activate()); } } @@ -531,12 +528,10 @@ class OpenViewletAction extends Action { // Hide sidebar if selected viewlet already visible if (sideBarVisible && activeViewlet && activeViewlet.getId() === this.viewlet.id) { - this.partService.setSideBarHidden(true); - } else { - this.viewletService.openViewlet(this.viewlet.id, true).done(null, errors.onUnexpectedError); + return this.partService.setSideBarHidden(true); } - return TPromise.as(true); + return this.viewletService.openViewlet(this.viewlet.id, true); } } diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index fe855b35e7f..3a94f7b0305 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -350,7 +350,7 @@ export class ActivitybarPart extends Part implements IActivityBarService { // Case: we closed the last visible viewlet // Solv: we hide the sidebar else if (visibleViewlets.length === 1) { - unpinPromise = TPromise.as(this.partService.setSideBarHidden(true)); + unpinPromise = this.partService.setSideBarHidden(true); } // Case: we closed the default viewlet diff --git a/src/vs/workbench/browser/parts/editor/editorActions.ts b/src/vs/workbench/browser/parts/editor/editorActions.ts index e70751ab74f..7086cc67ca2 100644 --- a/src/vs/workbench/browser/parts/editor/editorActions.ts +++ b/src/vs/workbench/browser/parts/editor/editorActions.ts @@ -824,7 +824,7 @@ export class MaximizeGroupAction extends Action { public run(): TPromise { if (this.editorService.getActiveEditor()) { this.editorGroupService.arrangeGroups(GroupArrangement.MINIMIZE_OTHERS); - this.partService.setSideBarHidden(true); + return this.partService.setSideBarHidden(true); } return TPromise.as(false); diff --git a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts index c381a4b44c2..0c77a476847 100644 --- a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts +++ b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts @@ -83,16 +83,17 @@ export class SidebarPart extends CompositePart implements ISidebar { } // First check if sidebar is hidden and show if so + let promise = TPromise.as(null); if (!this.partService.isVisible(Parts.SIDEBAR_PART)) { try { this.blockOpeningViewlet = true; - this.partService.setSideBarHidden(false); + promise = this.partService.setSideBarHidden(false); } finally { this.blockOpeningViewlet = false; } } - return this.openComposite(id, focus); + return promise.then(() => this.openComposite(id, focus)); } public getActiveViewlet(): IViewlet { @@ -122,21 +123,18 @@ class FocusSideBarAction extends Action { super(id, label); } - public run(): TPromise { + public run(): TPromise { // Show side bar if (!this.partService.isVisible(Parts.SIDEBAR_PART)) { - this.partService.setSideBarHidden(false); + return this.partService.setSideBarHidden(false); } // Focus into active viewlet - else { - let viewlet = this.viewletService.getActiveViewlet(); - if (viewlet) { - viewlet.focus(); - } + let viewlet = this.viewletService.getActiveViewlet(); + if (viewlet) { + viewlet.focus(); } - return TPromise.as(true); } } diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index ff5e2429ae5..387ea257d24 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -676,7 +676,7 @@ export class Workbench implements IPartService { } } - public setSideBarHidden(hidden: boolean, skipLayout?: boolean): void { + public setSideBarHidden(hidden: boolean, skipLayout?: boolean): TPromise { this.sideBarHidden = hidden; // Adjust CSS @@ -686,36 +686,40 @@ export class Workbench implements IPartService { this.workbench.removeClass('nosidebar'); } - // Layout - if (!skipLayout) { - this.workbenchLayout.layout({ forceStyleRecompute: true }); - } - + let promise = TPromise.as(null); // If sidebar becomes hidden, also hide the current active Viewlet if any if (hidden && this.sidebarPart.getActiveViewlet()) { - this.sidebarPart.hideActiveViewlet(); + promise = this.sidebarPart.hideActiveViewlet().then(() => { - const activeEditor = this.editorPart.getActiveEditor(); - const activePanel = this.panelPart.getActivePanel(); + const activeEditor = this.editorPart.getActiveEditor(); + const activePanel = this.panelPart.getActivePanel(); - // Pass Focus to Editor or Panel if Sidebar is now hidden - if (this.hasFocus(Parts.PANEL_PART) && activePanel) { - activePanel.focus(); - } else if (activeEditor) { - activeEditor.focus(); - } + // Pass Focus to Editor or Panel if Sidebar is now hidden + if (this.hasFocus(Parts.PANEL_PART) && activePanel) { + activePanel.focus(); + } else if (activeEditor) { + activeEditor.focus(); + } + }); } // If sidebar becomes visible, show last active Viewlet or default viewlet else if (!hidden && !this.sidebarPart.getActiveViewlet()) { const viewletToOpen = this.sidebarPart.getLastActiveViewletId() || this.viewletService.getDefaultViewletId(); if (viewletToOpen) { - this.sidebarPart.openViewlet(viewletToOpen, true).done(null, errors.onUnexpectedError); + promise = this.sidebarPart.openViewlet(viewletToOpen, true); } } - // Remember in settings - this.storageService.store(Workbench.sidebarHiddenSettingKey, hidden ? 'true' : 'false', StorageScope.WORKSPACE); + return promise.then(() => { + // Remember in settings + this.storageService.store(Workbench.sidebarHiddenSettingKey, hidden ? 'true' : 'false', StorageScope.WORKSPACE); + + // Layout + if (!skipLayout) { + this.workbenchLayout.layout({ forceStyleRecompute: true }); + } + }); } public setPanelHidden(hidden: boolean, skipLayout?: boolean): void { @@ -767,7 +771,7 @@ export class Workbench implements IPartService { private setSideBarPosition(position: Position): void { if (this.sideBarHidden) { - this.setSideBarHidden(false, true /* Skip Layout */); + this.setSideBarHidden(false, true /* Skip Layout */).done(undefined, errors.onUnexpectedError); } const newPositionValue = (position === Position.LEFT) ? 'left' : 'right'; @@ -1073,7 +1077,7 @@ export class Workbench implements IPartService { this.zenMode.wasSideBarVisible = this.isVisible(Parts.SIDEBAR_PART); this.zenMode.wasPanelVisible = this.isVisible(Parts.PANEL_PART); this.setPanelHidden(true, true); - this.setSideBarHidden(true, true); + this.setSideBarHidden(true, true).done(undefined, errors.onUnexpectedError); this.setActivityBarHidden(true, true); if (config.hideStatusBar) { @@ -1087,7 +1091,7 @@ export class Workbench implements IPartService { this.setPanelHidden(false, true); } if (this.zenMode.wasSideBarVisible) { - this.setSideBarHidden(false, true); + this.setSideBarHidden(false, true).done(undefined, errors.onUnexpectedError); } // Status bar and activity bar visibility come from settings -> update their visibility. this.onDidUpdateConfiguration(true); @@ -1101,7 +1105,7 @@ export class Workbench implements IPartService { this.inZenMode.set(this.zenMode.active); if (!skipLayout) { - this.layout(); + this.layout({ forceStyleRecompute: true }); } if (toggleFullScreen) { this.windowService.toggleFullScreen().done(undefined, errors.onUnexpectedError); diff --git a/src/vs/workbench/services/part/common/partService.ts b/src/vs/workbench/services/part/common/partService.ts index 5036d29cf88..35efde29427 100644 --- a/src/vs/workbench/services/part/common/partService.ts +++ b/src/vs/workbench/services/part/common/partService.ts @@ -80,7 +80,7 @@ export interface IPartService { /** * Set sidebar hidden or not */ - setSideBarHidden(hidden: boolean): void; + setSideBarHidden(hidden: boolean): TPromise; /** * Set panel part hidden or not diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index 22652887145..1666da5e5ef 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -272,7 +272,7 @@ export class TestPartService implements IPartService { return false; } - public setSideBarHidden(hidden: boolean): void { } + public setSideBarHidden(hidden: boolean): TPromise { return TPromise.as(null); } public isPanelHidden(): boolean { return false;