Skip to content

Commit 14c74a1

Browse files
authored
Fix terminating behavior and other small issues (#44)
* Fix terminating behavior and dispose not used listeners - Remove unused code in data provider - Remove context menu entry from session tree node * Remove empty line
1 parent 4ae863e commit 14c74a1

7 files changed

Lines changed: 47 additions & 32 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@
286286
"webview/context": [
287287
{
288288
"command": "peripheral-inspector.svd.setFormat",
289-
"when": "webviewId =~ /peripheral-inspector.peripheral-*/ && webviewSection == tree-item",
289+
"when": "webviewId =~ /peripheral-inspector.peripheral-*/ && webviewSection == tree-item && cdtTreeItemType !== peripheral-session-node",
290290
"group": "navigation"
291291
},
292292
{

src/common/notification.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,11 @@ export interface TreeNotification<T> {
1616
context?: TreeNotificationContext;
1717
data: T;
1818
}
19+
20+
export interface TreeTerminatedEvent<T> {
21+
/**
22+
* The number of remaining trees.
23+
*/
24+
remaining: number;
25+
data: T;
26+
}

src/components/tree/integration/peripheral-tree-converter.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ export class PeripheralTreeConverter implements TreeResourceConverter<Peripheral
5656
}
5757
}
5858

59-
6059
export class PeripheralBaseNodeConverter implements TreeResourceConverter<PeripheralBaseNodeDTO, PeripheralTreeNodeDTOs> {
6160
canHandle(resource: PeripheralTreeNodeDTOs): boolean {
6261
return PeripheralBaseNodeDTO.is(resource);
@@ -69,13 +68,13 @@ export class PeripheralBaseNodeConverter implements TreeResourceConverter<Periph
6968
parent: context.parent,
7069
resource,
7170
expanded: context.expandedKeys.includes(resource.id),
72-
columns: this.getColumns(resource, context),
71+
columns: this.getColumns(resource),
7372
});
7473
}
7574

7675
// ==== Rendering ====
7776

78-
private getColumns(resource: PeripheralBaseNodeDTO, _context: TreeConverterContext<PeripheralTreeNodeDTOs>): Record<string, CDTTreeTableColumn> {
77+
private getColumns(resource: PeripheralBaseNodeDTO): Record<string, CDTTreeTableColumn> {
7978
return {
8079
'title': {
8180
type: 'string',
@@ -98,17 +97,16 @@ export class PeripheralSessionNodeConverter implements TreeResourceConverter<Per
9897
parent: context.parent,
9998
resource,
10099
expanded: context.expandedKeys.includes(resource.id),
101-
columns: this.getColumns(resource, context),
100+
columns: this.getColumns(resource),
102101
});
103102
}
104103

105104
// ==== Rendering ====
106105

107-
private getColumns(resource: PeripheralSessionNodeDTO, context: TreeConverterContext<PeripheralTreeNodeDTOs>): Record<string, CDTTreeTableColumn> {
106+
private getColumns(resource: PeripheralSessionNodeDTO): Record<string, CDTTreeTableColumn> {
108107
return {
109108
'title': {
110109
type: 'string',
111-
icon: context.pinnedKeys.includes(resource.id) ? 'codicon codicon-pinned' : undefined,
112110
label: resource.name,
113111
colSpan: 'fill'
114112
},

src/components/tree/integration/tree-data-provider.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import * as vscode from 'vscode';
99
import { MaybePromise } from '../../../common';
10-
import { TreeNotification } from '../../../common/notification';
10+
import { TreeNotification, TreeTerminatedEvent } from '../../../common/notification';
1111
import { CDTTreeTableColumnDefinition } from '../types';
1212

1313
/**
@@ -18,6 +18,7 @@ import { CDTTreeTableColumnDefinition } from '../types';
1818
* are actually send to the webview to be display in the tree.
1919
*/
2020
export interface CDTTreeDataProvider<TNode, TSerializedNode> {
21+
onDidTerminate: vscode.Event<TreeTerminatedEvent<TNode>>;
2122
onDidChangeTreeData: vscode.Event<TreeNotification<TNode | TNode[] | undefined | null>>;
2223
/**
2324
* Get the column definitions for the tree table.

src/components/tree/integration/webview/tree-webview-view-provider.ts

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,6 @@ export abstract class CDTTreeWebviewViewProvider<TNode> implements vscode.Webvie
3333
protected readonly context: vscode.ExtensionContext,
3434
protected readonly messenger = new Messenger({ ignoreHiddenViews: false, debugLog: true })
3535
) {
36-
this.init();
37-
}
38-
39-
protected init(): void {
40-
this.dataProvider.onDidChangeTreeData?.(async (event) => {
41-
if (event.context?.resync !== false) {
42-
this.refresh();
43-
}
44-
});
4536
}
4637

4738
public async resolveWebviewView(webviewView: vscode.WebviewView, _context: vscode.WebviewViewResolveContext,
@@ -106,6 +97,16 @@ export abstract class CDTTreeWebviewViewProvider<TNode> implements vscode.Webvie
10697
}
10798

10899
const disposables = [
100+
this.dataProvider.onDidTerminate(async (event) => {
101+
if (event.remaining > 0) {
102+
this.refresh();
103+
}
104+
}),
105+
this.dataProvider.onDidChangeTreeData(async (event) => {
106+
if (event.context?.resync !== false) {
107+
this.refresh();
108+
}
109+
}),
109110
this.messenger.onNotification(CTDTreeMessengerType.ready, () => this.onReady(), { sender: participant }),
110111
this.messenger.onNotification(CTDTreeMessengerType.executeCommand, (event) => this.onDidExecuteCommandEvent.fire(event), { sender: participant }),
111112
this.messenger.onNotification(CTDTreeMessengerType.toggleNode, event => this.onDidToggleNodeEvent.fire(event), { sender: participant }),
@@ -127,10 +128,7 @@ export abstract class CDTTreeWebviewViewProvider<TNode> implements vscode.Webvie
127128
const columnFields = this.dataProvider.getColumnDefinitions();
128129
const items = await this.dataProvider.getSerializedRoots();
129130

130-
this.messenger.sendNotification(CTDTreeMessengerType.updateState, this.participant, {
131-
columnFields,
132-
items
133-
});
131+
this.sendNotification(CTDTreeMessengerType.updateState, { columnFields, items });
134132
}
135133

136134
sendNotification<P>(type: NotificationType<P>, params?: P): void {

src/plugin/peripheral/tree/peripheral-data-tracker.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,15 @@ import {
1919
PeripheralRegisterNode,
2020
} from '../nodes';
2121
import { PeripheralTreeForSession } from './peripheral-session-tree';
22-
import { TreeNotification, TreeNotificationContext } from '../../../common/notification';
22+
import { TreeNotification, TreeNotificationContext, TreeTerminatedEvent } from '../../../common/notification';
2323
import { PeripheralTreeDataProvider } from './peripheral-tree-data-provider';
2424
import * as xmlWriter from 'xmlbuilder2';
2525
import { XMLBuilder } from 'xmlbuilder2/lib/interfaces';
2626
import { hexFormat } from '../../../utils';
2727

2828
export class PeripheralDataTracker {
29+
protected onDidTerminateEvent = new vscode.EventEmitter<TreeTerminatedEvent<PeripheralTreeForSession>>();
30+
public readonly onDidTerminate = this.onDidTerminateEvent.event;
2931
protected onDidChangeEvent = new vscode.EventEmitter<void>();
3032
public readonly onDidChange = this.onDidChangeEvent.event;
3133
protected onDidPeripheralChangeEvent = new vscode.EventEmitter<TreeNotification<PeripheralBaseNode>>();
@@ -329,7 +331,7 @@ export class PeripheralDataTracker {
329331
this.fireOnDidChange();
330332
}
331333

332-
vscode.commands.executeCommand('setContext', `${PeripheralTreeDataProvider.viewName}.hasData`, this.sessionPeripherals.size > 0);
334+
this.refreshContext();
333335
}
334336

335337
protected onDebugSessionTerminated(session: vscode.DebugSession): void {
@@ -342,10 +344,13 @@ export class PeripheralDataTracker {
342344
this.oldState.set(session.name, regs.expanded);
343345
this.sessionPeripherals.delete(session.id);
344346
regs.sessionTerminated(this.context);
345-
this.fireOnDidChange();
347+
this.onDidTerminateEvent.fire({
348+
data: regs,
349+
remaining: this.sessionPeripherals.size
350+
});
346351
}
347352

348-
vscode.commands.executeCommand('setContext', `${PeripheralTreeDataProvider.viewName}.hasData`, this.sessionPeripherals.size > 0);
353+
this.refreshContext();
349354
}
350355

351356
protected onDebugStopped(session: vscode.DebugSession): void {
@@ -363,4 +368,8 @@ export class PeripheralDataTracker {
363368
}
364369
}, 100);
365370
}
371+
372+
protected refreshContext(): void {
373+
vscode.commands.executeCommand('setContext', `${PeripheralTreeDataProvider.viewName}.hasData`, this.sessionPeripherals.size > 0);
374+
}
366375
}

src/plugin/peripheral/tree/peripheral-tree-data-provider.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
********************************************************************************/
77

88
import * as vscode from 'vscode';
9-
import { TreeNotification } from '../../../common/notification';
9+
import { TreeNotification, TreeTerminatedEvent } from '../../../common/notification';
1010
import { PERIPHERAL_ID_SEP, PeripheralBaseNodeDTO } from '../../../common/peripheral-dto';
1111
import { CDTTreeDataProvider } from '../../../components/tree/integration/tree-data-provider';
1212
import { CDTTreeWebviewViewProvider } from '../../../components/tree/integration/webview';
@@ -18,27 +18,28 @@ import { PeripheralDataTracker } from './peripheral-data-tracker';
1818
export class PeripheralTreeDataProvider implements CDTTreeDataProvider<PeripheralBaseNode, PeripheralBaseNodeDTO> {
1919
public static viewName = `${manifest.PACKAGE_NAME}.svd`;
2020

21+
protected onDidTerminateEvent = new vscode.EventEmitter<TreeTerminatedEvent<PeripheralBaseNode>>();
22+
readonly onDidTerminate = this.onDidTerminateEvent.event;
2123
protected onDidChangeTreeDataEvent = new vscode.EventEmitter<TreeNotification<PeripheralBaseNode | PeripheralBaseNode[] | undefined>>();
2224
readonly onDidChangeTreeData = this.onDidChangeTreeDataEvent.event;
2325

2426
constructor(protected readonly dataTracker: PeripheralDataTracker, protected context: vscode.ExtensionContext) {
27+
this.dataTracker.onDidTerminate((event) => {
28+
this.onDidTerminateEvent.fire(event);
29+
});
2530
this.dataTracker.onDidSelectionChange(() => {
2631
this.onDidChangeTreeDataEvent.fire({ data: undefined });
2732
});
2833
this.dataTracker.onDidChange(async () => {
29-
await this.getSerializedRoots();
3034
this.onDidChangeTreeDataEvent.fire({ data: undefined });
3135
});
3236
this.dataTracker.onDidPeripheralChange(async (event) => {
33-
await this.getSerializedData(event.data, true);
3437
this.onDidChangeTreeDataEvent.fire(event);
3538
});
3639
this.dataTracker.onDidExpand(async (event) => {
37-
await this.getSerializedData(event.data, true);
3840
this.onDidChangeTreeDataEvent.fire(event);
3941
});
4042
this.dataTracker.onDidCollapse(async (event) => {
41-
await this.getSerializedData(event.data, true);
4243
this.onDidChangeTreeDataEvent.fire(event);
4344
});
4445
}
@@ -73,12 +74,12 @@ export class PeripheralTreeDataProvider implements CDTTreeDataProvider<Periphera
7374
return Promise.all(children.map(c => this.getSerializedData(c)));
7475
}
7576

76-
async getSerializedData(element: PeripheralBaseNode, refreshCache = false): Promise<PeripheralBaseNodeDTO> {
77+
async getSerializedData(element: PeripheralBaseNode): Promise<PeripheralBaseNodeDTO> {
7778
const item = await element.serialize();
7879

7980
const children = await this.getChildren(element);
8081
if (children && children?.length > 0) {
81-
item.children = await Promise.all(children.map(c => this.getSerializedData(c, refreshCache)));
82+
item.children = await Promise.all(children.map(c => this.getSerializedData(c)));
8283
}
8384

8485
return item;

0 commit comments

Comments
 (0)