From 3546f20df72519b08ad40f0ff2dbec5aac731e65 Mon Sep 17 00:00:00 2001 From: Alberto Iannaccone Date: Tue, 4 Oct 2022 10:59:11 +0200 Subject: [PATCH 1/5] Fix boards listing --- .../browser/contributions/board-selection.ts | 29 ++++++++++++------- .../src/node/boards-service-impl.ts | 8 ++--- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/arduino-ide-extension/src/browser/contributions/board-selection.ts b/arduino-ide-extension/src/browser/contributions/board-selection.ts index 037587d99..696d2b3f9 100644 --- a/arduino-ide-extension/src/browser/contributions/board-selection.ts +++ b/arduino-ide-extension/src/browser/contributions/board-selection.ts @@ -199,14 +199,15 @@ PID: ${PID}`; }); // Installed boards - for (const board of installedBoards) { + installedBoards.forEach((board, index) => { const { packageId, packageName, fqbn, name, manuallyInstalled } = board; const packageLabel = packageName + - `${manuallyInstalled - ? nls.localize('arduino/board/inSketchbook', ' (in Sketchbook)') - : '' + `${ + manuallyInstalled + ? nls.localize('arduino/board/inSketchbook', ' (in Sketchbook)') + : '' }`; // Platform submenu const platformMenuPath = [...boardsPackagesGroup, packageId]; @@ -239,14 +240,18 @@ PID: ${PID}`; }; // Board menu - const menuAction = { commandId: id, label: name }; + const menuAction = { + commandId: id, + label: name, + order: `${index}`, + }; this.commandRegistry.registerCommand(command, handler); this.toDisposeBeforeMenuRebuild.push( Disposable.create(() => this.commandRegistry.unregisterCommand(command)) ); this.menuModelRegistry.registerMenuAction(platformMenuPath, menuAction); // Note: we do not dispose the menu actions individually. Calling `unregisterSubmenu` on the parent will wipe the children menu nodes recursively. - } + }); // Installed ports const registerPorts = ( @@ -282,11 +287,13 @@ PID: ${PID}`; // First we show addresses with recognized boards connected, // then all the rest. - const sortedIDs = Object.keys(ports).sort((left: string, right: string): number => { - const [, leftBoards] = ports[left]; - const [, rightBoards] = ports[right]; - return rightBoards.length - leftBoards.length; - }); + const sortedIDs = Object.keys(ports).sort( + (left: string, right: string): number => { + const [, leftBoards] = ports[left]; + const [, rightBoards] = ports[right]; + return rightBoards.length - leftBoards.length; + } + ); for (let i = 0; i < sortedIDs.length; i++) { const portID = sortedIDs[i]; diff --git a/arduino-ide-extension/src/node/boards-service-impl.ts b/arduino-ide-extension/src/node/boards-service-impl.ts index 12c3fe354..e2b595080 100644 --- a/arduino-ide-extension/src/node/boards-service-impl.ts +++ b/arduino-ide-extension/src/node/boards-service-impl.ts @@ -32,7 +32,7 @@ import { CoreClientAware } from './core-client-provider'; import { BoardDetailsRequest, BoardDetailsResponse, - BoardSearchRequest, + BoardListAllRequest, } from './cli-protocol/cc/arduino/cli/commands/v1/board_pb'; import { ListProgrammersAvailableForUploadRequest, @@ -196,11 +196,11 @@ export class BoardsServiceImpl query?: string; }): Promise { const { instance, client } = await this.coreClient; - const req = new BoardSearchRequest(); - req.setSearchArgs(query || ''); + const req = new BoardListAllRequest(); + req.addSearchArgs(query || ''); req.setInstance(instance); const boards = await new Promise((resolve, reject) => { - client.boardSearch(req, (error, resp) => { + client.boardListAll(req, (error, resp) => { if (error) { reject(error); return; From dd0205cb893179dafbdcec1c321de4d127a09654 Mon Sep 17 00:00:00 2001 From: Alberto Iannaccone Date: Tue, 4 Oct 2022 11:08:48 +0200 Subject: [PATCH 2/5] use arduio-cli sorting fix --- .../browser/contributions/board-selection.ts | 2 +- .../src/common/protocol/boards-service.ts | 1 + .../src/node/boards-service-impl.ts | 32 ++++++++++++++++++- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/arduino-ide-extension/src/browser/contributions/board-selection.ts b/arduino-ide-extension/src/browser/contributions/board-selection.ts index 696d2b3f9..2241c9259 100644 --- a/arduino-ide-extension/src/browser/contributions/board-selection.ts +++ b/arduino-ide-extension/src/browser/contributions/board-selection.ts @@ -361,7 +361,7 @@ PID: ${PID}`; } protected async installedBoards(): Promise { - const allBoards = await this.boardsService.searchBoards({}); + const allBoards = await this.boardsService.getInstalledBoards(); return allBoards.filter(InstalledBoardWithPackage.is); } } diff --git a/arduino-ide-extension/src/common/protocol/boards-service.ts b/arduino-ide-extension/src/common/protocol/boards-service.ts index 763fc9bd6..602ea501a 100644 --- a/arduino-ide-extension/src/common/protocol/boards-service.ts +++ b/arduino-ide-extension/src/common/protocol/boards-service.ts @@ -141,6 +141,7 @@ export interface BoardsService fqbn: string; }): Promise; searchBoards({ query }: { query?: string }): Promise; + getInstalledBoards(): Promise; getBoardUserFields(options: { fqbn: string; protocol: string; diff --git a/arduino-ide-extension/src/node/boards-service-impl.ts b/arduino-ide-extension/src/node/boards-service-impl.ts index e2b595080..d3243a30f 100644 --- a/arduino-ide-extension/src/node/boards-service-impl.ts +++ b/arduino-ide-extension/src/node/boards-service-impl.ts @@ -33,6 +33,7 @@ import { BoardDetailsRequest, BoardDetailsResponse, BoardListAllRequest, + BoardSearchRequest, } from './cli-protocol/cc/arduino/cli/commands/v1/board_pb'; import { ListProgrammersAvailableForUploadRequest, @@ -195,9 +196,38 @@ export class BoardsServiceImpl }: { query?: string; }): Promise { + const { instance, client } = await this.coreClient; + const req = new BoardSearchRequest(); + req.setSearchArgs(query || ''); + req.setInstance(instance); + const boards = await new Promise((resolve, reject) => { + client.boardSearch(req, (error, resp) => { + if (error) { + reject(error); + return; + } + const boards: Array = []; + for (const board of resp.getBoardsList()) { + const platform = board.getPlatform(); + if (platform) { + boards.push({ + name: board.getName(), + fqbn: board.getFqbn(), + packageId: platform.getId(), + packageName: platform.getName(), + manuallyInstalled: platform.getManuallyInstalled(), + }); + } + } + resolve(boards); + }); + }); + return boards; + } + + async getInstalledBoards(): Promise { const { instance, client } = await this.coreClient; const req = new BoardListAllRequest(); - req.addSearchArgs(query || ''); req.setInstance(instance); const boards = await new Promise((resolve, reject) => { client.boardListAll(req, (error, resp) => { From 2d9b0722afdfbab4173d6c31bbdece11cbdef492 Mon Sep 17 00:00:00 2001 From: Alberto Iannaccone Date: Tue, 4 Oct 2022 16:50:24 +0200 Subject: [PATCH 3/5] re-use code to handle board list response --- .../src/node/boards-service-impl.ts | 40 ++++++++----------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/arduino-ide-extension/src/node/boards-service-impl.ts b/arduino-ide-extension/src/node/boards-service-impl.ts index d3243a30f..203245ae4 100644 --- a/arduino-ide-extension/src/node/boards-service-impl.ts +++ b/arduino-ide-extension/src/node/boards-service-impl.ts @@ -33,6 +33,7 @@ import { BoardDetailsRequest, BoardDetailsResponse, BoardListAllRequest, + BoardListAllResponse, BoardSearchRequest, } from './cli-protocol/cc/arduino/cli/commands/v1/board_pb'; import { @@ -200,37 +201,28 @@ export class BoardsServiceImpl const req = new BoardSearchRequest(); req.setSearchArgs(query || ''); req.setInstance(instance); - const boards = await new Promise((resolve, reject) => { - client.boardSearch(req, (error, resp) => { - if (error) { - reject(error); - return; - } - const boards: Array = []; - for (const board of resp.getBoardsList()) { - const platform = board.getPlatform(); - if (platform) { - boards.push({ - name: board.getName(), - fqbn: board.getFqbn(), - packageId: platform.getId(), - packageName: platform.getName(), - manuallyInstalled: platform.getManuallyInstalled(), - }); - } - } - resolve(boards); - }); - }); - return boards; + return this.handleListBoards(client.boardSearch.bind(client), req); } async getInstalledBoards(): Promise { const { instance, client } = await this.coreClient; const req = new BoardListAllRequest(); req.setInstance(instance); + return this.handleListBoards(client.boardListAll.bind(client), req); + } + + async handleListBoards( + getBoards: ( + request: BoardListAllRequest | BoardSearchRequest, + callback: ( + error: ServiceError | null, + response: BoardListAllResponse + ) => void + ) => void, + request: BoardListAllRequest | BoardSearchRequest + ): Promise { const boards = await new Promise((resolve, reject) => { - client.boardListAll(req, (error, resp) => { + getBoards(request, (error, resp) => { if (error) { reject(error); return; From 36593e9b239b9c0c520da9dc984beec9109fd6e8 Mon Sep 17 00:00:00 2001 From: Alberto Iannaccone Date: Thu, 6 Oct 2022 10:55:29 +0200 Subject: [PATCH 4/5] change `handleListBoards` visibility to `private` --- arduino-ide-extension/src/node/boards-service-impl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arduino-ide-extension/src/node/boards-service-impl.ts b/arduino-ide-extension/src/node/boards-service-impl.ts index 203245ae4..523b3513f 100644 --- a/arduino-ide-extension/src/node/boards-service-impl.ts +++ b/arduino-ide-extension/src/node/boards-service-impl.ts @@ -211,7 +211,7 @@ export class BoardsServiceImpl return this.handleListBoards(client.boardListAll.bind(client), req); } - async handleListBoards( + private async handleListBoards( getBoards: ( request: BoardListAllRequest | BoardSearchRequest, callback: ( From 7d4a9773cdb7f1eea9cbb42cf3669513aa18e75f Mon Sep 17 00:00:00 2001 From: Alberto Iannaccone Date: Thu, 6 Oct 2022 12:27:59 +0200 Subject: [PATCH 5/5] pad menu items order with leading zeros to fix alphanumeric order --- .../src/browser/boards/boards-data-menu-updater.ts | 2 +- .../src/browser/contributions/board-selection.ts | 4 ++-- .../src/browser/contributions/sketch-control.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/src/browser/boards/boards-data-menu-updater.ts b/arduino-ide-extension/src/browser/boards/boards-data-menu-updater.ts index 5f1c42e51..192c32d78 100644 --- a/arduino-ide-extension/src/browser/boards/boards-data-menu-updater.ts +++ b/arduino-ide-extension/src/browser/boards/boards-data-menu-updater.ts @@ -111,7 +111,7 @@ export class BoardsDataMenuUpdater implements FrontendApplicationContribution { const { label } = commands.get(commandId)!; this.menuRegistry.registerMenuAction(menuPath, { commandId, - order: `${i}`, + order: String(i).padStart(4), label, }); return Disposable.create(() => diff --git a/arduino-ide-extension/src/browser/contributions/board-selection.ts b/arduino-ide-extension/src/browser/contributions/board-selection.ts index 2241c9259..0b468144d 100644 --- a/arduino-ide-extension/src/browser/contributions/board-selection.ts +++ b/arduino-ide-extension/src/browser/contributions/board-selection.ts @@ -243,7 +243,7 @@ PID: ${PID}`; const menuAction = { commandId: id, label: name, - order: `${index}`, + order: String(index).padStart(4), // pads with leading zeros for alphanumeric sort where order is 1, 2, 11, and NOT 1, 11, 2 }; this.commandRegistry.registerCommand(command, handler); this.toDisposeBeforeMenuRebuild.push( @@ -329,7 +329,7 @@ PID: ${PID}`; const menuAction = { commandId: id, label, - order: `${protocolOrder + i + 1}`, + order: String(protocolOrder + i + 1).padStart(4), }; this.commandRegistry.registerCommand(command, handler); this.toDisposeBeforeMenuRebuild.push( diff --git a/arduino-ide-extension/src/browser/contributions/sketch-control.ts b/arduino-ide-extension/src/browser/contributions/sketch-control.ts index f5cc85334..62f2d8ce8 100644 --- a/arduino-ide-extension/src/browser/contributions/sketch-control.ts +++ b/arduino-ide-extension/src/browser/contributions/sketch-control.ts @@ -176,7 +176,7 @@ export class SketchControl extends SketchContribution { { commandId: command.id, label: this.labelProvider.getName(uri), - order: `${i}`, + order: String(i).padStart(4), } ); this.toDisposeBeforeCreateNewContextMenu.push(