@@ -2,6 +2,7 @@ import { exec } from 'child_process';
22import { join } from 'path' ;
33import { ProviderResult , TreeDataProvider , TreeItem , TreeItemCollapsibleState , window } from 'vscode' ;
44import { state } from './extension' ;
5+ import { existsSync } from 'fs' ;
56
67
78export interface Sketch {
@@ -20,9 +21,12 @@ export interface Folder {
2021 sketches ?: Sketch [ ] ;
2122}
2223
23-
24-
2524export async function setupSidebar ( ) {
25+ setupExamples ( ) ;
26+ setupSketchbook ( ) ;
27+ }
28+
29+ async function setupExamples ( ) {
2630 const examples = await new Promise < Folder [ ] > ( ( resolve ) => {
2731 exec ( `${ state . selectedVersion . path } contributions examples list` , ( error , stdout , stderr ) => {
2832 if ( error ) {
@@ -36,7 +40,9 @@ export async function setupSidebar() {
3640
3741 const examplesProvider = new ProcessingWindowDataProvider ( examples ) ;
3842 window . createTreeView ( 'processingSidebarExamplesView' , { treeDataProvider : examplesProvider } ) ;
43+ }
3944
45+ async function setupSketchbook ( ) {
4046 const sketchbook = await new Promise < Folder [ ] > ( ( resolve ) => {
4147 exec ( `${ state . selectedVersion . path } sketchbook list` , ( error , stdout , stderr ) => {
4248 if ( error ) {
@@ -49,7 +55,6 @@ export async function setupSidebar() {
4955 } ) ;
5056 const sketchbookProvider = new ProcessingWindowDataProvider ( sketchbook ) ;
5157 window . createTreeView ( 'processingSidebarSketchbookView' , { treeDataProvider : sketchbookProvider } ) ;
52-
5358}
5459
5560class FolderTreeItem extends TreeItem {
@@ -59,7 +64,6 @@ class FolderTreeItem extends TreeItem {
5964 const label = folder . name ;
6065 super ( label , TreeItemCollapsibleState . Collapsed ) ;
6166 this . tooltip = `${ this . label } ` ;
62- this . iconPath = join ( __dirname , ".." , ".." , "media/processing.svg" ) ;
6367 }
6468}
6569
@@ -70,14 +74,20 @@ class SketchTreeItem extends TreeItem {
7074 const label = sketch . name ;
7175 super ( label , TreeItemCollapsibleState . None ) ;
7276 this . tooltip = `${ this . label } ` ;
73- this . iconPath = join ( __dirname , ".." , ".." , "media/processing.svg" ) ;
77+ this . iconPath = join ( __dirname , ".." , ".." , "media/processing-flat-color.svg" ) ;
78+ this . command = {
79+ command : 'processing.sketch.open' ,
80+ title : 'Open Sketch' ,
81+ arguments : [ this . sketch . path ]
82+ } ;
83+
84+ const preview = `${ sketch . path } /${ sketch . name } .png` ;
85+ if ( existsSync ( preview ) ) {
86+ this . iconPath = preview ;
87+ }
7488 }
7589}
7690
77- // TODO: Top level items: [examples, sketchbook]
78- // TODO: Add examples from libraries
79- // TODO: Connect to Processing and request where the sketchbook is located
80-
8191class ProcessingWindowDataProvider implements TreeDataProvider < FolderTreeItem | SketchTreeItem > {
8292 constructor (
8393 public readonly folders : Folder [ ] ,
@@ -89,9 +99,7 @@ class ProcessingWindowDataProvider implements TreeDataProvider<FolderTreeItem |
8999 }
90100 getChildren ( element ?: FolderTreeItem ) : ProviderResult < ( FolderTreeItem | SketchTreeItem ) [ ] > {
91101 if ( element === undefined ) {
92- return this . folders . map ( ( folder ) => {
93- return new FolderTreeItem ( folder ) ;
94- } ) ;
102+ return this . folders . flatMap ( ( folder ) => folder . children ?. map ( child => new FolderTreeItem ( child ) ) ?? [ ] ) ;
95103 } else {
96104 const sketches = element . folder . sketches ?. map ( ( sketch ) => {
97105 return new SketchTreeItem ( sketch ) ;
@@ -107,4 +115,5 @@ class ProcessingWindowDataProvider implements TreeDataProvider<FolderTreeItem |
107115 return [ ...sketches , ...folders ] ;
108116 }
109117 }
110- }
118+ }
119+
0 commit comments