1+ import { exec } from 'child_process' ;
12import { join } from 'path' ;
23import { 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
625export 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}
0 commit comments