@devexperts/dxcharts-lite 1.0.2 → 2.0.1
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.d.ts +2 -2
- package/dist/chart/components/pane/pane-hit-test.controller.js +55 -1
- package/dist/chart/components/pane/pane-manager.component.d.ts +12 -6
- package/dist/chart/components/pane/pane-manager.component.js +149 -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.d.ts +4 -3
- package/dist/chart/components/y_axis/price_labels/last-candle-labels.provider.js +96 -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 +10 -17
- package/dist/chart/components/y_axis/y-axis.model.js +34 -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 +3 -2
- package/dist/chart/model/scale.model.js +316 -1
- package/dist/chart/model/scaling/auto-scale.model.d.ts +2 -4
- package/dist/chart/model/scaling/auto-scale.model.js +91 -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,37 @@
|
|
|
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
|
+
/**
|
|
7
|
+
* Constraint on top of high low provider - makes additional offset bounds.
|
|
8
|
+
* @doc-tags viewport,scaling
|
|
9
|
+
* @param offsetsProvider
|
|
10
|
+
* @doc-tags viewport,scaling,offsets
|
|
11
|
+
*/
|
|
12
|
+
export const createHighLowOffsetCalculator = (offsetsProvider) => (highLow) => {
|
|
13
|
+
const { top, bottom } = offsetsProvider();
|
|
14
|
+
const _height = highLow.high - highLow.low;
|
|
15
|
+
// TODO what should we do if height is 0?
|
|
16
|
+
const height = _height === 0 ? 1 : _height;
|
|
17
|
+
const offsetTop = (height * top) / 100;
|
|
18
|
+
const offsetBottom = (height * bottom) / 100;
|
|
19
|
+
const low = highLow.low - offsetBottom;
|
|
20
|
+
const high = highLow.high + offsetTop;
|
|
21
|
+
return { low, high };
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Constraint on top of high low provider - makes additional offset bounds.
|
|
25
|
+
* @doc-tags viewport,scaling
|
|
26
|
+
* @param offsetsProvider
|
|
27
|
+
* @param highLowProvider
|
|
28
|
+
* @doc-tags viewport,scaling,offsets
|
|
29
|
+
*/
|
|
30
|
+
export const createCandlesOffsetProvider = (offsetsProvider, highLowProvider) => {
|
|
31
|
+
const offsetsCalculator = createHighLowOffsetCalculator(offsetsProvider);
|
|
32
|
+
return {
|
|
33
|
+
isHighLowActive: () => true,
|
|
34
|
+
calculateHighLow: (state) => {
|
|
35
|
+
const highLow = highLowProvider.calculateHighLow(state);
|
|
36
|
+
return offsetsCalculator(highLow);
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
};
|
|
@@ -3,4 +3,100 @@
|
|
|
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{nameDirection
|
|
6
|
+
import { nameDirection } from '../../model/candle.model';
|
|
7
|
+
import { VisualSeriesPoint } from '../../model/data-series.model';
|
|
8
|
+
import VisualCandle from '../../model/visual-candle';
|
|
9
|
+
import { firstOf, lastOf } from '../../utils/array.utils';
|
|
10
|
+
import { round } from '../../utils/math.utils';
|
|
11
|
+
const DEFAULT_PERIOD = 60; // 1 minute
|
|
12
|
+
/**
|
|
13
|
+
* Generates fake candle for left and right "out of data range" zones.
|
|
14
|
+
* Requires period to calculate the fake timestamp.
|
|
15
|
+
* The timestamp won't take session breaks or holidays into account.
|
|
16
|
+
*/
|
|
17
|
+
export const fakeVisualCandle = (dataPoints, visualCandles, candleWidth, index, period = DEFAULT_PERIOD) => {
|
|
18
|
+
const candle = fakeCandle(dataPoints, index, period);
|
|
19
|
+
// in case we have equivolume
|
|
20
|
+
candle.volume = candleWidth;
|
|
21
|
+
let x;
|
|
22
|
+
if (visualCandles.length === 0) {
|
|
23
|
+
x = 0;
|
|
24
|
+
}
|
|
25
|
+
else if (index >= visualCandles.length) {
|
|
26
|
+
const lastCandle = visualCandles[visualCandles.length - 1];
|
|
27
|
+
const candlesCountInBetween = index - (visualCandles.length - 1);
|
|
28
|
+
const offsetFromLast = candlesCountInBetween * candleWidth;
|
|
29
|
+
x = lastCandle.centerUnit + offsetFromLast;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
const firstCandle = visualCandles[0];
|
|
33
|
+
const candlesCountInBetween = -index;
|
|
34
|
+
const offsetFromFirst = candlesCountInBetween * candleWidth;
|
|
35
|
+
x = firstCandle.centerUnit - offsetFromFirst;
|
|
36
|
+
}
|
|
37
|
+
return new VisualCandle(x, candleWidth, candle.open, candle.close, candle.lo, candle.hi, nameDirection(candle.open, candle.close), candle);
|
|
38
|
+
};
|
|
39
|
+
export const fakeVisualPoint = (dataPoints, visualPoints, meanDataWidth, index, period = DEFAULT_PERIOD) => {
|
|
40
|
+
const candle = fakeDataPoint(dataPoints, index, period);
|
|
41
|
+
let x;
|
|
42
|
+
if (visualPoints.length === 0) {
|
|
43
|
+
x = 0;
|
|
44
|
+
}
|
|
45
|
+
else if (index >= visualPoints.length) {
|
|
46
|
+
const lastCandle = visualPoints[visualPoints.length - 1];
|
|
47
|
+
const candlesCountInBetween = index - (visualPoints.length - 1);
|
|
48
|
+
const offsetFromLast = candlesCountInBetween * meanDataWidth;
|
|
49
|
+
x = lastCandle.centerUnit + offsetFromLast;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
const firstCandle = visualPoints[0];
|
|
53
|
+
const candlesCountInBetween = -index;
|
|
54
|
+
const offsetFromFirst = candlesCountInBetween * meanDataWidth;
|
|
55
|
+
x = firstCandle.centerUnit - offsetFromFirst;
|
|
56
|
+
}
|
|
57
|
+
return new VisualSeriesPoint(x, candle.close);
|
|
58
|
+
};
|
|
59
|
+
export const fakeCandle = (candles, index, period = DEFAULT_PERIOD) => {
|
|
60
|
+
const t = getTimestampOfIndex(candles, index, period);
|
|
61
|
+
return {
|
|
62
|
+
hi: NaN,
|
|
63
|
+
lo: NaN,
|
|
64
|
+
open: NaN,
|
|
65
|
+
close: NaN,
|
|
66
|
+
timestamp: t,
|
|
67
|
+
volume: NaN,
|
|
68
|
+
expansion: true,
|
|
69
|
+
idx: index,
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
export const fakeDataPoint = (candles, index, period = DEFAULT_PERIOD) => {
|
|
73
|
+
const t = getTimestampOfIndex(candles, index, period);
|
|
74
|
+
return {
|
|
75
|
+
close: NaN,
|
|
76
|
+
timestamp: t,
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Returns the timestamp of a given index in an array of candles.
|
|
81
|
+
* @param {Candle[]} candles - An array of candles.
|
|
82
|
+
* @param {Index} index - The index of the candle to get the timestamp from.
|
|
83
|
+
* @param {number} [period=DEFAULT_PERIOD] - The period of the candles in milliseconds.
|
|
84
|
+
* @returns {Timestamp} The timestamp of the candle at the given index or 0 if the array is empty or the index is out of bounds.
|
|
85
|
+
*/
|
|
86
|
+
function getTimestampOfIndex(candles, index, period = DEFAULT_PERIOD) {
|
|
87
|
+
var _a, _b;
|
|
88
|
+
const _index = round(index);
|
|
89
|
+
if (candles.length === 0) {
|
|
90
|
+
return 0;
|
|
91
|
+
}
|
|
92
|
+
const lastCandle = lastOf(candles);
|
|
93
|
+
if (_index >= candles.length && lastCandle) {
|
|
94
|
+
return fakeTimestamp(lastCandle, candles.length - 1, _index, period);
|
|
95
|
+
}
|
|
96
|
+
const firstCandle = firstOf(candles);
|
|
97
|
+
if (_index < 0 && firstCandle) {
|
|
98
|
+
return fakeTimestamp(firstCandle, 0, _index, period);
|
|
99
|
+
}
|
|
100
|
+
return (_b = (_a = candles[_index]) === null || _a === void 0 ? void 0 : _a.timestamp) !== null && _b !== void 0 ? _b : 0;
|
|
101
|
+
}
|
|
102
|
+
const fakeTimestamp = (candle, candleIdx, index, period = DEFAULT_PERIOD) => candle.timestamp + (index - (candleIdx !== null && candleIdx !== void 0 ? candleIdx : 0)) * period;
|
|
@@ -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{unitToPercent
|
|
6
|
+
import { unitToPercent } from '../../model/scaling/viewport.model';
|
|
7
|
+
import { PriceIncrementsUtils } from '../../utils/price-increments.utils';
|
|
8
|
+
export const createRegularPriceFormatter = (extent) => (value) => {
|
|
9
|
+
let checkedValue;
|
|
10
|
+
if (typeof value === 'number') {
|
|
11
|
+
checkedValue = value;
|
|
12
|
+
}
|
|
13
|
+
else if (typeof value === 'string') {
|
|
14
|
+
checkedValue = Number(value);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
return '—';
|
|
18
|
+
}
|
|
19
|
+
const [mainDataSeries] = extent.dataSeries;
|
|
20
|
+
if (mainDataSeries !== undefined) {
|
|
21
|
+
const precision = PriceIncrementsUtils.getPricePrecision(checkedValue, mainDataSeries.pricePrecisions);
|
|
22
|
+
return checkedValue.toFixed(precision);
|
|
23
|
+
}
|
|
24
|
+
return `${checkedValue}`;
|
|
25
|
+
};
|
|
26
|
+
export const createPercentFormatter = (extent) => (value, dataSeries) => {
|
|
27
|
+
const [mainDataSeries] = extent.dataSeries;
|
|
28
|
+
let valueUnit = value;
|
|
29
|
+
const series = dataSeries !== null && dataSeries !== void 0 ? dataSeries : mainDataSeries;
|
|
30
|
+
if (series !== undefined) {
|
|
31
|
+
valueUnit = unitToPercent(value, series.getBaseline());
|
|
32
|
+
}
|
|
33
|
+
// always apply default precision for percent
|
|
34
|
+
const formatted = valueUnit.toFixed(PriceIncrementsUtils.DEFAULT_PRECISION).replace('-', '−') + ' %';
|
|
35
|
+
return formatted === '−0.00 %' ? '0.00 %' : formatted;
|
|
36
|
+
};
|
|
37
|
+
export const createYExtentFormatters = (extent) => ({
|
|
38
|
+
percent: createPercentFormatter(extent),
|
|
39
|
+
regular: createRegularPriceFormatter(extent),
|
|
40
|
+
});
|
|
@@ -3,4 +3,71 @@
|
|
|
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{cloneUnsafe
|
|
6
|
+
import { cloneUnsafe } from '../../utils/object.utils';
|
|
7
|
+
export class SecondaryChartColorsPool {
|
|
8
|
+
constructor(config) {
|
|
9
|
+
this.config = config;
|
|
10
|
+
this.usedChartColors = {};
|
|
11
|
+
this.symbolsToColorKeys = {};
|
|
12
|
+
this.secondaryChartColorsPool = this.createColorPool(this.config.colors.secondaryChartTheme);
|
|
13
|
+
this.usedChartColors = Object.keys(this.secondaryChartColorsPool).reduce((acc, key) => (Object.assign(Object.assign({}, acc), { [key]: 0 })), {});
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Creates a color pool object based on the provided color array
|
|
17
|
+
* @param {SecondaryChartTheme[]} colorArray - An array of SecondaryChartTheme objects
|
|
18
|
+
* @returns {Object} - An object containing a key-value pair for each color in the colorArray
|
|
19
|
+
* The key is a string in the format "colorX" where X is the index of the color in the array
|
|
20
|
+
* The value is an object containing the FullChartColors for the color, with lineTheme and areaTheme properties
|
|
21
|
+
*/
|
|
22
|
+
createColorPool(colorArray) {
|
|
23
|
+
return colorArray.reduce((acc, item, index) => {
|
|
24
|
+
acc[`color${index}`] = Object.assign(Object.assign({}, cloneUnsafe(this.config.colors)), { lineTheme: Object.assign({}, item.lineTheme), areaTheme: Object.assign({}, item.areaTheme) });
|
|
25
|
+
return acc;
|
|
26
|
+
}, {});
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Takes a color from the secondaryChartColorsPool and assigns it to a symbol.
|
|
30
|
+
* @param {string} symbol - The symbol to assign the color to.
|
|
31
|
+
* @returns {string} The color assigned to the symbol.
|
|
32
|
+
*/
|
|
33
|
+
takeColorFromPool(symbol) {
|
|
34
|
+
let minColors = Number.MAX_SAFE_INTEGER;
|
|
35
|
+
let minColorKey = '';
|
|
36
|
+
for (const [key, value] of Object.entries(this.usedChartColors)) {
|
|
37
|
+
if (value < minColors) {
|
|
38
|
+
minColors = value;
|
|
39
|
+
minColorKey = key;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
this.usedChartColors[minColorKey] = this.usedChartColors[minColorKey] + 1;
|
|
43
|
+
this.symbolsToColorKeys[symbol] = minColorKey;
|
|
44
|
+
return this.secondaryChartColorsPool[minColorKey];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Adds a color to the chart color pool.
|
|
48
|
+
*
|
|
49
|
+
* @param {string} symbol - The symbol of the color to be added.
|
|
50
|
+
*
|
|
51
|
+
* @returns {void}
|
|
52
|
+
*/
|
|
53
|
+
addColorToPool(symbol) {
|
|
54
|
+
const key = this.symbolsToColorKeys[symbol];
|
|
55
|
+
if (this.usedChartColors[key]) {
|
|
56
|
+
this.usedChartColors[key] = this.usedChartColors[key] - 1;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Updates the color configuration for a given symbol in the chart.
|
|
61
|
+
* @param {string} symbol - The symbol for which the color configuration needs to be updated.
|
|
62
|
+
* @param {CandleSeriesColors} config - The new color configuration for the symbol.
|
|
63
|
+
* @returns {void}
|
|
64
|
+
*/
|
|
65
|
+
updateColorConfig(symbol, config) {
|
|
66
|
+
var _a, _b;
|
|
67
|
+
const existColorConfig = this.secondaryChartColorsPool[this.usedChartColors[symbol]];
|
|
68
|
+
if (existColorConfig) {
|
|
69
|
+
const colors = config;
|
|
70
|
+
this.secondaryChartColorsPool[this.usedChartColors[symbol]] = Object.assign(Object.assign({}, config), { lineTheme: Object.assign(existColorConfig.lineTheme, (_a = colors.lineTheme) !== null && _a !== void 0 ? _a : {}), areaTheme: Object.assign(existColorConfig.areaTheme, (_b = colors.areaTheme) !== null && _b !== void 0 ? _b : {}) });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -3,4 +3,88 @@
|
|
|
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{ClearCanvasDrawer
|
|
6
|
+
import { ClearCanvasDrawer } from '../../drawers/clear-canvas.drawer';
|
|
7
|
+
import { CompositeDrawer } from '../../drawers/composite.drawer';
|
|
8
|
+
import { ChartBaseElement } from '../../model/chart-base-element';
|
|
9
|
+
import { CrossToolDrawer } from './cross-tool.drawer';
|
|
10
|
+
import { CrossToolModel } from './cross-tool.model';
|
|
11
|
+
import { CrossAndLabelsDrawerType } from './types/cross-and-labels.drawer';
|
|
12
|
+
import { NoneDrawerType } from './types/none.drawer';
|
|
13
|
+
/**
|
|
14
|
+
* Default bundled chart cross tool.
|
|
15
|
+
*/
|
|
16
|
+
export class CrossToolComponent extends ChartBaseElement {
|
|
17
|
+
constructor(config, crossToolCanvasModel, canvasBoundsContainer, drawingManager, paneManager, crossEventProducer, hoverProducer) {
|
|
18
|
+
super();
|
|
19
|
+
this.config = config;
|
|
20
|
+
this.crossToolCanvasModel = crossToolCanvasModel;
|
|
21
|
+
this.canvasBoundsContainer = canvasBoundsContainer;
|
|
22
|
+
this.drawingManager = drawingManager;
|
|
23
|
+
this.paneManager = paneManager;
|
|
24
|
+
this.crossToolTypeDrawers = {};
|
|
25
|
+
this.model = new CrossToolModel(config.components.crossTool, this.crossToolCanvasModel, crossEventProducer, hoverProducer);
|
|
26
|
+
this.addChildEntity(this.model);
|
|
27
|
+
const clearCanvasDrawer = new ClearCanvasDrawer(this.crossToolCanvasModel);
|
|
28
|
+
this.registerDefaultDrawerTypes();
|
|
29
|
+
const crossToolDrawer = new CrossToolDrawer(this.model, this.crossToolCanvasModel, this.crossToolTypeDrawers);
|
|
30
|
+
const compositeDrawer = new CompositeDrawer();
|
|
31
|
+
compositeDrawer.addDrawer(clearCanvasDrawer, 'CLEAR_CANVAS');
|
|
32
|
+
compositeDrawer.addDrawer(crossToolDrawer, 'CROSS_TOOL_DRAWER');
|
|
33
|
+
this.drawingManager.addDrawer(compositeDrawer, 'CROSS_TOOL');
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Registers default drawer types for the chart.
|
|
37
|
+
* @private
|
|
38
|
+
* @function
|
|
39
|
+
* @name registerDefaultDrawerTypes
|
|
40
|
+
*
|
|
41
|
+
* @returns {void}
|
|
42
|
+
*/
|
|
43
|
+
registerDefaultDrawerTypes() {
|
|
44
|
+
this.registerCrossToolTypeDrawer('cross-and-labels', new CrossAndLabelsDrawerType(this.config, this.canvasBoundsContainer, this.paneManager, () => true));
|
|
45
|
+
this.registerCrossToolTypeDrawer('just-labels', new CrossAndLabelsDrawerType(this.config, this.canvasBoundsContainer, this.paneManager, () => true, true));
|
|
46
|
+
this.registerCrossToolTypeDrawer('none', new NoneDrawerType());
|
|
47
|
+
}
|
|
48
|
+
//#region public methods
|
|
49
|
+
/**
|
|
50
|
+
* Sets the cross tool visibility.
|
|
51
|
+
* @param visible
|
|
52
|
+
*/
|
|
53
|
+
setVisible(visible) {
|
|
54
|
+
this.model.setType(visible ? 'cross-and-labels' : 'none');
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Sets the crosstool type.
|
|
58
|
+
* - cross-and-labels - both the crosshair and X/Y labels
|
|
59
|
+
* - only-labels - only the X/Y label
|
|
60
|
+
* - none
|
|
61
|
+
* @param type
|
|
62
|
+
*/
|
|
63
|
+
setType(type) {
|
|
64
|
+
this.model.setType(type);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Returns an Observable that emits the current hover subject.
|
|
68
|
+
*/
|
|
69
|
+
observeCrossToolChanged() {
|
|
70
|
+
return this.model.currentHoverSubject;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Sets magnet target for cross tool.
|
|
74
|
+
* Supported only for 'cross-and-labels' type.
|
|
75
|
+
* Default magnet target is none.
|
|
76
|
+
* @param target
|
|
77
|
+
*/
|
|
78
|
+
setMagnetTarget(target) {
|
|
79
|
+
this.config.components.crossTool.magnetTarget = target;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Adds a new drawer type for cross tool, so you can add your own implementation of cross tool
|
|
83
|
+
* (or override existing)
|
|
84
|
+
* @param drawerName - an unique drawer type name
|
|
85
|
+
* @param drawerImpl - CrossToolTypeDrawer object
|
|
86
|
+
*/
|
|
87
|
+
registerCrossToolTypeDrawer(drawerName, drawerImpl) {
|
|
88
|
+
this.crossToolTypeDrawers[drawerName] = drawerImpl;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -3,4 +3,35 @@
|
|
|
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 CrossToolDrawer
|
|
6
|
+
export class CrossToolDrawer {
|
|
7
|
+
constructor(model, crossToolCanvasModel, crossToolTypeDrawers) {
|
|
8
|
+
this.model = model;
|
|
9
|
+
this.crossToolCanvasModel = crossToolCanvasModel;
|
|
10
|
+
this.crossToolTypeDrawers = crossToolTypeDrawers;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Draws the cross tool on the canvas.
|
|
14
|
+
* @function
|
|
15
|
+
* @name draw
|
|
16
|
+
* @memberof CrossToolCanvasView
|
|
17
|
+
* @instance
|
|
18
|
+
* @returns {void}
|
|
19
|
+
*/
|
|
20
|
+
draw() {
|
|
21
|
+
const drawer = this.crossToolTypeDrawers[this.model.type];
|
|
22
|
+
if (drawer) {
|
|
23
|
+
this.model.currentHover && drawer.draw(this.crossToolCanvasModel.ctx, this.model.currentHover);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
console.error(`No cross tool drawer type registered for drawer type ${this.model.type}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Returns an array of string containing the canvas ID of the crossToolCanvasModel.
|
|
31
|
+
*
|
|
32
|
+
* @returns {Array<string>} An array of string containing the canvas ID of the crossToolCanvasModel.
|
|
33
|
+
*/
|
|
34
|
+
getCanvasIds() {
|
|
35
|
+
return [this.crossToolCanvasModel.canvasId];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -3,4 +3,110 @@
|
|
|
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 { BehaviorSubject } from 'rxjs';
|
|
7
|
+
import { ChartBaseElement } from '../../model/chart-base-element';
|
|
8
|
+
import { CHART_UUID } from '../../canvas/canvas-bounds-container';
|
|
9
|
+
export class CrossToolModel extends ChartBaseElement {
|
|
10
|
+
get currentHover() {
|
|
11
|
+
return this.currentHoverSubject.getValue();
|
|
12
|
+
}
|
|
13
|
+
set currentHover(value) {
|
|
14
|
+
this.currentHoverSubject.next(value);
|
|
15
|
+
}
|
|
16
|
+
constructor(config, crossToolCanvasModel, crossEventProducer, hoverProducer) {
|
|
17
|
+
super();
|
|
18
|
+
this.config = config;
|
|
19
|
+
this.crossToolCanvasModel = crossToolCanvasModel;
|
|
20
|
+
this.crossEventProducer = crossEventProducer;
|
|
21
|
+
this.hoverProducer = hoverProducer;
|
|
22
|
+
// the main hover object which will be presented on UI
|
|
23
|
+
this.currentHoverSubject = new BehaviorSubject(null);
|
|
24
|
+
this.type = 'cross-and-labels';
|
|
25
|
+
this.type = config.type;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Sets the type of the CrossTool object.
|
|
29
|
+
*
|
|
30
|
+
* @param {CrossToolType} type - The type of the CrossTool object.
|
|
31
|
+
* @returns {void}
|
|
32
|
+
*/
|
|
33
|
+
setType(type) {
|
|
34
|
+
this.type = type;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Method to activate the cross tool.
|
|
38
|
+
* It subscribes to the canvasInputListener's mouse move event and fires the draw event.
|
|
39
|
+
* It also subscribes to the eventBus's hover and close hover events and updates the hover and fires the draw event accordingly.
|
|
40
|
+
* It also subscribes to the chartModel's candlesSetSubject and timeZoneModel's observeTimeZoneChanged events and recalculates the cross tool X formatter.
|
|
41
|
+
*/
|
|
42
|
+
doActivate() {
|
|
43
|
+
super.doActivate();
|
|
44
|
+
this.addRxSubscription(this.hoverProducer.hoverSubject.subscribe(hover => {
|
|
45
|
+
if (this.crossEventProducer.crossSubject.getValue() !== null && hover !== null) {
|
|
46
|
+
this.updateHover(hover);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
this.currentHover = null;
|
|
50
|
+
}
|
|
51
|
+
this.fireDraw();
|
|
52
|
+
}));
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* This method is used to fire the draw event of the crossToolCanvasModel if the type is not 'none'.
|
|
56
|
+
* @private
|
|
57
|
+
*/
|
|
58
|
+
fireDraw() {
|
|
59
|
+
if (this.type !== 'none') {
|
|
60
|
+
this.crossToolCanvasModel.fireDraw();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Updates the current hover position with the provided hover object.
|
|
65
|
+
* @param {Object} hover - The hover object containing the x and y coordinates and time formatted.
|
|
66
|
+
* @param {number} hover.x - The x coordinate of the hover.
|
|
67
|
+
* @param {number} hover.y - The y coordinate of the hover.
|
|
68
|
+
* @param {string} hover.timeFormatted - The formatted time of the hover.
|
|
69
|
+
* @param {Object} hover.candleHover - The candle hover object containing the open, close, high, low and closestOHLCY coordinates.
|
|
70
|
+
* @param {number} hover.candleHover.openY - The y coordinate of the open price of the candle.
|
|
71
|
+
* @param {number} hover.candleHover.closeY - The y coordinate of the close price of the candle.
|
|
72
|
+
* @param {number} hover.candleHover.highY - The y coordinate of the high price of the candle.
|
|
73
|
+
* @param {number} hover.candleHover.lowY - The y coordinate of the low price of the candle.
|
|
74
|
+
* @param {number} hover.candleHover.closestOHLCY - The y coordinate of the closest OHLC price of the candle.
|
|
75
|
+
* @returns {void}
|
|
76
|
+
*/
|
|
77
|
+
updateHover(hover, magnetTarget = this.config.magnetTarget) {
|
|
78
|
+
if (this.currentHover === null) {
|
|
79
|
+
this.currentHover = { x: hover.x, y: 0, time: hover.timeFormatted, paneId: hover.paneId };
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
this.currentHover.x = hover.x;
|
|
83
|
+
this.currentHover.time = hover.timeFormatted;
|
|
84
|
+
}
|
|
85
|
+
if (hover.candleHover && hover.paneId === CHART_UUID) {
|
|
86
|
+
switch (magnetTarget) {
|
|
87
|
+
case 'O':
|
|
88
|
+
this.currentHover.y = hover.candleHover.openY;
|
|
89
|
+
break;
|
|
90
|
+
case 'C':
|
|
91
|
+
this.currentHover.y = hover.candleHover.closeY;
|
|
92
|
+
break;
|
|
93
|
+
case 'H':
|
|
94
|
+
this.currentHover.y = hover.candleHover.highY;
|
|
95
|
+
break;
|
|
96
|
+
case 'L':
|
|
97
|
+
this.currentHover.y = hover.candleHover.lowY;
|
|
98
|
+
break;
|
|
99
|
+
case 'OHLC':
|
|
100
|
+
this.currentHover.y = hover.candleHover.closestOHLCY;
|
|
101
|
+
break;
|
|
102
|
+
case 'none':
|
|
103
|
+
this.currentHover.y = hover.y;
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
this.currentHover.y = hover.y;
|
|
109
|
+
}
|
|
110
|
+
this.currentHoverSubject.next(this.currentHover);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -3,4 +3,140 @@
|
|
|
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{CanvasElement
|
|
6
|
+
import { CanvasElement } from '../../../canvas/canvas-bounds-container';
|
|
7
|
+
import { avoidAntialiasing, drawRoundedRect } from '../../../utils/canvas/canvas-drawing-functions.utils';
|
|
8
|
+
import { priceLabelDrawersMap } from '../../y_axis/price_labels/price-label.drawer';
|
|
9
|
+
export class CrossAndLabelsDrawerType {
|
|
10
|
+
constructor(config, canvasBoundsContainer, paneManager, crossDrawPredicate = () => true, noLines) {
|
|
11
|
+
this.config = config;
|
|
12
|
+
this.canvasBoundsContainer = canvasBoundsContainer;
|
|
13
|
+
this.paneManager = paneManager;
|
|
14
|
+
this.crossDrawPredicate = crossDrawPredicate;
|
|
15
|
+
this.noLines = noLines;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Draws a cross tool on a canvas context and its labels if the crossDrawPredicate is true.
|
|
19
|
+
* @param {CanvasRenderingContext2D} ctx - The canvas context to draw on.
|
|
20
|
+
* @param {CrossToolHover} hover - The hover object containing information about the cross tool's position.
|
|
21
|
+
*/
|
|
22
|
+
draw(ctx, hover) {
|
|
23
|
+
if (this.crossDrawPredicate()) {
|
|
24
|
+
avoidAntialiasing(ctx, () => this.drawCrossTool(ctx, hover));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* This is a protected method called `drawCrossTool` that takes two parameters: `ctx` of type `CanvasRenderingContext2D` and `hover` of type `CrossToolHover`.
|
|
29
|
+
* The method draws a cross tool on the canvas using the provided context. It first gets the bounds of all panes and the hit test bounds of all panes. It then gets the top padding of the x-axis from the configuration and the left padding of the y-axis from the configuration based on the type of y-label.
|
|
30
|
+
* If the hit test bounds of all panes contain the hover coordinates, it draws a horizontal line and a vertical line using the provided coordinates and the bounds of all panes. It sets the stroke style to the line color from the configuration and sets the line dash to the line dash from the configuration. It then begins a new path, moves to the start of the horizontal line, draws a line to the end of the horizontal line, moves to the start of the vertical line, and draws a line to the end of the vertical line. Finally, it strokes the path.
|
|
31
|
+
*/
|
|
32
|
+
drawCrossTool(ctx, hover) {
|
|
33
|
+
var _a, _b, _c, _d, _e;
|
|
34
|
+
const allPanes = this.canvasBoundsContainer.getBounds(CanvasElement.ALL_PANES);
|
|
35
|
+
// extension is need for allPanes.y to fit into hit test
|
|
36
|
+
const allPanesHT = this.canvasBoundsContainer.getBoundsHitTest(CanvasElement.ALL_PANES, { extensionY: 0.0001 });
|
|
37
|
+
const xAxisTopPadding = (_a = this.config.components.xAxis.padding.top) !== null && _a !== void 0 ? _a : 0;
|
|
38
|
+
const padding = (_c = this.config.components.yAxis.typeConfig[(_b = this.config.components.crossTool.yLabel.type) !== null && _b !== void 0 ? _b : 'badge']) === null || _c === void 0 ? void 0 : _c.paddings;
|
|
39
|
+
const yAxisLeftPadding = (_d = padding === null || padding === void 0 ? void 0 : padding.start) !== null && _d !== void 0 ? _d : 0;
|
|
40
|
+
// we want to draw hover even if y coordinate is beyond chart
|
|
41
|
+
// Example: snap option is turned on, and chart is scrolled down, so it's not visible
|
|
42
|
+
const paneHT = (_e = this.paneManager.panes[hover.paneId]) === null || _e === void 0 ? void 0 : _e.ht;
|
|
43
|
+
if (allPanesHT(hover.x, allPanes.y)) {
|
|
44
|
+
const horizontalLineCoords = {
|
|
45
|
+
start: [allPanes.x, hover.y],
|
|
46
|
+
end: [allPanes.x + allPanes.width + yAxisLeftPadding, hover.y],
|
|
47
|
+
};
|
|
48
|
+
const verticalLineCoords = {
|
|
49
|
+
start: [hover.x, allPanes.y],
|
|
50
|
+
end: [hover.x, allPanes.y + allPanes.height + xAxisTopPadding],
|
|
51
|
+
};
|
|
52
|
+
const allowHorizontal = paneHT === null || paneHT === void 0 ? void 0 : paneHT(hover.x, hover.y);
|
|
53
|
+
if (!this.noLines) {
|
|
54
|
+
ctx.strokeStyle = this.config.colors.crossTool.lineColor;
|
|
55
|
+
ctx.setLineDash(this.config.components.crossTool.lineDash);
|
|
56
|
+
ctx.beginPath();
|
|
57
|
+
// don't draw horizontal line if it's not in hit test
|
|
58
|
+
if (allowHorizontal) {
|
|
59
|
+
ctx.moveTo(...horizontalLineCoords.start);
|
|
60
|
+
ctx.lineTo(...horizontalLineCoords.end);
|
|
61
|
+
}
|
|
62
|
+
ctx.moveTo(...verticalLineCoords.start);
|
|
63
|
+
ctx.lineTo(...verticalLineCoords.end);
|
|
64
|
+
ctx.stroke();
|
|
65
|
+
}
|
|
66
|
+
allowHorizontal && this.drawYLabel(ctx, hover);
|
|
67
|
+
this.drawXLabel(ctx, hover);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Draws the X axis label for the cross tool on the canvas.
|
|
72
|
+
* @param {CanvasRenderingContext2D} ctx - The 2D rendering context for the canvas.
|
|
73
|
+
* @param {CrossToolHover} hover - The hover object containing the x and y coordinates of the cross tool.
|
|
74
|
+
* @returns {void}
|
|
75
|
+
*/
|
|
76
|
+
drawXLabel(ctx, hover) {
|
|
77
|
+
var _a, _b, _c, _d, _e;
|
|
78
|
+
const xLabelPadding = this.config.components.crossTool.xLabel.padding;
|
|
79
|
+
const xLabelMargin = this.config.components.crossTool.xLabel.margin;
|
|
80
|
+
const crossToolColors = this.config.colors.crossTool;
|
|
81
|
+
// X axis label same for all
|
|
82
|
+
if (this.config.components.xAxis.visible) {
|
|
83
|
+
ctx.font = this.config.components.xAxis.fontSize + 'px ' + this.config.components.xAxis.fontFamily;
|
|
84
|
+
// X hover
|
|
85
|
+
const x = hover.x;
|
|
86
|
+
const labelText = hover.time;
|
|
87
|
+
const width = ctx.measureText(labelText).width;
|
|
88
|
+
const fontHeight = this.config.components.xAxis.fontSize;
|
|
89
|
+
// box
|
|
90
|
+
const xAxis = this.canvasBoundsContainer.getBounds(CanvasElement.X_AXIS);
|
|
91
|
+
ctx.save();
|
|
92
|
+
ctx.fillStyle = crossToolColors.labelBoxColor;
|
|
93
|
+
const xLabelPaddingLeft = (_a = xLabelPadding === null || xLabelPadding === void 0 ? void 0 : xLabelPadding.left) !== null && _a !== void 0 ? _a : 0;
|
|
94
|
+
const xLabelPaddingRight = (_b = xLabelPadding === null || xLabelPadding === void 0 ? void 0 : xLabelPadding.right) !== null && _b !== void 0 ? _b : 0;
|
|
95
|
+
const xLabelPaddingTop = (_c = xLabelPadding === null || xLabelPadding === void 0 ? void 0 : xLabelPadding.top) !== null && _c !== void 0 ? _c : 0;
|
|
96
|
+
const xLabelPaddingBottom = (_d = xLabelPadding === null || xLabelPadding === void 0 ? void 0 : xLabelPadding.bottom) !== null && _d !== void 0 ? _d : 0;
|
|
97
|
+
const xLabelMarginTop = (_e = xLabelMargin === null || xLabelMargin === void 0 ? void 0 : xLabelMargin.top) !== null && _e !== void 0 ? _e : 0;
|
|
98
|
+
const boxWidth = width + xLabelPaddingLeft + xLabelPaddingRight;
|
|
99
|
+
const boxHeight = fontHeight + xLabelPaddingTop + xLabelPaddingBottom;
|
|
100
|
+
const xBoxPos = Math.max(x - boxWidth / 2, 0);
|
|
101
|
+
const yBoxPos = xAxis.y + xLabelMarginTop;
|
|
102
|
+
drawRoundedRect(ctx, xBoxPos, yBoxPos, boxWidth, boxHeight);
|
|
103
|
+
// label
|
|
104
|
+
ctx.fillStyle = crossToolColors.labelTextColor;
|
|
105
|
+
const xTextPos = Math.max(x - width / 2, xLabelPaddingLeft);
|
|
106
|
+
const yTextPos = xAxis.y + xLabelMarginTop + fontHeight + xLabelPaddingTop - 1; // -1 for vertical adjustment
|
|
107
|
+
ctx.fillText(labelText, xTextPos, yTextPos);
|
|
108
|
+
ctx.restore();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Draws the Y-axis label on the canvas context at the given point.
|
|
113
|
+
* @param {CanvasRenderingContext2D} ctx - The canvas context to draw on.
|
|
114
|
+
* @param {Point} point - The point where the label should be drawn.
|
|
115
|
+
* @returns {void}
|
|
116
|
+
*/
|
|
117
|
+
drawYLabel(ctx, point) {
|
|
118
|
+
const yLabelPadding = this.config.components.crossTool.yLabel.padding;
|
|
119
|
+
const crossToolColors = this.config.colors.crossTool;
|
|
120
|
+
// Y axis label different for main chart pane and the rest panes
|
|
121
|
+
if (this.config.components.yAxis.visible) {
|
|
122
|
+
const pane = this.paneManager.panes[point.paneId];
|
|
123
|
+
const y = point.y;
|
|
124
|
+
if (!pane) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
for (const extent of pane.yExtentComponents) {
|
|
128
|
+
const price = extent.regularValueFromY(y);
|
|
129
|
+
const label = extent.valueFormatter(price);
|
|
130
|
+
const bounds = this.canvasBoundsContainer.getBounds(CanvasElement.PANE_UUID_Y_AXIS(pane.uuid, extent.idx));
|
|
131
|
+
const drawYLabel = priceLabelDrawersMap[this.config.components.crossTool.yLabel.type];
|
|
132
|
+
drawYLabel(ctx, bounds, label, y, {
|
|
133
|
+
textColor: crossToolColors.labelTextColor,
|
|
134
|
+
bgColor: crossToolColors.labelBoxColor,
|
|
135
|
+
paddingBottom: yLabelPadding === null || yLabelPadding === void 0 ? void 0 : yLabelPadding.bottom,
|
|
136
|
+
paddingEnd: yLabelPadding === null || yLabelPadding === void 0 ? void 0 : yLabelPadding.end,
|
|
137
|
+
paddingTop: yLabelPadding === null || yLabelPadding === void 0 ? void 0 : yLabelPadding.top,
|
|
138
|
+
}, extent.yAxis.state, this.config.colors.yAxis, true);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
@@ -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 class NoneDrawerType{
|
|
6
|
+
export class NoneDrawerType {
|
|
7
|
+
draw() { }
|
|
8
|
+
}
|