From 611c4427881aad2678067ceac308959c0eb4d5ef Mon Sep 17 00:00:00 2001 From: Sanders Lauture Date: Thu, 3 Nov 2016 13:24:11 -0400 Subject: [PATCH] First attempt --- src/vs/code/electron-main/menus.ts | 22 +++++++++ src/vs/test/utils/servicesTestUtils.ts | 6 +++ .../actions/toggleActivityBarVisibility.ts | 49 +++++++++++++++++++ src/vs/workbench/browser/layout.ts | 14 ++++-- .../activitybar/media/activitybarpart.css | 5 ++ .../electron-browser/main.contribution.ts | 5 ++ .../workbench/electron-browser/workbench.ts | 35 +++++++++++++ .../services/part/common/partService.ts | 10 ++++ src/vs/workbench/workbench.main.ts | 1 + 9 files changed, 144 insertions(+), 3 deletions(-) create mode 100644 src/vs/workbench/browser/actions/toggleActivityBarVisibility.ts diff --git a/src/vs/code/electron-main/menus.ts b/src/vs/code/electron-main/menus.ts index 7d97bed307a..59f4767dc13 100644 --- a/src/vs/code/electron-main/menus.ts +++ b/src/vs/code/electron-main/menus.ts @@ -31,6 +31,9 @@ interface IConfiguration extends IFilesConfiguration { }, statusBar: { visible: boolean; + }, + activityBar: { + visible: boolean; } }; } @@ -44,6 +47,7 @@ export class VSCodeMenu { private currentAutoSaveSetting: string; private currentSidebarLocation: 'left' | 'right'; private currentStatusbarVisible: boolean; + private currentActivityBarVisible: boolean; private isQuitting: boolean; private appMenuInstalled: boolean; @@ -151,6 +155,15 @@ export class VSCodeMenu { this.currentStatusbarVisible = newStatusbarVisible; updateMenu = true; } + + let newActivityBarVisible = config.workbench.activityBar && config.workbench.activityBar.visible; + if (typeof newActivityBarVisible !== 'boolean') { + newActivityBarVisible = true; + } + if (newActivityBarVisible !== this.currentActivityBarVisible) { + this.currentActivityBarVisible = newActivityBarVisible; + updateMenu = true; + } } if (handleMenu && updateMenu) { @@ -543,6 +556,14 @@ export class VSCodeMenu { } const toggleStatusbar = this.createMenuItem(statusBarLabel, 'workbench.action.toggleStatusbarVisibility'); + let activityBarLabel: string; + if (this.currentActivityBarVisible) { + activityBarLabel = 'Show Activity Bar'; + } else { + activityBarLabel = 'Hide Activity Bar'; + } + const toggleActivtyBar = this.createMenuItem(activityBarLabel, 'workbench.action.toggleActivityBarVisibility'); + const toggleWordWrap = this.createMenuItem(nls.localize({ key: 'miToggleWordWrap', comment: ['&& denotes a mnemonic'] }, "Toggle &&Word Wrap"), 'editor.action.toggleWordWrap'); const toggleRenderWhitespace = this.createMenuItem(nls.localize({ key: 'miToggleRenderWhitespace', comment: ['&& denotes a mnemonic'] }, "Toggle &&Render Whitespace"), 'editor.action.toggleRenderWhitespace'); const toggleRenderControlCharacters = this.createMenuItem(nls.localize({ key: 'miToggleRenderControlCharacters', comment: ['&& denotes a mnemonic'] }, "Toggle &&Control Characters"), 'editor.action.toggleRenderControlCharacter'); @@ -574,6 +595,7 @@ export class VSCodeMenu { toggleSidebar, togglePanel, toggleStatusbar, + toggleActivtyBar, __separator__(), toggleWordWrap, toggleRenderWhitespace, diff --git a/src/vs/test/utils/servicesTestUtils.ts b/src/vs/test/utils/servicesTestUtils.ts index e0a20651cff..046f9017d5b 100644 --- a/src/vs/test/utils/servicesTestUtils.ts +++ b/src/vs/test/utils/servicesTestUtils.ts @@ -240,6 +240,12 @@ export class TestPartService implements IPartService { return false; } + public isActivityBarHidden(): boolean { + return false; + } + + public setActivityBarHidden(hidden: boolean): void { } + public isSideBarHidden(): boolean { return false; } diff --git a/src/vs/workbench/browser/actions/toggleActivityBarVisibility.ts b/src/vs/workbench/browser/actions/toggleActivityBarVisibility.ts new file mode 100644 index 00000000000..66ccce4edab --- /dev/null +++ b/src/vs/workbench/browser/actions/toggleActivityBarVisibility.ts @@ -0,0 +1,49 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import { TPromise } from 'vs/base/common/winjs.base'; +import nls = require('vs/nls'); +import { Registry } from 'vs/platform/platform'; +import { Action } from 'vs/base/common/actions'; +import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; +import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actionRegistry'; +import { IMessageService, Severity } from 'vs/platform/message/common/message'; +import { IConfigurationEditingService, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; +import { IPartService } from 'vs/workbench/services/part/common/partService'; + +export class ToggleActivityBarVisibilityAction extends Action { + + public static ID = 'workbench.action.toggleActivityBarVisibility'; + public static LABEL = nls.localize('toggleActivityBar', "Toggle Activity Bar Visibility"); + + private static activityBarVisibleKey = 'workbench.activitybar.visible'; + + constructor( + id: string, + label: string, + @IPartService private partService: IPartService, + @IMessageService private messageService: IMessageService, + @IConfigurationEditingService private configurationEditingService: IConfigurationEditingService + ) { + super(id, label); + + this.enabled = !!this.partService; + } + + public run(): TPromise { + const visibility = !this.partService.isActivityBarHidden(); + const newVisibilityValue = !visibility; + + this.configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: ToggleActivityBarVisibilityAction.activityBarVisibleKey, value: newVisibilityValue }).then(null, error => { + this.messageService.show(Severity.Error, error); + }); + + return TPromise.as(null); + } +} + +let registry = Registry.as(Extensions.WorkbenchActions); +registry.registerWorkbenchAction(new SyncActionDescriptor(ToggleActivityBarVisibilityAction, ToggleActivityBarVisibilityAction.ID, ToggleActivityBarVisibilityAction.LABEL), 'View: Toggle Activity Bar Visibility', nls.localize('view', "View")); \ No newline at end of file diff --git a/src/vs/workbench/browser/layout.ts b/src/vs/workbench/browser/layout.ts index cc7bad838db..99db9c76426 100644 --- a/src/vs/workbench/browser/layout.ts +++ b/src/vs/workbench/browser/layout.ts @@ -343,6 +343,7 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal this.workbenchSize = this.getWorkbenchArea(); + const isActivityBarHidden = this.partService.isActivityBarHidden(); const isSidebarHidden = this.partService.isSideBarHidden(); const isPanelHidden = this.partService.isPanelHidden(); const sidebarPosition = this.partService.getSideBarPosition(); @@ -366,7 +367,13 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal // Activity Bar let activityBarMinWidth = this.computedStyles.activitybar.minWidth; - let activityBarSize = new Dimension(activityBarMinWidth, sidebarSize.height); + let activityBarWidth: number; + if (isActivityBarHidden) { + activityBarWidth = 0; + } else { + activityBarWidth = activityBarMinWidth; + } + let activityBarSize = new Dimension(activityBarWidth, sidebarSize.height); // Panel part let panelHeight: number; @@ -399,7 +406,7 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal // Sidebar hidden if (isSidebarHidden) { - editorSize.width = Math.min(this.workbenchSize.width - activityBarSize.width, this.workbenchSize.width - activityBarMinWidth); + editorSize.width = this.workbenchSize.width - activityBarSize.width; if (sidebarPosition === Position.LEFT) { editorSize.remainderLeft = Math.round((this.workbenchSize.width - editorSize.width + activityBarSize.width) / 2); @@ -531,7 +538,8 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal public getVerticalSashLeft(sash: Sash): number { let isSidebarHidden = this.partService.isSideBarHidden(); let sidebarPosition = this.partService.getSideBarPosition(); - let activitybarWidth = this.computedStyles.activitybar.minWidth; + let isActivityBarHidden = this.partService.isActivityBarHidden(); + let activitybarWidth = !isActivityBarHidden ? this.computedStyles.activitybar.minWidth : 0; if (sidebarPosition === Position.LEFT) { return !isSidebarHidden ? this.sidebarWidth + activitybarWidth : activitybarWidth; diff --git a/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css b/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css index 09d24f7a2bc..636a2217c80 100644 --- a/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css +++ b/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css @@ -13,6 +13,11 @@ height: 100%; } +.monaco-workbench.noactivitybar > .activitybar { + display: none !important; + visibility: hidden !important; +} + .monaco-workbench > .activitybar > .content .monaco-action-bar { text-align: left; background-color: inherit; diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index cc6c348b772..f175a5be4ba 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -120,6 +120,11 @@ configurationRegistry.registerConfiguration({ 'type': 'boolean', 'default': true, 'description': nls.localize('statusBarVisibility', "Controls the visibility of the status bar at the bottom of the workbench.") + }, + 'workbench.activitybar.visible': { + 'type': 'boolean', + 'default': true, + 'description': nls.localize('activityBarVisibility', "Controls the visibility of the activity bar on the left side of the workbench.") } } }); diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index 955b02c089b..27cc69bdced 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -113,6 +113,8 @@ export class Workbench implements IPartService { private static sidebarPositionConfigurationKey = 'workbench.sideBar.location'; private static statusbarVisibleConfigurationKey = 'workbench.statusBar.visible'; + private static activityBarVisibleConfigurationKey = 'workbench.activitybar.visible'; + public _serviceBrand: any; private container: HTMLElement; @@ -140,6 +142,7 @@ export class Workbench implements IPartService { private creationPromiseComplete: ValueCallback; private sideBarHidden: boolean; private statusBarHidden: boolean; + private activityBarHidden: boolean; private sideBarPosition: Position; private panelHidden: boolean; private editorBackgroundDelayer: Delayer; @@ -452,6 +455,11 @@ export class Workbench implements IPartService { // Statusbar visibility const statusBarVisible = this.configurationService.lookup(Workbench.statusbarVisibleConfigurationKey).value; this.statusBarHidden = !statusBarVisible; + + // Activity bar visibility + const activityBarVisible = this.configurationService.lookup(Workbench.activityBarVisibleConfigurationKey).value; + this.activityBarHidden = !activityBarVisible; + } /** @@ -512,6 +520,8 @@ export class Workbench implements IPartService { return !this.panelHidden; case Parts.STATUSBAR_PART: return !this.statusBarHidden; + case Parts.ACTIVITYBAR_PART: + return !this.activityBarHidden; } return true; // any other part cannot be hidden @@ -530,6 +540,26 @@ export class Workbench implements IPartService { } } + public isActivityBarHidden(): boolean { + return this.activityBarHidden; + } + + public setActivityBarHidden(hidden: boolean, skipLayout?: boolean): void { + this.activityBarHidden = hidden; + + // Adjust CSS + if (hidden) { + this.workbench.addClass('noactivitybar'); + } else { + this.workbench.removeClass('noactivitybar'); + } + + // Layout + if (!skipLayout) { + this.workbenchLayout.layout({ forceStyleReCompute: true }); + } + } + public isSideBarHidden(): boolean { return this.sideBarHidden; } @@ -715,6 +745,11 @@ export class Workbench implements IPartService { if (newStatusbarHiddenValue !== this.isStatusBarHidden()) { this.setStatusBarHidden(newStatusbarHiddenValue); } + + const newActivityBarHiddenValue = !this.configurationService.lookup(Workbench.activityBarVisibleConfigurationKey).value; + if (newActivityBarHiddenValue !== this.isActivityBarHidden()) { + this.setActivityBarHidden(newActivityBarHiddenValue); + } } private createWorkbenchLayout(): void { diff --git a/src/vs/workbench/services/part/common/partService.ts b/src/vs/workbench/services/part/common/partService.ts index d9301282379..5093252fee6 100644 --- a/src/vs/workbench/services/part/common/partService.ts +++ b/src/vs/workbench/services/part/common/partService.ts @@ -55,6 +55,16 @@ export interface IPartService { */ isVisible(part: Parts): boolean; + /** + * Checks if the activity bar is currently hidden or not + */ + isActivityBarHidden(): boolean; + + /** + * Set activity bar hidden or not + */ + setActivityBarHidden(hidden: boolean): void; + /** * Checks if the statusbar is currently hidden or not */ diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index e78d493ce95..d199cd43cde 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -20,6 +20,7 @@ import 'vs/editor/browser/editor.all'; import 'vs/platform/actions/browser/menusExtensionPoint'; // Workbench +import 'vs/workbench/browser/actions/toggleActivityBarVisibility'; import 'vs/workbench/browser/actions/toggleStatusbarVisibility'; import 'vs/workbench/browser/actions/toggleSidebarVisibility'; import 'vs/workbench/browser/actions/toggleSidebarPosition'; -- GitLab