mirror of
https://github.com/arduino/arduino-ide.git
synced 2025-10-19 08:08:33 +00:00

* backend structure WIP * Scaffold interfaces and classes for pluggable monitors * Implement MonitorService to handle pluggable monitor lifetime * Rename WebSocketService to WebSocketProvider and uninjected it * Moved some interfaces * Changed upload settings * Enhance MonitorManager APIs * Fixed WebSocketChange event signature * Add monitor proxy functions for the frontend * Moved settings to MonitorService * Remove several unnecessary serial monitor classes * Changed how connection is handled on upload * Proxied more monitor methods to frontend * WebSocketProvider is not injectable anymore * Add generic monitor settings storaging * More serial classes removal * Remove unused file * Changed plotter contribution to use new manager proxy * Changed MonitorWidget and children to use new monitor proxy * Updated MonitorWidget to use new monitor proxy * Fix backend logger bindings * Delete unnecessary Symbol * coreClientProvider is now set when constructing MonitorService * Add missing binding * Fix `MonitorManagerProxy` DI issue * fix monitor connection * delete duplex when connection is closed * update arduino-cli to 0.22.0 * fix upload when monitor is open * add MonitorSettingsProvider interface * monitor settings provider stub * updated pseudo code * refactor monitor settings interfaces * monitor service provider singleton * add unit tests * change MonitorService providers to injectable deps * fix monitor settings client communication * refactor monitor commands protocol * use monitor settings provider properly * add settings to monitor model * add settings to monitor model * reset serial monitor when port changes * fix serial plotter opening * refine monitor connection settings * fix hanging web socket connections * add serial plotter reset command * send port to web socket clients * monitor service wait for success serial port open * fix reset loop * update serial plotter version * update arduino-cli version to 0.23.0-rc1 and regenerate grpc protocol * remove useless plotter protocol file * localize web socket errors * clean-up code * update translation file * Fix duplicated editor tabs (#1012) * Save dialog for closing temporary sketch and unsaved files (#893) * Use normal `OnWillStop` event * Align `CLOSE` command to rest of app * Fixed FS path vs encoded URL comparision when handling stop request. Ref: https://github.com/eclipse-theia/theia/issues/11226 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> * Fixed the translations. Signed-off-by: Akos Kitta <a.kitta@arduino.cc> * Fixed the translations again. Removed `electron` from the `nls-extract`. It does not contain app code. Signed-off-by: Akos Kitta <a.kitta@arduino.cc> * Aligned the stop handler code to Theia. Signed-off-by: Akos Kitta <a.kitta@arduino.cc> Co-authored-by: Akos Kitta <a.kitta@arduino.cc> * fix serial monitor send line ending * refactor monitor-service poll for test/readability * localize web socket errors * update translation file * Fix duplicated editor tabs (#1012) * i18n:check rerun * Speed up IDE startup time. Signed-off-by: Akos Kitta <a.kitta@arduino.cc> * override coreClientProvider in monitor-service * cleanup merged code Co-authored-by: Francesco Stasi <f.stasi@me.com> Co-authored-by: Silvano Cerza <silvanocerza@gmail.com> Co-authored-by: Mark Sujew <mark.sujew@typefox.io> Co-authored-by: David Simpson <45690499+davegarthsimpson@users.noreply.github.com> Co-authored-by: Akos Kitta <a.kitta@arduino.cc>
195 lines
6.1 KiB
TypeScript
195 lines
6.1 KiB
TypeScript
import * as React from '@theia/core/shared/react';
|
|
import { injectable, inject } from '@theia/core/shared/inversify';
|
|
import { AbstractViewContribution, codicon } from '@theia/core/lib/browser';
|
|
import { MonitorWidget } from './monitor-widget';
|
|
import { MenuModelRegistry, Command, CommandRegistry } from '@theia/core';
|
|
import {
|
|
TabBarToolbarContribution,
|
|
TabBarToolbarRegistry,
|
|
} from '@theia/core/lib/browser/shell/tab-bar-toolbar';
|
|
import { ArduinoToolbar } from '../../toolbar/arduino-toolbar';
|
|
import { ArduinoMenus } from '../../menu/arduino-menus';
|
|
import { nls } from '@theia/core/lib/common';
|
|
import { MonitorModel } from '../../monitor-model';
|
|
import { MonitorManagerProxyClient } from '../../../common/protocol';
|
|
|
|
export namespace SerialMonitor {
|
|
export namespace Commands {
|
|
export const AUTOSCROLL = Command.toLocalizedCommand(
|
|
{
|
|
id: 'serial-monitor-autoscroll',
|
|
label: 'Autoscroll',
|
|
},
|
|
'arduino/serial/autoscroll'
|
|
);
|
|
export const TIMESTAMP = Command.toLocalizedCommand(
|
|
{
|
|
id: 'serial-monitor-timestamp',
|
|
label: 'Timestamp',
|
|
},
|
|
'arduino/serial/timestamp'
|
|
);
|
|
export const CLEAR_OUTPUT = Command.toLocalizedCommand(
|
|
{
|
|
id: 'serial-monitor-clear-output',
|
|
label: 'Clear Output',
|
|
iconClass: codicon('clear-all'),
|
|
},
|
|
'vscode/output.contribution/clearOutput.label'
|
|
);
|
|
}
|
|
}
|
|
|
|
@injectable()
|
|
export class MonitorViewContribution
|
|
extends AbstractViewContribution<MonitorWidget>
|
|
implements TabBarToolbarContribution
|
|
{
|
|
static readonly TOGGLE_SERIAL_MONITOR = MonitorWidget.ID + ':toggle';
|
|
static readonly TOGGLE_SERIAL_MONITOR_TOOLBAR =
|
|
MonitorWidget.ID + ':toggle-toolbar';
|
|
static readonly RESET_SERIAL_MONITOR = MonitorWidget.ID + ':reset';
|
|
|
|
constructor(
|
|
@inject(MonitorModel)
|
|
protected readonly model: MonitorModel,
|
|
|
|
@inject(MonitorManagerProxyClient)
|
|
protected readonly monitorManagerProxy: MonitorManagerProxyClient
|
|
) {
|
|
super({
|
|
widgetId: MonitorWidget.ID,
|
|
widgetName: MonitorWidget.LABEL,
|
|
defaultWidgetOptions: {
|
|
area: 'bottom',
|
|
},
|
|
toggleCommandId: MonitorViewContribution.TOGGLE_SERIAL_MONITOR,
|
|
toggleKeybinding: 'CtrlCmd+Shift+M',
|
|
});
|
|
this.monitorManagerProxy.onMonitorShouldReset(() => this.reset());
|
|
}
|
|
|
|
override registerMenus(menus: MenuModelRegistry): void {
|
|
if (this.toggleCommand) {
|
|
menus.registerMenuAction(ArduinoMenus.TOOLS__MAIN_GROUP, {
|
|
commandId: this.toggleCommand.id,
|
|
label: MonitorWidget.LABEL,
|
|
order: '5',
|
|
});
|
|
}
|
|
}
|
|
|
|
registerToolbarItems(registry: TabBarToolbarRegistry): void {
|
|
registry.registerItem({
|
|
id: 'monitor-autoscroll',
|
|
render: () => this.renderAutoScrollButton(),
|
|
isVisible: (widget) => widget instanceof MonitorWidget,
|
|
onDidChange: this.model.onChange as any, // XXX: it's a hack. See: https://github.com/eclipse-theia/theia/pull/6696/
|
|
});
|
|
registry.registerItem({
|
|
id: 'monitor-timestamp',
|
|
render: () => this.renderTimestampButton(),
|
|
isVisible: (widget) => widget instanceof MonitorWidget,
|
|
onDidChange: this.model.onChange as any, // XXX: it's a hack. See: https://github.com/eclipse-theia/theia/pull/6696/
|
|
});
|
|
registry.registerItem({
|
|
id: SerialMonitor.Commands.CLEAR_OUTPUT.id,
|
|
command: SerialMonitor.Commands.CLEAR_OUTPUT.id,
|
|
tooltip: nls.localize(
|
|
'vscode/output.contribution/clearOutput.label',
|
|
'Clear Output'
|
|
),
|
|
});
|
|
}
|
|
|
|
override registerCommands(commands: CommandRegistry): void {
|
|
commands.registerCommand(SerialMonitor.Commands.CLEAR_OUTPUT, {
|
|
isEnabled: (widget) => widget instanceof MonitorWidget,
|
|
isVisible: (widget) => widget instanceof MonitorWidget,
|
|
execute: (widget) => {
|
|
if (widget instanceof MonitorWidget) {
|
|
widget.clearConsole();
|
|
}
|
|
},
|
|
});
|
|
if (this.toggleCommand) {
|
|
commands.registerCommand(this.toggleCommand, {
|
|
execute: () => this.toggle(),
|
|
});
|
|
commands.registerCommand(
|
|
{ id: MonitorViewContribution.TOGGLE_SERIAL_MONITOR_TOOLBAR },
|
|
{
|
|
isVisible: (widget) =>
|
|
ArduinoToolbar.is(widget) && widget.side === 'right',
|
|
execute: () => this.toggle(),
|
|
}
|
|
);
|
|
}
|
|
commands.registerCommand(
|
|
{ id: MonitorViewContribution.RESET_SERIAL_MONITOR },
|
|
{ execute: () => this.reset() }
|
|
);
|
|
}
|
|
|
|
protected async toggle(): Promise<void> {
|
|
const widget = this.tryGetWidget();
|
|
if (widget) {
|
|
widget.dispose();
|
|
} else {
|
|
await this.openView({ activate: true, reveal: true });
|
|
}
|
|
}
|
|
|
|
protected async reset(): Promise<void> {
|
|
const widget = this.tryGetWidget();
|
|
if (widget) {
|
|
widget.dispose();
|
|
await this.openView({ activate: true, reveal: true });
|
|
}
|
|
}
|
|
|
|
protected renderAutoScrollButton(): React.ReactNode {
|
|
return (
|
|
<React.Fragment key="autoscroll-toolbar-item">
|
|
<div
|
|
title={nls.localize(
|
|
'vscode/output.contribution/toggleAutoScroll',
|
|
'Toggle Autoscroll'
|
|
)}
|
|
className={`item enabled fa fa-angle-double-down arduino-monitor ${
|
|
this.model.autoscroll ? 'toggled' : ''
|
|
}`}
|
|
onClick={this.toggleAutoScroll}
|
|
></div>
|
|
</React.Fragment>
|
|
);
|
|
}
|
|
|
|
protected readonly toggleAutoScroll = () => this.doToggleAutoScroll();
|
|
protected async doToggleAutoScroll(): Promise<void> {
|
|
this.model.toggleAutoscroll();
|
|
}
|
|
|
|
protected renderTimestampButton(): React.ReactNode {
|
|
return (
|
|
<React.Fragment key="line-ending-toolbar-item">
|
|
<div
|
|
title={nls.localize(
|
|
'arduino/serial/toggleTimestamp',
|
|
'Toggle Timestamp'
|
|
)}
|
|
className={`item enabled fa fa-clock-o arduino-monitor ${
|
|
this.model.timestamp ? 'toggled' : ''
|
|
}`}
|
|
onClick={this.toggleTimestamp}
|
|
></div>
|
|
</React.Fragment>
|
|
);
|
|
}
|
|
|
|
protected readonly toggleTimestamp = () => this.doToggleTimestamp();
|
|
protected async doToggleTimestamp(): Promise<void> {
|
|
this.model.toggleTimestamp();
|
|
}
|
|
}
|