From 8d0ae4eba5f8758c833844079705bc7137b65836 Mon Sep 17 00:00:00 2001 From: chriswang521 Date: Mon, 22 May 2023 10:38:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Etoolbar=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E6=A0=8F,=E4=BD=8D=E4=BA=8E=E6=A0=87=E9=A2=98=E6=A0=8F?= =?UTF-8?q?=E5=92=8C=E8=8F=9C=E5=8D=95=E6=A0=8F=E4=B8=8B=E9=9D=A2,?= =?UTF-8?q?=E5=85=B7=E6=9C=89=E9=9A=90=E8=97=8F=E6=98=BE=E7=A4=BA=E5=8A=9F?= =?UTF-8?q?=E8=83=BD,=E5=B7=A5=E5=85=B7=E6=A0=8F=E4=B8=AD=E4=B8=BA?= =?UTF-8?q?=E4=B8=80=E4=BA=9B=E5=BF=AB=E6=8D=B7=E6=8C=89=E9=92=AE.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../translations/main.i18n.json | 31 +- .../browser/actions/layoutActions.ts | 43 ++ src/vs/workbench/browser/layout.ts | 75 +++- src/vs/workbench/browser/layoutState.ts | 11 + .../parts/toolbar/media/toolbarpart.css | 132 ++++++ .../browser/parts/toolbar/toolbarPart.ts | 408 ++++++++++++++++++ .../browser/workbench.contribution.ts | 5 + src/vs/workbench/browser/workbench.ts | 4 + .../services/layout/browser/layoutService.ts | 10 +- .../services/toolbar/common/toolBarService.ts | 26 ++ .../test/browser/workbenchTestServices.ts | 1 + src/vs/workbench/workbench.common.main.ts | 4 +- 12 files changed, 739 insertions(+), 11 deletions(-) create mode 100644 src/vs/workbench/browser/parts/toolbar/media/toolbarpart.css create mode 100644 src/vs/workbench/browser/parts/toolbar/toolbarPart.ts create mode 100644 src/vs/workbench/services/toolbar/common/toolBarService.ts diff --git a/extensions/vscode-language-pack-zh-hans/translations/main.i18n.json b/extensions/vscode-language-pack-zh-hans/translations/main.i18n.json index cf38ebbb..731fdfb3 100644 --- a/extensions/vscode-language-pack-zh-hans/translations/main.i18n.json +++ b/extensions/vscode-language-pack-zh-hans/translations/main.i18n.json @@ -2873,7 +2873,11 @@ "toggleZenMode": "切换禅模式", "visible": "可见", "zenMode": "禅模式", - "zenModeIcon": "表示禅模式" + "zenModeIcon": "表示禅模式", + "toolBarIcon": "表示工具栏", + "toggleToolBar": "切换工具栏", + "miShowToolBar": "显示工具栏", + "toolBar": "工具栏" }, "vs/workbench/browser/actions/navigationActions": { "focusNextPart": "专注下一部分", @@ -3611,6 +3615,30 @@ "userIsAdmin": "[管理员]", "userIsSudo": "[超级用户]" }, + "vs/workbench/browser/parts/toolbar/toolbarPart": { + "newFile": "新建文本文件", + "newWindow": "新建窗口", + "undo": "撤销", + "redo": "恢复", + "navigatePrevious": "返回", + "navigateNext": "前进", + "moveLinesUp": "向上移动行", + "moveLinesDown" : "向下移动行", + "explorer": "资源管理器", + "Search": "搜索", + "Scm": "源代码管理", + "Run and Debug": "运行和调试", + "Extensions": "插件", + "Terminal": "终端", + "KeyboardShortcuts": "键盘快捷方式", + "Settings": "设置", + "ZoomIn": "放大", + "ZoomOut": "缩小", + "FullScreen": "全屏", + "ZenMode":"禅模式", + "hideToolBar":"隐藏工具栏", + "toolBarBackground":"工具栏背景" + }, "vs/workbench/browser/parts/views/treeView": { "collapseAll": "全部折叠", "command-error": "运行命令 {1} 错误: {0}。这可能是由提交 {1} 的扩展引起的。", @@ -3726,6 +3754,7 @@ "splitOnDragAndDrop": "通过将编辑器或文件放到编辑器区域的边缘,控制是否可以由拖放操作拆分编辑器组。", "splitSizing": "拆分编辑器组时控制编辑器组大小。", "statusBarVisibility": "控制工作台底部状态栏的可见性。", + "toolBarVisibility":"控制工作台中工具栏的可见性。", "tabDescription": "控制编辑器标签的格式。", "tabScrollbarHeight": "控制编辑器标题区域中用于选项卡和面包屑的滚动条的高度。", "tabSizing": "控制编辑器选项卡的大小调整。当 \"#workbench.editor.showTabs#\" 处于禁用状态时,将忽略此值。", diff --git a/src/vs/workbench/browser/actions/layoutActions.ts b/src/vs/workbench/browser/actions/layoutActions.ts index 4b4cc8b3..44ec7884 100644 --- a/src/vs/workbench/browser/actions/layoutActions.ts +++ b/src/vs/workbench/browser/actions/layoutActions.ts @@ -31,6 +31,7 @@ import { ICommandActionTitle } from 'vs/platform/action/common/action'; // Register Icons const menubarIcon = registerIcon('menuBar', Codicon.layoutMenubar, localize('menuBarIcon', "Represents the menu bar")); +const toolbarIcon = registerIcon('toolBar', Codicon.browser, localize('toolBarIcon', "Represents the tool bar")); const activityBarLeftIcon = registerIcon('activity-bar-left', Codicon.layoutActivitybarLeft, localize('activityBarLeft', "Represents the activity bar in the left position")); const activityBarRightIcon = registerIcon('activity-bar-right', Codicon.layoutActivitybarRight, localize('activityBarRight', "Represents the activity bar in the right position")); const panelLeftIcon = registerIcon('panel-left', Codicon.layoutSidebarLeft, localize('panelLeft', "Represents a side bar in the left position")); @@ -68,6 +69,47 @@ registerAction2(class extends Action2 { } }); +//kylin ide start, add Toggle Toolbar Layout +export class ToggleToolBarVisibilityAction extends Action2 { + + static readonly ID = 'workbench.action.toggleToolBarVisibility'; + static readonly LABEL = localize('toggleToolBar', 'Toggle Tool Bar Visibility'); + + private static readonly toolBarVisibleKey = 'workbench.toolBar.visible'; + + constructor() { + super({ + id: ToggleToolBarVisibilityAction.ID, + title: { value: ToggleToolBarVisibilityAction.LABEL, original: 'Toggle Tool Bar Visibility' }, + category: CATEGORIES.View, + f1: true + }); + } + + run(accessor: ServicesAccessor): void { + const layoutService = accessor.get(IWorkbenchLayoutService); + const configurationService = accessor.get(IConfigurationService); + + const visibility = layoutService.isVisible(Parts.TOOLBAR_PART); + const newVisibilityValue = !visibility; + + configurationService.updateValue(ToggleToolBarVisibilityAction.toolBarVisibleKey, newVisibilityValue); + } +} + +registerAction2(ToggleToolBarVisibilityAction); + +MenuRegistry.appendMenuItem(MenuId.MenubarAppearanceMenu, { + group: '2_workbench_layout', + command: { + id: ToggleToolBarVisibilityAction.ID, + title: localize({ key: 'miShowToolBar', comment: ['&& denotes a mnemonic'] }, 'Show &&Tool Bar'), + toggled: ContextKeyExpr.equals('config.workbench.toolBar.visible', true) + }, + order: 4 +}); +//kylin ide end, add Toggle Toolbar Layout + // --- Toggle Activity Bar export class ToggleActivityBarVisibilityAction extends Action2 { @@ -1146,6 +1188,7 @@ if (!isMacintosh || !isNative) { } ToggleVisibilityActions.push(...[ + CreateToggleLayoutItem(ToggleToolBarVisibilityAction.ID, ContextKeyExpr.equals('config.workbench.toolBar.visible', true), localize('toolBar', "Tool Bar"), toolbarIcon), CreateToggleLayoutItem(ToggleActivityBarVisibilityAction.ID, ContextKeyExpr.equals('config.workbench.activityBar.visible', true), localize('activityBar', "Activity Bar"), { whenA: ContextKeyExpr.equals('config.workbench.sideBar.location', 'left'), iconA: activityBarLeftIcon, iconB: activityBarRightIcon }), CreateToggleLayoutItem(ToggleSidebarVisibilityAction.ID, SideBarVisibleContext, localize('sideBar', "Primary Side Bar"), { whenA: ContextKeyExpr.equals('config.workbench.sideBar.location', 'left'), iconA: panelLeftIcon, iconB: panelRightIcon }), CreateToggleLayoutItem(ToggleAuxiliaryBarAction.ID, AuxiliaryBarVisibleContext, localize('secondarySideBar', "Secondary Side Bar"), { whenA: ContextKeyExpr.equals('config.workbench.sideBar.location', 'left'), iconA: panelRightIcon, iconB: panelLeftIcon }), diff --git a/src/vs/workbench/browser/layout.ts b/src/vs/workbench/browser/layout.ts index 10a0a5e0..430b067e 100644 --- a/src/vs/workbench/browser/layout.ts +++ b/src/vs/workbench/browser/layout.ts @@ -50,6 +50,7 @@ import { ActivitybarPart } from 'vs/workbench/browser/parts/activitybar/activity import { AuxiliaryBarPart } from 'vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { LayoutStateKeys, LayoutStateModel, WorkbenchLayoutSettings } from 'vs/workbench/browser/layoutState'; +import { IToolBarService } from 'vs/workbench/services/toolbar/common/toolBarService'; interface IWorkbenchLayoutWindowRuntimeState { fullscreen: boolean; @@ -90,6 +91,7 @@ enum WorkbenchLayoutClasses { PANEL_HIDDEN = 'nopanel', AUXILIARYBAR_HIDDEN = 'noauxiliarybar', STATUSBAR_HIDDEN = 'nostatusbar', + TOOLBAR_HIDDEN = 'notoolbar', FULLSCREEN = 'fullscreen', MAXIMIZED = 'maximized', WINDOW_BORDER = 'border' @@ -168,6 +170,9 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi private auxiliaryBarPartView!: ISerializableView; private editorPartView!: ISerializableView; private statusBarPartView!: ISerializableView; + //kylin ide --- start + private toolBarPartView!: ISerializableView; + //kylin ide --- end private environmentService!: IBrowserWorkbenchEnvironmentService; private extensionService!: IExtensionService; @@ -221,6 +226,9 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi this.notificationService = accessor.get(INotificationService); this.statusBarService = accessor.get(IStatusbarService); accessor.get(IBannerService); + //kylin ide --- start + accessor.get(IToolBarService); + //kylin ide --- end // Listeners this.registerLayoutListeners(); @@ -449,6 +457,10 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi this.setPanelAlignment(change.value as PanelAlignment); } + if (change.key === LayoutStateKeys.TOOLBAR_HIDDEN) { + this.setToolBarHidden(change.value as boolean); + } + this.doUpdateLayoutConfiguration(); }); @@ -951,6 +963,8 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi return !this.stateModel.getRuntimeValue(LayoutStateKeys.ACTIVITYBAR_HIDDEN); case Parts.EDITOR_PART: return !this.stateModel.getRuntimeValue(LayoutStateKeys.EDITOR_HIDDEN); + case Parts.TOOLBAR_PART: + return !this.stateModel.getRuntimeValue(LayoutStateKeys.TOOLBAR_HIDDEN); default: return false; // any other part cannot be hidden } @@ -971,6 +985,8 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi return !this.stateModel.getRuntimeValue(LayoutStateKeys.ACTIVITYBAR_HIDDEN); case Parts.EDITOR_PART: return !this.stateModel.getRuntimeValue(LayoutStateKeys.EDITOR_HIDDEN); + case Parts.TOOLBAR_PART: + return !this.stateModel.getRuntimeValue(LayoutStateKeys.TOOLBAR_HIDDEN); default: return false; // any other part cannot be hidden } @@ -1028,6 +1044,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi const takenHeight = (this.isVisible(Parts.TITLEBAR_PART) ? this.titleBarPartView.minimumHeight : 0) + + (this.isVisible(Parts.TOOLBAR_PART) ? this.toolBarPartView.minimumHeight : 0) + (this.isVisible(Parts.STATUSBAR_PART) ? this.statusBarPartView.minimumHeight : 0) + (this.isVisible(Parts.PANEL_PART) && !isColumn ? this.panelPartView.minimumHeight : 0); @@ -1195,6 +1212,10 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi const auxiliaryBarPart = this.getPart(Parts.AUXILIARYBAR_PART); const sideBar = this.getPart(Parts.SIDEBAR_PART); const statusBar = this.getPart(Parts.STATUSBAR_PART); + // kylin ide --- start + // Add toolbar + const toolBar = this.getPart(Parts.TOOLBAR_PART); + // kylin ide --- end // View references for all parts this.titleBarPartView = titleBar; @@ -1205,6 +1226,9 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi this.panelPartView = panelPart; this.auxiliaryBarPartView = auxiliaryBarPart; this.statusBarPartView = statusBar; + //kylin ide --- start + this.toolBarPartView = toolBar; + //kylin ide --- end const viewMap = { [Parts.ACTIVITYBAR_PART]: this.activityBarPartView, @@ -1214,7 +1238,10 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi [Parts.PANEL_PART]: this.panelPartView, [Parts.SIDEBAR_PART]: this.sideBarPartView, [Parts.STATUSBAR_PART]: this.statusBarPartView, - [Parts.AUXILIARYBAR_PART]: this.auxiliaryBarPartView + [Parts.AUXILIARYBAR_PART]: this.auxiliaryBarPartView, + //kylin ide --- start + [Parts.TOOLBAR_PART]: this.toolBarPartView + //kylin ide --- end }; const fromJSON = ({ type }: { type: Parts }) => viewMap[type]; @@ -1229,7 +1256,8 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi this.workbenchGrid = workbenchGrid; this.workbenchGrid.edgeSnapping = this.windowState.runtime.fullscreen; - for (const part of [titleBar, editorPart, activityBar, panelPart, sideBar, statusBar, auxiliaryBarPart]) { + //add toolbar + for (const part of [titleBar, editorPart, activityBar, panelPart, sideBar, statusBar, auxiliaryBarPart, toolBar]) { this._register(part.onDidVisibilityChange((visible) => { if (part === sideBar) { this.setSideBarHidden(!visible, true); @@ -1396,6 +1424,22 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi } } + //kylin ide --- start : set tool bar hidden + setToolBarHidden(hidden: boolean, skipLayout?: boolean): void { + this.stateModel.setRuntimeValue(LayoutStateKeys.TOOLBAR_HIDDEN, hidden); + + // Adjust CSS + if (hidden) { + this.container.classList.add(WorkbenchLayoutClasses.TOOLBAR_HIDDEN); + } else { + this.container.classList.remove(WorkbenchLayoutClasses.TOOLBAR_HIDDEN); + } + + // Propagate to grid + this.workbenchGrid.setViewVisible(this.toolBarPartView, !hidden); + } + //kylin ide --- end : set tool bar hidden + private setActivityBarHidden(hidden: boolean, skipLayout?: boolean): void { // Propagate to grid this.stateModel.setRuntimeValue(LayoutStateKeys.ACTIVITYBAR_HIDDEN, hidden); @@ -1432,6 +1476,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi !this.isVisible(Parts.PANEL_PART) ? WorkbenchLayoutClasses.PANEL_HIDDEN : undefined, !this.isVisible(Parts.AUXILIARYBAR_PART) ? WorkbenchLayoutClasses.AUXILIARYBAR_HIDDEN : undefined, !this.isVisible(Parts.STATUSBAR_PART) ? WorkbenchLayoutClasses.STATUSBAR_HIDDEN : undefined, + !this.isVisible(Parts.TOOLBAR_PART) ? WorkbenchLayoutClasses.TOOLBAR_HIDDEN : undefined, this.windowState.runtime.fullscreen ? WorkbenchLayoutClasses.FULLSCREEN : undefined ]); } @@ -1499,20 +1544,20 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi const preMoveAuxiliaryBarSize = !this.isVisible(Parts.AUXILIARYBAR_PART) ? Sizing.Invisible(this.workbenchGrid.getViewCachedVisibleSize(this.auxiliaryBarPartView) ?? this.auxiliaryBarPartView.minimumWidth) : this.workbenchGrid.getViewSize(this.auxiliaryBarPartView).width; if (sideBarPosition === Position.LEFT) { - this.workbenchGrid.moveViewTo(this.activityBarPartView, [2, 0]); + this.workbenchGrid.moveViewTo(this.activityBarPartView, [3, 0]); this.workbenchGrid.moveView(this.sideBarPartView, preMoveSideBarSize, sideBarSiblingToEditor ? this.editorPartView : this.activityBarPartView, sideBarSiblingToEditor ? Direction.Left : Direction.Right); if (auxiliaryBarSiblingToEditor) { this.workbenchGrid.moveView(this.auxiliaryBarPartView, preMoveAuxiliaryBarSize, this.editorPartView, Direction.Right); } else { - this.workbenchGrid.moveViewTo(this.auxiliaryBarPartView, [2, -1]); + this.workbenchGrid.moveViewTo(this.auxiliaryBarPartView, [3, -1]); } } else { - this.workbenchGrid.moveViewTo(this.activityBarPartView, [2, -1]); + this.workbenchGrid.moveViewTo(this.activityBarPartView, [3, -1]); this.workbenchGrid.moveView(this.sideBarPartView, preMoveSideBarSize, sideBarSiblingToEditor ? this.editorPartView : this.activityBarPartView, sideBarSiblingToEditor ? Direction.Right : Direction.Left); if (auxiliaryBarSiblingToEditor) { this.workbenchGrid.moveView(this.auxiliaryBarPartView, preMoveAuxiliaryBarSize, this.editorPartView, Direction.Left); } else { - this.workbenchGrid.moveViewTo(this.auxiliaryBarPartView, [2, 0]); + this.workbenchGrid.moveViewTo(this.auxiliaryBarPartView, [3, 0]); } } @@ -1736,6 +1781,8 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi return this.setAuxiliaryBarHidden(hidden); case Parts.PANEL_PART: return this.setPanelHidden(hidden); + case Parts.TOOLBAR_PART: + return this.setToolBarHidden(hidden); } } @@ -1899,7 +1946,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi for (const neighborView of neighborViews) { const neighborPart = - [Parts.ACTIVITYBAR_PART, Parts.EDITOR_PART, Parts.PANEL_PART, Parts.AUXILIARYBAR_PART, Parts.SIDEBAR_PART, Parts.STATUSBAR_PART, Parts.TITLEBAR_PART] + [Parts.ACTIVITYBAR_PART, Parts.EDITOR_PART, Parts.PANEL_PART, Parts.AUXILIARYBAR_PART, Parts.SIDEBAR_PART, Parts.STATUSBAR_PART, Parts.TOOLBAR_PART, Parts.TITLEBAR_PART] .find(partId => this.getPart(partId) === neighborView && this.isVisible(partId)); if (neighborPart !== undefined) { @@ -2023,7 +2070,13 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi const bannerHeight = this.bannerPartView.minimumHeight; const statusBarHeight = this.statusBarPartView.minimumHeight; const activityBarWidth = this.activityBarPartView.minimumWidth; - const middleSectionHeight = height - titleBarHeight - statusBarHeight; + // kylin ide --- start + // Add toolbar + const toolBarHeight = this.toolBarPartView.minimumHeight; + // const middleRightSectionwidth = width - (this.stateModel.getRuntimeValue(LayoutStateKeys.TOOLBAR_VISIBLE) ? 0 : activityBarWidth); + // kylin ide --- end + const middleSectionHeight = height - titleBarHeight - statusBarHeight - toolBarHeight; + const activityBarNode: ISerializedLeafNode = { type: 'leaf', @@ -2086,6 +2139,12 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi size: bannerHeight, visible: false }, + { + type: 'leaf', + data: { type: Parts.TOOLBAR_PART }, + size: toolBarHeight, + visible: !this.stateModel.getRuntimeValue(LayoutStateKeys.TOOLBAR_HIDDEN) + }, { type: 'branch', data: middleSection, diff --git a/src/vs/workbench/browser/layoutState.ts b/src/vs/workbench/browser/layoutState.ts index 6c01f1a8..dfa5f9ad 100644 --- a/src/vs/workbench/browser/layoutState.ts +++ b/src/vs/workbench/browser/layoutState.ts @@ -75,6 +75,7 @@ export const LayoutStateKeys = { PANEL_HIDDEN: new RuntimeStateKey('panel.hidden', StorageScope.WORKSPACE, StorageTarget.USER, true), AUXILIARYBAR_HIDDEN: new RuntimeStateKey('auxiliaryBar.hidden', StorageScope.WORKSPACE, StorageTarget.USER, true), STATUSBAR_HIDDEN: new RuntimeStateKey('statusBar.hidden', StorageScope.WORKSPACE, StorageTarget.USER, false, true), + TOOLBAR_HIDDEN: new RuntimeStateKey('toolBar.hidden', StorageScope.WORKSPACE, StorageTarget.USER, false, true), } as const; @@ -112,6 +113,10 @@ export class LayoutStateModel extends Disposable { if (configurationChangeEvent.affectsConfiguration(LegacyWorkbenchLayoutSettings.SIDEBAR_POSITION)) { this.setRuntimeValueAndFire(LayoutStateKeys.SIDEBAR_POSITON, positionFromString(this.configurationService.getValue(LegacyWorkbenchLayoutSettings.SIDEBAR_POSITION) ?? 'left')); } + + if (configurationChangeEvent.affectsConfiguration(LegacyWorkbenchLayoutSettings.TOOLBAR_VISIBLE)) { + this.setRuntimeValueAndFire(LayoutStateKeys.TOOLBAR_HIDDEN, !this.configurationService.getValue(LegacyWorkbenchLayoutSettings.TOOLBAR_VISIBLE)); + } } private updateLegacySettingsFromState(key: RuntimeStateKey, value: T): void { @@ -126,6 +131,8 @@ export class LayoutStateModel extends Disposable { this.configurationService.updateValue(LegacyWorkbenchLayoutSettings.STATUSBAR_VISIBLE, !value); } else if (key === LayoutStateKeys.SIDEBAR_POSITON) { this.configurationService.updateValue(LegacyWorkbenchLayoutSettings.SIDEBAR_POSITION, positionToString(value as Position)); + } else if (key === LayoutStateKeys.STATUSBAR_HIDDEN) { + this.configurationService.updateValue(LegacyWorkbenchLayoutSettings.TOOLBAR_VISIBLE, !value); } } @@ -146,6 +153,7 @@ export class LayoutStateModel extends Disposable { this.stateCache.set(LayoutStateKeys.ACTIVITYBAR_HIDDEN.name, !this.configurationService.getValue(LegacyWorkbenchLayoutSettings.ACTIVITYBAR_VISIBLE)); this.stateCache.set(LayoutStateKeys.STATUSBAR_HIDDEN.name, !this.configurationService.getValue(LegacyWorkbenchLayoutSettings.STATUSBAR_VISIBLE)); this.stateCache.set(LayoutStateKeys.SIDEBAR_POSITON.name, positionFromString(this.configurationService.getValue(LegacyWorkbenchLayoutSettings.SIDEBAR_POSITION) ?? 'left')); + this.stateCache.set(LayoutStateKeys.TOOLBAR_HIDDEN.name, !this.configurationService.getValue(LegacyWorkbenchLayoutSettings.TOOLBAR_VISIBLE)); // Set dynamic defaults: part sizing and side bar visibility const workbenchDimensions = getClientArea(this.container); @@ -222,6 +230,8 @@ export class LayoutStateModel extends Disposable { case LayoutStateKeys.SIDEBAR_POSITON: this.stateCache.set(key.name, this.configurationService.getValue(LegacyWorkbenchLayoutSettings.SIDEBAR_POSITION) ?? 'left'); break; + case LayoutStateKeys.TOOLBAR_HIDDEN: + this.stateCache.set(key.name, this.configurationService.getValue(LegacyWorkbenchLayoutSettings.TOOLBAR_VISIBLE)); } } @@ -282,4 +292,5 @@ enum LegacyWorkbenchLayoutSettings { ACTIVITYBAR_VISIBLE = 'workbench.activityBar.visible', // Deprecated to UI State STATUSBAR_VISIBLE = 'workbench.statusBar.visible', // Deprecated to UI State SIDEBAR_POSITION = 'workbench.sideBar.location', // Deprecated to UI State + TOOLBAR_VISIBLE = 'workbench.toolBar.visible', } diff --git a/src/vs/workbench/browser/parts/toolbar/media/toolbarpart.css b/src/vs/workbench/browser/parts/toolbar/media/toolbarpart.css new file mode 100644 index 00000000..236fd1a8 --- /dev/null +++ b/src/vs/workbench/browser/parts/toolbar/media/toolbarpart.css @@ -0,0 +1,132 @@ +/*---------------------------------------------------------------------------- +* Copyright (c) KylinIdeTeam. 2022-2023. All rights reserved. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* --------------------------------------------------------------------------- */ + +.monaco-workbench .part.toolbar { + box-sizing: border-box; + width: 100%; + padding: 0 70px; + overflow: hidden; + flex-shrink: 0; + align-items: center; + justify-content: center; + user-select: none; + -webkit-user-select: none; + zoom: 1; + /* prevent zooming */ + line-height: 22px; + height: 22px; + display: flex; +} + +.monaco-workbench .part.toolbar>.toolbar-drag-region { + top: 0; + left: 0; + display: block; + position: absolute; + width: 100%; + height: 100%; + z-index: -1; + -webkit-app-region: drag; +} + +.monaco-workbench .part.toolbar>.toolbar-title { + display: flex; + align-items: center; + height: 100%; + margin-left: 5px; + /* flex: 0 1 auto; + font-size: 16px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + margin-left: auto; + margin-right: auto; + zoom: 1; prevent zooming */ +} + +.toolbar-title>.tool-item { + /* padding: 0 4px 3px; */ + display: flex; + align-items: center; + height: 100%; + /* position: relative; */ + margin: 3px 3px 0 3px; +} + +.tool-item>.tool-item-icon { + width: 24px; + height: 24px; + cursor: pointer; + text-align: center; + /* vertical-align: middle; */ + /* border:1px solid transparent; */ +} + +.tool-item-icon:hover { + /* background: #4d4d4d; */ + border: 1px solid; + border-radius: 2px; + box-sizing: border-box; +} + +.tool-item-icon:active { + /* background: #303030; */ + border: 0px solid #6e6e6e; + border-radius: 2px; + box-sizing: border-box; +} + +.tool-item-icon>.iconimg { + width: 18px; + height: 18px; + /* vertical-align: middle; */ + display: inline-block; +} + +/* Windows/Linux: Rules for custom title (icon, window controls) */ +.monaco-workbench.web .part.toolbar, +.monaco-workbench.windows .part.toolbar, +.monaco-workbench.linux .part.toolbar { + padding: 0; + height: 30px; + line-height: 30px; + justify-content: left; + overflow: visible; +} + +.monaco-workbench.web .part.toolbar>.window-title, +.monaco-workbench.windows .part.toolbar>.window-title, +.monaco-workbench.linux .part.toolbar>.window-title { + cursor: default; +} + +.monaco-workbench.linux .part.toolbar>.window-title { + font-size: inherit; +} + +.monaco-workbench.windows .part.toolbar>.resizer, +.monaco-workbench.linux .part.toolbar>.resizer { + -webkit-app-region: no-drag; + position: absolute; + top: 0; + width: 100%; + height: 20%; +} + +.monaco-workbench.windows.fullscreen .part.toolbar>.resizer, +.monaco-workbench.linux.fullscreen .part.toolbar>.resizer { + display: none; +} diff --git a/src/vs/workbench/browser/parts/toolbar/toolbarPart.ts b/src/vs/workbench/browser/parts/toolbar/toolbarPart.ts new file mode 100644 index 00000000..ca4ee2ae --- /dev/null +++ b/src/vs/workbench/browser/parts/toolbar/toolbarPart.ts @@ -0,0 +1,408 @@ +/*---------------------------------------------------------------------------- +* Copyright (c) KylinIdeTeam. 2022-2023. All rights reserved. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* 创建工具条,工具条具有显示隐藏功能,在工具条上创建快捷按钮并能响应动作。 +* --------------------------------------------------------------------------- */ + +import 'vs/css!./media/toolbarpart'; +import { localize } from 'vs/nls'; +import { ICommandService } from 'vs/platform/commands/common/commands'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IStorageService } from 'vs/platform/storage/common/storage'; +import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { Part } from 'vs/workbench/browser/part'; +import { MENUBAR_SELECTION_BACKGROUND, MENUBAR_SELECTION_BORDER, TITLE_BAR_ACTIVE_BACKGROUND, TITLE_BAR_BORDER, WORKBENCH_BACKGROUND } from 'vs/workbench/common/theme'; +import { IWorkbenchLayoutService, Parts } from 'vs/workbench/services/layout/browser/layoutService'; +import { URI } from 'vs/base/common/uri'; +import { registerColor, transparent } from 'vs/platform/theme/common/colorRegistry'; +import { Color } from 'vs/base/common/color'; +import { addDisposableListener, EventHelper, EventType, $ } from 'vs/base/browser/dom'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { FileAccess } from 'vs/base/common/network'; +import { IToolBarService } from 'vs/workbench/services/toolbar/common/toolBarService'; +import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; +import { IAction, toAction } from 'vs/base/common/actions'; +import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; +import { dispose } from 'vs/base/common/lifecycle'; +import { ToggleToolBarVisibilityAction } from 'vs/workbench/browser/actions/layoutActions'; +import { Codicon, CSSIcon } from 'vs/base/common/codicons'; +import { isWeb } from 'vs/base/common/platform'; +// import { isMacintosh } from 'vs/base/common/platform'; +// import { OpenFileFolderAction, OpenFolderAction } from 'vs/workbench/browser/actions/workspaceActions'; + +export class ToolbarPart extends Part implements IToolBarService { + declare readonly _serviceBrand: undefined; + + readonly minimumWidth: number = 0; + readonly maximumWidth: number = Number.POSITIVE_INFINITY; + readonly minimumHeight: number = 34; + readonly maximumHeight: number = 34; + + constructor( + @IStorageService storageService: IStorageService, + @IThemeService themeService: IThemeService, + @IWorkbenchLayoutService layoutService: IWorkbenchLayoutService, + @IInstantiationService protected readonly instantiationService: IInstantiationService, + @ICommandService private readonly commandService: ICommandService, + @IContextMenuService private contextMenuService: IContextMenuService, + ) { + super(Parts.TOOLBAR_PART, { hasTitle: false }, themeService, storageService, layoutService); + } + + override createContentArea(parent: HTMLElement): HTMLElement { + this.element = parent; + const content = document.createElement('div'); + content.classList.add('toolbar-title'); + this.element.appendChild(content); + + const toolitem = [ + // 新建文本文件 + { + url: FileAccess.asFileUri('./media/newfile.svg', require), + command: 'workbench.action.files.newUntitledFile', + arg: '', + title: localize('newFile', 'New Text File') + '(Ctrl+N)', + icon: Codicon.newFile + }, + // 新建窗口 + { + url: FileAccess.asFileUri('./media/newWindow.svg', require), + command: 'workbench.action.newWindow', + arg: '', + title: localize('newWindow', 'New Window') + '(Ctrl+Shift+N)', + icon: Codicon.emptyWindow + }, + // //打开文件夹,有问题 + // { + // url: FileAccess.asFileUri('./media/create.svg', require), + // command: isMacintosh ? 'workbench.action.files.openFileFolder' : 'workbench.action.files.openFolder', + // arg: '', + // title: localize('openFolder', 'Open Folder') + '(Ctrl+K Ctrl+O)', + // icon: Codicon.folderOpened + // }, + // 撤销 + { + url: FileAccess.asFileUri('./media/cancel.svg', require), + command: 'undo', + arg: '', + title: localize('undo', 'Undo') + '(Ctrl+Z)', + icon: Codicon.discard + }, + //恢复 + { + url: FileAccess.asFileUri('./media/redo.svg', require), + command: 'redo', + arg: '', + title: localize('redo', 'Redo') + '(Ctrl+Y)', + icon: Codicon.redo + }, + // 返回 + { + url: FileAccess.asFileUri('./media/back.svg', require), + command: 'workbench.action.navigateBack', + arg: '', + title: localize('navigatePrevious', 'Go Back') + '(Alt+LeftArrow)', + icon: Codicon.arrowLeft//Codicon.chevronLeft + }, + //前进 + { + url: FileAccess.asFileUri('./media/goahead.svg', require), + command: 'workbench.action.navigateForward', + arg: '', + title: localize('navigateNext', 'Go Forward') + '(Alt+RightArrow)', + icon: Codicon.arrowRight//Codicon.chevronRight + }, + // 向上移动一行 + { + url: FileAccess.asFileUri('./media/moveLinesUp.svg', require), + command: 'editor.action.moveLinesUpAction', + arg: '', + title: localize('moveLinesUp', 'moveLinesUp') + '(Alt+RightArrow)', + icon: Codicon.arrowUp + }, + // 向下移动一行 + { + url: FileAccess.asFileUri('./media/moveLinesDown.svg', require), + command: 'editor.action.moveLinesDownAction', + arg: '', + title: localize('moveLinesDown', 'moveLinesDown') + '(Alt+LeftArrow)', + icon: Codicon.arrowDown + }, + //打开explorer + { + url: FileAccess.asFileUri('./media/explorer.svg', require), + command: 'workbench.view.explorer', + arg: '', + title: localize('explorer', 'explorer') + '(Ctrl+Shift+E)', + icon: Codicon.files + }, + //开启搜索 + { + url: FileAccess.asFileUri('./media/search.svg', require), + command: 'workbench.view.search', + arg: '', + title: localize('Search', 'Search') + '(Ctrl+Shift+F)', + icon: Codicon.search + }, + //打开源代码管理 + { + url: FileAccess.asFileUri('./media/scm.svg', require), + command: 'workbench.view.scm', + arg: '', + title: localize('Scm', 'Source Control') + '(Ctrl+Shift+G G)', + icon: Codicon.sourceControl + }, + //打开debug + { + url: FileAccess.asFileUri('./media/debug.svg', require), + command: 'workbench.view.debug', + arg: '', + title: localize('Run and Debug', 'Run and Debug') + '(Ctrl+Shift+D)', + icon: Codicon.debugAlt + }, + //开启插件 + { + url: FileAccess.asFileUri('./media/extensions.svg', require), + command: 'workbench.view.extensions', + arg: '', + title: localize('Extensions', 'Extensions') + '(Ctrl+Shift+X)', + icon: Codicon.extensions + }, + //开启关闭终端 + { + url: FileAccess.asFileUri('./media/command.svg', require), + command: 'workbench.action.terminal.toggleTerminal', + arg: '', + title: localize('Terminal', 'Terminal') + '(Ctrl+`)', + icon: Codicon.terminal + }, + //打开键盘快捷方式 + { + url: FileAccess.asFileUri('./media/keyboardShortcuts.svg', require), + command: 'workbench.action.openGlobalKeybindings', + arg: '', + title: localize('KeyboardShortcuts', 'Keyboard Shortcuts') + '(Ctrl+K Ctrl+S)', + icon: Codicon.keyboard + }, + //打开设置 + { + url: FileAccess.asFileUri('./media/config-dark.svg', require), + command: 'workbench.action.openSettings', + arg: '', + title: localize('Settings', 'Settings') + '(Ctrl+,)', + icon: Codicon.gear + }, + //图片问题svg不显示,注释 + // { + // url: FileAccess.asFileUri('./media/siderbar.svg', require), + // command: 'workbench.action.toggleSidebarVisibility', + // arg: '', + // title: localize('Siderbar', 'Siderbar') + '(Ctrl+B)', + // icon: undefined + // }, + // { + // url: FileAccess.asFileUri('./media/panel.svg', require), + // command: 'workbench.action.togglePanel', + // arg: '', + // title: localize('Panel', 'Panel') + '(Ctrl+J)', + // icon: undefined + // }, + //放大窗体 + { + url: FileAccess.asFileUri('./media/zoomIn.svg', require), + command: 'workbench.action.zoomIn', + arg: '', + title: localize('ZoomIn', 'ZoomIn') + '(Ctrl+=)', + icon: Codicon.zoomIn + }, + //缩小窗体 + { + url: FileAccess.asFileUri('./media/zoomOut.svg', require), + command: 'workbench.action.zoomOut', + arg: '', + title: localize('ZoomOut', 'ZoomOut') + '(Ctrl+-)', + icon: Codicon.zoomOut + }, + //全屏模式 + { + url: FileAccess.asFileUri('./media/screenFull.svg', require), + command: 'workbench.action.toggleFullScreen', + arg: '', + title: localize('FullScreen', 'FullScreen') + '(F11)', + icon: Codicon.screenFull + }, + //禅模式 + { + url: FileAccess.asFileUri('./media/zenMode.svg', require), + command: 'workbench.action.toggleZenMode', + arg: '', + title: localize('ZenMode', 'ZenMode') + '(Ctrl+K Z)', + icon: Codicon.target + } + ]; + + //添加分隔竖线 + toolitem.forEach(item => { + if (item.command === 'undo' || item.command === 'workbench.view.explorer' || item.command === 'workbench.action.zoomIn') { + const toolitem = document.createElement('div'); + toolitem.style.margin = '0 5px 0 5px'; + toolitem.style.height = '23px'; + toolitem.style.border = '0.5px solid'; + toolitem.style.borderColor = '#5C5C5C'; + content.appendChild(toolitem); + } + if (isWeb && (item.command === 'workbench.action.zoomIn' || item.command === 'workbench.action.zoomOut')) { + return; + } + this.createToolitem(content, item.url, item.command, item.arg, item.title, item.icon); + }); + this.updateStyles(); + + // Context menu support 鼠标右键菜单 + this._register(addDisposableListener(parent, EventType.CONTEXT_MENU, e => this.showContextMenu(e))); + return this.element; + } + + private createToolitem(parent: HTMLElement, url: URI, cmd: string, arg: string, title: string, icon?: Codicon | undefined): void { + const toolitem = document.createElement('div'); + toolitem.classList.add('tool-item'); + + const toolitemicon = document.createElement('div'); + toolitemicon.classList.add('tool-item-icon'); + + //没有使用url的图片地址,使用IDE中的默认icon + if (icon === undefined) { + const img = document.createElement('img'); + img.title = title; + img.classList.add('tool-item-icon'); + img.src = url.toString(true); + toolitemicon.appendChild(img); + } else { + const node = $(`span`); + node.title = title; + node.classList.add(...CSSIcon.asClassNameArray(icon)); + toolitemicon.appendChild(node); + } + + + toolitem.appendChild(toolitemicon); + parent.appendChild(toolitem); + if (cmd.length > 0) { + this._register(addDisposableListener(toolitem, EventType.MOUSE_DOWN, _e => { + if (arg.length > 0) { + this.commandService.executeCommand(cmd, arg); + } + else { + this.commandService.executeCommand(cmd); + } + })); + } + } + + //显示右键菜单内容 + private showContextMenu(e: MouseEvent): void { + EventHelper.stop(e, true); + + const event = new StandardMouseEvent(e); + + let actions: IAction[] | undefined = undefined; + this.contextMenuService.showContextMenu({ + getAnchor: () => ({ x: event.posx, y: event.posy }), + getActions: () => { + actions = this.getContextMenuActions(event); + + return actions; + }, + onHide: () => { + if (actions) { + dispose(actions); + } + } + }); + } + + //add context action 填充鼠标右键菜单的事件 + private getContextMenuActions(_event: StandardMouseEvent): IAction[] { + const actions: IAction[] = []; + + // Toggle Tool Bar + actions.push(toAction({ id: ToggleToolBarVisibilityAction.ID, label: localize('hideToolBar', 'Hide Tool Bar'), run: async () => this.instantiationService.invokeFunction(accessor => new ToggleToolBarVisibilityAction().run(accessor)) })); + + // 此处可添加右键菜单 + return actions; + } + + override updateStyles() { + super.updateStyles(); + // Part container + if (this.element) { + const TOOL_BAR_BACKGROUND = registerColor('toolBar.background', { + dark: transparent(TITLE_BAR_ACTIVE_BACKGROUND, 0.7), + light: transparent(TITLE_BAR_ACTIVE_BACKGROUND, 0.8), + hcDark: Color.black, hcLight: Color.white + }, localize('toolBarBackground', 'Tool bar background')); + const toolbarBackground = this.getColor(TOOL_BAR_BACKGROUND, (color, theme) => { + return color.isOpaque() ? color : color.makeOpaque(WORKBENCH_BACKGROUND(theme)); + }) || ''; + this.element.style.backgroundColor = toolbarBackground; + if (toolbarBackground && Color.fromHex(toolbarBackground).isLighter()) { + this.element.classList.add('light'); + } else { + this.element.classList.remove('light'); + } + const toolbarBorder = this.getColor(TITLE_BAR_BORDER); + this.element.style.borderBottom = toolbarBorder ? `1px solid ${toolbarBorder}` : ''; + } + } + + override layout(width: number, height: number): void { + super.layoutContents(width, height); + } + + toJSON(): object { + return { + type: Parts.TOOLBAR_PART + }; + } +} + +registerThemingParticipant((theme, collector) => { + const toolBarHoverBg = theme.getColor(MENUBAR_SELECTION_BACKGROUND); + if (toolBarHoverBg) { + collector.addRule(` + .tool-item-icon:hover { + background: ${toolBarHoverBg}; + border: 0px solid; + } + `); + } + const toolBarActiveBg = theme.getColor(TITLE_BAR_ACTIVE_BACKGROUND); + if (toolBarActiveBg) { + collector.addRule(` + .tool-item-icon:active { + background: ${toolBarActiveBg}; + } + `); + } + const toolBarHoverBd = theme.getColor(MENUBAR_SELECTION_BORDER); + if (toolBarHoverBd) { + collector.addRule(` + .tool-item-icon:hover { + border-color: ${toolBarHoverBd}; + } + `); + } +}); + +registerSingleton(IToolBarService, ToolbarPart); diff --git a/src/vs/workbench/browser/workbench.contribution.ts b/src/vs/workbench/browser/workbench.contribution.ts index 36dc8265..0686a69b 100644 --- a/src/vs/workbench/browser/workbench.contribution.ts +++ b/src/vs/workbench/browser/workbench.contribution.ts @@ -382,6 +382,11 @@ const registry = Registry.as(ConfigurationExtensions.Con 'default': true, 'description': localize('statusBarVisibility', "Controls the visibility of the status bar at the bottom of the workbench.") }, + 'workbench.toolBar.visible': { + 'type': 'boolean', + 'default': true, + 'description': localize('toolBarVisibility', "Controls the visibility of the tool bar in the workbench.") + }, 'workbench.activityBar.visible': { 'type': 'boolean', 'default': true, diff --git a/src/vs/workbench/browser/workbench.ts b/src/vs/workbench/browser/workbench.ts index 27c50770..6507412f 100644 --- a/src/vs/workbench/browser/workbench.ts +++ b/src/vs/workbench/browser/workbench.ts @@ -339,6 +339,10 @@ export class Workbench extends Layout { for (const { id, role, classes, options } of [ { id: Parts.TITLEBAR_PART, role: 'contentinfo', classes: ['titlebar'] }, { id: Parts.BANNER_PART, role: 'banner', classes: ['banner'] }, + // kylin ide --- start + // Add toolbar + { id: Parts.TOOLBAR_PART, role: 'none', classes: ['toolbar'] }, + // kylin ide --- end { id: Parts.ACTIVITYBAR_PART, role: 'none', classes: ['activitybar', this.getSideBarPosition() === Position.LEFT ? 'left' : 'right'] }, // Use role 'none' for some parts to make screen readers less chatty #114892 { id: Parts.SIDEBAR_PART, role: 'none', classes: ['sidebar', this.getSideBarPosition() === Position.LEFT ? 'left' : 'right'] }, { id: Parts.EDITOR_PART, role: 'main', classes: ['editor'], options: { restorePreviousState: this.willRestoreEditors() } }, diff --git a/src/vs/workbench/services/layout/browser/layoutService.ts b/src/vs/workbench/services/layout/browser/layoutService.ts index e6b68545..f14b4354 100644 --- a/src/vs/workbench/services/layout/browser/layoutService.ts +++ b/src/vs/workbench/services/layout/browser/layoutService.ts @@ -20,7 +20,10 @@ export const enum Parts { PANEL_PART = 'workbench.parts.panel', AUXILIARYBAR_PART = 'workbench.parts.auxiliarybar', EDITOR_PART = 'workbench.parts.editor', - STATUSBAR_PART = 'workbench.parts.statusbar' + STATUSBAR_PART = 'workbench.parts.statusbar', + //kylin ide --- start + TOOLBAR_PART = 'workbench.parts.toolbar' /* TOOLBAR_PART */ + //kylin ide --- end } export const enum Position { @@ -165,6 +168,11 @@ export interface IWorkbenchLayoutService extends ILayoutService { */ getDimension(part: Parts): Dimension | undefined; + /** + * Set tool bar hidden or not + */ + setToolBarHidden(hidden: boolean): void; + /** * Set part hidden or not */ diff --git a/src/vs/workbench/services/toolbar/common/toolBarService.ts b/src/vs/workbench/services/toolbar/common/toolBarService.ts new file mode 100644 index 00000000..454f9703 --- /dev/null +++ b/src/vs/workbench/services/toolbar/common/toolBarService.ts @@ -0,0 +1,26 @@ +/*---------------------------------------------------------------------------- +* Copyright (c) KylinIDETeam. 2022-2023. All rights reserved. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* 创建工具条服务类。 +* --------------------------------------------------------------------------- */ + +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; + +export const IToolBarService = createDecorator('toolbarService'); + +export interface IToolBarService { + + readonly _serviceBrand: undefined; + +} diff --git a/src/vs/workbench/test/browser/workbenchTestServices.ts b/src/vs/workbench/test/browser/workbenchTestServices.ts index 5bd96210..5c82bafb 100644 --- a/src/vs/workbench/test/browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/browser/workbenchTestServices.ts @@ -598,6 +598,7 @@ export class TestLayoutService implements IWorkbenchLayoutService { isTitleBarHidden(): boolean { return false; } isStatusBarHidden(): boolean { return false; } isActivityBarHidden(): boolean { return false; } + setToolBarHidden(_hidden: boolean): void { } setActivityBarHidden(_hidden: boolean): void { } setBannerHidden(_hidden: boolean): void { } isSideBarHidden(): boolean { return false; } diff --git a/src/vs/workbench/workbench.common.main.ts b/src/vs/workbench/workbench.common.main.ts index fc82d15f..497812e2 100644 --- a/src/vs/workbench/workbench.common.main.ts +++ b/src/vs/workbench/workbench.common.main.ts @@ -46,7 +46,9 @@ import 'vs/workbench/browser/parts/paneCompositePart'; import 'vs/workbench/browser/parts/banner/bannerPart'; import 'vs/workbench/browser/parts/statusbar/statusbarPart'; import 'vs/workbench/browser/parts/views/viewsService'; - +//kylin ide --- start +import 'vs/workbench/browser/parts/toolbar/toolbarPart'; +//kylin ide --- end //#endregion