Skip to content

Commit 40cd824

Browse files
authored
Add contextMenu for liveWatch (#1031)
1 parent dc94d3e commit 40cd824

6 files changed

Lines changed: 175 additions & 9 deletions

File tree

package.json

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,11 @@
187187
"title": "Set Value",
188188
"category": "Live Watch"
189189
},
190+
{
191+
"command": "vscode-cmsis-debugger.liveWatch.resetViewState",
192+
"title": "Reset View State",
193+
"category": "Live Watch"
194+
},
190195
{
191196
"command": "vscode-cmsis-debugger.componentViewer.lockComponent",
192197
"title": "Lock Component Display",
@@ -412,6 +417,10 @@
412417
"command": "vscode-cmsis-debugger.liveWatch.setValue",
413418
"when": "false"
414419
},
420+
{
421+
"command": "vscode-cmsis-debugger.liveWatch.resetViewState",
422+
"when": "false"
423+
},
415424
{
416425
"command": "vscode-cmsis-debugger.componentViewer.lockComponent",
417426
"when": "false"
@@ -636,16 +645,21 @@
636645
"when": "inDebugMode && view == cmsis-debugger.liveWatch && vscode-cmsis-debugger.setExpressionSupported",
637646
"group": "contextMenuG1@5"
638647
},
639-
{
640-
"command": "vscode-cmsis-debugger.liveWatch.deleteAll",
641-
"when": "view == cmsis-debugger.liveWatch",
642-
"group": "contextMenuG2@1"
643-
},
644648
{
645649
"command": "vscode-cmsis-debugger.liveWatch.refresh",
646650
"when": "view == cmsis-debugger.liveWatch",
647651
"group": "contextMenuG2@2"
648652
},
653+
{
654+
"command": "vscode-cmsis-debugger.liveWatch.enablePeriodicUpdate",
655+
"when": "inDebugMode && view == cmsis-debugger.liveWatch && liveWatch.canAccessWhileRunning && !liveWatch.periodicUpdateEnabled",
656+
"group": "contextMenuG2@3"
657+
},
658+
{
659+
"command": "vscode-cmsis-debugger.liveWatch.disablePeriodicUpdate",
660+
"when": "inDebugMode && view == cmsis-debugger.liveWatch && liveWatch.canAccessWhileRunning && liveWatch.periodicUpdateEnabled",
661+
"group": "contextMenuG2@3"
662+
},
649663
{
650664
"command": "vscode-cmsis-debugger.liveWatch.showInMemoryInspector",
651665
"when": "view == cmsis-debugger.liveWatch",
@@ -661,6 +675,16 @@
661675
"when": "inDebugMode && (view == cmsis-debugger.liveWatch) && cdt.debug.outputRadix && cdt.debug.outputRadix != 'hexadecimal' && (debugType == 'gdb' || debugType == 'gdbtarget')",
662676
"group": "contextMenuG4@2"
663677
},
678+
{
679+
"command": "vscode-cmsis-debugger.liveWatch.deleteAll",
680+
"when": "view == cmsis-debugger.liveWatch",
681+
"group": "contextMenuG5@1"
682+
},
683+
{
684+
"command": "vscode-cmsis-debugger.liveWatch.resetViewState",
685+
"when": "inDebugMode && view == cmsis-debugger.liveWatch",
686+
"group": "contextMenuG5@2"
687+
},
664688
{
665689
"command": "vscode-cmsis-debugger.componentViewer.lockComponent",
666690
"when": "view == cmsis-debugger.componentViewer && viewItem == parentInstance",

src/desktop/extension.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ export const activate = async (context: vscode.ExtensionContext): Promise<void>
9494
cpuStates.resetViewState(),
9595
componentViewer.resetRuntimeViewState(),
9696
corePeripherals.resetRuntimeViewState(),
97-
liveWatchTreeDataProvider.resetViewState(),
97+
liveWatchTreeDataProvider.resetRuntimeViewState(),
9898
]);
9999
})
100100
);

src/views/dynamic-view-states.test.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import * as vscode from 'vscode';
1818
import {
1919
clearAllViewState,
2020
clearComponentViewerState,
21+
clearLiveWatchState,
2122
readComponentViewerState,
2223
readCpuStates,
2324
readLiveWatchState,
@@ -409,5 +410,60 @@ describe('dynamic-view-states', () => {
409410
vscode.ConfigurationTarget.Workspace
410411
);
411412
});
413+
414+
it('clears only Live Watch state and preserves other view state', async () => {
415+
const otherConfigKey = 'Other-Target::Debug';
416+
const updateMock = mockGetConfiguration(
417+
{
418+
[CONFIG_KEY]: {
419+
componentViewer: {
420+
filterPattern: 'global-filter',
421+
},
422+
liveWatchPeriodicUpdateEnabled: false,
423+
},
424+
[otherConfigKey]: {
425+
liveWatchPeriodicUpdateEnabled: false,
426+
},
427+
},
428+
{
429+
[CONFIG_KEY]: {
430+
corePeripherals: {
431+
periodicUpdateEnabled: false,
432+
},
433+
liveWatchPeriodicUpdateEnabled: false,
434+
},
435+
[otherConfigKey]: {
436+
cpuStatesEnabled: true,
437+
},
438+
}
439+
);
440+
await clearLiveWatchState();
441+
442+
expect(updateMock).toHaveBeenCalledWith(
443+
'vscode-cmsis-debugger.viewState',
444+
{
445+
[CONFIG_KEY]: {
446+
corePeripherals: {
447+
periodicUpdateEnabled: false,
448+
},
449+
},
450+
[otherConfigKey]: {
451+
cpuStatesEnabled: true,
452+
},
453+
},
454+
vscode.ConfigurationTarget.Workspace
455+
);
456+
expect(updateMock).toHaveBeenCalledWith(
457+
'vscode-cmsis-debugger.viewState',
458+
{
459+
[CONFIG_KEY]: {
460+
componentViewer: {
461+
filterPattern: 'global-filter',
462+
},
463+
},
464+
},
465+
vscode.ConfigurationTarget.Global
466+
);
467+
});
412468
});
413469
});

src/views/dynamic-view-states.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,3 +171,10 @@ export async function writeLiveWatchState(configStateKey: string, periodicUpdate
171171
const stateToStore = periodicUpdateEnabled ? userState === false ? true : undefined : false;
172172
await writeWorkspaceDynamicViewState(configStateKey, 'liveWatchPeriodicUpdateEnabled', stateToStore);
173173
}
174+
175+
export async function clearLiveWatchState(): Promise<void> {
176+
await Promise.all([
177+
clearDynamicViewState('liveWatchPeriodicUpdateEnabled', vscode.ConfigurationTarget.Workspace),
178+
clearDynamicViewState('liveWatchPeriodicUpdateEnabled', vscode.ConfigurationTarget.Global),
179+
]);
180+
}

src/views/live-watch/live-watch.test.ts

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,8 @@ describe('LiveWatchTreeDataProvider', () => {
400400
'vscode-cmsis-debugger.liveWatch.addToLiveWatchFromVariablesView',
401401
'vscode-cmsis-debugger.liveWatch.showInMemoryInspector',
402402
'vscode-cmsis-debugger.liveWatch.enablePeriodicUpdate',
403-
'vscode-cmsis-debugger.liveWatch.disablePeriodicUpdate'
403+
'vscode-cmsis-debugger.liveWatch.disablePeriodicUpdate',
404+
'vscode-cmsis-debugger.liveWatch.resetViewState'
404405
]);
405406
});
406407

@@ -627,6 +628,16 @@ describe('LiveWatchTreeDataProvider', () => {
627628
await Promise.resolve();
628629
expect(refreshSpy).toHaveBeenCalled();
629630
});
631+
632+
it('reset view state command resets Live Watch view state', async () => {
633+
const resetViewStateSpy = jest.spyOn(liveWatchTreeDataProvider, 'resetViewState').mockResolvedValue(undefined);
634+
await liveWatchTreeDataProvider.activate(tracker);
635+
const handler = getRegisteredHandler('vscode-cmsis-debugger.liveWatch.resetViewState');
636+
expect(handler).toBeDefined();
637+
await handler();
638+
639+
expect(resetViewStateSpy).toHaveBeenCalled();
640+
});
630641
});
631642

632643
describe('Live Watch periodic update state persists to and restores from settings', () => {
@@ -704,6 +715,23 @@ describe('LiveWatchTreeDataProvider', () => {
704715

705716
it('re-enables sessions and updates the toolbar context on view state reset', async () => {
706717
const executeCommandSpy = jest.spyOn(vscode.commands, 'executeCommand').mockResolvedValue(undefined);
718+
const updateMock = jest.fn().mockResolvedValue(undefined);
719+
jest.spyOn(vscode.workspace, 'getConfiguration').mockReturnValue({
720+
update: updateMock,
721+
inspect: jest.fn().mockReturnValue({
722+
globalValue: {
723+
Debug: {
724+
liveWatchPeriodicUpdateEnabled: false,
725+
},
726+
},
727+
workspaceValue: {
728+
Debug: {
729+
liveWatchPeriodicUpdateEnabled: false,
730+
cpuStatesEnabled: true,
731+
},
732+
},
733+
}),
734+
} as any);
707735
await liveWatchTreeDataProvider.activate(tracker);
708736
(tracker as any)._onWillStartSession.fire(gdbtargetDebugSession);
709737
(liveWatchTreeDataProvider as any).sessionLiveWatchStates.get(gdbtargetDebugSession.session.id)!.periodicUpdateEnabled = false;
@@ -712,6 +740,49 @@ describe('LiveWatchTreeDataProvider', () => {
712740

713741
expect((liveWatchTreeDataProvider as any).sessionLiveWatchStates.get(gdbtargetDebugSession.session.id)!.periodicUpdateEnabled).toBe(true);
714742
expect(executeCommandSpy).toHaveBeenCalledWith('setContext', 'liveWatch.periodicUpdateEnabled', true);
743+
expect(updateMock).toHaveBeenCalledWith(
744+
'vscode-cmsis-debugger.viewState',
745+
{
746+
Debug: {
747+
cpuStatesEnabled: true,
748+
},
749+
},
750+
vscode.ConfigurationTarget.Workspace
751+
);
752+
expect(updateMock).toHaveBeenCalledWith(
753+
'vscode-cmsis-debugger.viewState',
754+
undefined,
755+
vscode.ConfigurationTarget.Global
756+
);
757+
});
758+
759+
it('runtime view state reset does not clear persisted settings', async () => {
760+
const executeCommandSpy = jest.spyOn(vscode.commands, 'executeCommand').mockResolvedValue(undefined);
761+
const updateMock = jest.fn().mockResolvedValue(undefined);
762+
jest.spyOn(vscode.workspace, 'getConfiguration').mockReturnValue({
763+
update: updateMock,
764+
inspect: jest.fn().mockReturnValue({
765+
globalValue: {
766+
Debug: {
767+
liveWatchPeriodicUpdateEnabled: false,
768+
},
769+
},
770+
workspaceValue: {
771+
Debug: {
772+
liveWatchPeriodicUpdateEnabled: false,
773+
},
774+
},
775+
}),
776+
} as any);
777+
await liveWatchTreeDataProvider.activate(tracker);
778+
(tracker as any)._onWillStartSession.fire(gdbtargetDebugSession);
779+
(liveWatchTreeDataProvider as any).sessionLiveWatchStates.get(gdbtargetDebugSession.session.id)!.periodicUpdateEnabled = false;
780+
781+
liveWatchTreeDataProvider.resetRuntimeViewState();
782+
783+
expect((liveWatchTreeDataProvider as any).sessionLiveWatchStates.get(gdbtargetDebugSession.session.id)!.periodicUpdateEnabled).toBe(true);
784+
expect(executeCommandSpy).toHaveBeenCalledWith('setContext', 'liveWatch.periodicUpdateEnabled', true);
785+
expect(updateMock).not.toHaveBeenCalled();
715786
});
716787
});
717788

src/views/live-watch/live-watch.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { DebugProtocol } from '@vscode/debugprotocol';
1919
import { GDBTargetDebugSession, GDBTargetDebugTracker, SessionEvent } from '../../debug-session';
2020
import { vscodeViewExists } from '../../vscode-utils';
2121
import { logger } from '../..';
22-
import { readLiveWatchState, writeLiveWatchState } from '../dynamic-view-states';
22+
import { clearLiveWatchState, readLiveWatchState, writeLiveWatchState } from '../dynamic-view-states';
2323

2424
export interface LiveWatchNode {
2525
id: number;
@@ -247,6 +247,8 @@ export class LiveWatchTreeDataProvider implements vscode.TreeDataProvider<LiveWa
247247
async () => await this.handleEnablePeriodicUpdate());
248248
const disablePeriodicUpdateCommand = vscode.commands.registerCommand('vscode-cmsis-debugger.liveWatch.disablePeriodicUpdate',
249249
async () => await this.handleDisablePeriodicUpdate());
250+
const resetViewStateCommand = vscode.commands.registerCommand('vscode-cmsis-debugger.liveWatch.resetViewState',
251+
async () => await this.resetViewState());
250252
vscode.commands.executeCommand('setContext', 'liveWatch.periodicUpdateEnabled', true);
251253
vscode.commands.executeCommand('setContext', 'liveWatch.canAccessWhileRunning', false);
252254
this._context.subscriptions.push(
@@ -263,7 +265,8 @@ export class LiveWatchTreeDataProvider implements vscode.TreeDataProvider<LiveWa
263265
addToLiveWatchFromVariablesViewCommand,
264266
showInMemoryInspectorCommand,
265267
enablePeriodicUpdateCommand,
266-
disablePeriodicUpdateCommand
268+
disablePeriodicUpdateCommand,
269+
resetViewStateCommand
267270
);
268271
return true;
269272
}
@@ -474,6 +477,11 @@ export class LiveWatchTreeDataProvider implements vscode.TreeDataProvider<LiveWa
474477
}
475478

476479
public async resetViewState(): Promise<void> {
480+
await clearLiveWatchState();
481+
this.resetRuntimeViewState();
482+
}
483+
484+
public resetRuntimeViewState(): void {
477485
for (const state of this.sessionLiveWatchStates.values()) {
478486
state.periodicUpdateEnabled = true;
479487
}

0 commit comments

Comments
 (0)