From 8c49c04359ca4fc0f61766fb4a6d9441200842f3 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Thu, 5 Dec 2019 16:35:16 +0100 Subject: [PATCH] :crossed_fingers: finalized the monitor UI Signed-off-by: Akos Kitta --- .../src/browser/monitor/monitor-connection.ts | 6 +- .../src/browser/monitor/monitor-model.ts | 20 ++++--- .../monitor/monitor-view-contribution.tsx | 4 +- .../src/browser/monitor/monitor-widget.tsx | 57 ++++++++++++------- .../src/browser/style/monitor.css | 28 +++++---- 5 files changed, 66 insertions(+), 49 deletions(-) diff --git a/arduino-ide-extension/src/browser/monitor/monitor-connection.ts b/arduino-ide-extension/src/browser/monitor/monitor-connection.ts index cf19e6e6..b6d39dce 100644 --- a/arduino-ide-extension/src/browser/monitor/monitor-connection.ts +++ b/arduino-ide-extension/src/browser/monitor/monitor-connection.ts @@ -95,12 +95,12 @@ export class MonitorConnection { } }); // Handles the `baudRate` changes by reconnecting if required. - this.monitorModel.onChange(() => { - if (this.autoConnect && this.connected) { + this.monitorModel.onChange(({ property }) => { + if (property === 'baudRate' && this.autoConnect && this.connected) { const { boardsConfig } = this.boardsServiceClient; this.handleBoardConfigChange(boardsConfig); } - }) + }); } get connected(): boolean { diff --git a/arduino-ide-extension/src/browser/monitor/monitor-model.ts b/arduino-ide-extension/src/browser/monitor/monitor-model.ts index 79cb1de6..b1f9968e 100644 --- a/arduino-ide-extension/src/browser/monitor/monitor-model.ts +++ b/arduino-ide-extension/src/browser/monitor/monitor-model.ts @@ -15,7 +15,7 @@ export class MonitorModel implements FrontendApplicationContribution { @inject(BoardsServiceClientImpl) protected readonly boardsServiceClient: BoardsServiceClientImpl; - protected readonly onChangeEmitter: Emitter; + protected readonly onChangeEmitter: Emitter>; protected _autoscroll: boolean; protected _timestamp: boolean; protected _baudRate: MonitorConfig.BaudRate; @@ -26,7 +26,7 @@ export class MonitorModel implements FrontendApplicationContribution { this._timestamp = false; this._baudRate = MonitorConfig.BaudRate.DEFAULT; this._lineEnding = MonitorModel.EOL.DEFAULT; - this.onChangeEmitter = new Emitter(); + this.onChangeEmitter = new Emitter>(); } onStart(): void { @@ -37,7 +37,7 @@ export class MonitorModel implements FrontendApplicationContribution { }); } - get onChange(): Event { + get onChange(): Event> { return this.onChangeEmitter.event; } @@ -48,6 +48,7 @@ export class MonitorModel implements FrontendApplicationContribution { toggleAutoscroll(): void { this._autoscroll = !this._autoscroll; this.storeState(); + this.storeState().then(() => this.onChangeEmitter.fire({ property: 'autoscroll', value: this._autoscroll })); } get timestamp(): boolean { @@ -56,7 +57,7 @@ export class MonitorModel implements FrontendApplicationContribution { toggleTimestamp(): void { this._timestamp = !this._timestamp; - this.storeState(); + this.storeState().then(() => this.onChangeEmitter.fire({ property: 'timestamp', value: this._timestamp })); } get baudRate(): MonitorConfig.BaudRate { @@ -65,7 +66,7 @@ export class MonitorModel implements FrontendApplicationContribution { set baudRate(baudRate: MonitorConfig.BaudRate) { this._baudRate = baudRate; - this.storeState().then(() => this.onChangeEmitter.fire(undefined)); + this.storeState().then(() => this.onChangeEmitter.fire({ property: 'baudRate', value: this._baudRate })); } get lineEnding(): MonitorModel.EOL { @@ -74,7 +75,7 @@ export class MonitorModel implements FrontendApplicationContribution { set lineEnding(lineEnding: MonitorModel.EOL) { this._lineEnding = lineEnding; - this.storeState(); + this.storeState().then(() => this.onChangeEmitter.fire({ property: 'lineEnding', value: this._lineEnding })); } protected restoreState(state: MonitorModel.State) { @@ -82,7 +83,6 @@ export class MonitorModel implements FrontendApplicationContribution { this._timestamp = state.timestamp; this._baudRate = state.baudRate; this._lineEnding = state.lineEnding; - this.onChangeEmitter.fire(undefined); } protected async storeState(): Promise { @@ -104,6 +104,12 @@ export namespace MonitorModel { baudRate: MonitorConfig.BaudRate; lineEnding: EOL; } + export namespace State { + export interface Change { + readonly property: K; + readonly value: State[K]; + } + } export type EOL = '' | '\n' | '\r' | '\r\n'; export namespace EOL { 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 a9967970..1231bd22 100644 --- a/arduino-ide-extension/src/browser/monitor/monitor-view-contribution.tsx +++ b/arduino-ide-extension/src/browser/monitor/monitor-view-contribution.tsx @@ -59,13 +59,13 @@ export class MonitorViewContribution extends AbstractViewContribution this.renderAutoScrollButton(), isVisible: widget => widget instanceof MonitorWidget, - onDidChange: this.model.onChange + onDidChange: this.model.onChange as any // TODO: 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 + onDidChange: this.model.onChange as any // TODO: https://github.com/eclipse-theia/theia/pull/6696/ }); registry.registerItem({ id: SerialMonitor.Commands.CLEAR_OUTPUT.id, diff --git a/arduino-ide-extension/src/browser/monitor/monitor-widget.tsx b/arduino-ide-extension/src/browser/monitor/monitor-widget.tsx index 3079aba1..82bf6716 100644 --- a/arduino-ide-extension/src/browser/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/monitor/monitor-widget.tsx @@ -88,7 +88,7 @@ export class MonitorWidget extends ReactWidget { value: '' }, { - label: 'Newline', + label: 'New Line', value: '\n' }, { @@ -99,7 +99,7 @@ export class MonitorWidget extends ReactWidget { label: 'Both NL & CR', value: '\r\n' } - ] + ]; } protected get baudRates(): OptionsType> { @@ -111,28 +111,33 @@ export class MonitorWidget extends ReactWidget { const { baudRates, lineEndings } = this; const lineEnding = lineEndings.find(item => item.value === this.monitorModel.lineEnding) || lineEndings[1]; // Defaults to `\n`. const baudRate = baudRates.find(item => item.value === this.monitorModel.baudRate) || baudRates[4]; // Defaults to `9600`. - return
+ return
-
- , - +
+ +
+
+ +
-
+
void; @@ -168,9 +173,9 @@ export namespace SerialMonitorSendField { } } -export class SerialMonitorSendField extends React.Component { +export class SerialMonitorSendInput extends React.Component { - constructor(props: SerialMonitorSendField.Props) { + constructor(props: Readonly) { super(props); this.state = { value: '' }; this.onChange = this.onChange.bind(this); @@ -235,6 +240,7 @@ export namespace SerialMonitorOutput { } export interface State { content: string; + timestamp: boolean; } } @@ -248,7 +254,7 @@ export class SerialMonitorOutput extends React.Component) { super(props); - this.state = { content: '' }; + this.state = { content: '', timestamp: this.props.monitorModel.timestamp }; } render(): React.ReactNode { @@ -270,11 +276,17 @@ export class SerialMonitorOutput extends React.Component ` : ''}${line}`; + const content = `${this.state.content}${this.state.timestamp ? `${dateFormat(new Date(), 'H:M:ss.l')} -> ` : ''}${line}`; this.setState({ content }); } }), - this.props.clearConsoleEvent(() => this.setState({ content: '' })) + this.props.clearConsoleEvent(() => this.setState({ content: '' })), + this.props.monitorModel.onChange(({ property }) => { + if (property === 'timestamp') { + const { timestamp } = this.props.monitorModel; + this.setState({ timestamp }); + } + }) ]); } @@ -283,7 +295,8 @@ export class SerialMonitorOutput extends React.Component input { +.serial-monitor .head .send > input { line-height: var(--theia-content-line-height); width: 100%; } -.serial-monitor-container .head .send > input:focus { +.serial-monitor .head .send > input:focus { border-color: var(--theia-accent-color3); } -.serial-monitor-container .head .send > input.not-connected { +.serial-monitor .head .send > input.not-connected { background-color: var(--theia-warn-color0); } -.serial-monitor-container .head .send input#serial-monitor-send { - color: var(--theia-ui-font-color1); - flex: 1; -} - -.serial-monitor-container .head .config { +.serial-monitor .head .config { display: flex; } -#serial-monitor-output-container { +.serial-monitor .head .config .select { + margin-left: 5px; +} + +.serial-monitor .body { overflow: auto; flex: 1; - padding: 6px; + padding: 5px; } .p-TabBar-toolbar .item.arduino-monitor {