fixed the programmer menu.

Signed-off-by: Akos Kitta <kittaakos@typefox.io>
This commit is contained in:
Akos Kitta 2020-07-21 18:20:19 +02:00
parent e77c9721cd
commit e1d86d0bda
3 changed files with 34 additions and 22 deletions

View File

@ -82,7 +82,7 @@ import {
} from '@theia/core/lib/browser/connection-status-service';
import { ConfigServiceClientImpl } from './config-service-client-impl';
import { CoreServiceClientImpl } from './core-service-client-impl';
import { BoardsDataMenuUpdater } from './boards/boards-details-menu-updater';
import { BoardsDataMenuUpdater } from './boards/boards-data-menu-updater';
import { BoardsDataStore } from './boards/boards-data-store';
import { ILogger } from '@theia/core';
import { FileSystemExt, FileSystemExtPath } from '../common/protocol/filesystem-ext';

View File

@ -3,7 +3,7 @@ import { CommandRegistry } from '@theia/core/lib/common/command';
import { MenuModelRegistry, MenuNode } from '@theia/core/lib/common/menu';
import { Disposable, DisposableCollection } from '@theia/core/lib/common/disposable';
import { BoardsServiceClientImpl } from './boards-service-client-impl';
import { Board, ConfigOption } from '../../common/protocol';
import { Board, ConfigOption, Programmer } from '../../common/protocol';
import { FrontendApplicationContribution } from '@theia/core/lib/browser';
import { BoardsDataStore } from './boards-data-store';
import { MainMenuManager } from '../../common/main-menu-manager';
@ -41,7 +41,7 @@ export class BoardsDataMenuUpdater implements FrontendApplicationContribution {
this.mainMenuManager.update();
const { fqbn } = selectedBoard;
if (fqbn) {
const { configOptions, programmers } = await this.boardsDataStore.getData(fqbn);
const { configOptions, programmers, selectedProgrammer } = await this.boardsDataStore.getData(fqbn);
const boardsConfigMenuPath = [...ArduinoMenus.TOOLS, 'z01_boardsConfig']; // `z_` is for ordering.
for (const { label, option, values } of configOptions.sort(ConfigOption.LABEL_COMPARATOR)) {
const menuPath = [...boardsConfigMenuPath, `${option}`];
@ -60,25 +60,32 @@ export class BoardsDataMenuUpdater implements FrontendApplicationContribution {
this.toDisposeOnBoardChange.pushAll([
...commands.values(),
Disposable.create(() => this.unregisterSubmenu(menuPath)), // We cannot dispose submenu entries: https://github.com/eclipse-theia/theia/issues/7299
...Array.from(commands.keys()).map((commandId, index) => {
...Array.from(commands.keys()).map((commandId, i) => {
const { label } = commands.get(commandId)!;
this.menuRegistry.registerMenuAction(menuPath, { commandId, order: String(index), label });
this.menuRegistry.registerMenuAction(menuPath, { commandId, order: `${i}`, label });
return Disposable.create(() => this.menuRegistry.unregisterMenuAction(commandId));
})
]);
}
if (programmers.length) {
const programmersMenuPath = [...ArduinoMenus.TOOLS, 'z02_programmers'];
const label = selectedProgrammer ? `Programmer: ${selectedProgrammer.name}` : 'Programmer'
this.menuRegistry.registerSubmenu(programmersMenuPath, label);
for (const programmer of programmers) {
const { id, name } = programmer;
const menuPath = [...programmersMenuPath, `${name}`];
const command = { id: `${fqbn}-programmer--${id}` };
const handler = { execute: () => this.boardsDataStore.selectProgrammer({ fqbn, programmer }) };
this.menuRegistry.registerMenuAction(menuPath, { commandId: command.id, label: name });
const handler = {
execute: () => this.boardsDataStore.selectProgrammer({ fqbn, selectedProgrammer: programmer }),
isToggled: () => Programmer.equals(programmer, selectedProgrammer)
};
this.menuRegistry.registerMenuAction(programmersMenuPath, { commandId: command.id, label: name });
this.toDisposeOnBoardChange.pushAll([
this.commandRegistry.registerCommand(command, handler),
Disposable.create(() => this.menuRegistry.unregisterMenuAction(command, menuPath))
Disposable.create(() => this.unregisterSubmenu(programmersMenuPath)),
Disposable.create(() => this.menuRegistry.unregisterMenuAction(command, programmersMenuPath))
]);
}
}
this.mainMenuManager.update();
}
}

View File

@ -92,11 +92,12 @@ export class BoardsDataStore implements FrontendApplicationContribution {
}
async selectProgrammer(
{ fqbn, programmer }: { fqbn: string, programmer: Programmer },
{ fqbn, selectedProgrammer }: { fqbn: string, selectedProgrammer: Programmer },
boardsPackageVersion: MaybePromise<Installable.Version | undefined> = this.getBoardsPackageVersion(fqbn)): Promise<boolean> {
const { configOptions, programmers } = deepClone(await this.getData(fqbn, boardsPackageVersion));
if (!programmers.find(p => Programmer.equals(programmer, p))) {
const data = deepClone(await this.getData(fqbn, boardsPackageVersion));
const { programmers } = data;
if (!programmers.find(p => Programmer.equals(selectedProgrammer, p))) {
return false;
}
@ -104,7 +105,8 @@ export class BoardsDataStore implements FrontendApplicationContribution {
if (!version) {
return false;
}
await this.setData({ fqbn, data: { configOptions, programmers }, version });
await this.setData({ fqbn, data: { ...data, selectedProgrammer }, version });
this.fireChanged();
return true;
}
@ -113,7 +115,8 @@ export class BoardsDataStore implements FrontendApplicationContribution {
{ fqbn, option, selectedValue }: { fqbn: string, option: string, selectedValue: string },
boardsPackageVersion: MaybePromise<Installable.Version | undefined> = this.getBoardsPackageVersion(fqbn)): Promise<boolean> {
const { configOptions, programmers } = deepClone(await this.getData(fqbn, boardsPackageVersion));
const data = deepClone(await this.getData(fqbn, boardsPackageVersion));
const { configOptions } = data;
const configOption = configOptions.find(c => c.option === option);
if (!configOption) {
return false;
@ -134,7 +137,8 @@ export class BoardsDataStore implements FrontendApplicationContribution {
if (!version) {
return false;
}
await this.setData({ fqbn, data: { configOptions, programmers }, version });
await this.setData({ fqbn, data, version });
this.fireChanged();
return true;
}
@ -185,6 +189,7 @@ export namespace BoardsDataStore {
export interface Data {
readonly configOptions: ConfigOption[];
readonly programmers: Programmer[];
readonly selectedProgrammer?: Programmer;
}
export namespace Data {
export const EMPTY: Data = {