From a60b2b19cae49d2be3274df5867d2b74bba67055 Mon Sep 17 00:00:00 2001 From: Eleanor Boyd <26030610+eleanorjboyd@users.noreply.github.com> Date: Wed, 16 Apr 2025 15:11:56 -0700 Subject: [PATCH] Adding menu items (#310) --- src/common/pickers/managers.ts | 55 +++++++++++++++++++--- src/extension.ts | 5 +- src/features/creators/newPackageProject.ts | 18 +++++++ src/features/creators/newScriptProject.ts | 17 +++++++ 4 files changed, 88 insertions(+), 7 deletions(-) create mode 100644 src/features/creators/newPackageProject.ts create mode 100644 src/features/creators/newScriptProject.ts diff --git a/src/common/pickers/managers.ts b/src/common/pickers/managers.ts index 409b4025..25b955d4 100644 --- a/src/common/pickers/managers.ts +++ b/src/common/pickers/managers.ts @@ -134,14 +134,57 @@ export async function pickCreator(creators: PythonProjectCreator[]): Promise ({ - label: c.displayName ?? c.name, - description: c.description, - c: c, - })); + // First level menu + const autoFindCreator = creators.find((c) => c.name === 'autoProjects'); + const existingProjectsCreator = creators.find((c) => c.name === 'existingProjects'); + const otherCreators = creators.filter((c) => c.name !== 'autoProjects' && c.name !== 'existingProjects'); + + const items: QuickPickItem[] = [ + { + label: 'Auto Find', + description: autoFindCreator?.description ?? 'Automatically find Python projects', + }, + { + label: 'Select Existing', + description: existingProjectsCreator?.description ?? 'Select existing Python projects', + }, + { + label: 'Create New', + description: 'Create a Python project from a template', + }, + ]; + const selected = await showQuickPick(items, { placeHolder: Pickers.Managers.selectProjectCreator, ignoreFocusOut: true, }); - return (selected as { c: PythonProjectCreator })?.c; + + if (!selected) { + return undefined; + } + + // Return appropriate creator based on selection + switch (selected.label) { + case 'Auto Find': + return autoFindCreator; + case 'Select Existing': + return existingProjectsCreator; + case 'Create New': + // Show second level menu for other creators + if (otherCreators.length === 0) { + return undefined; + } + const newItems: (QuickPickItem & { c: PythonProjectCreator })[] = otherCreators.map((c) => ({ + label: c.displayName ?? c.name, + description: c.description, + c: c, + })); + const newSelected = await showQuickPick(newItems, { + placeHolder: 'Select project type for new project', + ignoreFocusOut: true, + }); + return newSelected?.c; + } + + return undefined; } diff --git a/src/extension.ts b/src/extension.ts index 78f1a8e4..1ba566d9 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,5 +1,4 @@ import { commands, ExtensionContext, LogOutputChannel, Terminal, Uri } from 'vscode'; - import { PythonEnvironment, PythonEnvironmentApi } from './api'; import { ensureCorrectVersion } from './common/extVersion'; import { registerTools } from './common/lm.apis'; @@ -20,6 +19,8 @@ import { createManagerReady } from './features/common/managerReady'; import { GetEnvironmentInfoTool, InstallPackageTool } from './features/copilotTools'; import { AutoFindProjects } from './features/creators/autoFindProjects'; import { ExistingProjects } from './features/creators/existingProjects'; +import { NewPackageProject } from './features/creators/newPackageProject'; +import { NewScriptProject } from './features/creators/newScriptProject'; import { ProjectCreatorsImpl } from './features/creators/projectCreators'; import { addPythonProjectCommand, @@ -108,6 +109,8 @@ export async function activate(context: ExtensionContext): Promise { + // show notification that the package creation was selected than return undefined + window.showInformationMessage('Creating a new Python package...'); + return undefined; + } +} diff --git a/src/features/creators/newScriptProject.ts b/src/features/creators/newScriptProject.ts new file mode 100644 index 00000000..4b94333c --- /dev/null +++ b/src/features/creators/newScriptProject.ts @@ -0,0 +1,17 @@ +import { MarkdownString, window } from 'vscode'; +import { PythonProject, PythonProjectCreator, PythonProjectCreatorOptions } from '../../api'; + +export class NewScriptProject implements PythonProjectCreator { + public readonly name = 'newScript'; + public readonly displayName = 'Project'; + public readonly description = 'Create a new Python project'; + public readonly tooltip = new MarkdownString('Create a new Python project'); + + constructor() {} + + async create(_options?: PythonProjectCreatorOptions): Promise { + // show notification that the script creation was selected than return undefined + window.showInformationMessage('Creating a new Python project...'); + return undefined; + } +}