Skip to content

Commit a2f8c85

Browse files
committed
Add command to sort databases by name
This assumes that we will be adding other sorting mechanisms in the future, like sort by data added. Not happy with the icon I chose, but I didn't want to spend too much time creating a new one.
1 parent 62d9efc commit a2f8c85

File tree

4 files changed

+66
-6
lines changed

4 files changed

+66
-6
lines changed
Lines changed: 3 additions & 0 deletions
Loading
Lines changed: 3 additions & 0 deletions
Loading

extensions/ql-vscode/package.json

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,14 @@
206206
"command": "codeQLDatabases.upgradeDatabase",
207207
"title": "Upgrade Database"
208208
},
209+
{
210+
"command": "codeQLDatabases.sortByName",
211+
"title": "Sort by Name",
212+
"icon": {
213+
"light": "media/light/sort-precedence.svg",
214+
"dark": "media/dark/sort-precedence.svg"
215+
}
216+
},
209217
{
210218
"command": "codeQL.checkForUpdatesToCLI",
211219
"title": "CodeQL: Check for CLI Updates"
@@ -257,6 +265,11 @@
257265
],
258266
"menus": {
259267
"view/title": [
268+
{
269+
"command": "codeQLDatabases.sortByName",
270+
"when": "view == codeQLDatabases",
271+
"group": "navigation"
272+
},
260273
{
261274
"command": "codeQL.chooseDatabase",
262275
"when": "view == codeQLDatabases",
@@ -344,6 +357,10 @@
344357
"command": "codeQLDatabases.setCurrentDatabase",
345358
"when": "false"
346359
},
360+
{
361+
"command": "codeQLDatabases.sortByName",
362+
"when": "false"
363+
},
347364
{
348365
"command": "codeQLDatabases.removeDatabase",
349366
"when": "false"

extensions/ql-vscode/src/databases-ui.ts

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,19 @@ function joinThemableIconPath(base: string, iconPath: ThemableIconPath): Themabl
3434
return path.join(base, iconPath);
3535
}
3636

37+
enum SortOrder {
38+
NameAsc = 'NameAsc',
39+
NameDesc = 'NameDesc'
40+
}
41+
3742
/**
3843
* Tree data provider for the databases view.
3944
*/
4045
class DatabaseTreeDataProvider extends DisposableObject
4146
implements TreeDataProvider<DatabaseItem> {
4247

48+
private _sortOrder = SortOrder.NameAsc;
49+
4350
private readonly _onDidChangeTreeData = new EventEmitter<DatabaseItem | undefined>();
4451
private currentDatabaseItem: DatabaseItem | undefined;
4552

@@ -84,7 +91,14 @@ class DatabaseTreeDataProvider extends DisposableObject
8491

8592
public getChildren(element?: DatabaseItem): ProviderResult<DatabaseItem[]> {
8693
if (element === undefined) {
87-
return this.databaseManager.databaseItems.slice(0);
94+
return this.databaseManager.databaseItems.slice(0).sort((db1, db2) => {
95+
switch(this.sortOrder) {
96+
case SortOrder.NameAsc:
97+
return db1.name.localeCompare(db2.name);
98+
case SortOrder.NameDesc:
99+
return db2.name.localeCompare(db1.name);
100+
}
101+
});
88102
}
89103
else {
90104
return [];
@@ -98,6 +112,15 @@ class DatabaseTreeDataProvider extends DisposableObject
98112
public getCurrent(): DatabaseItem | undefined {
99113
return this.currentDatabaseItem;
100114
}
115+
116+
public get sortOrder() {
117+
return this._sortOrder;
118+
}
119+
120+
public set sortOrder(newSortOrder: SortOrder) {
121+
this._sortOrder = newSortOrder;
122+
this._onDidChangeTreeData.fire();
123+
}
101124
}
102125

103126
/** Gets the first element in the given list, if any, or undefined if the list is empty or undefined. */
@@ -129,19 +152,25 @@ async function chooseDatabaseDir(): Promise<Uri | undefined> {
129152
}
130153

131154
export class DatabaseUI extends DisposableObject {
132-
public constructor(ctx: ExtensionContext, private cliserver: cli.CodeQLCliServer, private databaseManager: DatabaseManager,
133-
private readonly queryServer: qsClient.QueryServerClient | undefined) {
134-
155+
private treeDataProvider: DatabaseTreeDataProvider;
156+
157+
public constructor(
158+
ctx: ExtensionContext,
159+
private cliserver: cli.CodeQLCliServer,
160+
private databaseManager: DatabaseManager,
161+
private readonly queryServer: qsClient.QueryServerClient | undefined
162+
) {
135163
super();
136164

137-
const treeDataProvider = this.push(new DatabaseTreeDataProvider(ctx, databaseManager));
138-
this.push(window.createTreeView('codeQLDatabases', { treeDataProvider }));
165+
this.treeDataProvider = this.push(new DatabaseTreeDataProvider(ctx, databaseManager));
166+
this.push(window.createTreeView('codeQLDatabases', { treeDataProvider: this.treeDataProvider }));
139167

140168
ctx.subscriptions.push(commands.registerCommand('codeQL.chooseDatabase', this.handleChooseDatabase));
141169
ctx.subscriptions.push(commands.registerCommand('codeQL.setCurrentDatabase', this.handleSetCurrentDatabase));
142170
ctx.subscriptions.push(commands.registerCommand('codeQL.upgradeCurrentDatabase', this.handleUpgradeCurrentDatabase));
143171
ctx.subscriptions.push(commands.registerCommand('codeQL.clearCache', this.handleClearCache));
144172
ctx.subscriptions.push(commands.registerCommand('codeQLDatabases.setCurrentDatabase', this.handleMakeCurrentDatabase));
173+
ctx.subscriptions.push(commands.registerCommand('codeQLDatabases.sortByName', this.handleSortByName));
145174
ctx.subscriptions.push(commands.registerCommand('codeQLDatabases.removeDatabase', this.handleRemoveDatabase));
146175
ctx.subscriptions.push(commands.registerCommand('codeQLDatabases.upgradeDatabase', this.handleUpgradeDatabase));
147176
}
@@ -154,6 +183,14 @@ export class DatabaseUI extends DisposableObject {
154183
return await this.chooseAndSetDatabase();
155184
}
156185

186+
private handleSortByName = async () => {
187+
if (this.treeDataProvider.sortOrder === SortOrder.NameAsc) {
188+
this.treeDataProvider.sortOrder = SortOrder.NameDesc;
189+
} else {
190+
this.treeDataProvider.sortOrder = SortOrder.NameAsc;
191+
}
192+
}
193+
157194
private handleUpgradeCurrentDatabase = async (): Promise<void> => {
158195
await this.handleUpgradeDatabase(this.databaseManager.currentDatabaseItem);
159196
}

0 commit comments

Comments
 (0)