From 2a0273c77144405b7a716c0794acead5677a9c99 Mon Sep 17 00:00:00 2001 From: jbicker Date: Fri, 12 Jul 2019 10:40:41 +0200 Subject: [PATCH 1/2] Brought back the menu. With a restricted set of items. Signed-off-by: jbicker --- arduino-ide-extension/package.json | 1 + .../browser/arduino-frontend-contribution.tsx | 63 ++++++++++++++++--- .../src/browser/arduino-frontend-module.ts | 1 + .../boards-widget-frontend-contribution.ts | 15 ++++- .../custom-common-frontend-contribution.ts | 44 +++++++++++++ .../custom-file-menu-contribution.ts | 10 +++ .../custom-monaco-editor-menu-contribution.ts | 10 +++ .../list-widget-frontend-contribution.ts | 11 ++++ .../browser/menu/arduino-menu-contribution.ts | 11 +--- .../src/browser/style/arduino.useable.css | 2 +- .../electron-arduino-menu-contribution.ts | 32 ++++------ 11 files changed, 162 insertions(+), 38 deletions(-) create mode 100644 arduino-ide-extension/src/browser/customization/custom-common-frontend-contribution.ts create mode 100644 arduino-ide-extension/src/browser/customization/custom-file-menu-contribution.ts create mode 100644 arduino-ide-extension/src/browser/customization/custom-monaco-editor-menu-contribution.ts diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 3e8bebf9..05dec411 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -17,6 +17,7 @@ "@theia/outline-view": "next", "@theia/workspace": "next", "@theia/navigator": "next", + "@theia/terminal": "next", "p-queue": "^5.0.0" }, "scripts": { diff --git a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx index 97849d20..419bbad6 100644 --- a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx +++ b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx @@ -15,23 +15,30 @@ import { QuickPickService } from '@theia/core/lib/common/quick-pick-service'; import { BoardsListWidgetFrontendContribution } from './boards/boards-widget-frontend-contribution'; import { BoardsNotificationService } from './boards-notification-service'; import { WorkspaceRootUriAwareCommandHandler, WorkspaceCommands } from '@theia/workspace/lib/browser/workspace-commands'; -import { SelectionService, MenuModelRegistry } from '@theia/core'; +import { SelectionService, MenuContribution, MenuModelRegistry, MAIN_MENU_BAR } from '@theia/core'; import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service'; import { SketchFactory } from './sketch-factory'; import { ArduinoToolbar } from './toolbar/arduino-toolbar'; -import { EditorManager } from '@theia/editor/lib/browser'; +import { EditorManager, EditorMainMenu } from '@theia/editor/lib/browser'; import { ContextMenuRenderer, OpenerService, Widget } from '@theia/core/lib/browser'; import { OpenFileDialogProps, FileDialogService } from '@theia/filesystem/lib/browser/file-dialog'; import { FileSystem } from '@theia/filesystem/lib/common'; import { ArduinoToolbarContextMenu } from './arduino-file-menu'; import { Sketch, SketchesService } from '../common/protocol/sketches-service'; import { WindowService } from '@theia/core/lib/browser/window/window-service'; -import { CommonCommands } from '@theia/core/lib/browser/common-frontend-contribution' -import { BoardsToolBarItem } from './boards/boards-toolbar-item'; -import { SelectBoardDialog } from './boards/select-board-dialog'; +import { CommonCommands, CommonMenus } from '@theia/core/lib/browser/common-frontend-contribution'; +import { FileSystemCommands } from '@theia/filesystem/lib/browser/filesystem-frontend-contribution'; +import { FileDownloadCommands } from '@theia/filesystem/lib/browser/download/file-download-command-contribution'; +import { MonacoMenus } from '@theia/monaco/lib/browser/monaco-menu'; +import {TerminalMenus} from '@theia/terminal/lib/browser/terminal-frontend-contribution'; + +export namespace ArduinoMenus { + export const SKETCH = [...MAIN_MENU_BAR, '3_sketch']; + export const TOOLS = [...MAIN_MENU_BAR, '4_tools']; +} @injectable() -export class ArduinoFrontendContribution implements TabBarToolbarContribution, CommandContribution { +export class ArduinoFrontendContribution implements TabBarToolbarContribution, CommandContribution, MenuContribution { @inject(MessageService) protected readonly messageService: MessageService; @@ -180,7 +187,7 @@ export class ArduinoFrontendContribution implements TabBarToolbarContribution, C registerCommands(registry: CommandRegistry): void { registry.registerCommand(ArduinoCommands.VERIFY, { isVisible: widget => this.isArduinoToolbar(widget), - isEnabled: widget => this.isArduinoToolbar(widget), + isEnabled: widget => true, execute: async () => { const widget = this.getCurrentWidget(); if (widget instanceof EditorWidget) { @@ -201,7 +208,7 @@ export class ArduinoFrontendContribution implements TabBarToolbarContribution, C }); registry.registerCommand(ArduinoCommands.UPLOAD, { isVisible: widget => this.isArduinoToolbar(widget), - isEnabled: widget => this.isArduinoToolbar(widget), + isEnabled: widget => true, execute: async () => { const widget = this.getCurrentWidget(); if (widget instanceof EditorWidget) { @@ -292,6 +299,46 @@ export class ArduinoFrontendContribution implements TabBarToolbarContribution, C } this.selectedBoard = board; } + + registerMenus(registry: MenuModelRegistry) { + registry.unregisterMenuAction(FileSystemCommands.UPLOAD); + registry.unregisterMenuAction(FileDownloadCommands.DOWNLOAD); + + registry.unregisterMenuAction(WorkspaceCommands.NEW_FILE); + registry.unregisterMenuAction(WorkspaceCommands.NEW_FOLDER); + + registry.unregisterMenuAction(WorkspaceCommands.OPEN_FOLDER); + registry.unregisterMenuAction(WorkspaceCommands.OPEN_WORKSPACE); + registry.unregisterMenuAction(WorkspaceCommands.OPEN_RECENT_WORKSPACE); + registry.unregisterMenuAction(WorkspaceCommands.SAVE_WORKSPACE_AS); + registry.unregisterMenuAction(WorkspaceCommands.CLOSE); + + registry.getMenu(MAIN_MENU_BAR).removeNode(this.getMenuId(MonacoMenus.SELECTION)); + registry.getMenu(MAIN_MENU_BAR).removeNode(this.getMenuId(EditorMainMenu.GO)); + registry.getMenu(MAIN_MENU_BAR).removeNode(this.getMenuId(TerminalMenus.TERMINAL)); + registry.getMenu(MAIN_MENU_BAR).removeNode(this.getMenuId(CommonMenus.VIEW)); + registry.getMenu(MAIN_MENU_BAR).removeNode(this.getMenuId(CommonMenus.HELP)); + + registry.registerSubmenu(ArduinoMenus.SKETCH, 'Sketch'); + registry.registerMenuAction(ArduinoMenus.SKETCH, { + commandId: ArduinoCommands.VERIFY.id, + label: 'Verify/Compile', + order: '1' + }); + registry.registerMenuAction(ArduinoMenus.SKETCH, { + commandId: ArduinoCommands.UPLOAD.id, + label: 'Upload', + order: '2' + }); + + registry.registerSubmenu(ArduinoMenus.TOOLS, 'Tools'); + } + + protected getMenuId(menuPath: string[]): string { + const index = menuPath.length - 1; + const menuId = menuPath[index]; + return menuId; + } protected async openSketchFilesInNewWindow(uri: string) { const location = new URL(window.location.href); diff --git a/arduino-ide-extension/src/browser/arduino-frontend-module.ts b/arduino-ide-extension/src/browser/arduino-frontend-module.ts index 89483e52..40bd8887 100644 --- a/arduino-ide-extension/src/browser/arduino-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-frontend-module.ts @@ -55,6 +55,7 @@ export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Un // Commands and toolbar items bind(ArduinoFrontendContribution).toSelf().inSingletonScope(); bind(CommandContribution).toService(ArduinoFrontendContribution); + bind(MenuContribution).toService(ArduinoFrontendContribution); bind(TabBarToolbarContribution).toService(ArduinoFrontendContribution); bind(FrontendApplicationContribution).toService(ArduinoFrontendContribution); bind(MenuContribution).to(ArduinoToolbarMenuContribution).inSingletonScope(); diff --git a/arduino-ide-extension/src/browser/boards/boards-widget-frontend-contribution.ts b/arduino-ide-extension/src/browser/boards/boards-widget-frontend-contribution.ts index 703dd0ad..f7211947 100644 --- a/arduino-ide-extension/src/browser/boards/boards-widget-frontend-contribution.ts +++ b/arduino-ide-extension/src/browser/boards/boards-widget-frontend-contribution.ts @@ -3,6 +3,8 @@ import { FrontendApplicationContribution } from '@theia/core/lib/browser/fronten import { AbstractViewContribution } from '@theia/core/lib/browser/shell/view-contribution'; import { ListWidget } from './list-widget'; import { BoardsListWidget } from './boards-list-widget'; +import { MenuModelRegistry } from '@theia/core'; +import { ArduinoMenus } from '../arduino-frontend-contribution'; @injectable() export abstract class ListWidgetFrontendContribution extends AbstractViewContribution implements FrontendApplicationContribution { @@ -16,6 +18,8 @@ export abstract class ListWidgetFrontendContribution extends AbstractViewContrib @injectable() export class BoardsListWidgetFrontendContribution extends ListWidgetFrontendContribution { + static readonly OPEN_MANAGER = `${BoardsListWidget.WIDGET_ID}:toggle`; + constructor() { super({ widgetId: BoardsListWidget.WIDGET_ID, @@ -24,9 +28,18 @@ export class BoardsListWidgetFrontendContribution extends ListWidgetFrontendCont area: 'left', rank: 600 }, - toggleCommandId: `${BoardsListWidget.WIDGET_ID}:toggle`, + toggleCommandId: BoardsListWidgetFrontendContribution.OPEN_MANAGER, toggleKeybinding: 'ctrlcmd+shift+b' }); } + registerMenus(menus: MenuModelRegistry): void { + if (this.toggleCommand) { + menus.registerMenuAction(ArduinoMenus.TOOLS, { + commandId: this.toggleCommand.id, + label: 'Boards Manager...' + }); + } + } + } diff --git a/arduino-ide-extension/src/browser/customization/custom-common-frontend-contribution.ts b/arduino-ide-extension/src/browser/customization/custom-common-frontend-contribution.ts new file mode 100644 index 00000000..227ba0ff --- /dev/null +++ b/arduino-ide-extension/src/browser/customization/custom-common-frontend-contribution.ts @@ -0,0 +1,44 @@ +import { injectable } from "inversify"; +import { CommonFrontendContribution, CommonMenus, CommonCommands } from "@theia/core/lib/browser"; +import { MenuModelRegistry } from "@theia/core"; + +@injectable() +export class CustomCommonFrontendContribution extends CommonFrontendContribution { + registerMenus(registry: MenuModelRegistry): void { + registry.registerSubmenu(CommonMenus.FILE, 'File'); + registry.registerSubmenu(CommonMenus.EDIT, 'Edit'); + + registry.registerSubmenu(CommonMenus.FILE_SETTINGS_SUBMENU, 'Settings'); + + registry.registerMenuAction(CommonMenus.EDIT_UNDO, { + commandId: CommonCommands.UNDO.id, + order: '0' + }); + registry.registerMenuAction(CommonMenus.EDIT_UNDO, { + commandId: CommonCommands.REDO.id, + order: '1' + }); + + registry.registerMenuAction(CommonMenus.EDIT_FIND, { + commandId: CommonCommands.FIND.id, + order: '0' + }); + registry.registerMenuAction(CommonMenus.EDIT_FIND, { + commandId: CommonCommands.REPLACE.id, + order: '1' + }); + + registry.registerMenuAction(CommonMenus.EDIT_CLIPBOARD, { + commandId: CommonCommands.CUT.id, + order: '0' + }); + registry.registerMenuAction(CommonMenus.EDIT_CLIPBOARD, { + commandId: CommonCommands.COPY.id, + order: '1' + }); + registry.registerMenuAction(CommonMenus.EDIT_CLIPBOARD, { + commandId: CommonCommands.PASTE.id, + order: '2' + }); + } +} \ No newline at end of file diff --git a/arduino-ide-extension/src/browser/customization/custom-file-menu-contribution.ts b/arduino-ide-extension/src/browser/customization/custom-file-menu-contribution.ts new file mode 100644 index 00000000..a83da571 --- /dev/null +++ b/arduino-ide-extension/src/browser/customization/custom-file-menu-contribution.ts @@ -0,0 +1,10 @@ +import { injectable } from "inversify"; +import { FileMenuContribution } from "@theia/workspace/lib/browser"; +import { MenuModelRegistry } from "@theia/core"; + +@injectable() +export class CustomFileMenuContribution extends FileMenuContribution { + registerMenus(registry: MenuModelRegistry) { + + } +} \ No newline at end of file diff --git a/arduino-ide-extension/src/browser/customization/custom-monaco-editor-menu-contribution.ts b/arduino-ide-extension/src/browser/customization/custom-monaco-editor-menu-contribution.ts new file mode 100644 index 00000000..42165f2f --- /dev/null +++ b/arduino-ide-extension/src/browser/customization/custom-monaco-editor-menu-contribution.ts @@ -0,0 +1,10 @@ +import { injectable } from "inversify"; +import { MonacoEditorMenuContribution } from "@theia/monaco/lib/browser/monaco-menu"; +import { MenuModelRegistry } from "@theia/core"; + +@injectable() +export class CustomMonacoEditorMenuContribution extends MonacoEditorMenuContribution { + registerMenus(registry: MenuModelRegistry) { + + } +} \ No newline at end of file diff --git a/arduino-ide-extension/src/browser/library/list-widget-frontend-contribution.ts b/arduino-ide-extension/src/browser/library/list-widget-frontend-contribution.ts index 38ac4347..fe6f5b68 100644 --- a/arduino-ide-extension/src/browser/library/list-widget-frontend-contribution.ts +++ b/arduino-ide-extension/src/browser/library/list-widget-frontend-contribution.ts @@ -3,6 +3,8 @@ import { FrontendApplicationContribution } from '@theia/core/lib/browser/fronten import { AbstractViewContribution } from '@theia/core/lib/browser/shell/view-contribution'; import { ListWidget } from './list-widget'; import { LibraryListWidget } from './library-list-widget'; +import { MenuModelRegistry } from '@theia/core'; +import { ArduinoMenus } from '../arduino-frontend-contribution'; @injectable() export abstract class ListWidgetFrontendContribution extends AbstractViewContribution implements FrontendApplicationContribution { @@ -29,4 +31,13 @@ export class LibraryListWidgetFrontendContribution extends ListWidgetFrontendCon }); } + registerMenus(menus: MenuModelRegistry): void { + if (this.toggleCommand) { + menus.registerMenuAction(ArduinoMenus.SKETCH, { + commandId: this.toggleCommand.id, + label: 'Manage Libraries...' + }); + } + } + } diff --git a/arduino-ide-extension/src/browser/menu/arduino-menu-contribution.ts b/arduino-ide-extension/src/browser/menu/arduino-menu-contribution.ts index f519e087..464f4b6b 100644 --- a/arduino-ide-extension/src/browser/menu/arduino-menu-contribution.ts +++ b/arduino-ide-extension/src/browser/menu/arduino-menu-contribution.ts @@ -5,14 +5,7 @@ import { FrontendApplication } from "@theia/core/lib/browser"; @injectable() export class ArduinoMenuContribution extends BrowserMenuBarContribution { onStart(app: FrontendApplication): void { - if (this.isProMode()) { - const menu = this.factory.createMenuBar(); - app.shell.addWidget(menu, { area: 'top' }); - } - } - - protected isProMode(): boolean { - // TODO ask for pro preference - return false; + const menu = this.factory.createMenuBar(); + app.shell.addWidget(menu, { area: 'top' }); } } \ No newline at end of file diff --git a/arduino-ide-extension/src/browser/style/arduino.useable.css b/arduino-ide-extension/src/browser/style/arduino.useable.css index 8862821c..a89ddf19 100644 --- a/arduino-ide-extension/src/browser/style/arduino.useable.css +++ b/arduino-ide-extension/src/browser/style/arduino.useable.css @@ -49,7 +49,7 @@ is not optimized for dense, information rich UIs. /* Special font colors */ --theia-ui-icon-font-color: #ffffff; --theia-ui-bar-font-color0: var(--theia-ui-font-color0); - --theia-ui-bar-font-color1: var(--theia-ui-font-color1); + --theia-ui-bar-font-color1: var(--theia-inverse-ui-font-color0); /* var(--theia-ui-font-color1); */ /* Use the inverse UI colors against the brand/accent/warn/error colors. */ --theia-inverse-ui-font-color0: rgba(255, 255, 255, 1.0); --theia-inverse-ui-font-color2: rgba(255, 255, 255, 0.7); diff --git a/arduino-ide-extension/src/electron-browser/electron-arduino-menu-contribution.ts b/arduino-ide-extension/src/electron-browser/electron-arduino-menu-contribution.ts index 2ac22721..c358fd8c 100644 --- a/arduino-ide-extension/src/electron-browser/electron-arduino-menu-contribution.ts +++ b/arduino-ide-extension/src/electron-browser/electron-arduino-menu-contribution.ts @@ -7,27 +7,21 @@ import { isOSX } from '@theia/core'; @injectable() export class ElectronArduinoMenuContribution extends ElectronMenuContribution { onStart(app: FrontendApplication): void { - if (this.isProMode()) { - const currentWindow = electron.remote.getCurrentWindow(); - const createdMenuBar = this.factory.createMenuBar(); + const currentWindow = electron.remote.getCurrentWindow(); + const createdMenuBar = this.factory.createMenuBar(); - if (isOSX) { - electron.remote.Menu.setApplicationMenu(createdMenuBar); - currentWindow.on('focus', () => - // OSX: Recreate the menus when changing windows. - // OSX only has one menu bar for all windows, so we need to swap - // between them as the user switch windows. - electron.remote.Menu.setApplicationMenu(this.factory.createMenuBar()) - ); + if (isOSX) { + electron.remote.Menu.setApplicationMenu(createdMenuBar); + currentWindow.on('focus', () => + // OSX: Recreate the menus when changing windows. + // OSX only has one menu bar for all windows, so we need to swap + // between them as the user switch windows. + electron.remote.Menu.setApplicationMenu(this.factory.createMenuBar()) + ); - } else { - // Unix/Windows: Set the per-window menus - currentWindow.setMenu(createdMenuBar); - } + } else { + // Unix/Windows: Set the per-window menus + currentWindow.setMenu(createdMenuBar); } } - - protected isProMode(): boolean { - return false; - } } \ No newline at end of file From 5e728523efd5fd84cd0a40bc5f2939c050f88cc0 Mon Sep 17 00:00:00 2001 From: jbicker Date: Fri, 12 Jul 2019 14:37:56 +0200 Subject: [PATCH 2/2] Changed layout of top panel in browser. Signed-off-by: jbicker --- .../browser/arduino-frontend-contribution.tsx | 2 ++ .../menu/browser-arduino-menu-module.ts | 2 ++ .../src/browser/style/browser-menu.css | 19 +++++++++++++++++++ 3 files changed, 23 insertions(+) create mode 100644 arduino-ide-extension/src/browser/style/browser-menu.css diff --git a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx index 419bbad6..802c70ef 100644 --- a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx +++ b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx @@ -31,6 +31,8 @@ import { FileSystemCommands } from '@theia/filesystem/lib/browser/filesystem-fro import { FileDownloadCommands } from '@theia/filesystem/lib/browser/download/file-download-command-contribution'; import { MonacoMenus } from '@theia/monaco/lib/browser/monaco-menu'; import {TerminalMenus} from '@theia/terminal/lib/browser/terminal-frontend-contribution'; +import { SelectBoardDialog } from './boards/select-board-dialog'; +import { BoardsToolBarItem } from './boards/boards-toolbar-item'; export namespace ArduinoMenus { export const SKETCH = [...MAIN_MENU_BAR, '3_sketch']; diff --git a/arduino-ide-extension/src/browser/menu/browser-arduino-menu-module.ts b/arduino-ide-extension/src/browser/menu/browser-arduino-menu-module.ts index 340721ac..baded517 100644 --- a/arduino-ide-extension/src/browser/menu/browser-arduino-menu-module.ts +++ b/arduino-ide-extension/src/browser/menu/browser-arduino-menu-module.ts @@ -2,6 +2,8 @@ import { BrowserMenuBarContribution } from '@theia/core/lib/browser/menu/browser import { ArduinoMenuContribution } from './arduino-menu-contribution'; import { ContainerModule, interfaces } from 'inversify'; +import '../../../src/browser/style/browser-menu.css' + export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Unbind) => { unbind(BrowserMenuBarContribution); bind(BrowserMenuBarContribution).to(ArduinoMenuContribution).inSingletonScope(); diff --git a/arduino-ide-extension/src/browser/style/browser-menu.css b/arduino-ide-extension/src/browser/style/browser-menu.css new file mode 100644 index 00000000..a74a4c03 --- /dev/null +++ b/arduino-ide-extension/src/browser/style/browser-menu.css @@ -0,0 +1,19 @@ +#theia-top-panel { + min-height: 64px; + flex-direction: column; +} + +.p-TabBar-toolbar { + justify-content: flex-end; + margin: 0; + padding-left: 10px; + width: 100%; +} + +.p-MenuBar-item.p-mod-active { + color: var(--theia-inverse-ui-font-color3); +} + +.p-MenuBar.p-mod-active .p-MenuBar-item.p-mod-active { + color: var(--theia-ui-bar-font-color0); +} \ No newline at end of file