@devexperts/dxcharts-lite 1.0.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/chart/animation/canvas-animation.js +134 -1
- package/dist/chart/animation/types/animation.js +43 -1
- package/dist/chart/animation/types/color-alpha-animation.d.ts +1 -1
- package/dist/chart/animation/types/color-alpha-animation.js +60 -1
- package/dist/chart/animation/types/color-transition-animation.d.ts +1 -1
- package/dist/chart/animation/types/color-transition-animation.js +86 -1
- package/dist/chart/animation/types/viewport-movement-animation.js +63 -1
- package/dist/chart/animation/viewport-model-animation.js +20 -1
- package/dist/chart/bootstrap.d.ts +51 -48
- package/dist/chart/bootstrap.js +449 -1
- package/dist/chart/canvas/canvas-bounds-container.d.ts +0 -5
- package/dist/chart/canvas/canvas-bounds-container.js +815 -1
- package/dist/chart/canvas/canvas-chart-html.js +16 -18
- package/dist/chart/canvas/chart-elements.d.ts +1 -4
- package/dist/chart/canvas/chart-elements.js +22 -1
- package/dist/chart/canvas/cursor.handler.js +122 -1
- package/dist/chart/canvas/layout-creator.js +34 -1
- package/dist/chart/canvas/y-axis-bounds.container.d.ts +2 -2
- package/dist/chart/canvas/y-axis-bounds.container.js +67 -1
- package/dist/chart/chart-container.js +1 -1
- package/dist/chart/chart.config.d.ts +4 -5
- package/dist/chart/chart.config.js +645 -1
- package/dist/chart/chart.d.ts +62 -0
- package/dist/chart/chart.js +106 -0
- package/dist/chart/components/chart/basic-scale.d.ts +2 -2
- package/dist/chart/components/chart/basic-scale.js +31 -1
- package/dist/chart/components/chart/candle-transformer.functions.js +15 -1
- package/dist/chart/components/chart/candle-width-calculator.functions.js +2 -1
- package/dist/chart/components/chart/candle.functions.js +44 -1
- package/dist/chart/components/chart/chart-area-pan.handler.d.ts +3 -3
- package/dist/chart/components/chart/chart-area-pan.handler.js +197 -1
- package/dist/chart/components/chart/chart-base.model.js +66 -1
- package/dist/chart/components/chart/chart.component.d.ts +7 -3
- package/dist/chart/components/chart/chart.component.js +408 -1
- package/dist/chart/components/chart/chart.model.d.ts +4 -11
- package/dist/chart/components/chart/chart.model.js +954 -1
- package/dist/chart/components/chart/data-series.high-low-provider.js +34 -1
- package/dist/chart/components/chart/fake-candles.js +97 -1
- package/dist/chart/components/chart/price.formatter.js +35 -1
- package/dist/chart/components/chart/secondary-chart-colors-pool.js +68 -1
- package/dist/chart/components/cross_tool/cross-tool.component.js +85 -1
- package/dist/chart/components/cross_tool/cross-tool.drawer.js +32 -1
- package/dist/chart/components/cross_tool/cross-tool.model.js +107 -1
- package/dist/chart/components/cross_tool/types/cross-and-labels.drawer.js +137 -1
- package/dist/chart/components/cross_tool/types/none.drawer.js +3 -1
- package/dist/chart/components/dran-n-drop_helper/drag-n-drop-x.component.js +28 -1
- package/dist/chart/components/dran-n-drop_helper/drag-n-drop-y.component.js +24 -1
- package/dist/chart/components/dran-n-drop_helper/drag-n-drop.component.js +53 -1
- package/dist/chart/components/dynamic-objects/dynamic-objects.component.d.ts +13 -0
- package/dist/chart/components/dynamic-objects/dynamic-objects.component.js +20 -0
- package/dist/chart/components/dynamic-objects/dynamic-objects.drawer.d.ts +18 -0
- package/dist/chart/components/dynamic-objects/dynamic-objects.drawer.js +23 -0
- package/dist/chart/components/dynamic-objects/dynamic-objects.model.d.ts +63 -0
- package/dist/chart/components/dynamic-objects/dynamic-objects.model.js +136 -0
- package/dist/chart/components/events/events-hit-test.drawer.js +63 -1
- package/dist/chart/components/events/events.component.js +61 -1
- package/dist/chart/components/events/events.drawer.js +195 -1
- package/dist/chart/components/events/events.model.js +69 -1
- package/dist/chart/components/grid/grid.component.d.ts +2 -2
- package/dist/chart/components/grid/grid.component.js +31 -1
- package/dist/chart/components/grid/grid.drawer.d.ts +4 -3
- package/dist/chart/components/grid/grid.drawer.js +106 -1
- package/dist/chart/components/high_low/high-low.component.js +12 -1
- package/dist/chart/components/high_low/high-low.drawer.js +126 -1
- package/dist/chart/components/highlights/highlights.component.js +46 -1
- package/dist/chart/components/highlights/highlights.drawer.js +154 -1
- package/dist/chart/components/highlights/highlights.model.js +75 -1
- package/dist/chart/components/labels_generator/numeric-axis-labels.generator.d.ts +1 -1
- package/dist/chart/components/labels_generator/numeric-axis-labels.generator.js +199 -1
- package/dist/chart/components/navigation_map/navigation-map-move.handler.d.ts +2 -2
- package/dist/chart/components/navigation_map/navigation-map-move.handler.js +108 -1
- package/dist/chart/components/navigation_map/navigation-map.component.js +112 -1
- package/dist/chart/components/navigation_map/navigation-map.drawer.js +244 -1
- package/dist/chart/components/navigation_map/navigation-map.model.js +33 -2
- package/dist/chart/components/pan/chart-pan.component.d.ts +2 -2
- package/dist/chart/components/pan/chart-pan.component.js +51 -1
- package/dist/chart/components/pane/extent/y-extent-component.d.ts +12 -18
- package/dist/chart/components/pane/extent/y-extent-component.js +120 -1
- package/dist/chart/components/pane/pane-hit-test.controller.js +55 -1
- package/dist/chart/components/pane/pane-manager.component.d.ts +10 -5
- package/dist/chart/components/pane/pane-manager.component.js +148 -1
- package/dist/chart/components/pane/pane.component.d.ts +16 -32
- package/dist/chart/components/pane/pane.component.js +278 -1
- package/dist/chart/components/resizer/bar-resizer.component.js +139 -1
- package/dist/chart/components/resizer/bar-resizer.drawer.js +46 -1
- package/dist/chart/components/snapshot/snapshot.component.js +48 -1
- package/dist/chart/components/volumes/separate-volumes.component.d.ts +6 -10
- package/dist/chart/components/volumes/separate-volumes.component.js +63 -1
- package/dist/chart/components/volumes/volume-color-resolvers.functions.js +18 -1
- package/dist/chart/components/volumes/volumes.component.d.ts +6 -7
- package/dist/chart/components/volumes/volumes.component.js +94 -1
- package/dist/chart/components/volumes/volumes.drawer.d.ts +5 -12
- package/dist/chart/components/volumes/volumes.drawer.js +140 -1
- package/dist/chart/components/volumes/volumes.formatter.js +31 -1
- package/dist/chart/components/volumes/volumes.model.d.ts +2 -2
- package/dist/chart/components/volumes/volumes.model.js +43 -1
- package/dist/chart/components/watermark/water-mark.component.js +103 -1
- package/dist/chart/components/watermark/water-mark.drawer.js +187 -1
- package/dist/chart/components/x_axis/numeric-x-axis-labels.generator.js +27 -1
- package/dist/chart/components/x_axis/time/parser/time-formats-matchers.functions.js +187 -1
- package/dist/chart/components/x_axis/time/parser/time-formats-parser.functions.js +76 -1
- package/dist/chart/components/x_axis/time/parser/time-formats-validators.functions.js +79 -1
- package/dist/chart/components/x_axis/time/parser/time-formats.model.js +14 -1
- package/dist/chart/components/x_axis/time/x-axis-weights.functions.d.ts +1 -1
- package/dist/chart/components/x_axis/time/x-axis-weights.functions.js +143 -1
- package/dist/chart/components/x_axis/time/x-axis-weights.generator.js +73 -1
- package/dist/chart/components/x_axis/x-axis-draw.functions.js +49 -1
- package/dist/chart/components/x_axis/x-axis-labels.drawer.js +70 -1
- package/dist/chart/components/x_axis/x-axis-labels.generator.d.ts +2 -2
- package/dist/chart/components/x_axis/x-axis-labels.generator.js +332 -1
- package/dist/chart/components/x_axis/x-axis-labels.model.js +35 -1
- package/dist/chart/components/x_axis/x-axis-scale.handler.d.ts +2 -2
- package/dist/chart/components/x_axis/x-axis-scale.handler.js +60 -1
- package/dist/chart/components/x_axis/x-axis-time-labels.drawer.js +82 -1
- package/dist/chart/components/x_axis/x-axis.component.d.ts +2 -2
- package/dist/chart/components/x_axis/x-axis.component.js +119 -1
- package/dist/chart/components/y_axis/label-color.functions.js +53 -1
- package/dist/chart/components/y_axis/numeric-y-axis-labels.generator.d.ts +4 -4
- package/dist/chart/components/y_axis/numeric-y-axis-labels.generator.js +33 -1
- package/dist/chart/components/y_axis/price_labels/data-series-y-axis-labels.provider.d.ts +3 -3
- package/dist/chart/components/y_axis/price_labels/data-series-y-axis-labels.provider.js +67 -1
- package/dist/chart/components/y_axis/price_labels/labels-positions-calculator.js +56 -1
- package/dist/chart/components/y_axis/price_labels/last-candle-labels.provider.js +95 -1
- package/dist/chart/components/y_axis/price_labels/price-label.drawer.d.ts +2 -2
- package/dist/chart/components/y_axis/price_labels/price-label.drawer.js +119 -1
- package/dist/chart/components/y_axis/price_labels/y-axis-labels.model.d.ts +9 -8
- package/dist/chart/components/y_axis/price_labels/y-axis-labels.model.js +201 -1
- package/dist/chart/components/y_axis/price_labels/y-axis-price-labels.drawer.d.ts +6 -7
- package/dist/chart/components/y_axis/price_labels/y-axis-price-labels.drawer.js +58 -1
- package/dist/chart/components/y_axis/y-axis-base-labels.model.d.ts +6 -4
- package/dist/chart/components/y_axis/y-axis-base-labels.model.js +47 -1
- package/dist/chart/components/y_axis/y-axis-labels.drawer.d.ts +4 -4
- package/dist/chart/components/y_axis/y-axis-labels.drawer.js +161 -1
- package/dist/chart/components/y_axis/y-axis-scale.handler.d.ts +2 -2
- package/dist/chart/components/y_axis/y-axis-scale.handler.js +72 -1
- package/dist/chart/components/y_axis/y-axis.component.d.ts +32 -41
- package/dist/chart/components/y_axis/y-axis.component.js +220 -1
- package/dist/chart/components/y_axis/y-axis.drawer.d.ts +9 -12
- package/dist/chart/components/y_axis/y-axis.drawer.js +96 -1
- package/dist/chart/components/y_axis/y-axis.model.d.ts +9 -17
- package/dist/chart/components/y_axis/y-axis.model.js +33 -1
- package/dist/chart/drawers/chart-background.drawer.js +69 -1
- package/dist/chart/drawers/chart-type-drawers/area.drawer.js +69 -1
- package/dist/chart/drawers/chart-type-drawers/bar.drawer.js +57 -1
- package/dist/chart/drawers/chart-type-drawers/baseline.drawer.js +84 -1
- package/dist/chart/drawers/chart-type-drawers/candle.drawer.js +162 -1
- package/dist/chart/drawers/chart-type-drawers/histogram.drawer.js +57 -1
- package/dist/chart/drawers/chart-type-drawers/line.drawer.js +38 -1
- package/dist/chart/drawers/chart-type-drawers/scatter-plot.drawer.js +19 -1
- package/dist/chart/drawers/clear-canvas.drawer.js +14 -1
- package/dist/chart/drawers/composite.drawer.js +67 -1
- package/dist/chart/drawers/data-series-drawers/candle-series-wrapper.js +50 -1
- package/dist/chart/drawers/data-series-drawers/color-candle.drawer.js +35 -1
- package/dist/chart/drawers/data-series-drawers/data-series-drawers.utils.js +16 -1
- package/dist/chart/drawers/data-series-drawers/difference-cloud.drawer.js +106 -1
- package/dist/chart/drawers/data-series-drawers/histogram.drawer.js +23 -1
- package/dist/chart/drawers/data-series-drawers/linear.drawer.js +19 -1
- package/dist/chart/drawers/data-series-drawers/points.drawer.js +19 -1
- package/dist/chart/drawers/data-series-drawers/rectangular-tool.drawer.js +7 -1
- package/dist/chart/drawers/data-series-drawers/text.drawer.js +25 -1
- package/dist/chart/drawers/data-series-drawers/trend-histogram.drawer.js +35 -1
- package/dist/chart/drawers/data-series-drawers/triangle.drawer.js +22 -1
- package/dist/chart/drawers/data-series.drawer.d.ts +5 -7
- package/dist/chart/drawers/data-series.drawer.js +56 -1
- package/dist/chart/drawers/drawing-manager.d.ts +1 -1
- package/dist/chart/drawers/drawing-manager.js +177 -1
- package/dist/chart/drawers/ht-data-series.drawer.js +37 -1
- package/dist/chart/events/event-bus.js +73 -1
- package/dist/chart/events/events.js +3 -1
- package/dist/chart/inputhandlers/candle-tap.handler.js +46 -1
- package/dist/chart/inputhandlers/chart-resize.handler.js +98 -1
- package/dist/chart/inputhandlers/cross-event-producer.component.js +67 -1
- package/dist/chart/inputhandlers/hover-producer.component.d.ts +2 -2
- package/dist/chart/inputhandlers/hover-producer.component.js +228 -1
- package/dist/chart/inputhandlers/main-canvas-touch.handler.d.ts +2 -2
- package/dist/chart/inputhandlers/main-canvas-touch.handler.js +80 -1
- package/dist/chart/inputlisteners/canvas-input-listener.component.js +629 -1
- package/dist/chart/model/baseline.model.js +88 -1
- package/dist/chart/model/bounds.model.js +1 -1
- package/dist/chart/model/candle-hover.js +70 -1
- package/dist/chart/model/candle-series-high-low.provider.js +45 -1
- package/dist/chart/model/candle-series.model.d.ts +3 -3
- package/dist/chart/model/candle-series.model.js +245 -1
- package/dist/chart/model/candle.model.js +69 -1
- package/dist/chart/model/canvas.model.js +228 -1
- package/dist/chart/model/chart-base-element.js +129 -1
- package/dist/chart/model/compare-series-hover.js +25 -1
- package/dist/chart/model/data-series-view.d.ts +5 -5
- package/dist/chart/model/data-series-view.js +111 -1
- package/dist/chart/model/data-series.config.js +14 -1
- package/dist/chart/model/data-series.model.d.ts +4 -4
- package/dist/chart/model/data-series.model.js +281 -1
- package/dist/chart/model/date-time.formatter.js +151 -1
- package/dist/chart/model/hit-test-canvas.model.d.ts +1 -1
- package/dist/chart/model/hit-test-canvas.model.js +256 -1
- package/dist/chart/model/main-candle-series.model.d.ts +1 -1
- package/dist/chart/model/main-candle-series.model.js +29 -1
- package/dist/chart/model/scale.model.d.ts +2 -1
- package/dist/chart/model/scale.model.js +316 -1
- package/dist/chart/model/scaling/auto-scale.model.js +97 -1
- package/dist/chart/model/scaling/constrait.functions.js +61 -1
- package/dist/chart/model/scaling/lock-ratio.model.js +17 -1
- package/dist/chart/model/scaling/move-chart.functions.js +22 -1
- package/dist/chart/model/scaling/viewport.model.d.ts +2 -2
- package/dist/chart/model/scaling/viewport.model.js +279 -1
- package/dist/chart/model/scaling/x-zooming.functions.js +35 -1
- package/dist/chart/model/time-zone.model.js +109 -1
- package/dist/chart/model/visual-candle.js +134 -1
- package/dist/chart/utils/__tests__/array.utils.test.js +135 -1
- package/dist/chart/utils/__tests__/math.utils.test.js +14 -1
- package/dist/chart/utils/__tests__/object.utils.test.js +11 -1
- package/dist/chart/utils/__tests__/priceIncrementsUtils.test.js +29 -1
- package/dist/chart/utils/array.utils.d.ts +1 -1
- package/dist/chart/utils/array.utils.js +269 -1
- package/dist/chart/utils/auto-period-detector.utils.js +39 -1
- package/dist/chart/utils/candles-generator-ts.utils.js +20 -1
- package/dist/chart/utils/candles-generator.utils.js +161 -1
- package/dist/chart/utils/candles.utils.js +42 -1
- package/dist/chart/utils/canvas/canvas-drawing-functions.utils.js +144 -1
- package/dist/chart/utils/canvas/canvas-font-measure-tool.utils.js +51 -1
- package/dist/chart/utils/canvas/canvas-text-functions.utils.js +156 -1
- package/dist/chart/utils/color.utils.js +31 -1
- package/dist/chart/utils/device/browser.utils.js +10 -1
- package/dist/chart/utils/device/device-detector.utils.js +24 -1
- package/dist/chart/utils/device/device-pixel-ratio.utils.js +21 -1
- package/dist/chart/utils/device/touchpad.utils.js +91 -1
- package/dist/chart/utils/dom.utils.js +15 -1
- package/dist/chart/utils/function.utils.js +16 -1
- package/dist/chart/utils/linkedList.utils.d.ts +28 -0
- package/dist/chart/utils/linkedList.utils.js +138 -0
- package/dist/chart/utils/math.utils.js +115 -1
- package/dist/chart/utils/merge.utils.js +56 -1
- package/dist/chart/utils/object.utils.js +43 -1
- package/dist/chart/utils/performance/animation-frame-cache.utils.js +77 -0
- package/dist/chart/utils/{perfomance → performance}/debounce.utils.js +7 -1
- package/dist/chart/utils/performance/memoize.utils.js +74 -0
- package/dist/chart/utils/performance/request-animation-frame-throttle.utils.js +43 -0
- package/dist/chart/utils/performance/throttle.utils.js +26 -0
- package/dist/chart/utils/price-increments.utils.d.ts +1 -0
- package/dist/chart/utils/price-increments.utils.js +127 -1
- package/dist/chart/utils/uuid.utils.js +4 -1
- package/dist/dxchart.min.js +9 -12
- package/dist/index.d.ts +3 -3
- package/dist/index.js +20 -1
- package/package.json +4 -4
- package/dist/chart/utils/perfomance/animation-frame-cache.utils.js +0 -6
- package/dist/chart/utils/perfomance/memoize.utils.js +0 -6
- package/dist/chart/utils/perfomance/request-animation-frame-throttle.utils.js +0 -6
- package/dist/chart/utils/perfomance/throttle.utils.js +0 -6
- /package/dist/chart/utils/{perfomance → performance}/animation-frame-cache.utils.d.ts +0 -0
- /package/dist/chart/utils/{perfomance → performance}/debounce.utils.d.ts +0 -0
- /package/dist/chart/utils/{perfomance → performance}/memoize.utils.d.ts +0 -0
- /package/dist/chart/utils/{perfomance → performance}/request-animation-frame-throttle.utils.d.ts +0 -0
- /package/dist/chart/utils/{perfomance → performance}/throttle.utils.d.ts +0 -0
|
@@ -3,4 +3,22 @@
|
|
|
3
3
|
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
|
4
4
|
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
5
|
*/
|
|
6
|
-
import{setLineWidth
|
|
6
|
+
import { setLineWidth } from '../data-series.drawer';
|
|
7
|
+
import { buildLinePath } from './data-series-drawers.utils';
|
|
8
|
+
export class LinearDrawer {
|
|
9
|
+
constructor() { }
|
|
10
|
+
draw(ctx, allPoints, model, drawerConfig) {
|
|
11
|
+
allPoints.forEach((points, idx) => {
|
|
12
|
+
var _a;
|
|
13
|
+
const config = model.getPaintConfig(idx);
|
|
14
|
+
setLineWidth(ctx, config.lineWidth, model, drawerConfig, config.hoveredLineWidth);
|
|
15
|
+
ctx.strokeStyle = (_a = drawerConfig.singleColor) !== null && _a !== void 0 ? _a : config.color;
|
|
16
|
+
this.drawLinePath(ctx, points, model.view);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
drawLinePath(ctx, points, view) {
|
|
20
|
+
ctx.beginPath();
|
|
21
|
+
buildLinePath(points, ctx, view);
|
|
22
|
+
ctx.stroke();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -3,4 +3,22 @@
|
|
|
3
3
|
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
|
4
4
|
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
5
|
*/
|
|
6
|
-
export class PointsDrawer
|
|
6
|
+
export class PointsDrawer {
|
|
7
|
+
constructor() { }
|
|
8
|
+
draw(ctx, allPoints, model, drawerConfig) {
|
|
9
|
+
allPoints.forEach((points, idx) => {
|
|
10
|
+
var _a;
|
|
11
|
+
const config = model.getPaintConfig(idx);
|
|
12
|
+
const radius = config.lineWidth;
|
|
13
|
+
ctx.fillStyle = (_a = drawerConfig.singleColor) !== null && _a !== void 0 ? _a : config.color;
|
|
14
|
+
ctx.lineWidth = 1;
|
|
15
|
+
points.forEach(p => {
|
|
16
|
+
ctx.beginPath();
|
|
17
|
+
const x = model.view.toX(p.centerUnit);
|
|
18
|
+
const y = model.view.toY(p.close);
|
|
19
|
+
ctx.arc(x, y, radius, 0, Math.PI * 2);
|
|
20
|
+
ctx.fill();
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -3,4 +3,10 @@
|
|
|
3
3
|
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
|
4
4
|
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
5
|
*/
|
|
6
|
-
export class RectangularToolDrawer{
|
|
6
|
+
export class RectangularToolDrawer {
|
|
7
|
+
// private lastDrawnTimelineX: number = -1;
|
|
8
|
+
// private regularZoneOpacity: number = 0.3;
|
|
9
|
+
// private lastZoneOpacity: number = 0.4;
|
|
10
|
+
// constructor(private chartModel: ChartModel, private chartBoundsContainer: CanvasBoundsContainer) {}
|
|
11
|
+
draw() { }
|
|
12
|
+
}
|
|
@@ -3,4 +3,28 @@
|
|
|
3
3
|
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
|
4
4
|
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
5
|
*/
|
|
6
|
-
import{calculateSymbolHeight
|
|
6
|
+
import { calculateSymbolHeight, calculateTextWidth } from '../../utils/canvas/canvas-font-measure-tool.utils';
|
|
7
|
+
export class TextDrawer {
|
|
8
|
+
constructor(config) {
|
|
9
|
+
this.config = config;
|
|
10
|
+
}
|
|
11
|
+
draw(ctx, allPoints, model, drawerConfig) {
|
|
12
|
+
ctx.save();
|
|
13
|
+
allPoints.forEach((points, idx) => {
|
|
14
|
+
var _a;
|
|
15
|
+
const config = model.getPaintConfig(idx);
|
|
16
|
+
ctx.fillStyle = (_a = drawerConfig.singleColor) !== null && _a !== void 0 ? _a : config.color;
|
|
17
|
+
const font = config.lineWidth + 'px ' + this.config.components.yAxis.fontFamily;
|
|
18
|
+
ctx.font = font;
|
|
19
|
+
points.forEach(p => {
|
|
20
|
+
const text = model.getTextForPoint(p);
|
|
21
|
+
const textWidth = calculateTextWidth(text, ctx, font);
|
|
22
|
+
const textHeight = calculateSymbolHeight(font, ctx);
|
|
23
|
+
const x = model.view.toX(p.centerUnit) - textWidth / 2;
|
|
24
|
+
const y = model.view.toY(p.close) + textHeight;
|
|
25
|
+
ctx.fillText(text, x, y);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
ctx.restore();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -3,4 +3,38 @@
|
|
|
3
3
|
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
|
4
4
|
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
5
|
*/
|
|
6
|
-
import{flat
|
|
6
|
+
import { flat } from '../../utils/array.utils';
|
|
7
|
+
import { floor } from '../../utils/math.utils';
|
|
8
|
+
export class TrendHistogramDrawer {
|
|
9
|
+
constructor() { }
|
|
10
|
+
draw(ctx, allPoints, model) {
|
|
11
|
+
const zero = model.view.toY(0);
|
|
12
|
+
// here I do flat, thinks that there is no more that 1 series
|
|
13
|
+
const allPointsFlat = flat(allPoints);
|
|
14
|
+
const items = [[], []];
|
|
15
|
+
allPointsFlat.forEach((item, idx, array) => {
|
|
16
|
+
items[item.close < this.previousValue(array, idx) ? 1 : 0].push(item);
|
|
17
|
+
});
|
|
18
|
+
items.forEach((points, idx) => {
|
|
19
|
+
// odd width is crucial to draw histogram without antialiasing
|
|
20
|
+
const config = model.getPaintConfig(idx);
|
|
21
|
+
ctx.strokeStyle = idx === 0 ? config.color : config.aditionalColor || '#FF00FF';
|
|
22
|
+
ctx.lineWidth = config.lineWidth;
|
|
23
|
+
ctx.beginPath();
|
|
24
|
+
points.forEach(p => {
|
|
25
|
+
const x = model.view.toX(p.centerUnit);
|
|
26
|
+
const y = model.view.toY(p.close);
|
|
27
|
+
ctx.moveTo(x, floor(zero));
|
|
28
|
+
ctx.lineTo(x, floor(y));
|
|
29
|
+
});
|
|
30
|
+
ctx.stroke();
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
//weird but works
|
|
34
|
+
previousValue(arr, idx) {
|
|
35
|
+
do {
|
|
36
|
+
idx--;
|
|
37
|
+
} while (idx >= 0 && !isFinite(arr[idx] && arr[idx].close));
|
|
38
|
+
return arr[idx] ? arr[idx].close : Number.NaN;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -3,4 +3,25 @@
|
|
|
3
3
|
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
|
4
4
|
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
5
|
*/
|
|
6
|
-
export class TriangleDrawer
|
|
6
|
+
export class TriangleDrawer {
|
|
7
|
+
constructor() { }
|
|
8
|
+
draw(ctx, allPoints, model, drawerConfig) {
|
|
9
|
+
allPoints.forEach((points, idx) => {
|
|
10
|
+
var _a;
|
|
11
|
+
const config = model.getPaintConfig(idx);
|
|
12
|
+
ctx.fillStyle = (_a = drawerConfig.singleColor) !== null && _a !== void 0 ? _a : config.color;
|
|
13
|
+
points.forEach(p => {
|
|
14
|
+
const x = model.view.toX(p.centerUnit);
|
|
15
|
+
const y = model.view.toY(p.close);
|
|
16
|
+
this.drawCandleTriangle(ctx, x, y, config.lineWidth);
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
drawCandleTriangle(ctx, x, y, triangleWidth) {
|
|
21
|
+
ctx.beginPath();
|
|
22
|
+
ctx.moveTo(x - triangleWidth / 2, y);
|
|
23
|
+
ctx.lineTo(x, y - triangleWidth);
|
|
24
|
+
ctx.lineTo(x + triangleWidth / 2, y);
|
|
25
|
+
ctx.fill();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
|
4
4
|
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
5
|
*/
|
|
6
|
+
import { DynamicModelDrawer } from '../components/dynamic-objects/dynamic-objects.drawer';
|
|
6
7
|
import { PaneManager } from '../components/pane/pane-manager.component';
|
|
7
8
|
import { Bounds } from '../model/bounds.model';
|
|
8
|
-
import { DataSeriesModel, VisualSeriesPoint } from '../model/data-series.model';
|
|
9
9
|
import { CanvasModel } from '../model/canvas.model';
|
|
10
|
-
import {
|
|
10
|
+
import { DataSeriesModel, VisualSeriesPoint } from '../model/data-series.model';
|
|
11
11
|
export interface ChartDrawerConfig {
|
|
12
12
|
singleColor?: string;
|
|
13
13
|
forceBold?: number;
|
|
@@ -26,14 +26,12 @@ export declare const transformToTwoDimension: (points: VisualSeriesPoint[] | Vis
|
|
|
26
26
|
*
|
|
27
27
|
* (may support multiple layers in future)
|
|
28
28
|
*/
|
|
29
|
-
export declare class DataSeriesDrawer implements
|
|
29
|
+
export declare class DataSeriesDrawer implements DynamicModelDrawer<DataSeriesModel> {
|
|
30
30
|
private paneManager;
|
|
31
|
-
private canvasModel;
|
|
32
31
|
private readonly seriesDrawers;
|
|
33
|
-
constructor(paneManager: PaneManager,
|
|
34
|
-
draw(): void;
|
|
32
|
+
constructor(paneManager: PaneManager, seriesDrawers: Record<string, SeriesDrawer>);
|
|
33
|
+
draw(canvasModel: CanvasModel, model: DataSeriesModel, paneUUID?: string): void;
|
|
35
34
|
drawSeries(ctx: CanvasRenderingContext2D, series: DataSeriesModel): void;
|
|
36
|
-
getCanvasIds(): Array<string>;
|
|
37
35
|
}
|
|
38
36
|
export declare const clipToBounds: (ctx: CanvasRenderingContext2D, bounds: Bounds) => void;
|
|
39
37
|
export declare const setLineWidth: (ctx: CanvasRenderingContext2D, lineWidth: number, dataSeries: DataSeriesModel, drawerConfig: ChartDrawerConfig, seriesSelectedWidth?: number) => void;
|
|
@@ -3,4 +3,59 @@
|
|
|
3
3
|
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
|
4
4
|
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
5
|
*/
|
|
6
|
-
|
|
6
|
+
export const transformToTwoDimension = (points) => (Array.isArray(points[0]) ? points : [points]);
|
|
7
|
+
/**
|
|
8
|
+
* Basic data series drawer.
|
|
9
|
+
* Have multiple paint tools: linear, histogram, points, text above/below candle and others.
|
|
10
|
+
*
|
|
11
|
+
* (may support multiple layers in future)
|
|
12
|
+
*/
|
|
13
|
+
export class DataSeriesDrawer {
|
|
14
|
+
constructor(paneManager, seriesDrawers) {
|
|
15
|
+
this.paneManager = paneManager;
|
|
16
|
+
this.seriesDrawers = seriesDrawers;
|
|
17
|
+
}
|
|
18
|
+
draw(canvasModel, model, paneUUID) {
|
|
19
|
+
const ctx = canvasModel.ctx;
|
|
20
|
+
const pane = paneUUID && this.paneManager.panes[paneUUID];
|
|
21
|
+
if (model) {
|
|
22
|
+
ctx.save();
|
|
23
|
+
pane && clipToBounds(ctx, pane.getBounds());
|
|
24
|
+
this.drawSeries(ctx, model);
|
|
25
|
+
ctx.restore();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
drawSeries(ctx, series) {
|
|
29
|
+
if (series.config.visible) {
|
|
30
|
+
const paintTool = series.config.type;
|
|
31
|
+
const drawer = this.seriesDrawers[paintTool];
|
|
32
|
+
if (drawer) {
|
|
33
|
+
const viewportSeries = series.getSeriesInViewport(series.scale.xStart - 1, series.scale.xEnd + 1);
|
|
34
|
+
if (viewportSeries && viewportSeries.length >= 1) {
|
|
35
|
+
// +- 1 to correctly draw points which are partly inside bounds
|
|
36
|
+
drawer.draw(ctx, viewportSeries, series, {});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
console.error(`Data series drawer with type ${paintTool} isn't registered!`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export const clipToBounds = (ctx, bounds) => {
|
|
46
|
+
ctx.beginPath();
|
|
47
|
+
ctx.rect(bounds.x, bounds.y, bounds.width, bounds.height);
|
|
48
|
+
ctx.clip();
|
|
49
|
+
ctx.closePath();
|
|
50
|
+
};
|
|
51
|
+
export const setLineWidth = (ctx, lineWidth, dataSeries, drawerConfig, seriesSelectedWidth = lineWidth) => {
|
|
52
|
+
if (drawerConfig.forceBold) {
|
|
53
|
+
ctx.lineWidth = drawerConfig.forceBold;
|
|
54
|
+
}
|
|
55
|
+
else if (dataSeries.hovered) {
|
|
56
|
+
ctx.lineWidth = seriesSelectedWidth;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
ctx.lineWidth = lineWidth;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import EventBus from '../events/event-bus';
|
|
7
7
|
import { ChartResizeHandler } from '../inputhandlers/chart-resize.handler';
|
|
8
8
|
export declare const HIT_TEST_PREFIX = "HIT_TEST_";
|
|
9
|
-
declare const drawerTypes: readonly ["MAIN_BACKGROUND", "MAIN_CLEAR", "HIT_TEST_CLEAR", "YAXIS_CLEAR", "SERIES_CLEAR", "OVER_SERIES_CLEAR", "HIT_TEST_DRAWINGS", "GRID", "
|
|
9
|
+
declare const drawerTypes: readonly ["MAIN_BACKGROUND", "MAIN_CLEAR", "HIT_TEST_CLEAR", "YAXIS_CLEAR", "SERIES_CLEAR", "OVER_SERIES_CLEAR", "HIT_TEST_DRAWINGS", "GRID", "UNDERLAY_VOLUMES_AREA", "X_AXIS", "Y_AXIS", "HIGH_LOW", "DYNAMIC_OBJECTS", "N_MAP_CHART", "PL_CHART", "WATERMARK", "EMPTY_CHART", "OFFLINE_CHART", "LABELS", "EVENTS", "HIT_TEST_EVENTS", "ZERO_LINE", "PL_ZERO_LINE_BACKGROUND", "CROSS_TOOL"];
|
|
10
10
|
export type DrawerType = typeof drawerTypes[number];
|
|
11
11
|
/**
|
|
12
12
|
* Manages the drawing process.
|
|
@@ -3,4 +3,180 @@
|
|
|
3
3
|
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
|
4
4
|
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
5
|
*/
|
|
6
|
-
import
|
|
6
|
+
import { EVENT_DRAW } from '../events/events';
|
|
7
|
+
import { MIN_SUPPORTED_CANVAS_SIZE } from '../model/canvas.model';
|
|
8
|
+
import { arrayIntersect, reorderArray } from '../utils/array.utils';
|
|
9
|
+
import { animationFrameThrottled } from '../utils/performance/request-animation-frame-throttle.utils';
|
|
10
|
+
import { uuid } from '../utils/uuid.utils';
|
|
11
|
+
export const HIT_TEST_PREFIX = 'HIT_TEST_';
|
|
12
|
+
const drawerTypes = [
|
|
13
|
+
'MAIN_BACKGROUND',
|
|
14
|
+
'MAIN_CLEAR',
|
|
15
|
+
'HIT_TEST_CLEAR',
|
|
16
|
+
'YAXIS_CLEAR',
|
|
17
|
+
'SERIES_CLEAR',
|
|
18
|
+
'OVER_SERIES_CLEAR',
|
|
19
|
+
'HIT_TEST_DRAWINGS',
|
|
20
|
+
'GRID',
|
|
21
|
+
'UNDERLAY_VOLUMES_AREA',
|
|
22
|
+
'X_AXIS',
|
|
23
|
+
'Y_AXIS',
|
|
24
|
+
'HIGH_LOW',
|
|
25
|
+
'DYNAMIC_OBJECTS',
|
|
26
|
+
'N_MAP_CHART',
|
|
27
|
+
'PL_CHART',
|
|
28
|
+
'WATERMARK',
|
|
29
|
+
'EMPTY_CHART',
|
|
30
|
+
'OFFLINE_CHART',
|
|
31
|
+
'LABELS',
|
|
32
|
+
'EVENTS',
|
|
33
|
+
'HIT_TEST_EVENTS',
|
|
34
|
+
'ZERO_LINE',
|
|
35
|
+
'PL_ZERO_LINE_BACKGROUND',
|
|
36
|
+
'CROSS_TOOL',
|
|
37
|
+
];
|
|
38
|
+
/**
|
|
39
|
+
* Manages the drawing process.
|
|
40
|
+
* Can re-order drawers to make one be on top of the other.
|
|
41
|
+
*/
|
|
42
|
+
export class DrawingManager {
|
|
43
|
+
constructor(eventBus, chartResizeHandler) {
|
|
44
|
+
this.chartResizeHandler = chartResizeHandler;
|
|
45
|
+
this.drawingOrder = [];
|
|
46
|
+
this.drawersMap = {};
|
|
47
|
+
this.canvasIdsList = [];
|
|
48
|
+
this.animFrameId = `draw_${uuid()}`;
|
|
49
|
+
// eventBus.on(EVENT_DRAW_LAST_CANDLE, () => animationFrameThrottled(this.animFrameId + 'last', () => this.drawLastBar()));
|
|
50
|
+
this.drawHitTestCanvas = () => {
|
|
51
|
+
this.drawingOrder.forEach(drawer => {
|
|
52
|
+
if (drawer.indexOf(HIT_TEST_PREFIX) !== -1) {
|
|
53
|
+
this.drawersMap[drawer].draw();
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
eventBus.on(EVENT_DRAW, (canvasIds) => {
|
|
58
|
+
if (chartResizeHandler.wasResized()) {
|
|
59
|
+
// if we fire bus.fireDraw() without arguments(undefined) we need to keep canvasIdsList empty
|
|
60
|
+
if (this.canvasIdsList) {
|
|
61
|
+
if (canvasIds && canvasIds.length !== 0) {
|
|
62
|
+
this.canvasIdsList = this.canvasIdsList.concat(canvasIds);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
// make this undefined until the end of frame - this will redraw everything
|
|
66
|
+
this.canvasIdsList = undefined;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
animationFrameThrottled(this.animFrameId, () => {
|
|
70
|
+
this.forceDraw(this.canvasIdsList);
|
|
71
|
+
this.canvasIdsList = [];
|
|
72
|
+
this.drawHitTestCanvas();
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Updates canvases' sizes and executes redraw without animation frame.
|
|
79
|
+
* This is required for multi-chart canvas update synchronization.
|
|
80
|
+
* If all canvases update in separate animation frames - we see visual lag. Instead we should do all updates and then redraw.
|
|
81
|
+
* @doc-tags tricky,canvas,resize
|
|
82
|
+
*/
|
|
83
|
+
redrawCanvasesImmediate() {
|
|
84
|
+
this.chartResizeHandler.fireUpdates();
|
|
85
|
+
this.forceDraw();
|
|
86
|
+
}
|
|
87
|
+
drawLastBar() {
|
|
88
|
+
this.drawingOrder.forEach(drawerName => {
|
|
89
|
+
if (drawerName.indexOf(HIT_TEST_PREFIX) === -1) {
|
|
90
|
+
const drawer = this.drawersMap[drawerName];
|
|
91
|
+
drawer.drawLastBar && drawer.drawLastBar();
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
forceDraw(canvasIds) {
|
|
96
|
+
if (!this.isDrawable()) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
this.drawingOrder.forEach(drawerName => {
|
|
100
|
+
if (drawerName.indexOf(HIT_TEST_PREFIX) === -1) {
|
|
101
|
+
const drawer = this.drawersMap[drawerName];
|
|
102
|
+
// draw if not canvas specified
|
|
103
|
+
if (!canvasIds || canvasIds.length === 0) {
|
|
104
|
+
drawer.draw();
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
// draw if at least 1 canvas is touched (intersection)
|
|
108
|
+
if (arrayIntersect(canvasIds, drawer.getCanvasIds()).length) {
|
|
109
|
+
drawer.draw();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Indicates whether it is possible to draw chart or not.
|
|
116
|
+
* @returns {boolean} true if chart is drawable
|
|
117
|
+
*/
|
|
118
|
+
isDrawable() {
|
|
119
|
+
var _a, _b, _c, _d;
|
|
120
|
+
return (((_b = (_a = this.chartResizeHandler.previousBCR) === null || _a === void 0 ? void 0 : _a.height) !== null && _b !== void 0 ? _b : 0) > MIN_SUPPORTED_CANVAS_SIZE.width &&
|
|
121
|
+
((_d = (_c = this.chartResizeHandler.previousBCR) === null || _c === void 0 ? void 0 : _c.width) !== null && _d !== void 0 ? _d : 0) > MIN_SUPPORTED_CANVAS_SIZE.height);
|
|
122
|
+
}
|
|
123
|
+
drawHitTestOnly() {
|
|
124
|
+
this.drawHitTestCanvas();
|
|
125
|
+
}
|
|
126
|
+
addDrawer(drawer, name = uuid()) {
|
|
127
|
+
this.drawingOrder.indexOf(name) === -1 && this.drawingOrder.push(name);
|
|
128
|
+
this.drawersMap[name] = drawer;
|
|
129
|
+
}
|
|
130
|
+
addDrawerAfter(drawer, newDrawerName, drawerToPutAfterName) {
|
|
131
|
+
this.addDrawer(drawer, newDrawerName);
|
|
132
|
+
const newDrawerIdx = this.drawingOrder.indexOf(newDrawerName);
|
|
133
|
+
this.drawingOrder.splice(newDrawerIdx, 1);
|
|
134
|
+
const idx = this.drawingOrder.indexOf(drawerToPutAfterName);
|
|
135
|
+
this.drawingOrder.splice(idx + 1, 0, newDrawerName);
|
|
136
|
+
this.reorderDrawers(this.drawingOrder);
|
|
137
|
+
}
|
|
138
|
+
addDrawerBefore(drawer, newDrawerName, drawerToPutBeforeName) {
|
|
139
|
+
this.addDrawer(drawer, newDrawerName);
|
|
140
|
+
const idx = this.drawingOrder.indexOf(drawerToPutBeforeName);
|
|
141
|
+
if (idx !== -1) {
|
|
142
|
+
const newDrawerIdx = this.drawingOrder.indexOf(newDrawerName);
|
|
143
|
+
this.drawingOrder.splice(newDrawerIdx, 1);
|
|
144
|
+
this.drawingOrder.splice(idx, 0, newDrawerName);
|
|
145
|
+
this.reorderDrawers(this.drawingOrder);
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
getDrawerByName(name) {
|
|
151
|
+
return this.drawersMap[name];
|
|
152
|
+
}
|
|
153
|
+
getNameByDrawer(drawer) {
|
|
154
|
+
for (const drawerName in this.drawersMap) {
|
|
155
|
+
if (this.drawersMap[drawerName] === drawer) {
|
|
156
|
+
return drawerName;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
removeDrawerByName(name) {
|
|
161
|
+
const drawer = this.drawersMap[name];
|
|
162
|
+
this.removeDrawer(drawer);
|
|
163
|
+
}
|
|
164
|
+
removeDrawer(drawer) {
|
|
165
|
+
Object.keys(this.drawersMap).forEach(name => {
|
|
166
|
+
if (this.drawersMap[name] === drawer) {
|
|
167
|
+
delete this.drawersMap[name];
|
|
168
|
+
const drawerIdx = this.drawingOrder.indexOf(name);
|
|
169
|
+
drawerIdx !== -1 && this.drawingOrder.splice(drawerIdx, 1);
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
reorderDrawers(newOrder) {
|
|
174
|
+
this.drawingOrder = reorderArray(this.drawingOrder, newOrder);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// use this to create dynamic names
|
|
178
|
+
export class DynamicDrawerType {
|
|
179
|
+
static paneResizer(id) {
|
|
180
|
+
return `PANE_RESIZER_${id}`;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
@@ -3,4 +3,40 @@
|
|
|
3
3
|
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
|
4
4
|
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
5
|
*/
|
|
6
|
-
import{
|
|
6
|
+
import { clipToBounds } from './data-series.drawer';
|
|
7
|
+
/***
|
|
8
|
+
* HitTest Chart drawer. It's used to draw hit test for chart types on the hit-test canvas.
|
|
9
|
+
*/
|
|
10
|
+
export class HTDataSeriesDrawer {
|
|
11
|
+
constructor(seriesDrawers, canvasModel, paneManager) {
|
|
12
|
+
this.seriesDrawers = seriesDrawers;
|
|
13
|
+
this.canvasModel = canvasModel;
|
|
14
|
+
this.paneManager = paneManager;
|
|
15
|
+
}
|
|
16
|
+
draw() {
|
|
17
|
+
const ctx = this.canvasModel.ctx;
|
|
18
|
+
this.paneManager.yExtents.forEach(comp => {
|
|
19
|
+
ctx.save();
|
|
20
|
+
clipToBounds(ctx, comp.getBounds());
|
|
21
|
+
comp.dataSeries.forEach(series => this.drawSeries(ctx, series));
|
|
22
|
+
ctx.restore();
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
drawSeries(ctx, series) {
|
|
26
|
+
if (series.config.visible) {
|
|
27
|
+
const paintTool = series.config.type;
|
|
28
|
+
const drawer = this.seriesDrawers[paintTool];
|
|
29
|
+
if (drawer) {
|
|
30
|
+
const drawConfig = {
|
|
31
|
+
singleColor: this.canvasModel.idToColor(series.id),
|
|
32
|
+
forceBold: 7,
|
|
33
|
+
};
|
|
34
|
+
// +- 1 to correctly draw points which are partly inside bounds
|
|
35
|
+
drawer.draw(ctx, series.getSeriesInViewport(series.scale.xStart - 1, series.scale.xEnd + 1), series, drawConfig);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
getCanvasIds() {
|
|
40
|
+
return [this.canvasModel.canvasId];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -3,4 +3,76 @@
|
|
|
3
3
|
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
|
4
4
|
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
5
|
*/
|
|
6
|
-
import
|
|
6
|
+
import { Subject } from 'rxjs';
|
|
7
|
+
import { arrayRemove } from '../utils/array.utils';
|
|
8
|
+
import { EVENT_DRAW } from './events';
|
|
9
|
+
/**
|
|
10
|
+
* Event bus for chart.
|
|
11
|
+
* @doc-tags core-components
|
|
12
|
+
*/
|
|
13
|
+
export default class EventBus {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.UNKNOWN_ARR = [];
|
|
16
|
+
/** Registered event handlers. */
|
|
17
|
+
this.handlers = {};
|
|
18
|
+
/** State which can enable / disable events processing. */
|
|
19
|
+
this.muted = false;
|
|
20
|
+
this.unsub = (type, fn) => {
|
|
21
|
+
const handler = this.handlers[type];
|
|
22
|
+
handler !== undefined && arrayRemove.call(handler, fn);
|
|
23
|
+
};
|
|
24
|
+
this.add = (method, type, fn) => {
|
|
25
|
+
if (type in this.handlers) {
|
|
26
|
+
method.call(this.handlers[type], fn);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
this.handlers[type] = [fn];
|
|
30
|
+
}
|
|
31
|
+
return this.unsub.bind(this, type, fn);
|
|
32
|
+
};
|
|
33
|
+
this.on = (type, fn) => this.add(this.UNKNOWN_ARR.push, type, fn);
|
|
34
|
+
this.observe = (type) => {
|
|
35
|
+
const result = new Subject();
|
|
36
|
+
const subjectFn = result.next.bind(result);
|
|
37
|
+
const originalUnsubscribe = result.unsubscribe.bind(result);
|
|
38
|
+
this.on(type, subjectFn);
|
|
39
|
+
result.unsubscribe = () => {
|
|
40
|
+
this.unsub(type, subjectFn);
|
|
41
|
+
originalUnsubscribe();
|
|
42
|
+
};
|
|
43
|
+
return result.asObservable();
|
|
44
|
+
};
|
|
45
|
+
this.onPrior = (type, fn) => this.add(this.UNKNOWN_ARR.unshift, type, fn);
|
|
46
|
+
this.off = this.unsub;
|
|
47
|
+
this.fire = (type, ...args) => {
|
|
48
|
+
var _a;
|
|
49
|
+
if (!this.muted) {
|
|
50
|
+
const arr = (_a = this.handlers[type]) !== null && _a !== void 0 ? _a : [];
|
|
51
|
+
let i;
|
|
52
|
+
for (i = 0, arr.length; i < arr.length; i++) {
|
|
53
|
+
// call each handler with arguments
|
|
54
|
+
const fn = arr[i];
|
|
55
|
+
fn.apply(null, args);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
this.fireAsync = (type, event) => {
|
|
60
|
+
if (!this.muted) {
|
|
61
|
+
return window.setTimeout(this.fire.bind(this, type, event), 0);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
this.setMuted = (val) => {
|
|
65
|
+
this.muted = val;
|
|
66
|
+
};
|
|
67
|
+
this.clear = () => {
|
|
68
|
+
this.handlers = {};
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Triggers the draw event for the specified canvas IDs.
|
|
73
|
+
* @param {Array<string>} canvasIds - An optional array of canvas IDs to trigger the draw event for.
|
|
74
|
+
*/
|
|
75
|
+
fireDraw(canvasIds) {
|
|
76
|
+
this.fire(EVENT_DRAW, canvasIds);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -3,4 +3,6 @@
|
|
|
3
3
|
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
|
4
4
|
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
5
|
*/
|
|
6
|
-
export const EVENT_RESIZED=
|
|
6
|
+
export const EVENT_RESIZED = 'resized_local';
|
|
7
|
+
export const EVENT_DRAW = 'draw';
|
|
8
|
+
export const EVENT_DRAW_LAST_CANDLE = 'draw_last_candle';
|
|
@@ -3,4 +3,49 @@
|
|
|
3
3
|
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
|
4
4
|
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
5
|
*/
|
|
6
|
-
import{ChartBaseElement
|
|
6
|
+
import { ChartBaseElement } from '../model/chart-base-element';
|
|
7
|
+
import { map, distinctUntilChanged } from 'rxjs/operators';
|
|
8
|
+
export class CandleTapHandler extends ChartBaseElement {
|
|
9
|
+
constructor(mainCanvasParent, chartModel, canvasInputListeners, config) {
|
|
10
|
+
super();
|
|
11
|
+
canvasInputListeners
|
|
12
|
+
.observeTouchStart()
|
|
13
|
+
.pipe(map(e => (config.components.chart.highlightActiveCandle ? e : undefined)), distinctUntilChanged())
|
|
14
|
+
.subscribe(e => {
|
|
15
|
+
if (e) {
|
|
16
|
+
this.setCandleAsActive(e, mainCanvasParent, chartModel);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Sets the candle as active when a touch event occurs on the chart.
|
|
22
|
+
* @param {TouchEvent} e - The touch event that occurred on the chart.
|
|
23
|
+
* @param {Element} mainCanvasParent - The parent element of the main canvas.
|
|
24
|
+
* @param {ChartModel} chartModel - The chart model object.
|
|
25
|
+
*/
|
|
26
|
+
setCandleAsActive(e, mainCanvasParent, chartModel) {
|
|
27
|
+
if (e.touches.length === 1) {
|
|
28
|
+
const touch = e.touches.item(0);
|
|
29
|
+
if (touch !== null) {
|
|
30
|
+
const xTouchPosition = this.getTouchXPosition(touch, mainCanvasParent);
|
|
31
|
+
const candle = chartModel.candleFromX(xTouchPosition);
|
|
32
|
+
if (candle) {
|
|
33
|
+
chartModel.mainCandleSeries.setActiveCandle(candle);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// TO DO: check if this body calculations can potentially works wrong in widget
|
|
39
|
+
/**
|
|
40
|
+
* Calculates the X position of a touch event relative to the main canvas parent element.
|
|
41
|
+
* @param {Touch} touch - The touch event object.
|
|
42
|
+
* @param {Element} mainCanvasParent - The parent element of the main canvas.
|
|
43
|
+
* @returns {number} - The X position of the touch event relative to the main canvas parent element.
|
|
44
|
+
* @todo Check if this body calculations can potentially work incorrectly in the widget.
|
|
45
|
+
*/
|
|
46
|
+
getTouchXPosition(touch, mainCanvasParent) {
|
|
47
|
+
const rect = mainCanvasParent.getBoundingClientRect();
|
|
48
|
+
const scrollLeft = document.body.scrollLeft || document.documentElement.scrollLeft;
|
|
49
|
+
return touch.pageX - rect.left - scrollLeft;
|
|
50
|
+
}
|
|
51
|
+
}
|