import React from "react"; import { observable, action, makeObservable } from "mobx"; import { observer } from "mobx-react"; import classNames from "classnames"; import { Checkbox, Radio } from "eez-studio-ui/properties"; import type { IChartsController, WaveformRenderAlgorithm, IChartController } from "eez-studio-ui/chart/chart"; import { globalViewOptions } from "eez-studio-ui/chart/GlobalViewOptions"; //////////////////////////////////////////////////////////////////////////////// export const ChartViewOptions = observer( class ChartViewOptions extends React.Component< ChartViewOptionsProps & { chartsController: IChartsController; } > { render() { const chartsController = this.props.chartsController; const viewOptions = chartsController.viewOptions; return (
Axes lines subdivision:
viewOptions.setAxesLinesType("dynamic") )} > Dynamic {viewOptions.axesLines.type === "dynamic" && ( )} viewOptions.setAxesLinesType("fixed") )} > Fixed {viewOptions.axesLines.type === "fixed" && ( )}
{ viewOptions.setAxesLinesSnapToGrid(checked); })} > Snap to grid
{this.props.showRenderAlgorithm && (
Rendering algorithm:
)}
{ viewOptions.setShowAxisLabels(checked); })} > Show axis labels
{ viewOptions.setShowZoomButtons(checked); })} > Show zoom in/out buttons
Global options:
{ globalViewOptions.enableZoomAnimations = checked; })} > Enable zoom in/out animations
{ globalViewOptions.blackBackground = checked; })} > Black background
{this.props.showShowSampledDataOption && (
(globalViewOptions.showSampledData = checked) )} > Show sampled data
)}
); } } ); export interface ChartViewOptionsProps { showRenderAlgorithm: boolean; showShowSampledDataOption: boolean; } //////////////////////////////////////////////////////////////////////////////// interface DynamicSubdivisionOptionsProps { chartsController: IChartsController; } const DynamicSubdivisionOptions = observer( class DynamicSubdivisionOptions extends React.Component { xAxisSteps: string = ""; xAxisStepsError: boolean = false; yAxisSteps: string[] = []; yAxisStepsError: boolean[] = []; constructor(props: DynamicSubdivisionOptionsProps) { super(props); makeObservable(this, { xAxisSteps: observable, xAxisStepsError: observable, yAxisSteps: observable, yAxisStepsError: observable, loadProps: action }); this.loadProps(this.props); } componentDidUpdate(prevProps: any) { if (this.props != prevProps) { this.loadProps(this.props); } } loadProps(props: DynamicSubdivisionOptionsProps) { const chartsController = props.chartsController; const viewOptions = chartsController.viewOptions; const xSteps = viewOptions.axesLines.steps && viewOptions.axesLines.steps.x; this.xAxisSteps = xSteps ? xSteps .map(step => chartsController.xAxisController.unit.formatValue( step ) ) .join(", ") : ""; this.yAxisSteps = chartsController.chartControllers.map( (chartController: IChartController, i: number) => { const ySteps = viewOptions.axesLines.steps && i < viewOptions.axesLines.steps.y.length && viewOptions.axesLines.steps.y[i]; return ySteps ? ySteps .map(step => chartsController.chartControllers[ i ].yAxisController.unit.formatValue(step) ) .join(", ") : ""; } ); this.yAxisStepsError = this.yAxisSteps.map(x => false); } render() { const chartsController = this.props.chartsController; const viewOptions = chartsController.viewOptions; const yAxisSteps = chartsController.chartControllers .filter( chartController => !chartController.yAxisController.isDigital ) .map((chartController: IChartController, i: number) => { const yAxisController = chartController.yAxisController; return ( {yAxisController.axisModel.label} ) => { this.yAxisSteps[i] = event.target.value; const steps = event.target.value .split(",") .map(value => yAxisController.unit.parseValue( value ) ); if ( steps.length === 0 || !steps.every( step => step != null && step >= yAxisController.unit .units[0] ) ) { this.yAxisStepsError[i] = true; } else { this.yAxisStepsError[i] = false; steps.sort(); viewOptions.setAxesLinesStepsY( i, steps as number[] ); } } )} /> ); }); return (
{yAxisSteps}
Steps
Time ) => { this.xAxisSteps = event.target.value; const steps = event.target.value .split(",") .map(value => chartsController.xAxisController.unit.parseValue( value ) ) .sort(); if ( steps.length === 0 || !steps.every( step => step != null && step >= chartsController .xAxisController .unit .units[0] ) ) { this.xAxisStepsError = true; } else { this.xAxisStepsError = false; steps.sort(); viewOptions.setAxesLinesStepsX( steps as number[] ); } } )} />
); } } ); //////////////////////////////////////////////////////////////////////////////// interface FixedSubdivisionOptionsProps { chartsController: IChartsController; } const FixedSubdivisionOptions = observer( class FixedSubdivisionOptions extends React.Component { majorSubdivisionHorizontal: number = 0; majorSubdivisionVertical: number = 0; minorSubdivisionHorizontal: number = 0; minorSubdivisionVertical: number = 0; majorSubdivisionHorizontalError: boolean = false; constructor(props: FixedSubdivisionOptionsProps) { super(props); makeObservable(this, { majorSubdivisionHorizontal: observable, majorSubdivisionVertical: observable, minorSubdivisionHorizontal: observable, minorSubdivisionVertical: observable, majorSubdivisionHorizontalError: observable, loadProps: action }); this.loadProps(this.props); } componentDidUpdate(prevProps: any) { if (this.props != prevProps) { this.loadProps(this.props); } } loadProps(props: FixedSubdivisionOptionsProps) { const axesLines = props.chartsController.viewOptions.axesLines; this.majorSubdivisionHorizontal = axesLines.majorSubdivision.horizontal; this.majorSubdivisionVertical = axesLines.majorSubdivision.vertical; this.minorSubdivisionHorizontal = axesLines.minorSubdivision.horizontal; this.minorSubdivisionVertical = axesLines.minorSubdivision.vertical; } render() { const viewOptions = this.props.chartsController.viewOptions; return (
X axis Y axis
Major { this.majorSubdivisionHorizontal = event.target.value; const value = parseInt( event.target.value ); if ( isNaN(value) || value < 2 || value > 100 ) { this.majorSubdivisionHorizontalError = true; } else { this.majorSubdivisionHorizontalError = false; viewOptions.setAxesLinesMajorSubdivisionHorizontal( value ); } })} /> by { this.majorSubdivisionVertical = event.target.value; const value = parseInt( event.target.value ); if ( isNaN(value) || value < 2 || value > 100 ) { } else { viewOptions.setAxesLinesMajorSubdivisionVertical( value ); } })} />
Minor { this.minorSubdivisionHorizontal = event.target.value; const value = parseInt( event.target.value ); if ( isNaN(value) || value < 2 || value > 10 ) { } else { viewOptions.setAxesLinesMinorSubdivisionHorizontal( value ); } })} /> by { this.minorSubdivisionVertical = event.target.value; const value = parseInt( event.target.value ); if ( isNaN(value) || value < 2 || value > 10 ) { } else { viewOptions.setAxesLinesMinorSubdivisionVertical( value ); } })} />
); } } );