From f64f65b0e08edd0051fa9ec9034612b14829bcc3 Mon Sep 17 00:00:00 2001 From: Himanshu Date: Mon, 3 Feb 2025 20:47:58 +0530 Subject: [PATCH 1/4] new header bar --- .../parts/auxiliarybar/auxiliaryBarPart.ts | 45 ++++++++--- .../parts/auxiliarybar/auxiliaryTitleBar.ts | 49 ++++++++++++ .../auxiliarybar/media/auxiliaryBarPart.css | 80 +++++++++++++++++++ 3 files changed, 164 insertions(+), 10 deletions(-) create mode 100644 src/vs/workbench/browser/parts/auxiliarybar/auxiliaryTitleBar.ts diff --git a/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts b/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts index 56a497250ee41..68af0fca5acab 100644 --- a/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts +++ b/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts @@ -36,6 +36,7 @@ import { HiddenItemStrategy, WorkbenchToolBar } from '../../../../platform/actio import { ActionViewItem, IActionViewItemOptions } from '../../../../base/browser/ui/actionbar/actionViewItems.js'; import { CompositeMenuActions } from '../../actions.js'; import { IHoverService } from '../../../../platform/hover/browser/hover.js'; +import { AuxiliaryTitleBar } from './auxiliaryTitleBar.js'; export class AuxiliaryBarPart extends AbstractPaneCompositePart { @@ -224,22 +225,46 @@ export class AuxiliaryBarPart extends AbstractPaneCompositePart { protected override createHeaderArea() { const headerArea = super.createHeaderArea(); + + // Ensure header area has composite header class for styling + headerArea.classList.add('composite', 'header'); + + // Create and append the composite bar container first + const compositeBarContainer = $('.composite-bar-container'); + headerArea.appendChild(compositeBarContainer); + + // Create the global header container const globalHeaderContainer = $('.auxiliary-bar-global-header'); + headerArea.appendChild(globalHeaderContainer); - // Add auxillary header action - const menu = this.headerFooterCompositeBarDispoables.add(this.instantiationService.createInstance(CompositeMenuActions, MenuId.AuxiliaryBarHeader, undefined, undefined)); + // Create our custom title bar container + const customTitleBarContainer = $('.custom-title-container'); + headerArea.appendChild(customTitleBarContainer); - const toolBar = this.headerFooterCompositeBarDispoables.add(this.instantiationService.createInstance(WorkbenchToolBar, globalHeaderContainer, { - actionViewItemProvider: (action, options) => this.headerActionViewItemProvider(action, options), - orientation: ActionsOrientation.HORIZONTAL, - hiddenItemStrategy: HiddenItemStrategy.NoHide, - getKeyBinding: action => this.keybindingService.lookupKeybinding(action.id), - })); + // Create our custom title bar + this.headerFooterCompositeBarDispoables.add( + this.instantiationService.createInstance(AuxiliaryTitleBar, customTitleBarContainer) + ); + + // Add auxiliary header actions + const menu = this.headerFooterCompositeBarDispoables.add( + this.instantiationService.createInstance(CompositeMenuActions, MenuId.AuxiliaryBarHeader, undefined, undefined) + ); + + const toolBar = this.headerFooterCompositeBarDispoables.add( + this.instantiationService.createInstance(WorkbenchToolBar, globalHeaderContainer, { + actionViewItemProvider: (action, options) => this.headerActionViewItemProvider(action, options), + orientation: ActionsOrientation.HORIZONTAL, + hiddenItemStrategy: HiddenItemStrategy.NoHide, + getKeyBinding: action => this.keybindingService.lookupKeybinding(action.id), + }) + ); toolBar.setActions(prepareActions(menu.getPrimaryActions())); - this.headerFooterCompositeBarDispoables.add(menu.onDidChange(() => toolBar.setActions(prepareActions(menu.getPrimaryActions())))); + this.headerFooterCompositeBarDispoables.add(menu.onDidChange(() => + toolBar.setActions(prepareActions(menu.getPrimaryActions())) + )); - headerArea.appendChild(globalHeaderContainer); return headerArea; } diff --git a/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryTitleBar.ts b/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryTitleBar.ts new file mode 100644 index 0000000000000..714e5c87111f2 --- /dev/null +++ b/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryTitleBar.ts @@ -0,0 +1,49 @@ +import { Codicon } from '../../../../base/common/codicons.js'; +import { Disposable } from '../../../../base/common/lifecycle.js'; +import { ICommandService } from '../../../../platform/commands/common/commands.js'; +import { EventType, addDisposableListener } from '../../../../base/browser/dom.js'; + +export class AuxiliaryTitleBar extends Disposable { + private container: HTMLElement; + private readonly iconLabels = [ + { icon: Codicon.layoutPanel, title: 'Toggle Panel', command: 'workbench.action.togglePanel' }, + { icon: Codicon.layoutSidebarRight, title: 'Toggle Secondary Sidebar', command: 'workbench.action.toggleAuxiliaryBar' }, + { icon: Codicon.layoutCentered, title: 'Toggle Centered Layout', command: 'workbench.action.toggleCenteredLayout' }, + // { icon: Codicon.layoutActivitybarRight, title: 'Toggle Actions', command: 'workbench.action.toggleActivityBarVisibility' } + ]; + + constructor( + parent: HTMLElement, + @ICommandService private readonly commandService: ICommandService + ) { + super(); + + // Create the title bar container + this.container = document.createElement('div'); + this.container.classList.add('auxiliary-custom-titlebar'); + + // Insert at the beginning of the parent + parent.insertBefore(this.container, parent.firstChild); + + this.renderIcons(); + } + + private renderIcons(): void { + this.iconLabels.forEach(({ icon, title, command }) => { + const button = document.createElement('button'); + button.classList.add('monaco-button', 'codicon', `codicon-${icon.id}`); + button.title = title; + + this._register(addDisposableListener(button, EventType.CLICK, () => { + this.commandService.executeCommand(command); + })); + + this.container.appendChild(button); + }); + } + + override dispose(): void { + super.dispose(); + this.container.remove(); + } +} diff --git a/src/vs/workbench/browser/parts/auxiliarybar/media/auxiliaryBarPart.css b/src/vs/workbench/browser/parts/auxiliarybar/media/auxiliaryBarPart.css index 781c090fbe57e..cbf9b8dad4c0d 100644 --- a/src/vs/workbench/browser/parts/auxiliarybar/media/auxiliaryBarPart.css +++ b/src/vs/workbench/browser/parts/auxiliarybar/media/auxiliaryBarPart.css @@ -94,3 +94,83 @@ .monaco-workbench .auxiliarybar.pane-composite-part > .title.has-composite-bar > .title-actions .monaco-action-bar .action-item { max-width: 150px; } + +.monaco-workbench .part.auxiliarybar .composite.header { + display: flex; + flex-direction: column; +} + +.monaco-workbench .part.auxiliarybar .auxiliary-bar-global-header { + order: 1; +} + +.monaco-workbench .part.auxiliarybar .custom-title-container { + order: 2; + width: 100%; + display: flex; + flex-direction: column; + background-color: var(--vscode-sideBar-background); + border-bottom: 1px solid var(--vscode-sideBar-border); +} + +.monaco-workbench .part.auxiliarybar .auxiliary-titlebar { + display: flex; + align-items: center; + justify-content: flex-end; + padding: 4px 8px; + height: 35px; + box-sizing: border-box; +} + +.monaco-workbench .part.auxiliarybar .auxiliary-titlebar button { + display: flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + border: none; + background: none; + border-radius: 4px; + margin-left: 4px; + color: var(--vscode-sideBarTitle-foreground); + cursor: pointer; +} + +.monaco-workbench .part.auxiliarybar .auxiliary-titlebar button:hover { + background-color: var(--vscode-toolbar-hoverBackground); +} + +.monaco-workbench .part.auxiliarybar .auxiliary-titlebar button:active { + background-color: var(--vscode-toolbar-activeBackground); +} + +.monaco-workbench .part.auxiliarybar .auxiliary-custom-titlebar { + display: flex; + align-items: center; + justify-content: flex-end; + padding: 4px 8px; + height: 35px; + box-sizing: border-box; +} + +.monaco-workbench .part.auxiliarybar .auxiliary-custom-titlebar button { + display: flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + border: none; + background: none; + border-radius: 4px; + margin-left: 4px; + color: var(--vscode-sideBarTitle-foreground); + cursor: pointer; +} + +.monaco-workbench .part.auxiliarybar .auxiliary-custom-titlebar button:hover { + background-color: var(--vscode-toolbar-hoverBackground); +} + +.monaco-workbench .part.auxiliarybar .auxiliary-custom-titlebar button:active { + background-color: var(--vscode-toolbar-activeBackground); +} From e5b5bae9f4c9afab4d3eb373de33448c53cb03fb Mon Sep 17 00:00:00 2001 From: Nang Date: Wed, 5 Feb 2025 15:20:27 -0500 Subject: [PATCH 2/4] Renamed secondary to pearai (#178) --- extensions/pearai-submodule | 2 +- scripts/code.sh | 6 +++--- .../workbench/api/browser/viewsExtensionPoint.ts | 2 +- .../workbench/browser/actions/layoutActions.ts | 12 ++++++------ src/vs/workbench/browser/layout.ts | 2 +- .../parts/auxiliarybar/auxiliaryBarActions.ts | 16 ++++++++-------- .../parts/auxiliarybar/auxiliaryBarPart.ts | 4 ++-- .../parts/auxiliarybar/auxiliaryTitleBar.ts | 3 +-- .../workbench/browser/parts/paneCompositeBar.ts | 2 +- .../browser/parts/panel/panelActions.ts | 16 ++++++++-------- .../workbench/browser/workbench.contribution.ts | 12 ++++++------ .../quickaccess/browser/viewQuickAccess.ts | 2 +- 12 files changed, 39 insertions(+), 40 deletions(-) diff --git a/extensions/pearai-submodule b/extensions/pearai-submodule index 130eca8b1b2f7..4cdbc4f3dd028 160000 --- a/extensions/pearai-submodule +++ b/extensions/pearai-submodule @@ -1 +1 @@ -Subproject commit 130eca8b1b2f7b293e410d056a347cb764d52022 +Subproject commit 4cdbc4f3dd0280bb4e401ae5ffe9a04d25f22a59 diff --git a/scripts/code.sh b/scripts/code.sh index 0d9ac34df52df..c25922e70af11 100755 --- a/scripts/code.sh +++ b/scripts/code.sh @@ -3,9 +3,9 @@ set -e # Comment out if pearai submodule does not need to be recompiled. Speeds things up. -cd extensions/pearai-submodule -./scripts/install-and-build.sh -cd ../.. +# cd extensions/pearai-submodule +# ./scripts/install-and-build.sh +# cd ../.. if [[ "$OSTYPE" == "darwin"* ]]; then realpath() { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"; } diff --git a/src/vs/workbench/api/browser/viewsExtensionPoint.ts b/src/vs/workbench/api/browser/viewsExtensionPoint.ts index 5f67ed810342e..587a35502392d 100644 --- a/src/vs/workbench/api/browser/viewsExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsExtensionPoint.ts @@ -72,7 +72,7 @@ export const viewsContainersContribution: IJSONSchema = { items: viewsContainerSchema }, "auxiliarybar": { - description: localize('views.container.auxiliarybar', "Contribute views containers to Secondary Side Bar"), + description: localize('views.container.auxiliarybar', "Contribute views containers to PearAI Side Bar"), type: 'array', items: viewsContainerSchema } diff --git a/src/vs/workbench/browser/actions/layoutActions.ts b/src/vs/workbench/browser/actions/layoutActions.ts index 8d05f860289d2..27a0f82271d3d 100644 --- a/src/vs/workbench/browser/actions/layoutActions.ts +++ b/src/vs/workbench/browser/actions/layoutActions.ts @@ -241,7 +241,7 @@ MenuRegistry.appendMenuItems([{ group: '3_workbench_layout_move', command: { id: ToggleSidebarPositionAction.ID, - title: localize('move second sidebar left', "Move Secondary Side Bar Left") + title: localize('move second sidebar left', "Move PearAI Side Bar Left") }, when: ContextKeyExpr.and(ContextKeyExpr.notEquals('config.workbench.sideBar.location', 'right'), ContextKeyExpr.equals('viewLocation', ViewContainerLocationToString(ViewContainerLocation.AuxiliaryBar))), order: 1 @@ -252,7 +252,7 @@ MenuRegistry.appendMenuItems([{ group: '3_workbench_layout_move', command: { id: ToggleSidebarPositionAction.ID, - title: localize('move second sidebar right', "Move Secondary Side Bar Right") + title: localize('move second sidebar right', "Move PearAI Side Bar Right") }, when: ContextKeyExpr.and(ContextKeyExpr.equals('config.workbench.sideBar.location', 'right'), ContextKeyExpr.equals('viewLocation', ViewContainerLocationToString(ViewContainerLocation.AuxiliaryBar))), order: 1 @@ -953,7 +953,7 @@ registerAction2(class extends Action2 { if (!hasAddedView) { results.push({ type: 'separator', - label: localize('secondarySideBarContainer', "Secondary Side Bar / {0}", containerModel.title) + label: localize('secondarySideBarContainer', "PearAI Side Bar / {0}", containerModel.title) }); hasAddedView = true; } @@ -1060,7 +1060,7 @@ class MoveFocusedViewAction extends Action2 { if (!(isViewSolo && currentLocation === ViewContainerLocation.AuxiliaryBar)) { items.push({ id: '_.auxiliarybar.newcontainer', - label: localize('moveFocusedView.newContainerInSidePanel', "New Secondary Side Bar Entry") + label: localize('moveFocusedView.newContainerInSidePanel', "New PearAI Side Bar Entry") }); } @@ -1108,7 +1108,7 @@ class MoveFocusedViewAction extends Action2 { items.push({ type: 'separator', - label: localize('secondarySideBar', "Secondary Side Bar") + label: localize('secondarySideBar', "PearAI Side Bar") }); const pinnedAuxPanels = paneCompositePartService.getPinnedPaneCompositeIds(ViewContainerLocation.AuxiliaryBar); @@ -1390,7 +1390,7 @@ if (!isMacintosh || !isNative) { ToggleVisibilityActions.push(...[ CreateToggleLayoutItem(ToggleActivityBarVisibilityActionId, ContextKeyExpr.notEquals('config.workbench.activityBar.location', 'hidden'), 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 }), + CreateToggleLayoutItem(ToggleAuxiliaryBarAction.ID, AuxiliaryBarVisibleContext, localize('secondarySideBar', "PearAI Side Bar"), { whenA: ContextKeyExpr.equals('config.workbench.sideBar.location', 'left'), iconA: panelRightIcon, iconB: panelLeftIcon }), CreateToggleLayoutItem(TogglePanelAction.ID, PanelVisibleContext, localize('panel', "Panel"), panelIcon), CreateToggleLayoutItem(ToggleStatusbarVisibilityAction.ID, ContextKeyExpr.equals('config.workbench.statusBar.visible', true), localize('statusBar', "Status Bar"), statusBarIcon), CreateToggleLayoutItem(TogglePearOverlayAction.ID, PearAIVisibleContext, 'PearAI', pearaiIcon) diff --git a/src/vs/workbench/browser/layout.ts b/src/vs/workbench/browser/layout.ts index 59a0abf764d6e..5b38084e30cfa 100644 --- a/src/vs/workbench/browser/layout.ts +++ b/src/vs/workbench/browser/layout.ts @@ -2453,7 +2453,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi comment: 'Information about the layout of the workbench during statup'; activityBarVisible: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether or the not the activity bar is visible' }; sideBarVisible: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether or the not the primary side bar is visible' }; - auxiliaryBarVisible: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether or the not the secondary side bar is visible' }; + auxiliaryBarVisible: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether or the not the PearAI Side Bar is visible' }; panelVisible: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether or the not the panel is visible' }; statusbarVisible: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether or the not the status bar is visible' }; sideBarPosition: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether the primary side bar is on the left or right' }; diff --git a/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarActions.ts b/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarActions.ts index 126fa8e51b5c9..4b58a70ea8613 100644 --- a/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarActions.ts +++ b/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarActions.ts @@ -31,7 +31,7 @@ const auxiliaryBarLeftOffIcon = registerIcon('auxiliarybar-left-off-layout-icon' export class ToggleAuxiliaryBarAction extends Action2 { static readonly ID = 'workbench.action.toggleAuxiliaryBar'; - static readonly LABEL = localize2('toggleAuxiliaryBar', "Toggle Secondary Side Bar Visibility"); + static readonly LABEL = localize2('toggleAuxiliaryBar', "Toggle PearAI Side Bar Visibility"); constructor() { super({ @@ -39,7 +39,7 @@ export class ToggleAuxiliaryBarAction extends Action2 { title: ToggleAuxiliaryBarAction.LABEL, toggled: { condition: AuxiliaryBarVisibleContext, - title: localize('secondary sidebar', "Secondary Side Bar"), + title: localize('secondary sidebar', "PearAI Side Bar"), mnemonicTitle: localize({ key: 'secondary sidebar mnemonic', comment: ['&& denotes a mnemonic'] }, "Secondary Si&&de Bar"), }, @@ -84,7 +84,7 @@ registerAction2(ToggleAuxiliaryBarAction); registerAction2(class FocusAuxiliaryBarAction extends Action2 { static readonly ID = 'workbench.action.focusAuxiliaryBar'; - static readonly LABEL = localize2('focusAuxiliaryBar', "Focus into Secondary Side Bar"); + static readonly LABEL = localize2('focusAuxiliaryBar', "Focus into PearAI Side Bar"); constructor() { super({ @@ -117,7 +117,7 @@ MenuRegistry.appendMenuItems([ group: '2_pane_toggles', command: { id: ToggleAuxiliaryBarAction.ID, - title: localize('toggleSecondarySideBar', "Toggle Secondary Side Bar"), + title: localize('toggleSecondarySideBar', "Toggle PearAI Side Bar"), toggled: { condition: AuxiliaryBarVisibleContext, icon: auxiliaryBarLeftIcon }, icon: auxiliaryBarLeftOffIcon, }, @@ -130,7 +130,7 @@ MenuRegistry.appendMenuItems([ group: '2_pane_toggles', command: { id: ToggleAuxiliaryBarAction.ID, - title: localize('toggleSecondarySideBar', "Toggle Secondary Side Bar"), + title: localize('toggleSecondarySideBar', "Toggle PearAI Side Bar"), toggled: { condition: AuxiliaryBarVisibleContext, icon: auxiliaryBarRightIcon }, icon: auxiliaryBarRightOffIcon, }, @@ -143,7 +143,7 @@ MenuRegistry.appendMenuItems([ group: '3_workbench_layout_move', command: { id: ToggleAuxiliaryBarAction.ID, - title: localize2('hideAuxiliaryBar', 'Hide Secondary Side Bar'), + title: localize2('hideAuxiliaryBar', 'Hide PearAI Side Bar'), }, when: ContextKeyExpr.and(AuxiliaryBarVisibleContext, ContextKeyExpr.equals('viewLocation', ViewContainerLocationToString(ViewContainerLocation.AuxiliaryBar))), order: 2 @@ -155,7 +155,7 @@ registerAction2(class extends SwitchCompositeViewAction { constructor() { super({ id: 'workbench.action.previousAuxiliaryBarView', - title: localize2('previousAuxiliaryBarView', 'Previous Secondary Side Bar View'), + title: localize2('previousAuxiliaryBarView', 'Previous PearAI Side Bar View'), category: Categories.View, f1: true }, ViewContainerLocation.AuxiliaryBar, -1); @@ -166,7 +166,7 @@ registerAction2(class extends SwitchCompositeViewAction { constructor() { super({ id: 'workbench.action.nextAuxiliaryBarView', - title: localize2('nextAuxiliaryBarView', 'Next Secondary Side Bar View'), + title: localize2('nextAuxiliaryBarView', 'Next PearAI Side Bar View'), category: Categories.View, f1: true }, ViewContainerLocation.AuxiliaryBar, 1); diff --git a/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts b/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts index 68af0fca5acab..bf1bdb247df40 100644 --- a/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts +++ b/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts @@ -202,8 +202,8 @@ export class AuxiliaryBarPart extends AbstractPaneCompositePart { actions.push(...[ new Separator(), new SubmenuAction('workbench.action.panel.position', localize('activity bar position', "Activity Bar Position"), positionActions), - toAction({ id: ToggleSidebarPositionAction.ID, label: currentPositionRight ? localize('move second side bar left', "Move Secondary Side Bar Left") : localize('move second side bar right', "Move Secondary Side Bar Right"), run: () => this.commandService.executeCommand(ToggleSidebarPositionAction.ID) }), - toAction({ id: ToggleAuxiliaryBarAction.ID, label: localize('hide second side bar', "Hide Secondary Side Bar"), run: () => this.commandService.executeCommand(ToggleAuxiliaryBarAction.ID) }) + toAction({ id: ToggleSidebarPositionAction.ID, label: currentPositionRight ? localize('move second side bar left', "Move PearAI Side Bar Left") : localize('move second side bar right', "Move PearAI Side Bar Right"), run: () => this.commandService.executeCommand(ToggleSidebarPositionAction.ID) }), + toAction({ id: ToggleAuxiliaryBarAction.ID, label: localize('hide second side bar', "Hide PearAI Side Bar"), run: () => this.commandService.executeCommand(ToggleAuxiliaryBarAction.ID) }) ]); } diff --git a/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryTitleBar.ts b/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryTitleBar.ts index 714e5c87111f2..2a05b33d5b3b9 100644 --- a/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryTitleBar.ts +++ b/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryTitleBar.ts @@ -7,9 +7,8 @@ export class AuxiliaryTitleBar extends Disposable { private container: HTMLElement; private readonly iconLabels = [ { icon: Codicon.layoutPanel, title: 'Toggle Panel', command: 'workbench.action.togglePanel' }, - { icon: Codicon.layoutSidebarRight, title: 'Toggle Secondary Sidebar', command: 'workbench.action.toggleAuxiliaryBar' }, + { icon: Codicon.layoutSidebarRight, title: 'Toggle PearAI Sidebar', command: 'workbench.action.toggleAuxiliaryBar' }, { icon: Codicon.layoutCentered, title: 'Toggle Centered Layout', command: 'workbench.action.toggleCenteredLayout' }, - // { icon: Codicon.layoutActivitybarRight, title: 'Toggle Actions', command: 'workbench.action.toggleActivityBarVisibility' } ]; constructor( diff --git a/src/vs/workbench/browser/parts/paneCompositeBar.ts b/src/vs/workbench/browser/parts/paneCompositeBar.ts index db3d98034a003..1944540dd0241 100644 --- a/src/vs/workbench/browser/parts/paneCompositeBar.ts +++ b/src/vs/workbench/browser/parts/paneCompositeBar.ts @@ -205,7 +205,7 @@ export class PaneCompositeBar extends Disposable { private createMoveAction(viewContainer: ViewContainer, newLocation: ViewContainerLocation, defaultLocation: ViewContainerLocation): IAction { return toAction({ id: `moveViewContainerTo${newLocation}`, - label: newLocation === ViewContainerLocation.Panel ? localize('panel', "Panel") : newLocation === ViewContainerLocation.Sidebar ? localize('sidebar', "Primary Side Bar") : localize('auxiliarybar', "Secondary Side Bar"), + label: newLocation === ViewContainerLocation.Panel ? localize('panel', "Panel") : newLocation === ViewContainerLocation.Sidebar ? localize('sidebar', "Primary Side Bar") : localize('auxiliarybar', "PearAI Side Bar"), run: () => { let index: number | undefined; if (newLocation !== defaultLocation) { diff --git a/src/vs/workbench/browser/parts/panel/panelActions.ts b/src/vs/workbench/browser/parts/panel/panelActions.ts index 28164af5f3af7..e9e915a0f3c1f 100644 --- a/src/vs/workbench/browser/parts/panel/panelActions.ts +++ b/src/vs/workbench/browser/parts/panel/panelActions.ts @@ -314,7 +314,7 @@ registerAction2(class extends Action2 { constructor() { super({ id: 'workbench.action.closeAuxiliaryBar', - title: localize2('closeSecondarySideBar', 'Hide Secondary Side Bar'), + title: localize2('closeSecondarySideBar', 'Hide PearAI Side Bar'), category: Categories.View, icon: closeIcon, menu: [{ @@ -388,7 +388,7 @@ class MoveViewsBetweenPanelsAction extends Action2 { } -// Move Pear AI extension to secondary side bar (Auxiliary Bar) (we want secondary side bar to be default loaction for extension) +// Move Pear AI extension to PearAI Side Bar (Auxiliary Bar) (we want PearAI Side Bar to be default loaction for extension) class MovePearExtensionToAuxBarAction extends MoveViewsBetweenPanelsAction { static readonly ID = 'workbench.action.movePearExtensionToAuxBar'; readonly PearExtensionId; @@ -421,14 +421,14 @@ class MovePearExtensionToAuxBarAction extends MoveViewsBetweenPanelsAction { registerAction2(MovePearExtensionToAuxBarAction); -// --- Move Panel Views To Secondary Side Bar +// --- Move Panel Views To PearAI Side Bar class MovePanelToSidePanelAction extends MoveViewsBetweenPanelsAction { static readonly ID = 'workbench.action.movePanelToSidePanel'; constructor() { super(ViewContainerLocation.Panel, ViewContainerLocation.AuxiliaryBar, { id: MovePanelToSidePanelAction.ID, - title: localize2('movePanelToSecondarySideBar', "Move Panel Views To Secondary Side Bar"), + title: localize2('movePanelToSecondarySideBar', "Move Panel Views To PearAI Side Bar"), category: Categories.View, f1: false }); @@ -440,7 +440,7 @@ export class MovePanelToSecondarySideBarAction extends MoveViewsBetweenPanelsAct constructor() { super(ViewContainerLocation.Panel, ViewContainerLocation.AuxiliaryBar, { id: MovePanelToSecondarySideBarAction.ID, - title: localize2('movePanelToSecondarySideBar', "Move Panel Views To Secondary Side Bar"), + title: localize2('movePanelToSecondarySideBar', "Move Panel Views To PearAI Side Bar"), category: Categories.View, f1: true }); @@ -450,7 +450,7 @@ export class MovePanelToSecondarySideBarAction extends MoveViewsBetweenPanelsAct registerAction2(MovePanelToSidePanelAction); registerAction2(MovePanelToSecondarySideBarAction); -// --- Move Secondary Side Bar Views To Panel +// --- Move PearAI Side Bar Views To Panel class MoveSidePanelToPanelAction extends MoveViewsBetweenPanelsAction { static readonly ID = 'workbench.action.moveSidePanelToPanel'; @@ -458,7 +458,7 @@ class MoveSidePanelToPanelAction extends MoveViewsBetweenPanelsAction { constructor() { super(ViewContainerLocation.AuxiliaryBar, ViewContainerLocation.Panel, { id: MoveSidePanelToPanelAction.ID, - title: localize2('moveSidePanelToPanel', "Move Secondary Side Bar Views To Panel"), + title: localize2('moveSidePanelToPanel', "Move PearAI Side Bar Views To Panel"), category: Categories.View, f1: false }); @@ -471,7 +471,7 @@ export class MoveSecondarySideBarToPanelAction extends MoveViewsBetweenPanelsAct constructor() { super(ViewContainerLocation.AuxiliaryBar, ViewContainerLocation.Panel, { id: MoveSecondarySideBarToPanelAction.ID, - title: localize2('moveSidePanelToPanel', "Move Secondary Side Bar Views To Panel"), + title: localize2('moveSidePanelToPanel', "Move PearAI Side Bar Views To Panel"), category: Categories.View, f1: true }); diff --git a/src/vs/workbench/browser/workbench.contribution.ts b/src/vs/workbench/browser/workbench.contribution.ts index 7b8a2f90b5fe2..fd5ceb01abfda 100644 --- a/src/vs/workbench/browser/workbench.contribution.ts +++ b/src/vs/workbench/browser/workbench.contribution.ts @@ -509,7 +509,7 @@ const registry = Registry.as(ConfigurationExtensions.Con 'type': 'string', 'enum': ['left', 'right'], 'default': 'left', - 'description': localize('sideBarLocation', "Controls the location of the primary side bar and activity bar. They can either show on the left or right of the workbench. The secondary side bar will show on the opposite side of the workbench.") + 'description': localize('sideBarLocation', "Controls the location of the primary side bar and activity bar. They can either show on the left or right of the workbench. The PearAI Side Bar will show on the opposite side of the workbench.") }, 'workbench.panel.showLabels': { 'type': 'boolean', @@ -542,12 +542,12 @@ const registry = Registry.as(ConfigurationExtensions.Con 'type': 'string', 'enum': ['default', 'top', 'bottom', 'hidden'], 'default': 'default', - 'markdownDescription': localize({ comment: ['This is the description for a setting'], key: 'activityBarLocation' }, "Controls the location of the Activity Bar relative to the Primary and Secondary Side Bars."), + 'markdownDescription': localize({ comment: ['This is the description for a setting'], key: 'activityBarLocation' }, "Controls the location of the Activity Bar relative to the Primary and PearAI Side Bars."), 'enumDescriptions': [ - localize('workbench.activityBar.location.default', "Show the Activity Bar on the side of the Primary Side Bar and on top of the Secondary Side Bar."), - localize('workbench.activityBar.location.top', "Show the Activity Bar on top of the Primary and Secondary Side Bars."), - localize('workbench.activityBar.location.bottom', "Show the Activity Bar at the bottom of the Primary and Secondary Side Bars."), - localize('workbench.activityBar.location.hide', "Hide the Activity Bar in the Primary and Secondary Side Bars.") + localize('workbench.activityBar.location.default', "Show the Activity Bar on the side of the Primary Side Bar and on top of the PearAI Side Bar."), + localize('workbench.activityBar.location.top', "Show the Activity Bar on top of the Primary and PearAI Side Bars."), + localize('workbench.activityBar.location.bottom', "Show the Activity Bar at the bottom of the Primary and PearAI Side Bars."), + localize('workbench.activityBar.location.hide', "Hide the Activity Bar in the Primary and PearAI Side Bars.") ], }, 'workbench.activityBar.iconClickBehavior': { diff --git a/src/vs/workbench/contrib/quickaccess/browser/viewQuickAccess.ts b/src/vs/workbench/contrib/quickaccess/browser/viewQuickAccess.ts index 164b2e9821cb3..025e0c0bebaaa 100644 --- a/src/vs/workbench/contrib/quickaccess/browser/viewQuickAccess.ts +++ b/src/vs/workbench/contrib/quickaccess/browser/viewQuickAccess.ts @@ -151,7 +151,7 @@ export class ViewQuickAccessProvider extends PickerQuickAccessProvider { const paneComposites = this.paneCompositeService.getPaneComposites(location); From d94d8dedc79c8c6ee926371aa9bda4759fff0354 Mon Sep 17 00:00:00 2001 From: nang-dev Date: Wed, 5 Feb 2025 15:44:35 -0500 Subject: [PATCH 3/4] Fixed one rename --- src/vs/workbench/contrib/quickaccess/browser/viewQuickAccess.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/quickaccess/browser/viewQuickAccess.ts b/src/vs/workbench/contrib/quickaccess/browser/viewQuickAccess.ts index 025e0c0bebaaa..134d6f819c970 100644 --- a/src/vs/workbench/contrib/quickaccess/browser/viewQuickAccess.ts +++ b/src/vs/workbench/contrib/quickaccess/browser/viewQuickAccess.ts @@ -151,7 +151,7 @@ export class ViewQuickAccessProvider extends PickerQuickAccessProvider { const paneComposites = this.paneCompositeService.getPaneComposites(location); From 0c72d8ec361cbaa0ee610b08c5b936efacb135b8 Mon Sep 17 00:00:00 2001 From: Nang Date: Wed, 5 Feb 2025 18:07:59 -0500 Subject: [PATCH 4/4] Make Aux bar exclusive to PearAI extensions (#181) * Working no move * Working register redirect --- src/vs/workbench/common/views.ts | 17 ++++++- .../services/views/pearai/pearaiViews.ts | 49 +++++++++++++++++++ .../views/pearai/pearaiViewsShared.ts | 1 + src/vs/workbench/workbench.common.main.ts | 4 +- 4 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 src/vs/workbench/services/views/pearai/pearaiViews.ts create mode 100644 src/vs/workbench/services/views/pearai/pearaiViewsShared.ts diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index 37e1b8f620c75..5a600e04dd427 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -26,6 +26,7 @@ import { registerIcon } from '../../platform/theme/common/iconRegistry.js'; import { CancellationToken } from '../../base/common/cancellation.js'; import { VSDataTransfer } from '../../base/common/dataTransfer.js'; import { ILocalizedString } from '../../platform/action/common/action.js'; +import { auxiliaryBarAllowedViewContainerIDs } from '../services/views/pearai/pearaiViewsShared.js'; export const VIEWS_LOG_ID = 'views'; export const VIEWS_LOG_NAME = localize('views log', "Views"); @@ -255,7 +256,21 @@ class ViewContainersRegistryImpl extends Disposable implements IViewContainersRe } } -Registry.add(Extensions.ViewContainersRegistry, new ViewContainersRegistryImpl()); + +class PearAIViewContainersRegistryImpl extends ViewContainersRegistryImpl implements IViewContainersRegistry { + override registerViewContainer(viewContainerDescriptor: IViewContainerDescriptor, viewContainerLocation: ViewContainerLocation, options?: { isDefault?: boolean; doNotRegisterOpenCommand?: boolean }): ViewContainer { + // Register to sidebar instead of aux bar if non pearai integration + if ( + viewContainerLocation === ViewContainerLocation.AuxiliaryBar && + !auxiliaryBarAllowedViewContainerIDs.includes(viewContainerDescriptor.id) + ) { + viewContainerLocation = ViewContainerLocation.Sidebar; + } + return super.registerViewContainer(viewContainerDescriptor, viewContainerLocation, options); + } + } + +Registry.add(Extensions.ViewContainersRegistry, new PearAIViewContainersRegistryImpl()); export interface IViewDescriptor { diff --git a/src/vs/workbench/services/views/pearai/pearaiViews.ts b/src/vs/workbench/services/views/pearai/pearaiViews.ts new file mode 100644 index 0000000000000..cd46477028ad7 --- /dev/null +++ b/src/vs/workbench/services/views/pearai/pearaiViews.ts @@ -0,0 +1,49 @@ +import { ViewContainer, ViewContainerLocation } from '../../../common/views.js'; + +import { IExtensionService } from '../../extensions/common/extensions.js'; +import { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js'; +import { IViewDescriptorService } from '../../../common/views.js'; +import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js'; +import { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js'; +import { IStorageService } from '../../../../platform/storage/common/storage.js'; +import { ILoggerService } from '../../../../platform/log/common/log.js'; +import { ViewDescriptorService } from '../browser/viewDescriptorService.js'; +import { auxiliaryBarAllowedViewContainerIDs } from './pearaiViewsShared.js'; + +export class PearAIViewDescriptorService extends ViewDescriptorService implements IViewDescriptorService { + constructor( + @IInstantiationService instantiationService: IInstantiationService, + @IContextKeyService contextKeyService: IContextKeyService, + @IStorageService storageService: IStorageService, + @IExtensionService extensionService: IExtensionService, + @ITelemetryService telemetryService: ITelemetryService, + @ILoggerService loggerService: ILoggerService, + ) { + super(instantiationService, contextKeyService, storageService, extensionService, telemetryService, loggerService); + } + + + override moveViewContainerToLocation( + viewContainer: ViewContainer, + location: ViewContainerLocation, + ): void { + + // Prevent other views to move into aux bar + if ( + location === ViewContainerLocation.AuxiliaryBar && + !auxiliaryBarAllowedViewContainerIDs.includes(viewContainer.id) + ) { + return; + } + + // Prevent PearAI integrations to move out of aux bar + if ( + location !== ViewContainerLocation.AuxiliaryBar && + auxiliaryBarAllowedViewContainerIDs.includes(viewContainer.id) + ) { + return; + } + super.moveViewContainerToLocation(viewContainer, location); + } +} + diff --git a/src/vs/workbench/services/views/pearai/pearaiViewsShared.ts b/src/vs/workbench/services/views/pearai/pearaiViewsShared.ts new file mode 100644 index 0000000000000..82cf111eeb779 --- /dev/null +++ b/src/vs/workbench/services/views/pearai/pearaiViewsShared.ts @@ -0,0 +1 @@ +export const auxiliaryBarAllowedViewContainerIDs = ['workbench.view.extension.PearAI']; diff --git a/src/vs/workbench/workbench.common.main.ts b/src/vs/workbench/workbench.common.main.ts index 054f3e75a6d4f..2ae6c617699c2 100644 --- a/src/vs/workbench/workbench.common.main.ts +++ b/src/vs/workbench/workbench.common.main.ts @@ -162,6 +162,7 @@ registerSingleton(IContextKeyService, ContextKeyService, InstantiationType.Delay registerSingleton(ITextResourceConfigurationService, TextResourceConfigurationService, InstantiationType.Delayed); registerSingleton(IDownloadService, DownloadService, InstantiationType.Delayed); registerSingleton(IOpenerService, OpenerService, InstantiationType.Delayed); +registerSingleton(IViewDescriptorService, PearAIViewDescriptorService, InstantiationType.Delayed); //#endregion @@ -402,6 +403,7 @@ import './contrib/inlineCompletions/browser/inlineCompletions.contribution.js'; // Drop or paste into import './contrib/dropOrPasteInto/browser/dropOrPasteInto.contribution.js'; import { AllowedExtensionsService } from '../platform/extensionManagement/common/allowedExtensionsService.js'; - +import { IViewDescriptorService } from './common/views.js'; +import { PearAIViewDescriptorService } from './services/views/pearai/pearaiViews.js'; //#endregion