Skip to content

Commit e9552df

Browse files
authored
Create a basic tree view for the queries panel (github#2418)
1 parent 3e6372d commit e9552df

File tree

5 files changed

+122
-0
lines changed

5 files changed

+122
-0
lines changed

extensions/ql-vscode/src/extension.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ import { TestManager } from "./query-testing/test-manager";
125125
import { TestRunner } from "./query-testing/test-runner";
126126
import { TestManagerBase } from "./query-testing/test-manager-base";
127127
import { NewQueryRunner, QueryRunner, QueryServerClient } from "./query-server";
128+
import { QueriesModule } from "./queries-panel/queries-module";
128129

129130
/**
130131
* extension.ts
@@ -732,6 +733,8 @@ async function activateWithInstalledDistribution(
732733
);
733734
ctx.subscriptions.push(databaseUI);
734735

736+
QueriesModule.initialize(app);
737+
735738
void extLogger.log("Initializing evaluator log viewer.");
736739
const evalLogViewer = new EvalLogViewer();
737740
ctx.subscriptions.push(evalLogViewer);
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { extLogger } from "../common";
2+
import { App, AppMode } from "../common/app";
3+
import { isCanary, showQueriesPanel } from "../config";
4+
import { DisposableObject } from "../pure/disposable-object";
5+
import { QueriesPanel } from "./queries-panel";
6+
7+
export class QueriesModule extends DisposableObject {
8+
private queriesPanel: QueriesPanel | undefined;
9+
10+
private constructor(readonly app: App) {
11+
super();
12+
}
13+
14+
private initialize(app: App): void {
15+
if (app.mode === AppMode.Production || !isCanary() || !showQueriesPanel()) {
16+
// Currently, we only want to expose the new panel when we are in development and canary mode
17+
// and the developer has enabled the "Show queries panel" flag.
18+
return;
19+
}
20+
void extLogger.log("Initializing queries panel.");
21+
22+
this.queriesPanel = new QueriesPanel();
23+
this.push(this.queriesPanel);
24+
}
25+
26+
public static initialize(app: App): QueriesModule {
27+
const queriesModule = new QueriesModule(app);
28+
app.subscriptions.push(queriesModule);
29+
30+
queriesModule.initialize(app);
31+
return queriesModule;
32+
}
33+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import * as vscode from "vscode";
2+
import { DisposableObject } from "../pure/disposable-object";
3+
import { QueryTreeDataProvider } from "./query-tree-data-provider";
4+
import { QueryTreeViewItem } from "./query-tree-view-item";
5+
6+
export class QueriesPanel extends DisposableObject {
7+
private readonly dataProvider: QueryTreeDataProvider;
8+
private readonly treeView: vscode.TreeView<QueryTreeViewItem>;
9+
10+
public constructor() {
11+
super();
12+
13+
this.dataProvider = new QueryTreeDataProvider();
14+
15+
this.treeView = vscode.window.createTreeView("codeQLQueries", {
16+
treeDataProvider: this.dataProvider,
17+
});
18+
19+
this.push(this.treeView);
20+
}
21+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import * as vscode from "vscode";
2+
import { QueryTreeViewItem } from "./query-tree-view-item";
3+
import { DisposableObject } from "../pure/disposable-object";
4+
5+
export class QueryTreeDataProvider
6+
extends DisposableObject
7+
implements vscode.TreeDataProvider<QueryTreeViewItem>
8+
{
9+
private queryTreeItems: QueryTreeViewItem[];
10+
11+
public constructor() {
12+
super();
13+
14+
this.queryTreeItems = this.createTree();
15+
}
16+
17+
private createTree(): QueryTreeViewItem[] {
18+
// Temporary mock data, just to populate the tree view.
19+
return [
20+
{
21+
label: "name1",
22+
tooltip: "path1",
23+
children: [],
24+
},
25+
];
26+
}
27+
28+
/**
29+
* Returns the UI presentation of the element that gets displayed in the view.
30+
* @param item The item to represent.
31+
* @returns The UI presentation of the item.
32+
*/
33+
public getTreeItem(
34+
item: QueryTreeViewItem,
35+
): vscode.TreeItem | Thenable<vscode.TreeItem> {
36+
return item;
37+
}
38+
39+
/**
40+
* Called when expanding an item (including the root item).
41+
* @param item The item to expand.
42+
* @returns The children of the item.
43+
*/
44+
public getChildren(
45+
item?: QueryTreeViewItem,
46+
): vscode.ProviderResult<QueryTreeViewItem[]> {
47+
if (!item) {
48+
// We're at the root.
49+
return Promise.resolve(this.queryTreeItems);
50+
} else {
51+
return Promise.resolve(item.children);
52+
}
53+
}
54+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import * as vscode from "vscode";
2+
3+
export class QueryTreeViewItem extends vscode.TreeItem {
4+
constructor(
5+
public readonly label: string,
6+
public readonly tooltip: string | undefined,
7+
public readonly children: QueryTreeViewItem[],
8+
) {
9+
super(label);
10+
}
11+
}

0 commit comments

Comments
 (0)