Skip to content

Commit 32c3b24

Browse files
committed
more treeview
1 parent 791d60e commit 32c3b24

File tree

7 files changed

+124
-40
lines changed

7 files changed

+124
-40
lines changed

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@
2828
{
2929
"command": "source-academy.eval-editor",
3030
"title": "Source Academy: Run Code in Editor"
31+
},
32+
{
33+
"command": "source-academy.navigate",
34+
"title": "Source Academy: Navigate to a different route in Source Academy"
3135
}
3236
],
3337
"configuration": {

src/commands/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import * as vscode from "vscode";
22
import { runLanguagePicker } from "./language";
33
import { evalEditor } from "./evalEditor";
44
import { showPanel } from "./showPanel";
5+
import { navigate } from "./navigate";
56

67
const EXTENSION_ID = "source-academy";
78

@@ -13,6 +14,7 @@ const commands = (context: vscode.ExtensionContext) => ({
1314
pick: () => runLanguagePicker(context),
1415
"show-panel": () => showPanel(context),
1516
"eval-editor": () => evalEditor(context),
17+
navigate: () => navigate(context),
1618
});
1719

1820
/**

src/commands/navigate.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import * as vscode from "vscode";
2+
import { updateStatusBar } from "../statusbar/status";
3+
import { LANGUAGES } from "../utils/languages";
4+
import { sendToFrontendWrapped } from "./showPanel";
5+
import Messages from "../utils/messages";
6+
7+
export async function navigate(context: vscode.ExtensionContext) {
8+
const route = "/playground";
9+
sendToFrontendWrapped(Messages.Navigate(route));
10+
}

src/commands/showPanel.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { Editor } from "../utils/editor";
1414
import { FRONTEND_ELEMENT_ID } from "../constants";
1515
import { client } from "../extension";
1616
import _ from "lodash";
17+
import { treeDataProvider } from "../view/test";
1718

1819
let panel: vscode.WebviewPanel | null = null;
1920
// This needs to be a reference to active
@@ -92,6 +93,12 @@ async function handleMessage(
9293
// }
9394
// activeEditor.replace(message.code, "Text");
9495
// break;
96+
case MessageTypeNames.NotifyAssessmentsOverview:
97+
console.log("Received NotifyAssessmentsOverview message");
98+
const assessmentOverviews = message.assessmentOverviews;
99+
context.globalState.update("assessmentOverviews", assessmentOverviews);
100+
treeDataProvider.refresh();
101+
break;
95102
}
96103
console.log(`${Date.now()} Finish handleMessage: ${message.type}`);
97104
}

src/extension.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export let client: LanguageClient;
1313
// This method is called when your extension is activated
1414
// Your extension is activated the very first time the command is executed
1515
export function activate(context: vscode.ExtensionContext) {
16-
setupTreeView();
16+
setupTreeView(context);
1717
registerAllCommands(context);
1818

1919
context.subscriptions.push(setupStatusBar(context));

src/utils/messages.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,14 @@ export const isVscWorkspaceLocation = (s: any) =>
88
VscWorkspaceLocationArray.includes(s);
99
export type VscWorkspaceLocation = "assessment" | "playground";
1010

11+
export type VscAssessmentOverview = {
12+
type: string;
13+
closeAt: string;
14+
id: number;
15+
isPublished?: boolean;
16+
title: string;
17+
};
18+
1119
// ================================================================================
1220
// Message type definitions
1321
// ================================================================================
@@ -40,6 +48,14 @@ const Messages = createMessages({
4048
EvalEditor: (workspaceLocation: VscWorkspaceLocation) => ({
4149
workspaceLocation: workspaceLocation,
4250
}),
51+
NotifyAssessmentsOverview: (
52+
assessmentOverviews: VscAssessmentOverview[],
53+
) => ({
54+
assessmentOverviews,
55+
}),
56+
Navigate: (route: string) => ({
57+
route,
58+
}),
4359
});
4460

4561
export default Messages;

src/view/test.ts

Lines changed: 84 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
import * as vscode from "vscode";
22
import * as fs from "fs";
33
import * as path from "path";
4+
import { VscAssessmentOverview } from "../utils/messages";
45

5-
export function setupTreeView() {
6+
export let treeDataProvider: NodeDependenciesProvider;
7+
8+
export function setupTreeView(context: vscode.ExtensionContext) {
69
const rootPath =
710
vscode.workspace.workspaceFolders &&
811
vscode.workspace.workspaceFolders.length > 0
912
? vscode.workspace.workspaceFolders[0].uri.fsPath
1013
: undefined;
1114
console.log("Creating tree view");
15+
treeDataProvider = new NodeDependenciesProvider(
16+
context,
17+
"/home/heyzec/Documents/NUS/FYP/sa-vscode",
18+
);
1219
vscode.window.createTreeView("nodeDependencies", {
13-
treeDataProvider: new NodeDependenciesProvider(
14-
"/home/heyzec/Documents/NUS/FYP/sa-vscode",
15-
),
20+
treeDataProvider: treeDataProvider,
1621
});
1722
}
1823

@@ -39,48 +44,67 @@ const hardcode = [
3944
["The Essence of the Source", "Apr 20, 2025, 7:00 PM"],
4045
];
4146
export class NodeDependenciesProvider
42-
implements vscode.TreeDataProvider<Dependency | DependencyFolder>
47+
implements vscode.TreeDataProvider<BaseTreeItem>
4348
{
44-
constructor(private workspaceRoot: string) {}
49+
constructor(
50+
private context: vscode.ExtensionContext,
51+
private workspaceRoot: string,
52+
) {}
53+
54+
private _onDidChangeTreeData: vscode.EventEmitter<
55+
BaseTreeItem | undefined | null | void
56+
> = new vscode.EventEmitter<BaseTreeItem | undefined | null | void>();
57+
readonly onDidChangeTreeData: vscode.Event<
58+
BaseTreeItem | undefined | null | void
59+
> = this._onDidChangeTreeData.event;
4560

4661
// impl
47-
getTreeItem(element: Dependency): vscode.TreeItem {
62+
getTreeItem(element: BaseTreeItem): vscode.TreeItem {
4863
return element;
4964
}
5065

5166
// impl
52-
getChildren(
53-
element?: Dependency,
54-
): Thenable<(Dependency | DependencyFolder)[]> {
67+
getChildren(element?: BaseTreeItem): Thenable<BaseTreeItem[]> {
5568
if (!element) {
5669
return Promise.resolve([
57-
new DependencyFolder(
58-
"Missions",
59-
"",
60-
vscode.TreeItemCollapsibleState.Expanded,
61-
),
62-
new DependencyFolder(
63-
"Quests",
64-
"",
65-
vscode.TreeItemCollapsibleState.Collapsed,
66-
),
67-
new DependencyFolder(
68-
"Path",
69-
"",
70-
vscode.TreeItemCollapsibleState.Collapsed,
71-
),
70+
new AssessmentFolder("Missions"),
71+
new AssessmentFolder("Quests"),
72+
new AssessmentFolder("Path"),
7273
]);
7374
}
74-
return Promise.resolve(
75-
hardcode.map(
76-
(entry) =>
77-
new Dependency(
78-
entry[0],
79-
entry[1],
80-
vscode.TreeItemCollapsibleState.None,
81-
),
82-
),
83-
);
75+
76+
if (element && element.type === "AssessmentFolder") {
77+
// element: typeof AssessmentFolder = element as AssessmentFolder;
78+
const elem = element as AssessmentFolder;
79+
80+
// @ts-ignore
81+
const assessmentOverviews: VscAssessmentOverview[] =
82+
this.context.globalState.get("assessmentOverviews");
83+
84+
console.log("=============OA");
85+
console.log(assessmentOverviews);
86+
return Promise.resolve(
87+
assessmentOverviews
88+
.filter((oa) => oa.type == elem.assessmentType)
89+
.map((oa) => {
90+
const label = oa.title;
91+
const version = oa.closeAt;
92+
const collapsibleState = vscode.TreeItemCollapsibleState.Collapsed;
93+
return new AssessmentOverview(oa);
94+
}),
95+
);
96+
}
97+
return Promise.resolve([]);
98+
// return Promise.resolve(
99+
// hardcode.map(
100+
// (entry) =>
101+
// new Dependency(
102+
// entry[0],
103+
// entry[1],
104+
// vscode.TreeItemCollapsibleState.None,
105+
// ),
106+
// ),
107+
// );
84108

85109
// console.log("Attempt to child")
86110
// if (!this.workspaceRoot) {
@@ -110,6 +134,10 @@ export class NodeDependenciesProvider
110134
// }
111135
}
112136

137+
refresh() {
138+
this._onDidChangeTreeData.fire();
139+
}
140+
113141
/**
114142
* Given the path to package.json, read all its dependencies and devDependencies.
115143
*/
@@ -163,15 +191,14 @@ export class NodeDependenciesProvider
163191
}
164192
}
165193

166-
class DependencyFolder extends vscode.TreeItem {
194+
class BaseTreeItem extends vscode.TreeItem {
195+
type?: string;
196+
167197
constructor(
168198
public readonly label: string,
169-
private version: string,
170199
public readonly collapsibleState: vscode.TreeItemCollapsibleState,
171200
) {
172201
super(label, collapsibleState);
173-
this.tooltip = `${this.label}-${this.version}`;
174-
this.description = this.version;
175202
}
176203

177204
iconPath = {
@@ -180,6 +207,24 @@ class DependencyFolder extends vscode.TreeItem {
180207
};
181208
}
182209

210+
class AssessmentFolder extends BaseTreeItem {
211+
constructor(public readonly assessmentType: string) {
212+
super(assessmentType, vscode.TreeItemCollapsibleState.Collapsed);
213+
this.type = "AssessmentFolder";
214+
// this.tooltip = `${this.label}-${this.version}`;
215+
// this.description = this.version;
216+
}
217+
}
218+
219+
class AssessmentOverview extends BaseTreeItem {
220+
constructor(assessmentOverview: VscAssessmentOverview) {
221+
super(assessmentOverview.title, vscode.TreeItemCollapsibleState.None);
222+
this.type = "AssessmentOverview";
223+
this.description = assessmentOverview.closeAt;
224+
// this.tooltip = `${this.label}-${this.version}`;
225+
}
226+
}
227+
183228
class Dependency extends vscode.TreeItem {
184229
constructor(
185230
public readonly label: string,

0 commit comments

Comments
 (0)