Skip to content

Commit 208330b

Browse files
authored
Fix tree item bug (#1150)
1 parent 3af24dd commit 208330b

1 file changed

Lines changed: 60 additions & 47 deletions

File tree

src/workspaceViewer.ts

Lines changed: 60 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -22,29 +22,28 @@ async function populatePackageNodes(): Promise<void> {
2222
}
2323
}
2424

25-
function getPackageNode(name: string): PackageNode {
25+
function getPackageNode(name: string): PackageNode | undefined {
2626
const rootNode = globalRHelp?.treeViewWrapper.helpViewProvider.rootItem;
2727
if (rootNode) {
2828
return rootNode.pkgRootNode.children?.find(node => node.label === name);
2929
}
3030
}
3131

3232
export class WorkspaceDataProvider implements TreeDataProvider<TreeItem> {
33+
private readonly attachedNamespacesRootItem: TreeItem;
34+
private readonly loadedNamespacesRootItem: TreeItem;
35+
private readonly globalEnvRootItem: TreeItem;
3336
private _onDidChangeTreeData: EventEmitter<void> = new EventEmitter();
34-
readonly onDidChangeTreeData: Event<void> = this._onDidChangeTreeData.event;
3537

36-
refresh(): void {
38+
public readonly onDidChangeTreeData: Event<void> = this._onDidChangeTreeData.event;
39+
public data: WorkspaceData;
40+
41+
public refresh(): void {
3742
this.data = isGuestSession ? guestWorkspace : workspaceData;
3843
this._onDidChangeTreeData.fire();
3944
}
4045

41-
data: WorkspaceData;
42-
43-
private readonly attachedNamespacesRootItem: TreeItem;
44-
private readonly loadedNamespacesRootItem: TreeItem;
45-
private readonly globalEnvRootItem: TreeItem;
46-
47-
constructor() {
46+
public constructor() {
4847
this.attachedNamespacesRootItem = new TreeItem('Attached Namespaces', TreeItemCollapsibleState.Collapsed);
4948
this.attachedNamespacesRootItem.id = 'attached-namespaces';
5049
this.attachedNamespacesRootItem.iconPath = new ThemeIcon('library');
@@ -64,11 +63,11 @@ export class WorkspaceDataProvider implements TreeDataProvider<TreeItem> {
6463
);
6564
}
6665

67-
getTreeItem(element: TreeItem): TreeItem {
66+
public getTreeItem(element: TreeItem): TreeItem {
6867
return element;
6968
}
7069

71-
async getChildren(element?: TreeItem): Promise<TreeItem[]> {
70+
public async getChildren(element?: TreeItem): Promise<TreeItem[]> {
7271
if (element) {
7372
if (this.data === undefined) {
7473
return [];
@@ -141,7 +140,7 @@ export class WorkspaceDataProvider implements TreeDataProvider<TreeItem> {
141140
str,
142141
type,
143142
size,
144-
0,
143+
TreeLevel.Parent,
145144
dim,
146145
);
147146
};
@@ -162,7 +161,7 @@ export class WorkspaceDataProvider implements TreeDataProvider<TreeItem> {
162161
} else if (a.priority < b.priority) {
163162
return 1;
164163
} else {
165-
return 0 || a.label.localeCompare(b.label);
164+
return a.label.localeCompare(b.label);
166165
}
167166
}
168167

@@ -171,11 +170,11 @@ export class WorkspaceDataProvider implements TreeDataProvider<TreeItem> {
171170
}
172171

173172
class PackageItem extends TreeItem {
174-
static command : string = 'r.workspaceViewer.package.showQuickPick';
175-
label: string;
176-
name: string;
177-
pkgNode?: PackageNode;
178-
constructor(label: string, name: string, pkgNode?: PackageNode) {
173+
public static command : string = 'r.workspaceViewer.package.showQuickPick';
174+
public label: string;
175+
public name: string;
176+
public pkgNode?: PackageNode;
177+
public constructor(label: string, name: string, pkgNode?: PackageNode) {
179178
super(label, TreeItemCollapsibleState.None);
180179
this.name = name;
181180
this.iconPath = new ThemeIcon('symbol-package');
@@ -191,33 +190,48 @@ class PackageItem extends TreeItem {
191190
}
192191
}
193192

193+
enum TreeLevel {
194+
Parent = 0,
195+
Scalar = 1,
196+
Child = 2
197+
}
198+
194199
export class GlobalEnvItem extends TreeItem {
195-
label: string;
196-
desc: string;
197-
str: string;
198-
type: string;
199-
treeLevel: number;
200-
contextValue: string;
201-
priority: number;
200+
public label: string;
201+
public desc: string;
202+
public str: string;
203+
public type: string;
204+
public treeLevel: number;
205+
public contextValue: string;
206+
public priority: number;
202207

203208
constructor(
204209
label: string,
205210
rClass: string,
206211
str: string,
207212
type: string,
208-
size: number,
209-
treeLevel: number,
213+
size?: number,
214+
treeLevel?: number,
210215
dim?: number[],
211216
) {
212-
super(label, GlobalEnvItem.setCollapsibleState(treeLevel, type, str));
213-
this.description = this.getDescription(dim, str, rClass, type);
214-
this.tooltip = this.getTooltip(label, rClass, size, treeLevel);
215-
this.iconPath = this.getIcon(type, dim);
217+
super(
218+
label,
219+
GlobalEnvItem.setCollapsibleState(treeLevel ?? TreeLevel.Scalar, type, str)
220+
);
216221
this.type = type;
217222
this.str = str;
218-
this.treeLevel = treeLevel;
219-
this.contextValue = treeLevel === 0 ? 'rootNode' : `childNode${treeLevel}`;
223+
this.treeLevel = treeLevel ?? TreeLevel.Scalar;
220224
this.priority = dim ? 1 : 0;
225+
226+
this.description = this.getDescription(
227+
dim,
228+
str,
229+
rClass,
230+
type
231+
);
232+
this.tooltip = this.getTooltip(label, rClass, size, treeLevel);
233+
this.iconPath = this.getIcon(type, dim);
234+
this.contextValue = treeLevel === 0 ? 'rootNode' : `childNode${this.treeLevel}`;
221235
}
222236

223237
private getDescription(dim: number[], str: string, rClass: string, type: string): string {
@@ -244,19 +258,19 @@ export class GlobalEnvItem extends TreeItem {
244258
private getTooltip(
245259
label:string,
246260
rClass: string,
247-
size: number,
248-
treeLevel: number
261+
size?: number,
262+
treeLevel?: number
249263
): string {
250-
if (size !== undefined && treeLevel === 0) {
264+
if (size && treeLevel === TreeLevel.Parent) {
251265
return `${label} (${rClass}, ${this.getSizeString(size)})`;
252-
} else if (treeLevel === 1) {
253-
return null;
266+
} else if (treeLevel === TreeLevel.Scalar) {
267+
return '';
254268
} else {
255269
return `${label} (${rClass})`;
256270
}
257271
}
258272

259-
private getIcon(type: string, dim?: number[]) {
273+
private getIcon(type: string, dim?: number[]): vscode.ThemeIcon {
260274
let name: string;
261275
if (dim) {
262276
name = 'symbol-array';
@@ -274,9 +288,8 @@ export class GlobalEnvItem extends TreeItem {
274288
during the super constructor above. I created it to give full control
275289
of what elements can have have 'child' nodes os not. It can be expanded
276290
in the futere for more tree levels.*/
277-
278-
private static setCollapsibleState(treeLevel: number, type: string, str: string) {
279-
if (treeLevel === 0 && collapsibleTypes.includes(type) && str.includes('\n')){
291+
private static setCollapsibleState(treeLevel: number, type: string, str: string): vscode.TreeItemCollapsibleState {
292+
if (treeLevel === TreeLevel.Parent && collapsibleTypes.includes(type) && str.includes('\n')){
280293
return TreeItemCollapsibleState.Collapsed;
281294
} else {
282295
return TreeItemCollapsibleState.None;
@@ -285,8 +298,8 @@ export class GlobalEnvItem extends TreeItem {
285298
}
286299

287300
export function clearWorkspace(): void {
288-
const removeHiddenItems: boolean = config().get('workspaceViewer.removeHiddenItems');
289-
const promptUser: boolean = config().get('workspaceViewer.clearPrompt');
301+
const removeHiddenItems: boolean | undefined = config().get('workspaceViewer.removeHiddenItems');
302+
const promptUser: boolean | undefined = config().get('workspaceViewer.clearPrompt');
290303

291304
if ((isGuestSession ? guestWorkspace : workspaceData) !== undefined) {
292305
if (promptUser) {
@@ -316,7 +329,7 @@ export function clearWorkspace(): void {
316329
}
317330

318331
export function saveWorkspace(): void {
319-
if (workspaceData !== undefined) {
332+
if (workspaceData) {
320333
void window.showSaveDialog({
321334
defaultUri: Uri.file(path.join(workingDir, 'workspace.RData')),
322335
filters: {
@@ -335,7 +348,7 @@ export function saveWorkspace(): void {
335348
}
336349

337350
export function loadWorkspace(): void {
338-
if (workspaceData !== undefined) {
351+
if (workspaceData) {
339352
void window.showOpenDialog({
340353
defaultUri: Uri.file(workingDir),
341354
filters: {

0 commit comments

Comments
 (0)