From f6bdde20c8f02176890acc7dc0be190053b7887f Mon Sep 17 00:00:00 2001 From: Daniel Basso Ribas Date: Thu, 18 Mar 2021 13:41:59 -0300 Subject: [PATCH] Initial Workspace Viewer str() functionality (#577) --- package.json | 4 +-- src/workspaceViewer.ts | 62 +++++++++++++++++++++++++++++++++++------- 2 files changed, 54 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 0b12e0957..54d54d047 100644 --- a/package.json +++ b/package.json @@ -747,12 +747,12 @@ { "command": "r.workspaceViewer.view", "group": "inline", - "when": "view == workspaceViewer" + "when": "view == workspaceViewer && viewItem == rootNode" }, { "command": "r.workspaceViewer.remove", "group": "inline", - "when": "view == workspaceViewer" + "when": "view == workspaceViewer && viewItem == rootNode" }, { "command": "r.helpPanel.searchPackage", diff --git a/src/workspaceViewer.ts b/src/workspaceViewer.ts index 513031ff0..e3777cd41 100644 --- a/src/workspaceViewer.ts +++ b/src/workspaceViewer.ts @@ -29,8 +29,25 @@ export class WorkspaceDataProvider implements TreeDataProvider { return element; } - getChildren(): WorkspaceItem[] { - return this.getWorkspaceItems(this.data); + getChildren(element?: WorkspaceItem): WorkspaceItem[] { + if (element) { + return element.str + .split('\n') + .filter((elem, index) => {return index > 0;}) + .map(strItem => + new WorkspaceItem( + '', + '', + strItem.replace(/\s+/g,' ').trim(), + '', + 0, + element.treeLevel + 1 + ) + ); + } else { + return this.getWorkspaceItems(this.data); + } + } private getWorkspaceItems(data: WorkspaceAttr): WorkspaceItem[] { @@ -48,7 +65,7 @@ export class WorkspaceDataProvider implements TreeDataProvider { str, type, size, - TreeItemCollapsibleState.None, + 0, dim, ); }; @@ -83,20 +100,28 @@ export class WorkspaceDataProvider implements TreeDataProvider { } export class WorkspaceItem extends TreeItem { - public label: string; + label: string; + desc: string; + str: string; + treeLevel: number; + contextValue: string; + constructor( label: string, rClass: string, str: string, type: string, size: number, - collapsibleState: TreeItemCollapsibleState, - dim?: number[] + treeLevel: number, + dim?: number[], ) { - super(label, collapsibleState); + super(label, WorkspaceItem.setCollapsibleState(treeLevel, type, str)); this.description = this.getDescription(dim, str, rClass); - this.tooltip = this.getTooltip(label, rClass, size); + this.tooltip = this.getTooltip(label, rClass, size, treeLevel); this.contextValue = type; + this.str = str; + this.treeLevel = treeLevel; + this.contextValue = treeLevel === 0 ? 'rootNode' : `childNode${treeLevel}`; } private getDescription(dim: number[], str: string, rClass: string): string { @@ -110,13 +135,30 @@ export class WorkspaceItem extends TreeItem { return str; } } - private getTooltip(label:string, rClass: string, size: number): string { - if (size !== undefined) { + private getTooltip(label:string, rClass: string, + size: number, treeLevel: number): string { + + if (size !== undefined && treeLevel === 0) { return `${label} (${rClass}, ${size} bytes)`; + } else if (treeLevel === 1) { + return null; } else { return `${label} (${rClass})`; } } + + /* This logic has to be implemented this way to allow it to be called + during the super constructor above. I created it to give full control + of what elements can have have 'child' nodes os not. It can be expanded + in the futere for more tree levels.*/ + + private static setCollapsibleState(treeLevel: number, type: string, str: string) { + if (treeLevel === 0 && type === 'list' && str.includes('\n')){ + return TreeItemCollapsibleState.Collapsed; + } else { + return TreeItemCollapsibleState.None; + } + } } export function clearWorkspace(): void {