Skip to content

Commit

Permalink
DataLayer/ChartApi refactoring
Browse files Browse the repository at this point in the history
- Removed series clearing/modification from DataLayer - now it's responsibility is the only generate data updates
- DataLayer now generates baseIndex for timescale so we don't need to calculate it manually in chart model
- Removed Palette class, now we provide a color inside PlotRow (and any additional data for a bar)
- PlotRow is not generic now, if you'd like to add properties to it - just extend it
- PlotRow's value now contains the only 4 items (open, high, low, close), and they are always numbers
- Removed supporting empty values in PlotList
- Removed redundant each method from PlotList
- Refactored TickMarks algorithm
- Time scale points now contains time and time weight

Fixes #355 #270
  • Loading branch information
timocov committed Jun 18, 2020
1 parent 9da8096 commit 788f2ed
Show file tree
Hide file tree
Showing 24 changed files with 986 additions and 1,177 deletions.
44 changes: 18 additions & 26 deletions src/api/chart-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import {

import { CandlestickSeriesApi } from './candlestick-series-api';
import { DataUpdatesConsumer, SeriesDataItemTypeMap } from './data-consumer';
import { DataLayer, SeriesUpdatePacket } from './data-layer';
import { DataLayer, DataUpdateResponse, SeriesChanges } from './data-layer';
import { IChartApi, MouseEventHandler, MouseEventParams } from './ichart-api';
import { IPriceScaleApi } from './iprice-scale-api';
import { ISeriesApi } from './iseries-api';
Expand Down Expand Up @@ -271,39 +271,19 @@ export class ChartApi implements IChartApi, IPriceScaleApiProvider, DataUpdatesC
const update = this._dataLayer.removeSeries(series);
const model = this._chartWidget.model();
model.removeSeries(series);
const timeScaleUpdate = update.timeScaleUpdate;
model.updateTimeScale(timeScaleUpdate.changes, timeScaleUpdate.marks, true);
timeScaleUpdate.seriesUpdates.forEach((value: SeriesUpdatePacket, key: Series) => {
key.updateData(value.update);
});
model.updateTimeScaleBaseIndex(timeScaleUpdate.index);

this._sendUpdateToChart(update);

this._seriesMap.delete(seriesApi);
this._seriesMapReversed.delete(series);
}

public applyNewData<TSeriesType extends SeriesType>(series: Series<TSeriesType>, data: SeriesDataItemTypeMap[TSeriesType][]): void {
const update = this._dataLayer.setSeriesData(series, data);
const model = this._chartWidget.model();
const timeScaleUpdate = update.timeScaleUpdate;
model.updateTimeScale(timeScaleUpdate.changes, timeScaleUpdate.marks, true);
timeScaleUpdate.seriesUpdates.forEach((value: SeriesUpdatePacket, key: Series) => {
// the latest arg `true` must be removed in https://github.com/tradingview/lightweight-charts/issues/270
// here we don't need to clear palettes because they were just filled in DataLayer
// see https://github.com/tradingview/lightweight-charts/pull/330#discussion_r379415805
key.updateData(value.update, true);
});
model.updateTimeScaleBaseIndex(timeScaleUpdate.index);
this._sendUpdateToChart(this._dataLayer.setSeriesData(series, data));
}

public updateData<TSeriesType extends SeriesType>(series: Series<TSeriesType>, data: SeriesDataItemTypeMap[TSeriesType]): void {
const update = this._dataLayer.updateSeriesData(series, data);
const model = this._chartWidget.model();
const timeScaleUpdate = update.timeScaleUpdate;
model.updateTimeScale(timeScaleUpdate.changes, timeScaleUpdate.marks, false);
timeScaleUpdate.seriesUpdates.forEach((value: SeriesUpdatePacket, key: Series) => {
key.updateData(value.update);
});
model.updateTimeScaleBaseIndex(timeScaleUpdate.index);
this._sendUpdateToChart(this._dataLayer.updateSeriesData(series, data));
}

public subscribeClick(handler: MouseEventHandler): void {
Expand Down Expand Up @@ -347,6 +327,18 @@ export class ChartApi implements IChartApi, IPriceScaleApiProvider, DataUpdatesC
return this._chartWidget.takeScreenshot();
}

private _sendUpdateToChart(update: DataUpdateResponse): void {
const model = this._chartWidget.model();

if (update.timeScale !== undefined) {
model.updateTimeScale(update.timeScale.points, update.timeScale.baseIndex);
}

update.series.forEach((value: SeriesChanges, series: Series) => series.updateData(value.data, value.fullUpdate));

model.recalculateAllPanes();
}

private _mapSeriesToApi(series: Series): ISeriesApi<SeriesType> {
return ensureDefined(this._seriesMapReversed.get(series));
}
Expand Down
Loading

0 comments on commit 788f2ed

Please sign in to comment.