Skip to content

Commit 284181b

Browse files
Akos Kittakittaakos
Akos Kitta
authored andcommitted
ATL-811: Removed Run menu item from the app menu
It came from the `@theia/debug` extension. Signed-off-by: Akos Kitta <kittaakos@typefox.io>
1 parent db29670 commit 284181b

File tree

4 files changed

+44
-21
lines changed

4 files changed

+44
-21
lines changed

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

+5
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,8 @@ import { Debug } from './contributions/debug';
131131
import { DebugSessionManager } from './theia/debug/debug-session-manager';
132132
import { DebugSessionManager as TheiaDebugSessionManager } from '@theia/debug/lib/browser/debug-session-manager';
133133
import { Sketchbook } from './contributions/sketchbook';
134+
import { DebugFrontendApplicationContribution } from './theia/debug/debug-frontend-application-contribution';
135+
import { DebugFrontendApplicationContribution as TheiaDebugFrontendApplicationContribution } from '@theia/debug/lib/browser/debug-frontend-application-contribution';
134136

135137
const ElementQueries = require('css-element-queries/src/ElementQueries');
136138

@@ -363,4 +365,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
363365
// To avoid running `Save All` when there are no dirty editors before starting the debug session.
364366
bind(DebugSessionManager).toSelf().inSingletonScope();
365367
rebind(TheiaDebugSessionManager).toService(DebugSessionManager);
368+
// To remove the `Run` menu item from the application menu.
369+
bind(DebugFrontendApplicationContribution).toSelf().inSingletonScope();
370+
rebind(TheiaDebugFrontendApplicationContribution).toService(DebugFrontendApplicationContribution);
366371
});

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

+4-20
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import * as PQueue from 'p-queue';
22
import { inject, injectable } from 'inversify';
33
import { CommandRegistry } from '@theia/core/lib/common/command';
4-
import { MenuModelRegistry, MenuNode } from '@theia/core/lib/common/menu';
4+
import { MenuModelRegistry } from '@theia/core/lib/common/menu';
55
import { Disposable, DisposableCollection } from '@theia/core/lib/common/disposable';
66
import { BoardsServiceProvider } from './boards-service-provider';
77
import { Board, ConfigOption, Programmer } from '../../common/protocol';
88
import { FrontendApplicationContribution } from '@theia/core/lib/browser';
99
import { BoardsDataStore } from './boards-data-store';
1010
import { MainMenuManager } from '../../common/main-menu-manager';
11-
import { ArduinoMenus } from '../menu/arduino-menus';
11+
import { ArduinoMenus, unregisterSubmenu } from '../menu/arduino-menus';
1212

1313
@injectable()
1414
export class BoardsDataMenuUpdater implements FrontendApplicationContribution {
@@ -63,7 +63,7 @@ export class BoardsDataMenuUpdater implements FrontendApplicationContribution {
6363
this.menuRegistry.registerSubmenu(menuPath, label);
6464
this.toDisposeOnBoardChange.pushAll([
6565
...commands.values(),
66-
Disposable.create(() => this.unregisterSubmenu(menuPath)), // We cannot dispose submenu entries: https://github.com/eclipse-theia/theia/issues/7299
66+
Disposable.create(() => unregisterSubmenu(menuPath, this.menuRegistry)),
6767
...Array.from(commands.keys()).map((commandId, i) => {
6868
const { label } = commands.get(commandId)!;
6969
this.menuRegistry.registerMenuAction(menuPath, { commandId, order: `${i}`, label });
@@ -76,7 +76,7 @@ export class BoardsDataMenuUpdater implements FrontendApplicationContribution {
7676
const programmersMenuPath = [...ArduinoMenus.TOOLS__BOARD_SETTINGS_GROUP, 'z02_programmers'];
7777
const label = selectedProgrammer ? `Programmer: "${selectedProgrammer.name}"` : 'Programmer'
7878
this.menuRegistry.registerSubmenu(programmersMenuPath, label);
79-
this.toDisposeOnBoardChange.push(Disposable.create(() => this.unregisterSubmenu(programmersMenuPath)));
79+
this.toDisposeOnBoardChange.push(Disposable.create(() => unregisterSubmenu(programmersMenuPath, this.menuRegistry)));
8080
for (const programmer of programmers) {
8181
const { id, name } = programmer;
8282
const command = { id: `${fqbn}-programmer--${id}` };
@@ -98,20 +98,4 @@ export class BoardsDataMenuUpdater implements FrontendApplicationContribution {
9898
});
9999
}
100100

101-
protected unregisterSubmenu(menuPath: string[]): void {
102-
if (menuPath.length < 2) {
103-
throw new Error(`Expected at least two item as a menu-path. Got ${JSON.stringify(menuPath)} instead.`);
104-
}
105-
const toRemove = menuPath[menuPath.length - 1];
106-
const parentMenuPath = menuPath.slice(0, menuPath.length - 1);
107-
// This is unsafe. Calling `getMenu` with a non-existing menu-path will result in a new menu creation.
108-
// https://github.com/eclipse-theia/theia/issues/7300
109-
const parent = this.menuRegistry.getMenu(parentMenuPath);
110-
const index = parent.children.findIndex(({ id }) => id === toRemove);
111-
if (index === -1) {
112-
throw new Error(`Could not find menu with menu-path: ${JSON.stringify(menuPath)}.`);
113-
}
114-
(parent.children as Array<MenuNode>).splice(index, 1);
115-
}
116-
117101
}

arduino-ide-extension/src/browser/menu/arduino-menus.ts

+21-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { isOSX } from '@theia/core/lib/common/os';
22
import { CommonMenus } from '@theia/core/lib/browser/common-frontend-contribution';
3-
import { MAIN_MENU_BAR } from '@theia/core/lib/common/menu';
3+
import { MAIN_MENU_BAR, MenuModelRegistry, MenuNode } from '@theia/core/lib/common/menu';
44

55
export namespace ArduinoMenus {
66

@@ -67,3 +67,23 @@ export namespace ArduinoMenus {
6767
export const SKETCH_CONTROL__CONTEXT__RESOURCES_GROUP = [...SKETCH_CONTROL__CONTEXT, '2_resources'];
6868

6969
}
70+
71+
/**
72+
* This is a hack. It removes a submenu with all its children if any.
73+
* Theia cannot dispose submenu entries with a proper API: https://github.com/eclipse-theia/theia/issues/7299
74+
*/
75+
export function unregisterSubmenu(menuPath: string[], menuRegistry: MenuModelRegistry): void {
76+
if (menuPath.length < 2) {
77+
throw new Error(`Expected at least two item as a menu-path. Got ${JSON.stringify(menuPath)} instead.`);
78+
}
79+
const toRemove = menuPath[menuPath.length - 1];
80+
const parentMenuPath = menuPath.slice(0, menuPath.length - 1);
81+
// This is unsafe. Calling `getMenu` with a non-existing menu-path will result in a new menu creation.
82+
// https://github.com/eclipse-theia/theia/issues/7300
83+
const parent = menuRegistry.getMenu(parentMenuPath);
84+
const index = parent.children.findIndex(({ id }) => id === toRemove);
85+
if (index === -1) {
86+
throw new Error(`Could not find menu with menu-path: ${JSON.stringify(menuPath)}.`);
87+
}
88+
(parent.children as Array<MenuNode>).splice(index, 1);
89+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { injectable } from 'inversify';
2+
import { MenuModelRegistry } from '@theia/core/lib/common/menu';
3+
import { DebugFrontendApplicationContribution as TheiaDebugFrontendApplicationContribution, DebugMenus } from '@theia/debug/lib/browser/debug-frontend-application-contribution';
4+
import { unregisterSubmenu } from '../../menu/arduino-menus';
5+
6+
@injectable()
7+
export class DebugFrontendApplicationContribution extends TheiaDebugFrontendApplicationContribution {
8+
9+
registerMenus(registry: MenuModelRegistry): void {
10+
super.registerMenus(registry);
11+
unregisterSubmenu(DebugMenus.DEBUG, registry);
12+
}
13+
14+
}

0 commit comments

Comments
 (0)