Skip to content

Commit 3870077

Browse files
committed
Load examples from Processing API
1 parent 9e46430 commit 3870077

File tree

3 files changed

+68
-31
lines changed

3 files changed

+68
-31
lines changed

client/src/setupSidebar.ts

Lines changed: 65 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,97 @@
1+
import { exec } from 'child_process';
12
import { join } from 'path';
23
import { ProviderResult, TreeDataProvider, TreeItem, TreeItemCollapsibleState, window } from 'vscode';
4+
import { state } from './extension';
5+
6+
7+
export interface Sketch {
8+
type?: "sketch";
9+
name: string;
10+
path: string;
11+
mode?: string;
12+
}
13+
14+
export interface Folder {
15+
type?: "folder";
16+
name: string;
17+
path: string;
18+
mode?: string;
19+
children?: Folder[];
20+
sketches?: Sketch[];
21+
}
322

423

524

625
export async function setupSidebar() {
7-
const treeDataProvider = new ProcessingWindowDataProvider();
8-
window.createTreeView('processingSidebarView', { treeDataProvider });
26+
const examples = await new Promise<Folder[]>((resolve) => {
27+
exec(`${state.selectedVersion.path} contributions examples list`, (error, stdout, stderr) => {
28+
if (error) {
29+
console.error(`exec error: ${error}`);
30+
return;
31+
}
32+
console.log(`stdout: ${stdout}`);
33+
resolve(JSON.parse(stdout));
34+
});
35+
});
936

10-
{
11-
const treeDataProvider = new ProcessingWindowDataProvider();
12-
window.createTreeView('processingSidebarView2', { treeDataProvider });
13-
}
37+
const examplesProvider = new ProcessingWindowDataProvider(examples);
38+
window.createTreeView('processingSidebarExamplesView', { treeDataProvider: examplesProvider });
1439

1540
}
1641

17-
class ProcessingTreeItem extends TreeItem {
42+
class FolderTreeItem extends TreeItem {
1843
constructor(
19-
public readonly label: string,
20-
private version: string,
21-
public readonly collapsibleState: TreeItemCollapsibleState,
22-
public readonly path = "",
44+
public readonly folder: Folder
2345
) {
24-
super(label, collapsibleState);
25-
this.tooltip = `${this.label}-${this.version}`;
46+
const label = folder.name;
47+
super(label, TreeItemCollapsibleState.Collapsed);
48+
this.tooltip = `${this.label}`;
2649
this.iconPath = join(__dirname, "..", "..", "media/processing.svg");
2750
}
51+
}
2852

29-
53+
class SketchTreeItem extends TreeItem {
54+
constructor(
55+
public readonly sketch: Sketch
56+
) {
57+
const label = sketch.name;
58+
super(label, TreeItemCollapsibleState.None);
59+
this.tooltip = `${this.label}`;
60+
this.iconPath = join(__dirname, "..", "..", "media/processing.svg");
61+
}
3062
}
3163

3264
// TODO: Top level items: [examples, sketchbook]
3365
// TODO: Add examples from libraries
3466
// TODO: Connect to Processing and request where the sketchbook is located
3567

36-
class ProcessingWindowDataProvider implements TreeDataProvider<ProcessingTreeItem> {
68+
class ProcessingWindowDataProvider implements TreeDataProvider<FolderTreeItem> {
3769
constructor(
38-
public readonly path = "",
70+
public readonly folders: Folder[],
3971
) {
40-
4172
}
4273

43-
getTreeItem(element: ProcessingTreeItem): TreeItem | Thenable<TreeItem> {
74+
getTreeItem(element: FolderTreeItem): TreeItem | Thenable<TreeItem> {
4475
return element;
4576
}
46-
getChildren(element?: ProcessingTreeItem): ProviderResult<ProcessingTreeItem[]> {
77+
getChildren(element?: FolderTreeItem): ProviderResult<(FolderTreeItem | SketchTreeItem)[]> {
4778
if (element === undefined) {
48-
// return the examples and sketchbook items
49-
return [
50-
new ProcessingTreeItem('Sketchbook', '3.5.4', TreeItemCollapsibleState.Collapsed),
51-
new ProcessingTreeItem('Examples', '3.5.4', TreeItemCollapsibleState.Expanded),
52-
];
79+
return this.folders.map((folder) => {
80+
return new FolderTreeItem(folder);
81+
});
5382
} else {
54-
// Return the
55-
return [
56-
new ProcessingTreeItem('Example 1', '3.5.4', TreeItemCollapsibleState.None),
57-
];
83+
const sketches = element.folder.sketches?.map((sketch) => {
84+
return new SketchTreeItem(sketch);
85+
}) ?? [];
86+
const folders = element.folder.children?.map((folder) => {
87+
return new FolderTreeItem(folder);
88+
}) ?? [];
89+
90+
// Sort sketches and folders
91+
sketches.sort((a, b) => a.sketch.name.localeCompare(b.sketch.name));
92+
folders.sort((a, b) => a.folder.name.localeCompare(b.folder.name));
93+
94+
return [...sketches, ...folders];
5895
}
5996
}
6097
}

client/tsconfig.tsbuildinfo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"root":["./src/compareversions.ts","./src/extension.ts","./src/setupcommands.ts","./src/setupdecorators.ts","./src/setuplanguageserver.ts","./src/setupselectedversion.ts","./src/setupsidebar.ts"],"version":"5.8.3"}
1+
{"root":["./src/compareversions.ts","./src/extension.ts","./src/setupcommands.ts","./src/setupdecorators.ts","./src/setuplanguageserver.ts","./src/setupselectedversion.ts","./src/setupsidebar.ts"],"errors":true,"version":"5.8.3"}

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,12 @@
9494
"views": {
9595
"processingSidebar": [
9696
{
97-
"id": "processingSidebarView",
97+
"id": "processingSidebarSketchbookView",
9898
"name": "Sketchbook",
9999
"icon": "media/processing-outline.svg"
100100
},
101101
{
102-
"id": "processingSidebarView2",
102+
"id": "processingSidebarExamplesView",
103103
"name": "Examples",
104104
"icon": "media/processing-outline.svg"
105105
}

0 commit comments

Comments
 (0)