Skip to content

Commit e77b924

Browse files
author
Akos Kitta
committed
fix: board comparison in board+port select dialog
made "equals" check stricter. if fqbns present, they must be equal: do not fall back to board name compare. Signed-off-by: Akos Kitta <[email protected]>
1 parent a463091 commit e77b924

File tree

3 files changed

+44
-34
lines changed

3 files changed

+44
-34
lines changed

Diff for: arduino-ide-extension/src/browser/boards/boards-config-component.tsx

+3-6
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import * as React from '@theia/core/shared/react';
66
import {
77
Board,
88
BoardIdentifier,
9-
BoardsConfig,
109
BoardWithPackage,
1110
DetectedPort,
1211
findMatchingPortIndex,
@@ -15,14 +14,15 @@ import {
1514
} from '../../common/protocol/boards-service';
1615
import { Defined } from '../../common/types';
1716
import { NotificationCenter } from '../notification-center';
17+
import { BoardsConfigDialogState } from './boards-config-dialog';
1818
import { EditBoardsConfigActionParams } from './boards-service-provider';
1919

2020
namespace BoardsConfigComponent {
2121
export interface Props {
2222
/**
2323
* This is not the real config, it's only living in the dialog. Users can change it without update and can cancel any modifications.
2424
*/
25-
readonly boardsConfig: BoardsConfig;
25+
readonly boardsConfig: BoardsConfigDialogState;
2626
readonly notificationCenter: NotificationCenter;
2727
readonly appState: FrontendApplicationState;
2828
readonly onFocusNodeSet: (element: HTMLElement | undefined) => void;
@@ -187,10 +187,7 @@ export class BoardsConfigComponent extends React.Component<
187187
};
188188

189189
private readonly selectBoard = (selectedBoard: BoardWithPackage) => {
190-
this.props.onBoardSelected({
191-
fqbn: selectedBoard.fqbn,
192-
name: selectedBoard.name,
193-
});
190+
this.props.onBoardSelected(selectedBoard);
194191
};
195192

196193
private readonly focusNodeSet = (element: HTMLElement | null) => {

Diff for: arduino-ide-extension/src/browser/boards/boards-config-dialog.tsx

+8-5
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import {
1212
import React from '@theia/core/shared/react';
1313
import type { ReactNode } from '@theia/core/shared/react/index';
1414
import {
15-
BoardIdentifier,
1615
BoardsConfig,
1716
BoardWithPackage,
1817
DetectedPort,
@@ -31,8 +30,12 @@ import {
3130
@injectable()
3231
export class BoardsConfigDialogProps extends DialogProps {}
3332

33+
export type BoardsConfigDialogState = Omit<BoardsConfig, 'selectedBoard'> & {
34+
selectedBoard: BoardsConfig['selectedBoard'] | BoardWithPackage;
35+
};
36+
3437
@injectable()
35-
export class BoardsConfigDialog extends ReactDialog<BoardsConfig> {
38+
export class BoardsConfigDialog extends ReactDialog<BoardsConfigDialogState> {
3639
@inject(BoardsServiceProvider)
3740
private readonly boardsServiceProvider: BoardsServiceProvider;
3841
@inject(NotificationCenter)
@@ -43,7 +46,7 @@ export class BoardsConfigDialog extends ReactDialog<BoardsConfig> {
4346
private readonly onFilterTextDidChangeEmitter: Emitter<
4447
Defined<EditBoardsConfigActionParams['query']>
4548
>;
46-
private readonly onBoardSelected = (board: BoardIdentifier): void => {
49+
private readonly onBoardSelected = (board: BoardWithPackage): void => {
4750
this._boardsConfig.selectedBoard = board;
4851
this.update();
4952
};
@@ -64,7 +67,7 @@ export class BoardsConfigDialog extends ReactDialog<BoardsConfig> {
6467
): readonly DetectedPort[] => {
6568
return this.boardsServiceProvider.boardList.ports(predicate);
6669
};
67-
private _boardsConfig: BoardsConfig;
70+
private _boardsConfig: BoardsConfigDialogState;
6871
private focusNode: HTMLElement | undefined;
6972

7073
constructor(
@@ -181,7 +184,7 @@ export class BoardsConfigDialog extends ReactDialog<BoardsConfig> {
181184
return '';
182185
}
183186

184-
get value(): BoardsConfig {
187+
get value(): BoardsConfigDialogState {
185188
return this._boardsConfig;
186189
}
187190
}

Diff for: arduino-ide-extension/src/common/protocol/boards-service.ts

+33-23
Original file line numberDiff line numberDiff line change
@@ -483,9 +483,10 @@ export namespace Board {
483483
manuallyInstalled: boolean;
484484
}>;
485485
export function decorateBoards(
486-
selectedBoard: BoardIdentifier | undefined,
486+
selectedBoard: BoardIdentifier | BoardWithPackage | undefined,
487487
boards: Array<BoardWithPackage>
488488
): Array<Detailed> {
489+
let foundSelected = false;
489490
// Board names are not unique. We show the corresponding core name as a detail.
490491
// https://github.com/arduino/arduino-cli/pull/294#issuecomment-513764948
491492
const distinctBoardNames = new Map<string, number>();
@@ -496,36 +497,47 @@ export namespace Board {
496497
const selectedBoardPackageId = selectedBoard
497498
? createPlatformIdentifier(selectedBoard)
498499
: undefined;
499-
// Due to the non-unique board names, IDE2 has to check the package name.
500-
const selected = (board: BoardWithPackage) => {
501-
if (!!selectedBoard) {
502-
if (
503-
boardIdentifierEquals(
504-
{ name: board.name, fqbn: board.fqbn },
505-
selectedBoard
506-
)
507-
) {
500+
const selectedBoardFqbn = selectedBoard?.fqbn;
501+
// Due to the non-unique board names, IDE2 has to check the package name when boards are not installed and the FQBN is absent.
502+
const isSelected = (board: BoardWithPackage) => {
503+
if (!selectedBoard) {
504+
return false;
505+
}
506+
if (foundSelected) {
507+
return false;
508+
}
509+
let selected = false;
510+
if (board.fqbn && selectedBoardFqbn) {
511+
if (boardIdentifierEquals(board, selectedBoard)) {
512+
selected = true;
513+
}
514+
}
515+
if (!selected) {
516+
if (board.name === selectedBoard.name) {
508517
if (selectedBoardPackageId) {
509-
return platformIdentifierEquals(
510-
selectedBoardPackageId,
511-
board.packageId
512-
);
518+
const boardPackageId = createPlatformIdentifier(board);
519+
if (boardPackageId) {
520+
if (
521+
platformIdentifierEquals(boardPackageId, selectedBoardPackageId)
522+
) {
523+
selected = true;
524+
}
525+
}
513526
}
514-
if (!board.fqbn && board.name === selectedBoard.name) {
515-
return true;
516-
}
517-
return false;
518527
}
519528
}
520-
return false;
529+
if (selected) {
530+
foundSelected = true;
531+
}
532+
return selected;
521533
};
522534
return boards.map((board) => ({
523535
...board,
524536
details:
525537
(distinctBoardNames.get(board.name) || 0) > 1
526538
? ` - ${board.packageName}`
527539
: undefined,
528-
selected: selected(board),
540+
selected: isSelected(board),
529541
missing: !installed(board),
530542
}));
531543
}
@@ -711,9 +723,7 @@ export function boardIdentifierEquals(
711723
if (left.fqbn && right.fqbn) {
712724
const leftFqbn = options.looseFqbn ? sanitizeFqbn(left.fqbn) : left.fqbn;
713725
const rightFqbn = options.looseFqbn ? sanitizeFqbn(right.fqbn) : right.fqbn;
714-
if (leftFqbn === rightFqbn) {
715-
return true;
716-
}
726+
return leftFqbn === rightFqbn;
717727
}
718728
// No more Genuino hack.
719729
// https://github.com/arduino/arduino-ide/blob/f6a43254f5c416a2e4fa888875358336b42dd4d5/arduino-ide-extension/src/common/protocol/boards-service.ts#L572-L581

0 commit comments

Comments
 (0)