diff --git a/package.json b/package.json index d9ca298..3ab6195 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,8 @@ }, { "command": "source-academy.show-panel", - "title": "Source Academy: Show the Source Academy panel" + "title": "Source Academy: Show the Source Academy panel", + "icon": "$(rocket)" }, { "command": "source-academy.eval-editor", @@ -74,11 +75,20 @@ "key": "shift+enter" } ], + "menus": { + "view/title": [ + { + "command": "source-academy.show-panel", + "when": "view == assessments", + "group": "navigation" + } + ] + }, "views": { "source-academy": [ { "id": "assessments", - "name": "Assessments", + "name": "", "icon": "assets/icon.svg", "contextualTitle": "Source Academy" } diff --git a/src/treeview/index.ts b/src/treeview/index.ts index 5e73266..1e86989 100644 --- a/src/treeview/index.ts +++ b/src/treeview/index.ts @@ -33,6 +33,9 @@ export class AssessmentsSidebarProvider } getChildren(element?: BaseTreeItem): Thenable { + // Synthetic root item that launches the Source Academy panel. + const launchItem = new PlaygroundItem(); + // @ts-ignore const assessmentOverviews: VscAssessmentOverview[] = this.context.globalState.get("assessmentOverviews"); @@ -44,14 +47,18 @@ export class AssessmentsSidebarProvider const assessmentTypes = [ ...new Set(assessmentOverviews.map((ao) => ao.type)), ]; - return Promise.resolve( - assessmentTypes.map((at) => new AssessmentFolder(at)), - ); + const folders = assessmentTypes.map((at) => new AssessmentFolder(at)); + + return Promise.resolve([launchItem, ...folders]); } if (element && element.type === "AssessmentFolder") { const elem = element as AssessmentFolder; + if (!assessmentOverviews) { + return Promise.resolve([]); + } + return Promise.resolve( assessmentOverviews .filter((ao) => ao.type == elem.assessmentType) @@ -84,6 +91,21 @@ class BaseTreeItem extends vscode.TreeItem { }; } +/** + * Synthetic tree item that always appears at the top-level of the view. + */ +class PlaygroundItem extends BaseTreeItem { + constructor() { + super("Playground", vscode.TreeItemCollapsibleState.None); + this.type = "LaunchItem"; + this.command = { + title: "Playground", + command: "source-academy.navigate", + arguments: ["/playground"], + }; + } +} + class AssessmentFolder extends BaseTreeItem { constructor(public readonly assessmentType: string) { super(assessmentType, vscode.TreeItemCollapsibleState.Collapsed);