diff --git a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx index da040530..d8d68b95 100644 --- a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx +++ b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx @@ -9,29 +9,19 @@ import { BoardsService } from '../common/protocol/boards-service'; import { ArduinoCommands } from './arduino-commands'; import { CoreService } from '../common/protocol/core-service'; import { WorkspaceServiceExt } from './workspace-service-ext'; -import { ToolOutputServiceClient } from '../common/protocol/tool-output-service'; -import { QuickPickService } from '@theia/core/lib/common/quick-pick-service'; -import { BoardsListWidgetFrontendContribution } from './boards/boards-widget-frontend-contribution'; import { BoardsServiceClientImpl } from './boards/boards-service-client-impl'; import { WorkspaceRootUriAwareCommandHandler, WorkspaceCommands } from '@theia/workspace/lib/browser/workspace-commands'; import { SelectionService, MenuContribution, MenuModelRegistry, MAIN_MENU_BAR, MenuPath } from '@theia/core'; import { ArduinoToolbar } from './toolbar/arduino-toolbar'; import { EditorManager, EditorMainMenu } from '@theia/editor/lib/browser'; import { - ContextMenuRenderer, - OpenerService, - Widget, - StatusBar, - StatusBarAlignment, - QuickOpenService, - ApplicationShell, - FrontendApplicationContribution, - FrontendApplication + ContextMenuRenderer, Widget, StatusBar, StatusBarAlignment, FrontendApplicationContribution, + FrontendApplication, KeybindingContribution, KeybindingRegistry } from '@theia/core/lib/browser'; import { OpenFileDialogProps, FileDialogService } from '@theia/filesystem/lib/browser/file-dialog'; import { FileSystem, FileStat } from '@theia/filesystem/lib/common'; import { Sketch, SketchesService } from '../common/protocol/sketches-service'; -import { WindowService } from '@theia/core/lib/browser/window/window-service'; +import { ToolOutputServiceClient } from '../common/protocol/tool-output-service'; 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'; @@ -41,17 +31,16 @@ import { MaybePromise } from '@theia/core/lib/common/types'; import { BoardsConfigDialog } from './boards/boards-config-dialog'; import { BoardsToolBarItem } from './boards/boards-toolbar-item'; import { BoardsConfig } from './boards/boards-config'; -import { ConfigService } from '../common/protocol/config-service'; import { MonitorConnection } from './monitor/monitor-connection'; import { MonitorViewContribution } from './monitor/monitor-view-contribution'; import { ArduinoWorkspaceService } from './arduino-workspace-service'; import { FileNavigatorContribution } from '@theia/navigator/lib/browser/navigator-contribution'; +import { OutputContribution } from '@theia/output/lib/browser/output-contribution'; import { OutlineViewContribution } from '@theia/outline-view/lib/browser/outline-view-contribution'; import { ProblemContribution } from '@theia/markers/lib/browser/problem/problem-contribution'; import { ScmContribution } from '@theia/scm/lib/browser/scm-contribution'; import { SearchInWorkspaceFrontendContribution } from '@theia/search-in-workspace/lib/browser/search-in-workspace-frontend-contribution'; import { FileNavigatorCommands } from '@theia/navigator/lib/browser/navigator-contribution'; -import { ArduinoShellLayoutRestorer } from './shell/arduino-shell-layout-restorer'; import { EditorMode } from './editor-mode'; export namespace ArduinoMenus { @@ -67,7 +56,8 @@ export namespace ArduinoToolbarContextMenu { } @injectable() -export class ArduinoFrontendContribution implements FrontendApplicationContribution, TabBarToolbarContribution, CommandContribution, MenuContribution { +export class ArduinoFrontendContribution implements FrontendApplicationContribution, + TabBarToolbarContribution, CommandContribution, MenuContribution, KeybindingContribution { @inject(MessageService) protected readonly messageService: MessageService; @@ -84,12 +74,6 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut @inject(ToolOutputServiceClient) protected readonly toolOutputServiceClient: ToolOutputServiceClient; - @inject(QuickPickService) - protected readonly quickPickService: QuickPickService; - - @inject(BoardsListWidgetFrontendContribution) - protected readonly boardsListWidgetFrontendContribution: BoardsListWidgetFrontendContribution; - @inject(BoardsServiceClientImpl) protected readonly boardsServiceClient: BoardsServiceClientImpl; @@ -108,12 +92,6 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut @inject(FileSystem) protected readonly fileSystem: FileSystem; - @inject(OpenerService) - protected readonly openerService: OpenerService; - - @inject(WindowService) - protected readonly windowService: WindowService; - @inject(SketchesService) protected readonly sketchService: SketchesService; @@ -129,27 +107,18 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut @inject(StatusBar) protected readonly statusBar: StatusBar; - @inject(ArduinoShellLayoutRestorer) - protected readonly layoutRestorer: ArduinoShellLayoutRestorer; - - @inject(QuickOpenService) - protected readonly quickOpenService: QuickOpenService; - @inject(ArduinoWorkspaceService) protected readonly workspaceService: ArduinoWorkspaceService; - @inject(ConfigService) - protected readonly configService: ConfigService; - @inject(MonitorConnection) protected readonly monitorConnection: MonitorConnection; - @inject(ApplicationShell) - protected readonly shell: ApplicationShell; - @inject(FileNavigatorContribution) protected readonly fileNavigatorContributions: FileNavigatorContribution; + @inject(OutputContribution) + protected readonly outputContribution: OutputContribution; + @inject(OutlineViewContribution) protected readonly outlineContribution: OutlineViewContribution; @@ -195,6 +164,7 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut // Initialize all `pro-mode` widgets. This is a NOOP if in normal mode. for (const viewContribution of [ this.fileNavigatorContributions, + this.outputContribution, this.outlineContribution, this.problemContribution, this.scmContribution, @@ -255,6 +225,7 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut registerCommands(registry: CommandRegistry): void { // TODO: use proper API https://github.com/eclipse-theia/theia/pull/6599 const allHandlers: { [id: string]: CommandHandler[] } = (registry as any)._handlers; + // Make sure to reveal the `Explorer` before executing `New File` and `New Folder`. for (const command of [WorkspaceCommands.NEW_FILE, WorkspaceCommands.NEW_FOLDER]) { const { id } = command; @@ -311,12 +282,15 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut if (!boardsConfig.selectedBoard.fqbn) { throw new Error(`No core is installed for ${boardsConfig.selectedBoard.name}. Please install the board.`); } + // Reveal the Output view asynchronously (don't await it) + this.outputContribution.openView({ reveal: true }); await this.coreService.compile({ uri: uri.toString(), board: boardsConfig.selectedBoard }); } catch (e) { await this.messageService.error(e.toString()); } } }); + registry.registerCommand(ArduinoCommands.UPLOAD, { isVisible: widget => ArduinoToolbar.is(widget) && widget.side === 'left', isEnabled: widget => true, @@ -345,6 +319,8 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut if (!selectedPort) { throw new Error('No ports selected. Please select a port.'); } + // Reveal the Output view asynchronously (don't await it) + this.outputContribution.openView({ reveal: true }); await this.coreService.upload({ uri: uri.toString(), board: boardsConfig.selectedBoard, port: selectedPort.address }); } catch (e) { await this.messageService.error(e.toString()); @@ -355,6 +331,7 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut } } }); + registry.registerCommand(ArduinoCommands.SHOW_OPEN_CONTEXT_MENU, { isVisible: widget => ArduinoToolbar.is(widget) && widget.side === 'left', isEnabled: widget => ArduinoToolbar.is(widget) && widget.side === 'left', @@ -372,23 +349,27 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut } } }); + registry.registerCommand(ArduinoCommands.OPEN_FILE_NAVIGATOR, { isEnabled: () => true, execute: () => this.doOpenFile() - }) + }); + registry.registerCommand(ArduinoCommands.OPEN_SKETCH, { isEnabled: () => true, execute: async (sketch: Sketch) => { this.workspaceService.open(new URI(sketch.uri)); } - }) + }); + registry.registerCommand(ArduinoCommands.SAVE_SKETCH, { isEnabled: widget => ArduinoToolbar.is(widget) && widget.side === 'left', isVisible: widget => ArduinoToolbar.is(widget) && widget.side === 'left', execute: async (sketch: Sketch) => { registry.executeCommand(CommonCommands.SAVE_ALL.id); } - }) + }); + registry.registerCommand(ArduinoCommands.NEW_SKETCH, new WorkspaceRootUriAwareCommandHandler(this.workspaceService, this.selectionService, { execute: async uri => { try { @@ -404,6 +385,7 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut } } })); + registry.registerCommand(ArduinoCommands.OPEN_BOARDS_DIALOG, { isEnabled: () => true, execute: async () => { @@ -412,12 +394,13 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut this.boardsServiceClient.boardsConfig = boardsConfig; } } - }) + }); + registry.registerCommand(ArduinoCommands.TOGGLE_ADVANCED_MODE, { execute: () => this.editorMode.toggle(), isVisible: widget => ArduinoToolbar.is(widget) && widget.side === 'right', isToggled: () => this.editorMode.proMode - }) + }); } registerMenus(registry: MenuModelRegistry) { @@ -485,6 +468,17 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut return menuId; } + registerKeybindings(keybindings: KeybindingRegistry): void { + keybindings.registerKeybinding({ + command: ArduinoCommands.VERIFY.id, + keybinding: 'ctrlcmd+alt+v' + }); + keybindings.registerKeybinding({ + command: ArduinoCommands.UPLOAD.id, + keybinding: 'ctrlcmd+alt+u' + }); + } + protected async registerSketchesInMenu(registry: MenuModelRegistry): Promise { this.sketchService.getSketches().then(sketches => { this.wsSketchCount = sketches.length; diff --git a/arduino-ide-extension/src/browser/arduino-frontend-module.ts b/arduino-ide-extension/src/browser/arduino-frontend-module.ts index 98402f8e..227ab89c 100644 --- a/arduino-ide-extension/src/browser/arduino-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-frontend-module.ts @@ -28,7 +28,6 @@ import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service import { ArduinoWorkspaceService } from './arduino-workspace-service'; import { ThemeService } from '@theia/core/lib/browser/theming'; import { ArduinoTheme } from './arduino-theme'; -import { MenuContribution } from '@theia/core'; import { OutlineViewContribution } from '@theia/outline-view/lib/browser/outline-view-contribution'; import { ArduinoOutlineViewContribution } from './customization/arduino-outline-contribution'; import { ProblemContribution } from '@theia/markers/lib/browser/problem/problem-contribution'; @@ -42,7 +41,8 @@ import { EditorContribution } from '@theia/editor/lib/browser/editor-contributio import { ArduinoEditorContribution } from './customization/arduino-editor-contribution'; import { MonacoStatusBarContribution } from '@theia/monaco/lib/browser/monaco-status-bar-contribution'; import { ArduinoMonacoStatusBarContribution } from './customization/arduino-monaco-status-bar-contribution'; -import { ApplicationShell, ShellLayoutRestorer } from '@theia/core/lib/browser'; +import { ApplicationShell, ShellLayoutRestorer, KeybindingContribution } from '@theia/core/lib/browser'; +import { MenuContribution } from '@theia/core/lib/common/menu'; import { ArduinoApplicationShell } from './customization/arduino-application-shell'; import { ArduinoFrontendApplication } from './customization/arduino-frontend-application'; import { BoardsConfigDialog, BoardsConfigDialogProps } from './boards/boards-config-dialog'; @@ -71,6 +71,7 @@ import { ArduinoAboutDialog } from './customization/arduino-about-dialog'; import { ArduinoShellLayoutRestorer } from './shell/arduino-shell-layout-restorer'; import { EditorMode } from './editor-mode'; import { ListItemRenderer } from './components/component-list/list-item-renderer'; + const ElementQueries = require('css-element-queries/src/ElementQueries'); export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Unbind, isBound: interfaces.IsBound, rebind: interfaces.Rebind) => { @@ -82,6 +83,7 @@ export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Un bind(CommandContribution).toService(ArduinoFrontendContribution); bind(MenuContribution).toService(ArduinoFrontendContribution); bind(TabBarToolbarContribution).toService(ArduinoFrontendContribution); + bind(KeybindingContribution).toService(ArduinoFrontendContribution); bind(FrontendApplicationContribution).toService(ArduinoFrontendContribution); bind(ArduinoToolbarContribution).toSelf().inSingletonScope(); diff --git a/arduino-ide-extension/src/browser/customization/arduino-problem-contribution.ts b/arduino-ide-extension/src/browser/customization/arduino-problem-contribution.ts index 6bc5be2b..9606dd1e 100644 --- a/arduino-ide-extension/src/browser/customization/arduino-problem-contribution.ts +++ b/arduino-ide-extension/src/browser/customization/arduino-problem-contribution.ts @@ -1,4 +1,5 @@ import { inject, injectable } from 'inversify'; +import { KeybindingRegistry } from '@theia/core/lib/browser'; import { ProblemStat } from '@theia/markers/lib/browser/problem/problem-manager'; import { FrontendApplication } from '@theia/core/lib/browser/frontend-application'; import { ProblemContribution } from '@theia/markers/lib/browser/problem/problem-contribution'; @@ -22,4 +23,13 @@ export class ArduinoProblemContribution extends ProblemContribution { } } + registerKeybindings(keybindings: KeybindingRegistry): void { + if (this.toggleCommand) { + keybindings.registerKeybinding({ + command: this.toggleCommand.id, + keybinding: 'ctrlcmd+alt+shift+m' + }); + } + } + } diff --git a/arduino-ide-extension/src/browser/monitor/monitor-view-contribution.tsx b/arduino-ide-extension/src/browser/monitor/monitor-view-contribution.tsx index 2067799b..821de29f 100644 --- a/arduino-ide-extension/src/browser/monitor/monitor-view-contribution.tsx +++ b/arduino-ide-extension/src/browser/monitor/monitor-view-contribution.tsx @@ -41,7 +41,7 @@ export class MonitorViewContribution extends AbstractViewContribution