From e1d86d0bda2e888f91aaa877a4102c252f33a2fc Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Tue, 21 Jul 2020 18:20:19 +0200 Subject: [PATCH] fixed the programmer menu. Signed-off-by: Akos Kitta --- .../browser/arduino-ide-frontend-module.ts | 2 +- ...updater.ts => boards-data-menu-updater.ts} | 37 +++++++++++-------- .../src/browser/boards/boards-data-store.ts | 17 ++++++--- 3 files changed, 34 insertions(+), 22 deletions(-) rename arduino-ide-extension/src/browser/boards/{boards-details-menu-updater.ts => boards-data-menu-updater.ts} (74%) diff --git a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts index d7e3f1aa..80b742d6 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -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'; diff --git a/arduino-ide-extension/src/browser/boards/boards-details-menu-updater.ts b/arduino-ide-extension/src/browser/boards/boards-data-menu-updater.ts similarity index 74% rename from arduino-ide-extension/src/browser/boards/boards-details-menu-updater.ts rename to arduino-ide-extension/src/browser/boards/boards-data-menu-updater.ts index 8a135703..24eba9b2 100644 --- a/arduino-ide-extension/src/browser/boards/boards-details-menu-updater.ts +++ b/arduino-ide-extension/src/browser/boards/boards-data-menu-updater.ts @@ -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,24 +60,31 @@ 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)); }) ]); } - const programmersMenuPath = [...ArduinoMenus.TOOLS, 'z02_programmers']; - 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 }); - this.toDisposeOnBoardChange.pushAll([ - this.commandRegistry.registerCommand(command, handler), - Disposable.create(() => this.menuRegistry.unregisterMenuAction(command, menuPath)) - ]); + 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 command = { id: `${fqbn}-programmer--${id}` }; + 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.unregisterSubmenu(programmersMenuPath)), + Disposable.create(() => this.menuRegistry.unregisterMenuAction(command, programmersMenuPath)) + ]); + } } this.mainMenuManager.update(); } diff --git a/arduino-ide-extension/src/browser/boards/boards-data-store.ts b/arduino-ide-extension/src/browser/boards/boards-data-store.ts index 8ef40676..155a2169 100644 --- a/arduino-ide-extension/src/browser/boards/boards-data-store.ts +++ b/arduino-ide-extension/src/browser/boards/boards-data-store.ts @@ -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 = this.getBoardsPackageVersion(fqbn)): Promise { - 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 = this.getBoardsPackageVersion(fqbn)): Promise { - 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 = {