@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,632 @@
|
|
|
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{subscribeListener as n}from"../utils/dom.utils";import{merge as x,Subject as i}from"rxjs";import{ChartBaseElement as j}from"../model/chart-base-element";import{distinctUntilChanged as E,filter as s,map as v,tap as D}from"rxjs/operators";import{EVENT_RESIZED as f}from"../events/events";import{deviceDetector as y}from"../utils/device/device-detector.utils";import{touchpadDetector as L}from"../utils/device/touchpad.utils";var p;(function(a){a[a.left=0]="left",a[a.middle=1]="middle",a[a.right=2]="right"})(p||(p={}));class o extends j{constructor(t,r){super(),this.eventBus=t,this.element=r,this.xDragStartSubject=new i,this.xDragSubject=new i,this.xDragTickSubject=new i,this.xDragEndSubject=new i,this.yDragStartSubject=new i,this.yDragSubject=new i,this.yDragTickSubject=new i,this.yDragEndSubject=new i,this.mouseMoveSubject=new i,this.mouseMoveDocumentSubject=new i,this.clickSubject=new i,this.clickDocumentSubject=new i,this.dbClickSubject=new i,this.mouseDownSubject=new i,this.mouseUpSubject=new i,this.mouseUpDocumentSubject=new i,this.wheelSubject=new i,this.touchStartSubject=new i,this.touchMoveSubject=new i,this.touchEndSubject=new i,this.touchCancelSubject=new i,this.contextMenuSubject=new i,this.longTouchSubject=new i,this.pinchSubject=new i,this.scrollGestureSubject=new i,this.mouseLeavesCanvasSubject=new i,this.dragStartPoint={x:0,y:0},this.prevDragPoint={x:0,y:0},this.currentPoint={x:0,y:0},this.currentPointDocument={x:0,y:0},this.dragging=!1,this.canvasBounds={x:0,y:0,pageX:0,pageY:0,width:0,height:0},this.documentDragListeners=[],this.dragProcessListener=()=>{this.xDragSubject.next(this.currentPoint.x-this.dragStartPoint.x),this.yDragSubject.next(this.currentPoint.y-this.dragStartPoint.y),this.xDragTickSubject.next(this.currentPoint.x-this.prevDragPoint.x),this.yDragTickSubject.next(this.currentPoint.y-this.prevDragPoint.y),this.prevDragPoint.x=this.currentPoint.x,this.prevDragPoint.y=this.currentPoint.y},this.dragStartListener=u=>{this.isDraggable(u)&&(this.updateCurrentPoints(u),this.dragging=!0,this.dragStartEvent=u,this.documentDragListeners.forEach(c=>c()),this.dragStartPoint=o.copyPoint(this.currentPoint),this.xDragStartSubject.next(this.dragStartPoint),this.yDragStartSubject.next(this.dragStartPoint),this.prevDragPoint=Object.assign({},this.dragStartPoint),o.DRAG_EVENTS.forEach(c=>{document.addEventListener(c,this.dragProcessListener,!0);const e=document.removeEventListener.bind(document,c,this.dragProcessListener,!0);this.documentDragListeners.push(e),this.addSubscription(e)}),this.dragProcessListener())},this.dragListener=()=>this.mouseMoveDocumentSubject.next(this.currentPoint),this.updateElementOffsetListener=()=>this.mouseMoveSubject.next(this.currentPoint),this.dragEndListener=()=>{this.dragging=!1,this.documentDragListeners.forEach(u=>u()),this.xDragEndSubject.next(),this.yDragEndSubject.next()},this.clickHandler=()=>this.clickSubject.next(this.currentPoint),this.updateCurrentPoints=u=>{this.updateCurrentDocumentPoint(u),this.updateCurrentMousePoint(u)}}isDraggable(t){return t instanceof MouseEvent?t.button===p.left:t instanceof TouchEvent}startDragging(t){this.updateCurrentPoints(t),this.dragStartListener(t)}movePointer(t){this.updateCurrentPoints(t),this.dragListener(),this.updateElementOffsetListener(),this.dragging&&this.dragProcessListener()}stopDragging(){this.dragEndListener()}fixTextSelection(){const t=r=>(r.preventDefault(),!1);this.element.addEventListener("selectstart",t,!1),this.addSubscription(this.element.removeEventListener.bind(this.element,"selectstart",t,!1))}doActivate(){this.fixTextSelection(),this.documentDragListeners=[],o.DRAG_START_EVENTS.forEach(e=>{this.element.addEventListener(e,this.dragStartListener),this.addSubscription(()=>this.element.removeEventListener(e,this.dragStartListener))}),this.trackMousePosition(),o.DRAG_EVENTS.forEach(e=>{document.addEventListener(e,this.dragListener),this.addSubscription(document.removeEventListener.bind(document,e,this.dragListener)),this.element.addEventListener(e,this.updateElementOffsetListener),this.addSubscription(this.element.removeEventListener.bind(this.element,e,this.updateElementOffsetListener))}),o.DRAG_END_EVENTS.forEach(e=>{document.addEventListener(e,this.dragEndListener),this.addSubscription(document.removeEventListener.bind(document,e,this.dragEndListener))}),this.addSubscription(n(this.element,this.clickHandler,"click"));const t=e=>{this.clickDocumentSubject.next(e)};this.addSubscription(n(document,t,"click"));const r=y();if(r==="apple"||r==="mobile"){const b=(()=>{let h=null;return()=>{h?(this.dbClickSubject.next(this.currentPoint),clearTimeout(h),h=null):h=window.setTimeout(()=>{h=null},250)}})();this.addSubscription(n(this.element,b,"touchend"))}const u=(e,b=500,h=2)=>{e.preventDefault();let d=null;const g={x:e.touches[0].clientX,y:e.touches[0].clientY};let l={x:0,y:0};const P=S=>{l={x:S.touches[0].clientX,y:S.touches[0].clientY},(Math.sqrt(Math.pow(l.x-g.x,2)+Math.pow(l.y-g.y,2))>h||S.touches.length>1)&&m()},m=()=>{d&&(clearTimeout(d),d=null),this.element.removeEventListener("touchend",m),this.element.removeEventListener("touchmove",P)};d=setTimeout(()=>this.longTouchSubject.next(e),b),this.element.addEventListener("touchmove",P,{passive:!0}),this.element.addEventListener("touchend",m)};this.addSubscription(n(this.element,e=>u(e),"touchstart")),this.addSubscription(n(this.element,()=>this.dbClickSubject.next(this.currentPoint),"dblclick")),this.addSubscription(n(this.element,e=>this.touchStartSubject.next(e),"touchstart")),this.addSubscription(n(this.element,e=>this.touchMoveSubject.next(e),"touchmove",!0)),this.addSubscription(n(this.element,e=>this.touchEndSubject.next(e),"touchend")),this.addSubscription(n(this.element,e=>this.touchCancelSubject.next(e),"touchcancel")),this.addSubscription(n(this.element,e=>{e.ctrlKey?this.pinchSubject.next(e):L(e)?this.scrollGestureSubject.next(e):this.wheelSubject.next(e),e.preventDefault()},"wheel")),this.addSubscription(n(this.element,e=>this.contextMenuSubject.next(e),"contextmenu")),this.addSubscription(n(this.element,()=>this.mouseDownSubject.next(this.currentPoint),"mousedown")),this.addSubscription(n(this.element,()=>this.mouseUpSubject.next(this.currentPoint),"mouseup")),this.addSubscription(n(document,()=>this.mouseUpDocumentSubject.next(this.currentPoint),"mouseup")),this.addRxSubscription(this.eventBus.observe(f).subscribe(()=>{const e=this.element.getBoundingClientRect();this.canvasBounds.x=e.left,this.canvasBounds.y=e.top,this.canvasBounds.width=e.width,this.canvasBounds.height=e.height}));const c=()=>{this.mouseLeavesCanvasSubject.next(!0)};this.element.addEventListener("mouseleave",c,!1),this.addSubscription(this.element.removeEventListener.bind(this.element,"mouseleave",c,!1))}getCurrentMousePoint(){return this.currentPoint}trackMousePosition(){o.DRAG_EVENTS.forEach(t=>{document.addEventListener(t,this.updateCurrentPoints,!0),this.addSubscription(()=>document.removeEventListener(t,this.updateCurrentPoints,!0))})}updateCurrentDocumentPoint(t){"pageX"in t?this.currentPointDocument.x=t.pageX:t.touches!==void 0&&(this.currentPointDocument.x=t.touches[0].pageX),"pageY"in t?this.currentPointDocument.y=t.pageY:t.touches!==void 0&&(this.currentPointDocument.y=t.touches[0].pageY)}updateCurrentMousePoint(t){const r=this.element.getBoundingClientRect();"clientX"in t?this.currentPoint.x=t.clientX-r.left:t.touches!==void 0&&(this.currentPoint.x=t.touches[0].clientX-r.left),"clientY"in t?this.currentPoint.y=t.clientY-r.top:t.touches!==void 0&&(this.currentPoint.y=t.touches[0].clientY-r.top)}static copyPoint(t){return{x:t.x,y:t.y}}observeMouseMove(t=()=>!0){return this.mouseMoveSubject.asObservable().pipe(s(()=>t(this.currentPoint.x,this.currentPoint.y)))}observeMouseMoveNoDrag(){return this.mouseMoveSubject.asObservable().pipe(s(()=>!this.dragging))}observeMouseMoveDocument(t=()=>!0){return this.mouseMoveDocumentSubject.asObservable().pipe(s(()=>t(this.currentPoint.x,this.currentPoint.y)))}observeMouseMoveDocumentAnyElement(t=()=>!0){return this.mouseMoveDocumentSubject.asObservable().pipe(s(()=>t(this.currentPointDocument.x,this.currentPointDocument.y)),v(()=>this.currentPointDocument))}observeClickOnDocument(){return this.clickDocumentSubject.asObservable()}observeXDragStart(t=()=>!0){return this.xDragStartSubject.asObservable().pipe(s(()=>t(this.currentPoint.x,this.currentPoint.y)))}observeXDrag(t=()=>!0){return this.xDragSubject.pipe(s(()=>t(this.currentPoint.x,this.currentPoint.y)))}observeXDragEnd(t=()=>!0){return this.xDragEndSubject.asObservable().pipe(s(()=>t(this.currentPoint.x,this.currentPoint.y)))}observeXDragTick(){return this.xDragTickSubject.asObservable()}observeYDragStart(t=()=>!0){return this.yDragStartSubject.asObservable().pipe(s(()=>t(this.currentPoint.x,this.currentPoint.y)))}observeYDrag(t=()=>!0){return this.yDragSubject.asObservable().pipe(s(()=>t(this.currentPoint.x,this.currentPoint.y)))}observeYDragEnd(t=()=>!0){return this.yDragEndSubject.asObservable().pipe(s(()=>t(this.currentPoint.x,this.currentPoint.y)))}observeYDragTick(){return this.yDragTickSubject.asObservable()}observeMouseEnter(t=()=>!0,r=!1){const u=this.mouseMoveSubject.asObservable().pipe(s(()=>!(r&&this.dragging)),v(()=>t(this.currentPoint.x,this.currentPoint.y))),c=this.observeMouseLeavesCanvas().pipe(v(()=>!1));return x(u,c).pipe(E())}observeMouseLeavesCanvas(){return this.mouseLeavesCanvasSubject.asObservable()}observeClick(t=()=>!0){return this.clickSubject.asObservable().pipe(s(()=>t(this.currentPoint.x,this.currentPoint.y)))}observeDbClick(t=()=>!0){return this.dbClickSubject.asObservable().pipe(s(()=>t(this.currentPoint.x,this.currentPoint.y)))}observeWheel(t=()=>!0){return this.wheelSubject.asObservable().pipe(s(()=>t(this.currentPoint.x,this.currentPoint.y)))}observePinch(t=()=>!0){return this.pinchSubject.asObservable().pipe(s(()=>t(this.currentPoint.x,this.currentPoint.y)))}observeScrollGesture(){return this.scrollGestureSubject.asObservable()}observeTouchStart(t=()=>!0){return this.touchStartSubject.asObservable().pipe(s(()=>t(this.currentPoint.x,this.currentPoint.y)))}observeTouchMove(t=()=>!0){return this.touchMoveSubject.asObservable().pipe(s(()=>t(this.currentPoint.x,this.currentPoint.y)))}observeTouchEndDocument(){return this.touchEndSubject.asObservable()}observeTouchCancelDocument(){return this.touchCancelSubject.asObservable()}observeMouseDown(t=()=>!0){return this.mouseDownSubject.asObservable().pipe(s(()=>t(this.currentPoint.x,this.currentPoint.y)))}observeMouseUp(t=()=>!0){return this.mouseUpSubject.asObservable().pipe(s(()=>t(this.currentPoint.x,this.currentPoint.y)))}observeMouseUpDocument(t=()=>!0){return this.mouseUpDocumentSubject.asObservable().pipe(s(()=>t(this.currentPoint.x,this.currentPoint.y)))}observeContextMenu(t=()=>!0){return this.contextMenuSubject.asObservable().pipe(s(()=>t(this.currentPoint.x,this.currentPoint.y)),D(r=>r.preventDefault()))}observeLongTouch(t=()=>!0){return this.longTouchSubject.asObservable().pipe(s(()=>t(this.currentPoint.x,this.currentPoint.y)),D(r=>r.preventDefault()))}getCurrentPoint(){return this.currentPoint}}o.DRAG_START_EVENTS=["mousedown","touchstart"],o.DRAG_EVENTS=["mousemove","touchmove"],o.DRAG_END_EVENTS=["mouseup","touchend","touchcancel"];export{o as CanvasInputListenerComponent};
|
|
6
|
+
import { subscribeListener } from '../utils/dom.utils';
|
|
7
|
+
import { merge, Subject } from 'rxjs';
|
|
8
|
+
import { ChartBaseElement } from '../model/chart-base-element';
|
|
9
|
+
import { distinctUntilChanged, filter, map, tap } from 'rxjs/operators';
|
|
10
|
+
import { EVENT_RESIZED } from '../events/events';
|
|
11
|
+
import { deviceDetector } from '../utils/device/device-detector.utils';
|
|
12
|
+
import { touchpadDetector } from '../utils/device/touchpad.utils';
|
|
13
|
+
var MouseButton;
|
|
14
|
+
(function (MouseButton) {
|
|
15
|
+
MouseButton[MouseButton["left"] = 0] = "left";
|
|
16
|
+
MouseButton[MouseButton["middle"] = 1] = "middle";
|
|
17
|
+
MouseButton[MouseButton["right"] = 2] = "right";
|
|
18
|
+
})(MouseButton || (MouseButton = {}));
|
|
19
|
+
/**
|
|
20
|
+
* Gathers user input on canvas element:
|
|
21
|
+
* Chart update order should be following:
|
|
22
|
+
* 1. update currentPoints
|
|
23
|
+
* 2. fire drag, so chart scale is updated if dragged
|
|
24
|
+
* 3. fire cross - it should have updated chart coordinates
|
|
25
|
+
* - mouse drag X / Y
|
|
26
|
+
* - zooming (wheel event)
|
|
27
|
+
* - touch start and move
|
|
28
|
+
*/
|
|
29
|
+
class CanvasInputListenerComponent extends ChartBaseElement {
|
|
30
|
+
constructor(eventBus, element) {
|
|
31
|
+
super();
|
|
32
|
+
this.eventBus = eventBus;
|
|
33
|
+
this.element = element;
|
|
34
|
+
this.xDragStartSubject = new Subject();
|
|
35
|
+
/* Returns X drag delta in pixels relative to start event above: 1, 2, 3, 5, 10, 7, 3, -1, -9, -43, -149, ...*/
|
|
36
|
+
this.xDragSubject = new Subject();
|
|
37
|
+
/* Returns X drag delta in pixels for every tick: 1, 1, 2, 3, 2, 1, 1, 5, 10, 30, 2, 1, ...*/
|
|
38
|
+
this.xDragTickSubject = new Subject();
|
|
39
|
+
this.xDragEndSubject = new Subject();
|
|
40
|
+
this.yDragStartSubject = new Subject();
|
|
41
|
+
this.yDragSubject = new Subject();
|
|
42
|
+
this.yDragTickSubject = new Subject();
|
|
43
|
+
this.yDragEndSubject = new Subject();
|
|
44
|
+
this.mouseMoveSubject = new Subject();
|
|
45
|
+
this.mouseMoveDocumentSubject = new Subject();
|
|
46
|
+
this.clickSubject = new Subject();
|
|
47
|
+
this.clickDocumentSubject = new Subject();
|
|
48
|
+
this.dbClickSubject = new Subject();
|
|
49
|
+
this.mouseDownSubject = new Subject();
|
|
50
|
+
this.mouseUpSubject = new Subject();
|
|
51
|
+
this.mouseUpDocumentSubject = new Subject();
|
|
52
|
+
this.wheelSubject = new Subject();
|
|
53
|
+
this.touchStartSubject = new Subject();
|
|
54
|
+
this.touchMoveSubject = new Subject();
|
|
55
|
+
this.touchEndSubject = new Subject();
|
|
56
|
+
this.touchCancelSubject = new Subject();
|
|
57
|
+
this.contextMenuSubject = new Subject();
|
|
58
|
+
this.longTouchSubject = new Subject();
|
|
59
|
+
this.pinchSubject = new Subject();
|
|
60
|
+
this.scrollGestureSubject = new Subject();
|
|
61
|
+
this.mouseLeavesCanvasSubject = new Subject();
|
|
62
|
+
// point at which start dragging
|
|
63
|
+
this.dragStartPoint = { x: 0, y: 0 };
|
|
64
|
+
this.prevDragPoint = { x: 0, y: 0 };
|
|
65
|
+
// current mouse point in canvas
|
|
66
|
+
this.currentPoint = { x: 0, y: 0 };
|
|
67
|
+
// current mouse point in document
|
|
68
|
+
this.currentPointDocument = { x: 0, y: 0 };
|
|
69
|
+
// if currently dragging
|
|
70
|
+
this.dragging = false;
|
|
71
|
+
this.canvasBounds = {
|
|
72
|
+
x: 0,
|
|
73
|
+
y: 0,
|
|
74
|
+
pageX: 0,
|
|
75
|
+
pageY: 0,
|
|
76
|
+
width: 0,
|
|
77
|
+
height: 0,
|
|
78
|
+
};
|
|
79
|
+
this.documentDragListeners = [];
|
|
80
|
+
this.dragProcessListener = () => {
|
|
81
|
+
this.xDragSubject.next(this.currentPoint.x - this.dragStartPoint.x);
|
|
82
|
+
this.yDragSubject.next(this.currentPoint.y - this.dragStartPoint.y);
|
|
83
|
+
this.xDragTickSubject.next(this.currentPoint.x - this.prevDragPoint.x);
|
|
84
|
+
this.yDragTickSubject.next(this.currentPoint.y - this.prevDragPoint.y);
|
|
85
|
+
this.prevDragPoint.x = this.currentPoint.x;
|
|
86
|
+
this.prevDragPoint.y = this.currentPoint.y;
|
|
87
|
+
};
|
|
88
|
+
this.dragStartListener = (e) => {
|
|
89
|
+
if (this.isDraggable(e)) {
|
|
90
|
+
this.updateCurrentPoints(e);
|
|
91
|
+
this.dragging = true;
|
|
92
|
+
this.dragStartEvent = e;
|
|
93
|
+
this.documentDragListeners.forEach(unsub => unsub());
|
|
94
|
+
this.dragStartPoint = CanvasInputListenerComponent.copyPoint(this.currentPoint);
|
|
95
|
+
this.xDragStartSubject.next(this.dragStartPoint);
|
|
96
|
+
this.yDragStartSubject.next(this.dragStartPoint);
|
|
97
|
+
this.prevDragPoint = Object.assign({}, this.dragStartPoint);
|
|
98
|
+
CanvasInputListenerComponent.DRAG_EVENTS.forEach(dragEvent => {
|
|
99
|
+
// scale update rely on this listener, it should be executed BEFORE cross event, but AFTER updateCurrentPoints!!!
|
|
100
|
+
document.addEventListener(dragEvent, this.dragProcessListener, true);
|
|
101
|
+
const unsubscriber = document.removeEventListener.bind(document, dragEvent, this.dragProcessListener, true);
|
|
102
|
+
this.documentDragListeners.push(unsubscriber);
|
|
103
|
+
this.addSubscription(unsubscriber);
|
|
104
|
+
});
|
|
105
|
+
this.dragProcessListener();
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
this.dragListener = () => this.mouseMoveDocumentSubject.next(this.currentPoint);
|
|
109
|
+
this.updateElementOffsetListener = () => this.mouseMoveSubject.next(this.currentPoint);
|
|
110
|
+
this.dragEndListener = () => {
|
|
111
|
+
this.dragging = false;
|
|
112
|
+
this.documentDragListeners.forEach(unsub => unsub());
|
|
113
|
+
this.xDragEndSubject.next();
|
|
114
|
+
this.yDragEndSubject.next();
|
|
115
|
+
};
|
|
116
|
+
this.clickHandler = () => this.clickSubject.next(this.currentPoint);
|
|
117
|
+
this.updateCurrentPoints = (e) => {
|
|
118
|
+
this.updateCurrentDocumentPoint(e);
|
|
119
|
+
this.updateCurrentMousePoint(e);
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* This methods allows change scale, only if dragging using primary mouse button or touch.
|
|
124
|
+
* @param e
|
|
125
|
+
*/
|
|
126
|
+
isDraggable(e) {
|
|
127
|
+
if (e instanceof MouseEvent) {
|
|
128
|
+
return e.button === MouseButton.left;
|
|
129
|
+
}
|
|
130
|
+
return e instanceof TouchEvent;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* This methods allows you to start dragging programmatically
|
|
134
|
+
* @param e
|
|
135
|
+
*/
|
|
136
|
+
startDragging(e) {
|
|
137
|
+
this.updateCurrentPoints(e);
|
|
138
|
+
this.dragStartListener(e);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* This methods allows you to move mouse pointer programmatically
|
|
142
|
+
* @param e
|
|
143
|
+
*/
|
|
144
|
+
movePointer(e) {
|
|
145
|
+
this.updateCurrentPoints(e);
|
|
146
|
+
this.dragListener();
|
|
147
|
+
this.updateElementOffsetListener();
|
|
148
|
+
this.dragging && this.dragProcessListener();
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* This methods allows you to stop dragging programmatically
|
|
152
|
+
*/
|
|
153
|
+
stopDragging() {
|
|
154
|
+
this.dragEndListener();
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Prevents text selection inside chart-core canvas. TODO Do we need it?
|
|
158
|
+
*/
|
|
159
|
+
fixTextSelection() {
|
|
160
|
+
const selectListener = (e) => {
|
|
161
|
+
e.preventDefault();
|
|
162
|
+
return false;
|
|
163
|
+
};
|
|
164
|
+
this.element.addEventListener('selectstart', selectListener, false);
|
|
165
|
+
this.addSubscription(this.element.removeEventListener.bind(this.element, 'selectstart', selectListener, false));
|
|
166
|
+
}
|
|
167
|
+
doActivate() {
|
|
168
|
+
this.fixTextSelection();
|
|
169
|
+
// catch drag start on canvas element but may continue dragging outside of it
|
|
170
|
+
this.documentDragListeners = [];
|
|
171
|
+
CanvasInputListenerComponent.DRAG_START_EVENTS.forEach(dragStartEvent => {
|
|
172
|
+
this.element.addEventListener(dragStartEvent, this.dragStartListener);
|
|
173
|
+
this.addSubscription(() => this.element.removeEventListener(dragStartEvent, this.dragStartListener));
|
|
174
|
+
});
|
|
175
|
+
// always keep track of current mouse point
|
|
176
|
+
this.trackMousePosition();
|
|
177
|
+
CanvasInputListenerComponent.DRAG_EVENTS.forEach(dragEvent => {
|
|
178
|
+
document.addEventListener(dragEvent, this.dragListener);
|
|
179
|
+
this.addSubscription(document.removeEventListener.bind(document, dragEvent, this.dragListener));
|
|
180
|
+
this.element.addEventListener(dragEvent, this.updateElementOffsetListener);
|
|
181
|
+
this.addSubscription(this.element.removeEventListener.bind(this.element, dragEvent, this.updateElementOffsetListener));
|
|
182
|
+
});
|
|
183
|
+
CanvasInputListenerComponent.DRAG_END_EVENTS.forEach(dragEndEvent => {
|
|
184
|
+
document.addEventListener(dragEndEvent, this.dragEndListener);
|
|
185
|
+
this.addSubscription(document.removeEventListener.bind(document, dragEndEvent, this.dragEndListener));
|
|
186
|
+
});
|
|
187
|
+
this.addSubscription(subscribeListener(this.element, this.clickHandler, 'click'));
|
|
188
|
+
const clickDocumentListener = (e) => {
|
|
189
|
+
this.clickDocumentSubject.next(e);
|
|
190
|
+
};
|
|
191
|
+
this.addSubscription(subscribeListener(document, clickDocumentListener, 'click'));
|
|
192
|
+
const device = deviceDetector();
|
|
193
|
+
if (device === 'apple' || device === 'mobile') {
|
|
194
|
+
// workaround to handle double taps for iOS
|
|
195
|
+
const doubleTapListenerProducer = () => {
|
|
196
|
+
let timeoutId = null;
|
|
197
|
+
return () => {
|
|
198
|
+
if (timeoutId) {
|
|
199
|
+
this.dbClickSubject.next(this.currentPoint);
|
|
200
|
+
clearTimeout(timeoutId);
|
|
201
|
+
timeoutId = null;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
timeoutId = window.setTimeout(() => {
|
|
205
|
+
timeoutId = null;
|
|
206
|
+
}, 250);
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
};
|
|
210
|
+
const doubleTapListener = doubleTapListenerProducer();
|
|
211
|
+
this.addSubscription(subscribeListener(this.element, doubleTapListener, 'touchend'));
|
|
212
|
+
}
|
|
213
|
+
const longTouchListener = (e, delay = 500, pixelsForMoveReset = 2) => {
|
|
214
|
+
e.preventDefault();
|
|
215
|
+
let timer = null;
|
|
216
|
+
const initialCoords = { x: e.touches[0].clientX, y: e.touches[0].clientY };
|
|
217
|
+
let coords = { x: 0, y: 0 };
|
|
218
|
+
const touchMoveHandler = (e) => {
|
|
219
|
+
coords = { x: e.touches[0].clientX, y: e.touches[0].clientY };
|
|
220
|
+
if (Math.sqrt(Math.pow(coords.x - initialCoords.x, 2) + Math.pow(coords.y - initialCoords.y, 2)) >
|
|
221
|
+
pixelsForMoveReset ||
|
|
222
|
+
e.touches.length > 1) {
|
|
223
|
+
touchEnd();
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
const touchEnd = () => {
|
|
227
|
+
if (timer) {
|
|
228
|
+
clearTimeout(timer);
|
|
229
|
+
timer = null;
|
|
230
|
+
}
|
|
231
|
+
this.element.removeEventListener('touchend', touchEnd);
|
|
232
|
+
this.element.removeEventListener('touchmove', touchMoveHandler);
|
|
233
|
+
};
|
|
234
|
+
timer = setTimeout(() => this.longTouchSubject.next(e), delay);
|
|
235
|
+
this.element.addEventListener('touchmove', touchMoveHandler, { passive: true });
|
|
236
|
+
this.element.addEventListener('touchend', touchEnd);
|
|
237
|
+
};
|
|
238
|
+
this.addSubscription(subscribeListener(this.element, (e) => longTouchListener(e), 'touchstart'));
|
|
239
|
+
this.addSubscription(subscribeListener(this.element, () => this.dbClickSubject.next(this.currentPoint), 'dblclick'));
|
|
240
|
+
this.addSubscription(subscribeListener(this.element, (e) => this.touchStartSubject.next(e), 'touchstart'));
|
|
241
|
+
this.addSubscription(subscribeListener(this.element, (e) => this.touchMoveSubject.next(e), 'touchmove', true));
|
|
242
|
+
this.addSubscription(subscribeListener(this.element, (e) => this.touchEndSubject.next(e), 'touchend'));
|
|
243
|
+
this.addSubscription(subscribeListener(this.element, (e) => this.touchCancelSubject.next(e), 'touchcancel'));
|
|
244
|
+
this.addSubscription(subscribeListener(this.element, (e) => {
|
|
245
|
+
// pinch gesture, we needs the same behaviour as mouse wheel
|
|
246
|
+
if (e.ctrlKey) {
|
|
247
|
+
this.pinchSubject.next(e);
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
// mouse wheel or scroll gesture
|
|
251
|
+
const isTouchpad = touchpadDetector(e);
|
|
252
|
+
if (isTouchpad) {
|
|
253
|
+
this.scrollGestureSubject.next(e);
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
this.wheelSubject.next(e);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
e.preventDefault(); // to disable the scroll over the document, if for example chart is used as widget
|
|
260
|
+
}, 'wheel'));
|
|
261
|
+
this.addSubscription(subscribeListener(this.element, (e) => this.contextMenuSubject.next(e), 'contextmenu'));
|
|
262
|
+
this.addSubscription(subscribeListener(this.element, () => this.mouseDownSubject.next(this.currentPoint), 'mousedown'));
|
|
263
|
+
this.addSubscription(subscribeListener(this.element, () => this.mouseUpSubject.next(this.currentPoint), 'mouseup'));
|
|
264
|
+
this.addSubscription(subscribeListener(document, () => this.mouseUpDocumentSubject.next(this.currentPoint), 'mouseup'));
|
|
265
|
+
this.addRxSubscription(this.eventBus.observe(EVENT_RESIZED).subscribe(() => {
|
|
266
|
+
const bcr = this.element.getBoundingClientRect();
|
|
267
|
+
this.canvasBounds.x = bcr.left;
|
|
268
|
+
this.canvasBounds.y = bcr.top;
|
|
269
|
+
this.canvasBounds.width = bcr.width;
|
|
270
|
+
this.canvasBounds.height = bcr.height;
|
|
271
|
+
}));
|
|
272
|
+
const mouseLeaveListener = () => {
|
|
273
|
+
this.mouseLeavesCanvasSubject.next(true);
|
|
274
|
+
};
|
|
275
|
+
this.element.addEventListener('mouseleave', mouseLeaveListener, false);
|
|
276
|
+
this.addSubscription(this.element.removeEventListener.bind(this.element, 'mouseleave', mouseLeaveListener, false));
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Returns the current mouse point.
|
|
280
|
+
*
|
|
281
|
+
* @returns {Point} The current mouse point.
|
|
282
|
+
*/
|
|
283
|
+
getCurrentMousePoint() {
|
|
284
|
+
return this.currentPoint;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Private method that tracks the mouse position by adding event listeners for drag events on the document.
|
|
288
|
+
* The event listeners are added on the capture phase to ensure that every other listener gets an actual state for current points.
|
|
289
|
+
* The method also adds a subscription to remove the event listeners when they are no longer needed.
|
|
290
|
+
*/
|
|
291
|
+
trackMousePosition() {
|
|
292
|
+
CanvasInputListenerComponent.DRAG_EVENTS.forEach(dragEvent => {
|
|
293
|
+
// handle event on capture phase, so every other listeners get an actual state for current points
|
|
294
|
+
document.addEventListener(dragEvent, this.updateCurrentPoints, true);
|
|
295
|
+
this.addSubscription(() => document.removeEventListener(dragEvent, this.updateCurrentPoints, true));
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Updates the current point of the document based on the provided event.
|
|
300
|
+
* @param {CustomMouseEvent} e - The event that triggered the update.
|
|
301
|
+
* @returns {void}
|
|
302
|
+
*/
|
|
303
|
+
updateCurrentDocumentPoint(e) {
|
|
304
|
+
if ('pageX' in e) {
|
|
305
|
+
this.currentPointDocument.x = e.pageX;
|
|
306
|
+
}
|
|
307
|
+
else if (e.touches !== undefined) {
|
|
308
|
+
this.currentPointDocument.x = e.touches[0].pageX;
|
|
309
|
+
}
|
|
310
|
+
if ('pageY' in e) {
|
|
311
|
+
this.currentPointDocument.y = e.pageY;
|
|
312
|
+
}
|
|
313
|
+
else if (e.touches !== undefined) {
|
|
314
|
+
this.currentPointDocument.y = e.touches[0].pageY;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Updates the current mouse point based on the provided CustomMouseEvent.
|
|
319
|
+
* @param {CustomMouseEvent} e - The CustomMouseEvent object containing the mouse/touch coordinates.
|
|
320
|
+
* @returns {void}
|
|
321
|
+
* @private
|
|
322
|
+
*/
|
|
323
|
+
updateCurrentMousePoint(e) {
|
|
324
|
+
// this is a bad solution because BCR causes reflow
|
|
325
|
+
// it's ok while document is not changed, styles and layout
|
|
326
|
+
// but it's faster to cache BCR and recalculate when it's needed
|
|
327
|
+
const rect = this.element.getBoundingClientRect();
|
|
328
|
+
if ('clientX' in e) {
|
|
329
|
+
this.currentPoint.x = e.clientX - rect.left;
|
|
330
|
+
}
|
|
331
|
+
else if (e.touches !== undefined) {
|
|
332
|
+
this.currentPoint.x = e.touches[0].clientX - rect.left;
|
|
333
|
+
}
|
|
334
|
+
if ('clientY' in e) {
|
|
335
|
+
this.currentPoint.y = e.clientY - rect.top;
|
|
336
|
+
}
|
|
337
|
+
else if (e.touches !== undefined) {
|
|
338
|
+
this.currentPoint.y = e.touches[0].clientY - rect.top;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Creates a new object with the same properties as the provided Point object.
|
|
343
|
+
* @param {Point} point - The Point object to be copied.
|
|
344
|
+
* @returns {Object} - A new object with the same properties as the provided Point object.
|
|
345
|
+
* @private
|
|
346
|
+
* @static
|
|
347
|
+
*/
|
|
348
|
+
static copyPoint(point) {
|
|
349
|
+
return {
|
|
350
|
+
x: point.x,
|
|
351
|
+
y: point.y,
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
/* **************************************************************** */
|
|
355
|
+
/* HIT TEST argument allows to observe events only in specific areas */
|
|
356
|
+
/* **************************************************************** */
|
|
357
|
+
/**
|
|
358
|
+
* This method allows to observe mouse move events only in specific areas.
|
|
359
|
+
* @param {HitBoundsTest} hitBoundsTest - A function that takes x and y coordinates as arguments and returns a boolean value indicating whether the event should be observed or not.
|
|
360
|
+
* @returns {Observable<Point>} - An observable that emits a Point object whenever a mouse move event occurs within the specified area.
|
|
361
|
+
*/
|
|
362
|
+
observeMouseMove(hitBoundsTest = () => true) {
|
|
363
|
+
return this.mouseMoveSubject
|
|
364
|
+
.asObservable()
|
|
365
|
+
.pipe(filter(() => hitBoundsTest(this.currentPoint.x, this.currentPoint.y)));
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Returns an Observable that emits the mouse move events only if the user is not dragging.
|
|
369
|
+
* @returns {Observable<Point>} An Observable that emits the mouse move events.
|
|
370
|
+
*/
|
|
371
|
+
observeMouseMoveNoDrag() {
|
|
372
|
+
return this.mouseMoveSubject.asObservable().pipe(filter(() => !this.dragging));
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Observes any element hover in all document not only <canvas>
|
|
376
|
+
* @param hitBoundsTest
|
|
377
|
+
* @return point position in chart
|
|
378
|
+
*/
|
|
379
|
+
observeMouseMoveDocument(hitBoundsTest = () => true) {
|
|
380
|
+
return this.mouseMoveDocumentSubject
|
|
381
|
+
.asObservable()
|
|
382
|
+
.pipe(filter(() => hitBoundsTest(this.currentPoint.x, this.currentPoint.y)));
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Observes any element hover in all document not only <canvas>
|
|
386
|
+
* @param hitBoundsTest
|
|
387
|
+
* @return absolute point position in document
|
|
388
|
+
*/
|
|
389
|
+
observeMouseMoveDocumentAnyElement(hitBoundsTest = () => true) {
|
|
390
|
+
return this.mouseMoveDocumentSubject.asObservable().pipe(filter(() => hitBoundsTest(this.currentPointDocument.x, this.currentPointDocument.y)), map(() => this.currentPointDocument));
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Returns an Observable that emits an Event object whenever a click event occurs on the document.
|
|
394
|
+
* The Observable is created from a Subject that emits the click event.
|
|
395
|
+
* @returns {Observable<Event>} An Observable that emits an Event object whenever a click event occurs on the document.
|
|
396
|
+
*/
|
|
397
|
+
observeClickOnDocument() {
|
|
398
|
+
return this.clickDocumentSubject.asObservable();
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Returns observable which contains point position relative to chart canvas. (not document point!)
|
|
402
|
+
* @param hitBoundsTest {HitBoundsTest}
|
|
403
|
+
*/
|
|
404
|
+
observeXDragStart(hitBoundsTest = () => true) {
|
|
405
|
+
return this.xDragStartSubject
|
|
406
|
+
.asObservable()
|
|
407
|
+
.pipe(filter(() => hitBoundsTest(this.currentPoint.x, this.currentPoint.y)));
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Returns an Observable that emits the xDragSubject value if the hitBoundsTest function returns true for the currentPoint.
|
|
411
|
+
* @param {HitBoundsTest} hitBoundsTest - A function that takes the currentPoint's x and y coordinates as arguments and returns a boolean value.
|
|
412
|
+
* @returns {Observable<number>} - An Observable that emits the xDragSubject value if the hitBoundsTest function returns true for the currentPoint.
|
|
413
|
+
*/
|
|
414
|
+
observeXDrag(hitBoundsTest = () => true) {
|
|
415
|
+
return this.xDragSubject.pipe(filter(() => hitBoundsTest(this.currentPoint.x, this.currentPoint.y)));
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Returns an Observable that emits when the xDragEndSubject emits and the hitBoundsTest function returns true for the currentPoint.
|
|
419
|
+
* @param {HitBoundsTest} [hitBoundsTest=() => true] - A function that takes the currentPoint's x and y coordinates as arguments and returns a boolean indicating whether the point is within the desired bounds.
|
|
420
|
+
* @returns {Observable<void>} - An Observable that emits when the xDragEndSubject emits and the hitBoundsTest function returns true for the currentPoint.
|
|
421
|
+
*/
|
|
422
|
+
observeXDragEnd(hitBoundsTest = () => true) {
|
|
423
|
+
return this.xDragEndSubject
|
|
424
|
+
.asObservable()
|
|
425
|
+
.pipe(filter(() => hitBoundsTest(this.currentPoint.x, this.currentPoint.y)));
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Returns an Observable that emits a number every time a drag tick event occurs on the X axis.
|
|
429
|
+
* The number emitted represents the current position of the drag on the X axis.
|
|
430
|
+
* The Observable is created from a Subject that emits the drag tick events.
|
|
431
|
+
* @returns {Observable<number>} An Observable that emits a number every time a drag tick event occurs on the X axis.
|
|
432
|
+
*/
|
|
433
|
+
observeXDragTick() {
|
|
434
|
+
return this.xDragTickSubject.asObservable();
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Returns observable which contains point position relative to chart canvas. (not document point!)
|
|
438
|
+
* @param hitBoundsTest {HitBoundsTest}
|
|
439
|
+
*/
|
|
440
|
+
observeYDragStart(hitBoundsTest = () => true) {
|
|
441
|
+
return this.yDragStartSubject
|
|
442
|
+
.asObservable()
|
|
443
|
+
.pipe(filter(() => hitBoundsTest(this.currentPoint.x, this.currentPoint.y)));
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Returns an observable that emits the y-drag subject and filters it based on the hitBoundsTest function.
|
|
447
|
+
* @param {HitBoundsTest} hitBoundsTest - A function that returns a boolean indicating whether the current point is within the bounds.
|
|
448
|
+
* @returns {Observable<number>} - An observable that emits the y-drag subject.
|
|
449
|
+
*/
|
|
450
|
+
observeYDrag(hitBoundsTest = () => true) {
|
|
451
|
+
return this.yDragSubject
|
|
452
|
+
.asObservable()
|
|
453
|
+
.pipe(filter(() => hitBoundsTest(this.currentPoint.x, this.currentPoint.y)));
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Returns an Observable that emits when the yDragEndSubject emits and the hitBoundsTest function returns true for the currentPoint.
|
|
457
|
+
* @param {HitBoundsTest} hitBoundsTest - A function that takes in the x and y coordinates of the currentPoint and returns a boolean indicating whether the point is within the bounds.
|
|
458
|
+
* @returns {Observable<void>} - An Observable that emits when the yDragEndSubject emits and the hitBoundsTest function returns true for the currentPoint.
|
|
459
|
+
*/
|
|
460
|
+
observeYDragEnd(hitBoundsTest = () => true) {
|
|
461
|
+
return this.yDragEndSubject
|
|
462
|
+
.asObservable()
|
|
463
|
+
.pipe(filter(() => hitBoundsTest(this.currentPoint.x, this.currentPoint.y)));
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* Returns an Observable that emits a number every time the yDragTickSubject emits a value.
|
|
467
|
+
* The emitted value is the value emitted by the yDragTickSubject.
|
|
468
|
+
* @returns {Observable<number>} An Observable that emits a number every time the yDragTickSubject emits a value.
|
|
469
|
+
*/
|
|
470
|
+
observeYDragTick() {
|
|
471
|
+
return this.yDragTickSubject.asObservable();
|
|
472
|
+
}
|
|
473
|
+
/**
|
|
474
|
+
* Returns an Observable that emits a boolean value when the mouse enters the canvas.
|
|
475
|
+
* @param {HitBoundsTest} hitBoundsTest - A function that tests whether the mouse pointer is within the bounds of the canvas.
|
|
476
|
+
* @param {boolean} skipWhenDragging - A flag that determines whether to skip the mouse enter event when the user is dragging.
|
|
477
|
+
* @returns {Observable<boolean>} - An Observable that emits a boolean value when the mouse enters or leaves the canvas.
|
|
478
|
+
*/
|
|
479
|
+
observeMouseEnter(hitBoundsTest = () => true, skipWhenDragging = false) {
|
|
480
|
+
const mouseEnter$ = this.mouseMoveSubject.asObservable().pipe(filter(() => !(skipWhenDragging && this.dragging)), map(() => hitBoundsTest(this.currentPoint.x, this.currentPoint.y)));
|
|
481
|
+
const shouldCloseMouseEnter$ = this.observeMouseLeavesCanvas().pipe(map(() => false));
|
|
482
|
+
return merge(mouseEnter$, shouldCloseMouseEnter$).pipe(distinctUntilChanged());
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* Returns an observable that emits a value when the mouse leaves the canvas.
|
|
486
|
+
* @returns {Observable} An observable that emits a value when the mouse leaves the canvas.
|
|
487
|
+
*/
|
|
488
|
+
observeMouseLeavesCanvas() {
|
|
489
|
+
return this.mouseLeavesCanvasSubject.asObservable();
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Returns an Observable that emits a Point object when the element is clicked within the bounds specified by the hitBoundsTest function.
|
|
493
|
+
* @param {HitBoundsTest} hitBoundsTest - A function that takes the x and y coordinates of the click event and returns a boolean indicating whether the click is within the desired bounds.
|
|
494
|
+
* @returns {Observable<Point>} - An Observable that emits a Point object when the element is clicked within the specified bounds.
|
|
495
|
+
*/
|
|
496
|
+
observeClick(hitBoundsTest = () => true) {
|
|
497
|
+
return this.clickSubject
|
|
498
|
+
.asObservable()
|
|
499
|
+
.pipe(filter(() => hitBoundsTest(this.currentPoint.x, this.currentPoint.y)));
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Returns an Observable that emits a Point object when a double click event occurs within the bounds of the current point.
|
|
503
|
+
* @param {HitBoundsTest} [hitBoundsTest=() => true] - A function that tests if the double click event occurred within the bounds of the current point.
|
|
504
|
+
* @returns {Observable<Point>} An Observable that emits a Point object when a double click event occurs within the bounds of the current point.
|
|
505
|
+
*/
|
|
506
|
+
observeDbClick(hitBoundsTest = () => true) {
|
|
507
|
+
return this.dbClickSubject
|
|
508
|
+
.asObservable()
|
|
509
|
+
.pipe(filter(() => hitBoundsTest(this.currentPoint.x, this.currentPoint.y)));
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* Returns an Observable that emits WheelEvent objects when the wheelSubject emits a new value.
|
|
513
|
+
* The emitted events are filtered by the hitBoundsTest function, which is passed as an optional parameter.
|
|
514
|
+
* If the hitBoundsTest function is not provided, it defaults to a function that always returns true.
|
|
515
|
+
* @param {HitBoundsTest} [hitBoundsTest=() => true] - A function that takes the currentPoint's x and y coordinates as arguments and returns a boolean value.
|
|
516
|
+
* @returns {Observable<WheelEvent>} - An Observable that emits WheelEvent objects.
|
|
517
|
+
*/
|
|
518
|
+
observeWheel(hitBoundsTest = () => true) {
|
|
519
|
+
return this.wheelSubject
|
|
520
|
+
.asObservable()
|
|
521
|
+
.pipe(filter(() => hitBoundsTest(this.currentPoint.x, this.currentPoint.y)));
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Returns an Observable that emits WheelEvent when a pinch event occurs and the hitBoundsTest function returns true for the current point.
|
|
525
|
+
* @param {HitBoundsTest} hitBoundsTest - A function that takes the current point's x and y coordinates as arguments and returns a boolean indicating whether the point is within the desired bounds.
|
|
526
|
+
* @returns {Observable<WheelEvent>} - An Observable that emits WheelEvent when a pinch event occurs and the hitBoundsTest function returns true for the current point.
|
|
527
|
+
*/
|
|
528
|
+
observePinch(hitBoundsTest = () => true) {
|
|
529
|
+
return this.pinchSubject
|
|
530
|
+
.asObservable()
|
|
531
|
+
.pipe(filter(() => hitBoundsTest(this.currentPoint.x, this.currentPoint.y)));
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* Returns an Observable that emits a WheelEvent whenever a scroll gesture is detected.
|
|
535
|
+
* The Observable is created from a Subject that is subscribed to by the component's template.
|
|
536
|
+
* @returns {Observable<WheelEvent>} An Observable that emits a WheelEvent whenever a scroll gesture is detected.
|
|
537
|
+
*/
|
|
538
|
+
observeScrollGesture() {
|
|
539
|
+
return this.scrollGestureSubject.asObservable();
|
|
540
|
+
}
|
|
541
|
+
/**
|
|
542
|
+
* Returns an Observable that emits TouchEvent when a touchstart event occurs within the bounds of the current point.
|
|
543
|
+
* @param {HitBoundsTest} [hitBoundsTest=() => true] - A function that tests if the touch event occurred within the bounds of the current point.
|
|
544
|
+
* @returns {Observable<TouchEvent>} - An Observable that emits TouchEvent when a touchstart event occurs within the bounds of the current point.
|
|
545
|
+
*/
|
|
546
|
+
observeTouchStart(hitBoundsTest = () => true) {
|
|
547
|
+
return this.touchStartSubject
|
|
548
|
+
.asObservable()
|
|
549
|
+
.pipe(filter(() => hitBoundsTest(this.currentPoint.x, this.currentPoint.y)));
|
|
550
|
+
}
|
|
551
|
+
/**
|
|
552
|
+
* Returns an Observable that emits TouchEvent objects when the user moves their finger on the screen.
|
|
553
|
+
* @param {HitBoundsTest} hitBoundsTest - A function that takes the x and y coordinates of the current touch point and returns a boolean indicating whether the touch is within the desired bounds.
|
|
554
|
+
* @returns {Observable<TouchEvent>} - An Observable that emits TouchEvent objects when the user moves their finger on the screen within the specified bounds.
|
|
555
|
+
*/
|
|
556
|
+
observeTouchMove(hitBoundsTest = () => true) {
|
|
557
|
+
return this.touchMoveSubject
|
|
558
|
+
.asObservable()
|
|
559
|
+
.pipe(filter(() => hitBoundsTest(this.currentPoint.x, this.currentPoint.y)));
|
|
560
|
+
}
|
|
561
|
+
/**
|
|
562
|
+
* Returns an Observable that emits a TouchEvent when the touch end event occurs on the document.
|
|
563
|
+
* The Observable is created from a Subject that is subscribed to the touchEndSubject.
|
|
564
|
+
* @returns {Observable<TouchEvent>} An Observable that emits a TouchEvent when the touch end event occurs on the document.
|
|
565
|
+
*/
|
|
566
|
+
observeTouchEndDocument() {
|
|
567
|
+
return this.touchEndSubject.asObservable();
|
|
568
|
+
}
|
|
569
|
+
/**
|
|
570
|
+
* Returns an Observable that emits a TouchEvent when the touchcancel event is triggered on the document.
|
|
571
|
+
* @return {Observable<TouchEvent>} An Observable that emits a TouchEvent when the touchcancel event is triggered on the document.
|
|
572
|
+
*/
|
|
573
|
+
observeTouchCancelDocument() {
|
|
574
|
+
return this.touchCancelSubject.asObservable();
|
|
575
|
+
}
|
|
576
|
+
/**
|
|
577
|
+
* Returns an Observable that emits the Point object when the mouse button is pressed down within the bounds of the current point.
|
|
578
|
+
* @param {HitBoundsTest} [hitBoundsTest=() => true] - A function that tests whether the mouse click is within the bounds of the current point.
|
|
579
|
+
* @returns {Observable<Point>} - An Observable that emits the Point object when the mouse button is pressed down within the bounds of the current point.
|
|
580
|
+
*/
|
|
581
|
+
observeMouseDown(hitBoundsTest = () => true) {
|
|
582
|
+
return this.mouseDownSubject
|
|
583
|
+
.asObservable()
|
|
584
|
+
.pipe(filter(() => hitBoundsTest(this.currentPoint.x, this.currentPoint.y)));
|
|
585
|
+
}
|
|
586
|
+
/**
|
|
587
|
+
* Returns an Observable that emits the Point where the mouse button is released,
|
|
588
|
+
* filtered by the hitBoundsTest function that determines if the currentPoint is within the bounds.
|
|
589
|
+
* @param {HitBoundsTest} hitBoundsTest - A function that takes the x and y coordinates of the currentPoint and returns a boolean indicating if it is within the bounds.
|
|
590
|
+
* @returns {Observable<Point>} - An Observable that emits the Point where the mouse button is released, filtered by the hitBoundsTest function.
|
|
591
|
+
*/
|
|
592
|
+
observeMouseUp(hitBoundsTest = () => true) {
|
|
593
|
+
return this.mouseUpSubject
|
|
594
|
+
.asObservable()
|
|
595
|
+
.pipe(filter(() => hitBoundsTest(this.currentPoint.x, this.currentPoint.y)));
|
|
596
|
+
}
|
|
597
|
+
/**
|
|
598
|
+
* Returns an Observable that emits the Point where the mouse button is released on the document.
|
|
599
|
+
* @param {HitBoundsTest} hitBoundsTest - A function that returns a boolean indicating whether the mouseup event occurred within the bounds of the element.
|
|
600
|
+
* @returns {Observable<Point>} - An Observable that emits the Point where the mouse button is released on the document.
|
|
601
|
+
*/
|
|
602
|
+
observeMouseUpDocument(hitBoundsTest = () => true) {
|
|
603
|
+
return this.mouseUpDocumentSubject
|
|
604
|
+
.asObservable()
|
|
605
|
+
.pipe(filter(() => hitBoundsTest(this.currentPoint.x, this.currentPoint.y)));
|
|
606
|
+
}
|
|
607
|
+
/**
|
|
608
|
+
* Returns an Observable that emits a MouseEvent when a context menu event is triggered and the mouse pointer is within the bounds of the element.
|
|
609
|
+
* @param {HitBoundsTest} [hitBoundsTest=() => true] - A function that returns a boolean indicating whether the mouse pointer is within the bounds of the element.
|
|
610
|
+
* @returns {Observable<MouseEvent>} - An Observable that emits a MouseEvent when a context menu event is triggered and the mouse pointer is within the bounds of the element.
|
|
611
|
+
*/
|
|
612
|
+
observeContextMenu(hitBoundsTest = () => true) {
|
|
613
|
+
return this.contextMenuSubject.asObservable().pipe(filter(() => hitBoundsTest(this.currentPoint.x, this.currentPoint.y)), tap(p => p.preventDefault()));
|
|
614
|
+
}
|
|
615
|
+
/**
|
|
616
|
+
* Returns an Observable that emits a TouchEvent when a long touch is detected on the current element.
|
|
617
|
+
* @param {HitBoundsTest} [hitBoundsTest=() => true] - A function that returns a boolean indicating whether the touch event occurred within the bounds of the current element.
|
|
618
|
+
* @returns {Observable<TouchEvent>} - An Observable that emits a TouchEvent when a long touch is detected on the current element.
|
|
619
|
+
*/
|
|
620
|
+
observeLongTouch(hitBoundsTest = () => true) {
|
|
621
|
+
return this.longTouchSubject.asObservable().pipe(filter(() => hitBoundsTest(this.currentPoint.x, this.currentPoint.y)), tap(p => p.preventDefault()));
|
|
622
|
+
}
|
|
623
|
+
/**
|
|
624
|
+
* Returns the current point of the object.
|
|
625
|
+
* @returns {Point} The current point of the object.
|
|
626
|
+
*/
|
|
627
|
+
getCurrentPoint() {
|
|
628
|
+
return this.currentPoint;
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
CanvasInputListenerComponent.DRAG_START_EVENTS = ['mousedown', 'touchstart'];
|
|
632
|
+
CanvasInputListenerComponent.DRAG_EVENTS = ['mousemove', 'touchmove'];
|
|
633
|
+
CanvasInputListenerComponent.DRAG_END_EVENTS = ['mouseup', 'touchend', 'touchcancel'];
|
|
634
|
+
export { CanvasInputListenerComponent };
|