Skip to content

Feat: PearAI Creator View Facilitation #227

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
May 14, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions src/vs/workbench/browser/actions/layoutActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import { IPaneCompositePartService } from '../../services/panecomposite/browser/
import { ToggleAuxiliaryBarAction } from '../parts/auxiliarybar/auxiliaryBarActions.js';
import { TogglePanelAction } from '../parts/panel/panelActions.js';
import { ICommandService } from '../../../platform/commands/common/commands.js';
import { AuxiliaryBarVisibleContext, PanelAlignmentContext, PanelVisibleContext, SideBarVisibleContext, FocusedViewContext, InEditorZenModeContext, IsMainEditorCenteredLayoutContext, MainEditorAreaVisibleContext, IsMainWindowFullscreenContext, PanelPositionContext, IsAuxiliaryWindowFocusedContext, TitleBarStyleContext, PearAIVisibleContext } from '../../common/contextkeys.js';
import { AuxiliaryBarVisibleContext, PanelAlignmentContext, PanelVisibleContext, SideBarVisibleContext, FocusedViewContext, InEditorZenModeContext, IsMainEditorCenteredLayoutContext, MainEditorAreaVisibleContext, IsMainWindowFullscreenContext, PanelPositionContext, IsAuxiliaryWindowFocusedContext, TitleBarStyleContext, PearAIVisibleContext, PearAICreatorVisibleContext } from '../../common/contextkeys.js';
import { Codicon } from '../../../base/common/codicons.js';
import { ThemeIcon } from '../../../base/common/themables.js';
import { DisposableStore } from '../../../base/common/lifecycle.js';
Expand All @@ -33,6 +33,7 @@ import { IKeybindingService } from '../../../platform/keybinding/common/keybindi
import { TitlebarStyle } from '../../../platform/window/common/window.js';
import { IPreferencesService } from '../../services/preferences/common/preferences.js';
import { TogglePearOverlayAction } from '../parts/overlay/pearOverlayActions.js';
import { ToggleCreatorOverlayAction } from '../parts/overlay/creatorView/creatorOverlayActions.js';

// Register Icons
const menubarIcon = registerIcon('menuBar', Codicon.layoutMenubar, localize('menuBarIcon', "Represents the menu bar"));
Expand Down Expand Up @@ -1393,7 +1394,8 @@ ToggleVisibilityActions.push(...[
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)
CreateToggleLayoutItem(TogglePearOverlayAction.ID, PearAIVisibleContext, 'PearAI', pearaiIcon),
CreateToggleLayoutItem(ToggleCreatorOverlayAction.ID, PearAICreatorVisibleContext, 'PearAI Creator'),
]);

const MoveSideBarActions: CustomizeLayoutItem[] = [
Expand Down
20 changes: 20 additions & 0 deletions src/vs/workbench/browser/layout.ts
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi
private editorPartView!: ISerializableView;
private statusBarPartView!: ISerializableView;
private pearOverlayPartView!: ISerializableView;
private pearCreatorOverlayPartView!: ISerializableView;

private environmentService!: IBrowserWorkbenchEnvironmentService;
private extensionService!: IExtensionService;
Expand Down Expand Up @@ -1489,6 +1490,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi
const sideBar = this.getPart(Parts.SIDEBAR_PART);
const statusBar = this.getPart(Parts.STATUSBAR_PART);
const pearOverlayPart = this.getPart(Parts.PEAROVERLAY_PART);
const pearCreatorOverlayPart = this.getPart(Parts.PEARCREATOROVERLAY_PART);

// View references for all parts
this.titleBarPartView = titleBar;
Expand All @@ -1500,6 +1502,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi
this.auxiliaryBarPartView = auxiliaryBarPart;
this.statusBarPartView = statusBar;
this.pearOverlayPartView = pearOverlayPart;
this.pearCreatorOverlayPartView = pearCreatorOverlayPart;

// Create a new container for PearOverlayPart
const pearOverlayPartContainer = document.createElement("div");
Expand All @@ -1516,6 +1519,22 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi
this.mainContainer.appendChild(pearOverlayPartContainer);
pearOverlayPart.create(pearOverlayPartContainer);

// Create a container for the PearCreatorOverlayPart

const pearCreatorOverlayPartContainer = document.createElement("div");
pearCreatorOverlayPartContainer.style.position = "absolute";
pearCreatorOverlayPartContainer.style.top = "0";
pearCreatorOverlayPartContainer.style.left = "0";
pearCreatorOverlayPartContainer.style.right = "0";
pearCreatorOverlayPartContainer.style.bottom = "0";
pearCreatorOverlayPartContainer.style.zIndex = "-10";
pearCreatorOverlayPartContainer.style.display = "absolute";
pearCreatorOverlayPartContainer.classList.add("pearcreatoroverlay-part-container");
pearCreatorOverlayPartContainer.style.backgroundColor = 'transparent';

this.mainContainer.appendChild(pearCreatorOverlayPartContainer);
pearCreatorOverlayPart.create(pearCreatorOverlayPartContainer);

const viewMap = {
[Parts.ACTIVITYBAR_PART]: this.activityBarPartView,
[Parts.BANNER_PART]: this.bannerPartView,
Expand All @@ -1526,6 +1545,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi
[Parts.STATUSBAR_PART]: this.statusBarPartView,
[Parts.AUXILIARYBAR_PART]: this.auxiliaryBarPartView,
[Parts.PEAROVERLAY_PART]: this.pearOverlayPartView,
[Parts.PEARCREATOROVERLAY_PART]: this.pearCreatorOverlayPartView,
};

const fromJSON = ({ type }: { type: Parts }) => viewMap[type];
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
/* eslint-disable header/header */

import {
registerAction2,
Action2,
} from "../../../../../platform/actions/common/actions.js";
import { ServicesAccessor } from "../../../../../platform/instantiation/common/instantiation.js";
import { ICreatorOverlayService } from "./creatorOverlayService.js"; // Added .js extension
import { KeyCode, KeyMod } from "../../../../../base/common/keyCodes.js";
// import { PearAICreatorVisibleContext } from "../../../../common/contextkeys.js";

export class HideCreatorLoadingOverlayAction extends Action2 {
static readonly ID = "workbench.action.hideCreatorLoadingOverlay";

constructor() {
super({
id: HideCreatorLoadingOverlayAction.ID,
title: {
value: "Close Creator Loading Overlay",
original: "Close Creator Loading Overlay",
},
f1: false,
});
}

run(accessor: ServicesAccessor): void {
const creatorOverlayService = accessor.get(ICreatorOverlayService);
creatorOverlayService.hideLoadingOverlay();
}
}

export class CloseCreatorOverlayAction extends Action2 {
static readonly ID = "workbench.action.closeCreatorView";

constructor() {
super({
id: CloseCreatorOverlayAction.ID,
title: {
value: "Close Creator View Popup",
original: "Close Creator View Popup",
},
f1: true,
keybinding: {
weight: 210,
primary: KeyCode.Escape,
// when: PearAICreatorVisibleContext,
},
});
}

run(accessor: ServicesAccessor): void {
const creatorOverlayService = accessor.get(ICreatorOverlayService);
creatorOverlayService.hide();
}
}

export class ToggleCreatorOverlayAction extends Action2 {
static readonly ID = "workbench.action.toggleCreatorView";

constructor() {
super({
id: ToggleCreatorOverlayAction.ID,
title: {
value: "Toggle Creator View Popup",
original: "Toggle Creator View Popup",
},
f1: true,
keybinding: {
weight: 200,
primary: KeyMod.CtrlCmd | KeyCode.KeyE,
},
});
}

run(accessor: ServicesAccessor): void {
const creatorOverlayService = accessor.get(ICreatorOverlayService);
creatorOverlayService.toggle();
}
}

export class LockCreatorOverlayAction extends Action2 {
static readonly ID = "workbench.action.lockCreatorView";

constructor() {
super({
id: LockCreatorOverlayAction.ID,
title: { value: "Lock Creator View", original: "Lock Creator View" },
f1: true,
});
}

run(accessor: ServicesAccessor): void {
const creatorOverlayService = accessor.get(ICreatorOverlayService);
creatorOverlayService.lock();
}
}

export class UnlockCreatorOverlayAction extends Action2 {
static readonly ID = "workbench.action.unlockCreatorView";

constructor() {
super({
id: UnlockCreatorOverlayAction.ID,
title: { value: "Unlock Creator View", original: "Unlock Creator View" },
f1: true,
});
}

run(accessor: ServicesAccessor): void {
const creatorOverlayService = accessor.get(ICreatorOverlayService);
creatorOverlayService.unlock();
}
}

// Register all actions
registerAction2(CloseCreatorOverlayAction);
registerAction2(ToggleCreatorOverlayAction);
registerAction2(LockCreatorOverlayAction);
registerAction2(UnlockCreatorOverlayAction);
registerAction2(HideCreatorLoadingOverlayAction);
Loading
Loading