Skip to content

Commit 3bb9428

Browse files
Add Trace Viewer Shortcuts Panel
Helps fix #117 Signed-off-by: hriday-panchasara <hriday.panchasara@ericsson.com>
1 parent 4452e1b commit 3bb9428

File tree

9 files changed

+160
-5
lines changed

9 files changed

+160
-5
lines changed

vscode-trace-extension/package.json

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@
4646
"command": "openedTraces.openTraceFolder",
4747
"title": "Open Trace",
4848
"icon": "$(new-folder)"
49+
},
50+
{
51+
"command": "traceViewer.shortcuts",
52+
"title": "Trace Viewer Keyboard and Mouse Shortcuts",
53+
"icon": "$(info)"
4954
}
5055
],
5156
"viewsContainers": {
@@ -114,6 +119,11 @@
114119
"when": "activeWebviewPanelId == 'react'",
115120
"command": "outputs.openOverview",
116121
"group": "navigation@2"
122+
},
123+
{
124+
"when": "activeWebviewPanelId == 'react'",
125+
"command": "traceViewer.shortcuts",
126+
"group": "navigation@3"
117127
}
118128
]
119129
},
@@ -131,7 +141,14 @@
131141
"description": "Enter the trace server's API path, to be appended to the server URL. Eg: 'tsp/api'."
132142
}
133143
}
134-
}
144+
},
145+
"keybindings": [
146+
{
147+
"command": "traceViewer.shortcuts",
148+
"key": "ctrl+f1",
149+
"mac": "cmd+f1"
150+
}
151+
]
135152
},
136153
"dependencies": {
137154
"@fortawesome/fontawesome-svg-core": "^1.2.17",

vscode-trace-extension/src/extension.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { AnalysisProvider } from './trace-explorer/analysis-tree';
44
import { TraceExplorerItemPropertiesProvider } from './trace-explorer/properties/trace-explorer-properties-view-webview-provider';
55
import { TraceExplorerAvailableViewsProvider } from './trace-explorer/available-views/trace-explorer-available-views-webview-provider';
66
import { TraceExplorerOpenedTracesViewProvider } from './trace-explorer/opened-traces/trace-explorer-opened-traces-webview-provider';
7-
import { fileHandler, openOverviewHandler, resetZoomHandler } from './trace-explorer/trace-tree';
7+
import { fileHandler, openOverviewHandler, resetZoomHandler, keyboardShortcutsHandler } from './trace-explorer/trace-tree';
88
import { TraceServerConnectionStatusService } from './utils/trace-server-status';
99
import { updateTspClient } from './utils/tspClient';
1010
import { TraceExtensionLogger } from './utils/trace-extension-logger';
@@ -65,6 +65,10 @@ export function activate(context: vscode.ExtensionContext): void {
6565
context.subscriptions.push(vscode.commands.registerCommand('openedTraces.openTraceFolder', () => {
6666
fileOpenHandler(context, undefined);
6767
}));
68+
69+
context.subscriptions.push(vscode.commands.registerCommand('traceViewer.shortcuts', () => {
70+
keyboardShortcutsHandler(context.extensionUri);
71+
}));
6872
}
6973

7074
export function deactivate(): void {

vscode-trace-extension/src/trace-explorer/trace-tree.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { AnalysisProvider } from './analysis-tree';
88
import { TraceViewerPanel } from '../trace-viewer-panel/trace-viewer-webview-panel';
99
import { getTspClient } from '../utils/tspClient';
1010
import { traceLogger } from '../extension';
11+
import { KeyboardShortcutsPanel } from '../trace-viewer-panel/keyboard-shortcuts-panel';
1112

1213
const rootPath = path.resolve(__dirname, '../../..');
1314

@@ -106,6 +107,10 @@ export const resetZoomHandler = () => (): void => {
106107
TraceViewerPanel.resetZoomOnCurrent();
107108
};
108109

110+
export const keyboardShortcutsHandler = (extensionUri: vscode.Uri): void => {
111+
KeyboardShortcutsPanel.createOrShow(extensionUri, 'Trace Viewer Shortcuts');
112+
};
113+
109114
const openDialog = async (): Promise<vscode.Uri | undefined> => {
110115
const props: vscode.OpenDialogOptions = {
111116
title: 'Open Trace',
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import * as vscode from 'vscode';
2+
import { getTraceServerUrl } from '../utils/tspClient';
3+
4+
/**
5+
* Manages the keyboard and mouse shortcuts panel
6+
*/
7+
export class KeyboardShortcutsPanel {
8+
9+
private static readonly viewType = 'trace.viewer.shortcuts';
10+
private static _panel: vscode.WebviewPanel | undefined = undefined;
11+
12+
public static createOrShow(extensionUri: vscode.Uri, name: string): void {
13+
const column = vscode.window.activeTextEditor ? vscode.window.activeTextEditor.viewColumn : undefined;
14+
15+
if (this._panel) {
16+
this._panel.reveal(column);
17+
} else {
18+
this._panel = vscode.window.createWebviewPanel(KeyboardShortcutsPanel.viewType, name, column || vscode.ViewColumn.One, {
19+
// Enable javascript in the webview
20+
enableScripts: true,
21+
});
22+
23+
// Set the webview's initial html content
24+
this._panel.webview.html = this._getHtmlForWebview(this._panel.webview, extensionUri);
25+
26+
// Listen for when the panel is disposed
27+
// This happens when the user closes the panel or when the panel is closed programmatically
28+
this._panel.onDidDispose(() => {
29+
this._panel = undefined;
30+
});
31+
32+
}
33+
}
34+
35+
/* eslint-disable max-len */
36+
private static _getHtmlForWebview(webview: vscode.Webview, extensionUri: vscode.Uri): string {
37+
// Get the local path to main script run in the webview, then convert it to a uri we can use in the webview.
38+
const scriptUri = webview.asWebviewUri(vscode.Uri.joinPath(extensionUri, 'pack', 'shortcutsPanel.js'));
39+
40+
// Use a nonce to whitelist which scripts can be run
41+
const nonce = getNonce();
42+
43+
return `<!DOCTYPE html>
44+
<html lang="en">
45+
<head>
46+
<meta charset="utf-8">
47+
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
48+
<meta name="theme-color" content="#000000">
49+
<title>React App</title>
50+
<meta http-equiv="Content-Security-Policy"
51+
content="default-src 'none';
52+
img-src vscode-resource: https:;
53+
script-src 'nonce-${nonce}' 'unsafe-eval';
54+
style-src ${webview.cspSource} vscode-resource: 'unsafe-inline' http: https: data:;
55+
connect-src ${getTraceServerUrl()};
56+
font-src ${webview.cspSource}">
57+
<base href="${vscode.Uri.joinPath(extensionUri, 'pack').with({ scheme: 'vscode-resource' })}/">
58+
</head>
59+
60+
<body>
61+
<noscript>You need to enable JavaScript to run this app.</noscript>
62+
<div id="root"></div>
63+
64+
<script nonce="${nonce}">
65+
const vscode = acquireVsCodeApi();
66+
</script>
67+
<script nonce="${nonce}" src="${scriptUri}"></script>
68+
</body>
69+
</html>`;
70+
}
71+
}
72+
73+
function getNonce() {
74+
let text = '';
75+
const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
76+
for (let i = 0; i < 32; i++) {
77+
text += possible.charAt(Math.floor(Math.random() * possible.length));
78+
}
79+
return text;
80+
}

vscode-trace-webviews/src/style/trace-viewer.css

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,13 @@
2424
--trace-viewer-statusBar-foreground: var(--vscode-statusBar-foreground);
2525
--trace-viewer-ui-font-size1: var(--vscode-font-size);
2626
--trace-viewer-editorWidget-background: var(--vscode-editorWidget-background);
27-
--trace-viewer-ui-padding: 6px;
28-
--trace-viewer-list-line-height: 16px;
2927
--trace-viewer-layout-color4: var(--vscode-editorWidget-background);
3028
--trace-viewer-foreground: var(--vscode-editorWidget-foreground);
29+
--trace-viewer-keybindingLabel-background: var(--vscode-keybindingLabel-background);
30+
--trace-viewer-keybindingLabel-border: var(--vscode-keybindingLabel-border);
31+
--trace-viewer-keybindingLabel-bottomBorder: var(--vscode-keybindingLabel-bottomBorder);
32+
--trace-viewer-keybindingLabel-foreground: var(--vscode-keybindingLabel-foreground);
33+
--trace-viewer-button-background: var(--vscode-button-background);
34+
--trace-viewer-ui-padding: 6px;
35+
--trace-viewer-list-line-height: 16px;
3136
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
body {
2+
margin: 0;
3+
padding: 0;
4+
font-family: sans-serif;
5+
padding: calc(var(--trace-viewer-ui-padding)*2)
6+
}
7+
8+
.componentBody {
9+
background-color: var(--trace-viewer-editorWidget-background);
10+
color: var(--trace-viewer-foreground);
11+
padding: calc(var(--trace-viewer-ui-padding)*2)
12+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import * as React from 'react';
2+
import ReactDOM from 'react-dom/client';
3+
import './index.css';
4+
import ChartShortcutsComponent from './vscode-trace-explorer-shortcuts-widget';
5+
6+
const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement);
7+
8+
root.render(
9+
<ChartShortcutsComponent />
10+
);
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/* eslint-disable @typescript-eslint/ban-types */
2+
import React from 'react';
3+
import { KeyboardShortcutsComponent } from 'traceviewer-react-components/lib/trace-explorer/trace-explorer-sub-widgets/keyboard-shortcuts-component';
4+
import 'traceviewer-react-components/style/trace-explorer.css';
5+
import '../../style/trace-viewer.css';
6+
7+
class ChartShortcutsComponent extends React.Component<{}, {}> {
8+
constructor(props: {}) {
9+
super(props);
10+
}
11+
12+
public render(): React.ReactNode {
13+
return (
14+
<div className="componentBody">
15+
<KeyboardShortcutsComponent />
16+
</div>
17+
);
18+
}
19+
}
20+
21+
export default ChartShortcutsComponent;

vscode-trace-webviews/webpack.config.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ module.exports = {
66
trace_panel: "./src/trace-viewer/index.tsx",
77
openedTracesPanel: "./src/trace-explorer/opened-traces/index.tsx",
88
analysisPanel: "./src/trace-explorer/available-views/index.tsx",
9-
propertiesPanel: "./src/trace-explorer/properties/index.tsx"
9+
propertiesPanel: "./src/trace-explorer/properties/index.tsx",
10+
shortcutsPanel: "./src/trace-explorer/shortcuts/index.tsx"
1011
},
1112
output: {
1213
path: path.resolve(__dirname, "../vscode-trace-extension/pack"),

0 commit comments

Comments
 (0)