Skip to content

Commit e1d86d0

Browse files
author
Akos Kitta
committed
fixed the programmer menu.
Signed-off-by: Akos Kitta <kittaakos@typefox.io>
1 parent e77c972 commit e1d86d0

File tree

3 files changed

+34
-22
lines changed

3 files changed

+34
-22
lines changed

arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ import {
8282
} from '@theia/core/lib/browser/connection-status-service';
8383
import { ConfigServiceClientImpl } from './config-service-client-impl';
8484
import { CoreServiceClientImpl } from './core-service-client-impl';
85-
import { BoardsDataMenuUpdater } from './boards/boards-details-menu-updater';
85+
import { BoardsDataMenuUpdater } from './boards/boards-data-menu-updater';
8686
import { BoardsDataStore } from './boards/boards-data-store';
8787
import { ILogger } from '@theia/core';
8888
import { FileSystemExt, FileSystemExtPath } from '../common/protocol/filesystem-ext';

arduino-ide-extension/src/browser/boards/boards-details-menu-updater.ts renamed to arduino-ide-extension/src/browser/boards/boards-data-menu-updater.ts

+22-15
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { CommandRegistry } from '@theia/core/lib/common/command';
33
import { MenuModelRegistry, MenuNode } from '@theia/core/lib/common/menu';
44
import { Disposable, DisposableCollection } from '@theia/core/lib/common/disposable';
55
import { BoardsServiceClientImpl } from './boards-service-client-impl';
6-
import { Board, ConfigOption } from '../../common/protocol';
6+
import { Board, ConfigOption, Programmer } from '../../common/protocol';
77
import { FrontendApplicationContribution } from '@theia/core/lib/browser';
88
import { BoardsDataStore } from './boards-data-store';
99
import { MainMenuManager } from '../../common/main-menu-manager';
@@ -41,7 +41,7 @@ export class BoardsDataMenuUpdater implements FrontendApplicationContribution {
4141
this.mainMenuManager.update();
4242
const { fqbn } = selectedBoard;
4343
if (fqbn) {
44-
const { configOptions, programmers } = await this.boardsDataStore.getData(fqbn);
44+
const { configOptions, programmers, selectedProgrammer } = await this.boardsDataStore.getData(fqbn);
4545
const boardsConfigMenuPath = [...ArduinoMenus.TOOLS, 'z01_boardsConfig']; // `z_` is for ordering.
4646
for (const { label, option, values } of configOptions.sort(ConfigOption.LABEL_COMPARATOR)) {
4747
const menuPath = [...boardsConfigMenuPath, `${option}`];
@@ -60,24 +60,31 @@ export class BoardsDataMenuUpdater implements FrontendApplicationContribution {
6060
this.toDisposeOnBoardChange.pushAll([
6161
...commands.values(),
6262
Disposable.create(() => this.unregisterSubmenu(menuPath)), // We cannot dispose submenu entries: https://github.com/eclipse-theia/theia/issues/7299
63-
...Array.from(commands.keys()).map((commandId, index) => {
63+
...Array.from(commands.keys()).map((commandId, i) => {
6464
const { label } = commands.get(commandId)!;
65-
this.menuRegistry.registerMenuAction(menuPath, { commandId, order: String(index), label });
65+
this.menuRegistry.registerMenuAction(menuPath, { commandId, order: `${i}`, label });
6666
return Disposable.create(() => this.menuRegistry.unregisterMenuAction(commandId));
6767
})
6868
]);
6969
}
70-
const programmersMenuPath = [...ArduinoMenus.TOOLS, 'z02_programmers'];
71-
for (const programmer of programmers) {
72-
const { id, name } = programmer;
73-
const menuPath = [...programmersMenuPath, `${name}`];
74-
const command = { id: `${fqbn}-programmer--${id}` };
75-
const handler = { execute: () => this.boardsDataStore.selectProgrammer({ fqbn, programmer }) };
76-
this.menuRegistry.registerMenuAction(menuPath, { commandId: command.id, label: name });
77-
this.toDisposeOnBoardChange.pushAll([
78-
this.commandRegistry.registerCommand(command, handler),
79-
Disposable.create(() => this.menuRegistry.unregisterMenuAction(command, menuPath))
80-
]);
70+
if (programmers.length) {
71+
const programmersMenuPath = [...ArduinoMenus.TOOLS, 'z02_programmers'];
72+
const label = selectedProgrammer ? `Programmer: ${selectedProgrammer.name}` : 'Programmer'
73+
this.menuRegistry.registerSubmenu(programmersMenuPath, label);
74+
for (const programmer of programmers) {
75+
const { id, name } = programmer;
76+
const command = { id: `${fqbn}-programmer--${id}` };
77+
const handler = {
78+
execute: () => this.boardsDataStore.selectProgrammer({ fqbn, selectedProgrammer: programmer }),
79+
isToggled: () => Programmer.equals(programmer, selectedProgrammer)
80+
};
81+
this.menuRegistry.registerMenuAction(programmersMenuPath, { commandId: command.id, label: name });
82+
this.toDisposeOnBoardChange.pushAll([
83+
this.commandRegistry.registerCommand(command, handler),
84+
Disposable.create(() => this.unregisterSubmenu(programmersMenuPath)),
85+
Disposable.create(() => this.menuRegistry.unregisterMenuAction(command, programmersMenuPath))
86+
]);
87+
}
8188
}
8289
this.mainMenuManager.update();
8390
}

arduino-ide-extension/src/browser/boards/boards-data-store.ts

+11-6
Original file line numberDiff line numberDiff line change
@@ -92,19 +92,21 @@ export class BoardsDataStore implements FrontendApplicationContribution {
9292
}
9393

9494
async selectProgrammer(
95-
{ fqbn, programmer }: { fqbn: string, programmer: Programmer },
95+
{ fqbn, selectedProgrammer }: { fqbn: string, selectedProgrammer: Programmer },
9696
boardsPackageVersion: MaybePromise<Installable.Version | undefined> = this.getBoardsPackageVersion(fqbn)): Promise<boolean> {
9797

98-
const { configOptions, programmers } = deepClone(await this.getData(fqbn, boardsPackageVersion));
99-
if (!programmers.find(p => Programmer.equals(programmer, p))) {
98+
const data = deepClone(await this.getData(fqbn, boardsPackageVersion));
99+
const { programmers } = data;
100+
if (!programmers.find(p => Programmer.equals(selectedProgrammer, p))) {
100101
return false;
101102
}
102103

103104
const version = await boardsPackageVersion;
104105
if (!version) {
105106
return false;
106107
}
107-
await this.setData({ fqbn, data: { configOptions, programmers }, version });
108+
109+
await this.setData({ fqbn, data: { ...data, selectedProgrammer }, version });
108110
this.fireChanged();
109111
return true;
110112
}
@@ -113,7 +115,8 @@ export class BoardsDataStore implements FrontendApplicationContribution {
113115
{ fqbn, option, selectedValue }: { fqbn: string, option: string, selectedValue: string },
114116
boardsPackageVersion: MaybePromise<Installable.Version | undefined> = this.getBoardsPackageVersion(fqbn)): Promise<boolean> {
115117

116-
const { configOptions, programmers } = deepClone(await this.getData(fqbn, boardsPackageVersion));
118+
const data = deepClone(await this.getData(fqbn, boardsPackageVersion));
119+
const { configOptions } = data;
117120
const configOption = configOptions.find(c => c.option === option);
118121
if (!configOption) {
119122
return false;
@@ -134,7 +137,8 @@ export class BoardsDataStore implements FrontendApplicationContribution {
134137
if (!version) {
135138
return false;
136139
}
137-
await this.setData({ fqbn, data: { configOptions, programmers }, version });
140+
141+
await this.setData({ fqbn, data, version });
138142
this.fireChanged();
139143
return true;
140144
}
@@ -185,6 +189,7 @@ export namespace BoardsDataStore {
185189
export interface Data {
186190
readonly configOptions: ConfigOption[];
187191
readonly programmers: Programmer[];
192+
readonly selectedProgrammer?: Programmer;
188193
}
189194
export namespace Data {
190195
export const EMPTY: Data = {

0 commit comments

Comments
 (0)