@devexperts/dxcharts-lite 1.0.1 → 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.
Files changed (379) hide show
  1. package/README.md +4 -4
  2. package/dist/chart/animation/canvas-animation.d.ts +1 -1
  3. package/dist/chart/animation/canvas-animation.js +135 -2
  4. package/dist/chart/animation/types/animation.d.ts +1 -1
  5. package/dist/chart/animation/types/animation.js +44 -2
  6. package/dist/chart/animation/types/color-alpha-animation.d.ts +2 -2
  7. package/dist/chart/animation/types/color-alpha-animation.js +61 -2
  8. package/dist/chart/animation/types/color-transition-animation.d.ts +2 -2
  9. package/dist/chart/animation/types/color-transition-animation.js +87 -2
  10. package/dist/chart/animation/types/viewport-movement-animation.d.ts +1 -1
  11. package/dist/chart/animation/types/viewport-movement-animation.js +64 -2
  12. package/dist/chart/animation/viewport-model-animation.d.ts +1 -1
  13. package/dist/chart/animation/viewport-model-animation.js +21 -2
  14. package/dist/chart/bootstrap.d.ts +52 -49
  15. package/dist/chart/bootstrap.js +450 -2
  16. package/dist/chart/canvas/canvas-bounds-container.d.ts +1 -6
  17. package/dist/chart/canvas/canvas-bounds-container.js +816 -2
  18. package/dist/chart/canvas/canvas-chart-html.d.ts +1 -1
  19. package/dist/chart/canvas/canvas-chart-html.js +17 -19
  20. package/dist/chart/canvas/chart-elements.d.ts +2 -5
  21. package/dist/chart/canvas/chart-elements.js +23 -2
  22. package/dist/chart/canvas/cursor.handler.d.ts +1 -1
  23. package/dist/chart/canvas/cursor.handler.js +123 -2
  24. package/dist/chart/canvas/layout-creator.d.ts +1 -1
  25. package/dist/chart/canvas/layout-creator.js +35 -2
  26. package/dist/chart/canvas/y-axis-bounds.container.d.ts +3 -3
  27. package/dist/chart/canvas/y-axis-bounds.container.js +68 -2
  28. package/dist/chart/chart-container.d.ts +1 -1
  29. package/dist/chart/chart-container.js +2 -2
  30. package/dist/chart/chart.config.d.ts +5 -6
  31. package/dist/chart/chart.config.js +646 -2
  32. package/dist/chart/chart.d.ts +62 -0
  33. package/dist/chart/chart.js +106 -0
  34. package/dist/chart/components/chart/basic-scale.d.ts +3 -3
  35. package/dist/chart/components/chart/basic-scale.js +32 -2
  36. package/dist/chart/components/chart/candle-transformer.functions.d.ts +1 -1
  37. package/dist/chart/components/chart/candle-transformer.functions.js +16 -2
  38. package/dist/chart/components/chart/candle-width-calculator.functions.d.ts +1 -1
  39. package/dist/chart/components/chart/candle-width-calculator.functions.js +3 -2
  40. package/dist/chart/components/chart/candle.functions.d.ts +1 -1
  41. package/dist/chart/components/chart/candle.functions.js +45 -2
  42. package/dist/chart/components/chart/chart-area-pan.handler.d.ts +4 -4
  43. package/dist/chart/components/chart/chart-area-pan.handler.js +198 -2
  44. package/dist/chart/components/chart/chart-base.model.d.ts +1 -1
  45. package/dist/chart/components/chart/chart-base.model.js +67 -2
  46. package/dist/chart/components/chart/chart.component.d.ts +8 -4
  47. package/dist/chart/components/chart/chart.component.js +409 -2
  48. package/dist/chart/components/chart/chart.model.d.ts +5 -12
  49. package/dist/chart/components/chart/chart.model.js +955 -2
  50. package/dist/chart/components/chart/data-series.high-low-provider.d.ts +1 -1
  51. package/dist/chart/components/chart/data-series.high-low-provider.js +35 -2
  52. package/dist/chart/components/chart/fake-candles.d.ts +1 -1
  53. package/dist/chart/components/chart/fake-candles.js +98 -2
  54. package/dist/chart/components/chart/price.formatter.d.ts +1 -1
  55. package/dist/chart/components/chart/price.formatter.js +36 -2
  56. package/dist/chart/components/chart/secondary-chart-colors-pool.d.ts +1 -1
  57. package/dist/chart/components/chart/secondary-chart-colors-pool.js +69 -2
  58. package/dist/chart/components/cross_tool/cross-tool.component.d.ts +1 -1
  59. package/dist/chart/components/cross_tool/cross-tool.component.js +86 -2
  60. package/dist/chart/components/cross_tool/cross-tool.drawer.d.ts +1 -1
  61. package/dist/chart/components/cross_tool/cross-tool.drawer.js +33 -2
  62. package/dist/chart/components/cross_tool/cross-tool.model.d.ts +1 -1
  63. package/dist/chart/components/cross_tool/cross-tool.model.js +108 -2
  64. package/dist/chart/components/cross_tool/types/cross-and-labels.drawer.d.ts +1 -1
  65. package/dist/chart/components/cross_tool/types/cross-and-labels.drawer.js +138 -2
  66. package/dist/chart/components/cross_tool/types/none.drawer.d.ts +1 -1
  67. package/dist/chart/components/cross_tool/types/none.drawer.js +4 -2
  68. package/dist/chart/components/dran-n-drop_helper/drag-n-drop-x.component.d.ts +1 -1
  69. package/dist/chart/components/dran-n-drop_helper/drag-n-drop-x.component.js +29 -2
  70. package/dist/chart/components/dran-n-drop_helper/drag-n-drop-y.component.d.ts +1 -1
  71. package/dist/chart/components/dran-n-drop_helper/drag-n-drop-y.component.js +25 -2
  72. package/dist/chart/components/dran-n-drop_helper/drag-n-drop.component.d.ts +1 -1
  73. package/dist/chart/components/dran-n-drop_helper/drag-n-drop.component.js +54 -2
  74. package/dist/chart/components/dynamic-objects/dynamic-objects.component.d.ts +13 -0
  75. package/dist/chart/components/dynamic-objects/dynamic-objects.component.js +20 -0
  76. package/dist/chart/components/dynamic-objects/dynamic-objects.drawer.d.ts +18 -0
  77. package/dist/chart/components/dynamic-objects/dynamic-objects.drawer.js +23 -0
  78. package/dist/chart/components/dynamic-objects/dynamic-objects.model.d.ts +63 -0
  79. package/dist/chart/components/dynamic-objects/dynamic-objects.model.js +136 -0
  80. package/dist/chart/components/events/events-hit-test.drawer.d.ts +1 -1
  81. package/dist/chart/components/events/events-hit-test.drawer.js +64 -2
  82. package/dist/chart/components/events/events.component.d.ts +1 -1
  83. package/dist/chart/components/events/events.component.js +62 -2
  84. package/dist/chart/components/events/events.drawer.d.ts +1 -1
  85. package/dist/chart/components/events/events.drawer.js +196 -2
  86. package/dist/chart/components/events/events.model.d.ts +1 -1
  87. package/dist/chart/components/events/events.model.js +70 -2
  88. package/dist/chart/components/grid/grid.component.d.ts +3 -3
  89. package/dist/chart/components/grid/grid.component.js +32 -2
  90. package/dist/chart/components/grid/grid.drawer.d.ts +5 -4
  91. package/dist/chart/components/grid/grid.drawer.js +107 -2
  92. package/dist/chart/components/high_low/high-low.component.d.ts +1 -1
  93. package/dist/chart/components/high_low/high-low.component.js +13 -2
  94. package/dist/chart/components/high_low/high-low.drawer.d.ts +1 -1
  95. package/dist/chart/components/high_low/high-low.drawer.js +127 -2
  96. package/dist/chart/components/highlights/highlights.component.d.ts +1 -1
  97. package/dist/chart/components/highlights/highlights.component.js +47 -2
  98. package/dist/chart/components/highlights/highlights.drawer.d.ts +1 -1
  99. package/dist/chart/components/highlights/highlights.drawer.js +155 -2
  100. package/dist/chart/components/highlights/highlights.model.d.ts +1 -1
  101. package/dist/chart/components/highlights/highlights.model.js +76 -2
  102. package/dist/chart/components/labels_generator/numeric-axis-labels.generator.d.ts +2 -2
  103. package/dist/chart/components/labels_generator/numeric-axis-labels.generator.js +200 -2
  104. package/dist/chart/components/navigation_map/navigation-map-move.handler.d.ts +3 -3
  105. package/dist/chart/components/navigation_map/navigation-map-move.handler.js +109 -2
  106. package/dist/chart/components/navigation_map/navigation-map.component.d.ts +1 -1
  107. package/dist/chart/components/navigation_map/navigation-map.component.js +113 -2
  108. package/dist/chart/components/navigation_map/navigation-map.drawer.d.ts +1 -1
  109. package/dist/chart/components/navigation_map/navigation-map.drawer.js +245 -2
  110. package/dist/chart/components/navigation_map/navigation-map.model.d.ts +1 -1
  111. package/dist/chart/components/navigation_map/navigation-map.model.js +34 -3
  112. package/dist/chart/components/pan/chart-pan.component.d.ts +3 -3
  113. package/dist/chart/components/pan/chart-pan.component.js +52 -2
  114. package/dist/chart/components/pane/extent/y-extent-component.d.ts +13 -19
  115. package/dist/chart/components/pane/extent/y-extent-component.js +121 -2
  116. package/dist/chart/components/pane/pane-hit-test.controller.d.ts +1 -1
  117. package/dist/chart/components/pane/pane-hit-test.controller.js +56 -2
  118. package/dist/chart/components/pane/pane-manager.component.d.ts +11 -6
  119. package/dist/chart/components/pane/pane-manager.component.js +149 -2
  120. package/dist/chart/components/pane/pane.component.d.ts +18 -34
  121. package/dist/chart/components/pane/pane.component.js +279 -2
  122. package/dist/chart/components/resizer/bar-resizer.component.d.ts +1 -1
  123. package/dist/chart/components/resizer/bar-resizer.component.js +140 -2
  124. package/dist/chart/components/resizer/bar-resizer.drawer.d.ts +1 -1
  125. package/dist/chart/components/resizer/bar-resizer.drawer.js +47 -2
  126. package/dist/chart/components/snapshot/snapshot.component.d.ts +1 -1
  127. package/dist/chart/components/snapshot/snapshot.component.js +49 -2
  128. package/dist/chart/components/volumes/separate-volumes.component.d.ts +7 -11
  129. package/dist/chart/components/volumes/separate-volumes.component.js +64 -2
  130. package/dist/chart/components/volumes/volume-color-resolvers.functions.d.ts +1 -1
  131. package/dist/chart/components/volumes/volume-color-resolvers.functions.js +19 -2
  132. package/dist/chart/components/volumes/volumes.component.d.ts +9 -9
  133. package/dist/chart/components/volumes/volumes.component.js +95 -2
  134. package/dist/chart/components/volumes/volumes.drawer.d.ts +6 -13
  135. package/dist/chart/components/volumes/volumes.drawer.js +141 -2
  136. package/dist/chart/components/volumes/volumes.formatter.d.ts +1 -1
  137. package/dist/chart/components/volumes/volumes.formatter.js +32 -2
  138. package/dist/chart/components/volumes/volumes.model.d.ts +3 -3
  139. package/dist/chart/components/volumes/volumes.model.js +44 -2
  140. package/dist/chart/components/watermark/water-mark.component.d.ts +1 -1
  141. package/dist/chart/components/watermark/water-mark.component.js +104 -2
  142. package/dist/chart/components/watermark/water-mark.drawer.d.ts +1 -1
  143. package/dist/chart/components/watermark/water-mark.drawer.js +188 -2
  144. package/dist/chart/components/x_axis/numeric-x-axis-labels.generator.d.ts +1 -1
  145. package/dist/chart/components/x_axis/numeric-x-axis-labels.generator.js +28 -2
  146. package/dist/chart/components/x_axis/time/parser/time-formats-matchers.functions.d.ts +1 -1
  147. package/dist/chart/components/x_axis/time/parser/time-formats-matchers.functions.js +188 -2
  148. package/dist/chart/components/x_axis/time/parser/time-formats-parser.functions.d.ts +1 -1
  149. package/dist/chart/components/x_axis/time/parser/time-formats-parser.functions.js +77 -2
  150. package/dist/chart/components/x_axis/time/parser/time-formats-validators.functions.d.ts +1 -1
  151. package/dist/chart/components/x_axis/time/parser/time-formats-validators.functions.js +80 -2
  152. package/dist/chart/components/x_axis/time/parser/time-formats.model.d.ts +1 -1
  153. package/dist/chart/components/x_axis/time/parser/time-formats.model.js +15 -2
  154. package/dist/chart/components/x_axis/time/x-axis-weights.functions.d.ts +2 -2
  155. package/dist/chart/components/x_axis/time/x-axis-weights.functions.js +144 -2
  156. package/dist/chart/components/x_axis/time/x-axis-weights.generator.d.ts +1 -1
  157. package/dist/chart/components/x_axis/time/x-axis-weights.generator.js +74 -2
  158. package/dist/chart/components/x_axis/x-axis-draw.functions.d.ts +1 -1
  159. package/dist/chart/components/x_axis/x-axis-draw.functions.js +50 -2
  160. package/dist/chart/components/x_axis/x-axis-labels.drawer.d.ts +1 -1
  161. package/dist/chart/components/x_axis/x-axis-labels.drawer.js +71 -2
  162. package/dist/chart/components/x_axis/x-axis-labels.generator.d.ts +3 -3
  163. package/dist/chart/components/x_axis/x-axis-labels.generator.js +333 -2
  164. package/dist/chart/components/x_axis/x-axis-labels.model.d.ts +1 -1
  165. package/dist/chart/components/x_axis/x-axis-labels.model.js +36 -2
  166. package/dist/chart/components/x_axis/x-axis-scale.handler.d.ts +3 -3
  167. package/dist/chart/components/x_axis/x-axis-scale.handler.js +61 -2
  168. package/dist/chart/components/x_axis/x-axis-time-labels.drawer.d.ts +1 -1
  169. package/dist/chart/components/x_axis/x-axis-time-labels.drawer.js +83 -2
  170. package/dist/chart/components/x_axis/x-axis.component.d.ts +3 -3
  171. package/dist/chart/components/x_axis/x-axis.component.js +120 -2
  172. package/dist/chart/components/y_axis/label-color.functions.d.ts +1 -1
  173. package/dist/chart/components/y_axis/label-color.functions.js +54 -2
  174. package/dist/chart/components/y_axis/numeric-y-axis-labels.generator.d.ts +5 -5
  175. package/dist/chart/components/y_axis/numeric-y-axis-labels.generator.js +34 -2
  176. package/dist/chart/components/y_axis/price_labels/data-series-y-axis-labels.provider.d.ts +4 -4
  177. package/dist/chart/components/y_axis/price_labels/data-series-y-axis-labels.provider.js +68 -2
  178. package/dist/chart/components/y_axis/price_labels/labels-positions-calculator.d.ts +1 -1
  179. package/dist/chart/components/y_axis/price_labels/labels-positions-calculator.js +57 -2
  180. package/dist/chart/components/y_axis/price_labels/last-candle-labels.provider.d.ts +1 -1
  181. package/dist/chart/components/y_axis/price_labels/last-candle-labels.provider.js +96 -2
  182. package/dist/chart/components/y_axis/price_labels/price-label.drawer.d.ts +3 -3
  183. package/dist/chart/components/y_axis/price_labels/price-label.drawer.js +120 -2
  184. package/dist/chart/components/y_axis/price_labels/y-axis-labels.model.d.ts +10 -9
  185. package/dist/chart/components/y_axis/price_labels/y-axis-labels.model.js +202 -2
  186. package/dist/chart/components/y_axis/price_labels/y-axis-price-labels.drawer.d.ts +7 -8
  187. package/dist/chart/components/y_axis/price_labels/y-axis-price-labels.drawer.js +59 -2
  188. package/dist/chart/components/y_axis/y-axis-base-labels.model.d.ts +7 -5
  189. package/dist/chart/components/y_axis/y-axis-base-labels.model.js +48 -2
  190. package/dist/chart/components/y_axis/y-axis-labels.drawer.d.ts +5 -5
  191. package/dist/chart/components/y_axis/y-axis-labels.drawer.js +162 -2
  192. package/dist/chart/components/y_axis/y-axis-scale.handler.d.ts +3 -3
  193. package/dist/chart/components/y_axis/y-axis-scale.handler.js +73 -2
  194. package/dist/chart/components/y_axis/y-axis.component.d.ts +33 -42
  195. package/dist/chart/components/y_axis/y-axis.component.js +221 -2
  196. package/dist/chart/components/y_axis/y-axis.drawer.d.ts +10 -13
  197. package/dist/chart/components/y_axis/y-axis.drawer.js +97 -2
  198. package/dist/chart/components/y_axis/y-axis.model.d.ts +10 -18
  199. package/dist/chart/components/y_axis/y-axis.model.js +34 -2
  200. package/dist/chart/drawers/chart-background.drawer.d.ts +1 -1
  201. package/dist/chart/drawers/chart-background.drawer.js +70 -2
  202. package/dist/chart/drawers/chart-type-drawers/area.drawer.d.ts +1 -1
  203. package/dist/chart/drawers/chart-type-drawers/area.drawer.js +70 -2
  204. package/dist/chart/drawers/chart-type-drawers/bar.drawer.d.ts +1 -1
  205. package/dist/chart/drawers/chart-type-drawers/bar.drawer.js +58 -2
  206. package/dist/chart/drawers/chart-type-drawers/baseline.drawer.d.ts +1 -1
  207. package/dist/chart/drawers/chart-type-drawers/baseline.drawer.js +85 -2
  208. package/dist/chart/drawers/chart-type-drawers/candle.drawer.d.ts +1 -1
  209. package/dist/chart/drawers/chart-type-drawers/candle.drawer.js +163 -2
  210. package/dist/chart/drawers/chart-type-drawers/histogram.drawer.d.ts +1 -1
  211. package/dist/chart/drawers/chart-type-drawers/histogram.drawer.js +58 -2
  212. package/dist/chart/drawers/chart-type-drawers/line.drawer.d.ts +1 -1
  213. package/dist/chart/drawers/chart-type-drawers/line.drawer.js +39 -2
  214. package/dist/chart/drawers/chart-type-drawers/scatter-plot.drawer.d.ts +1 -1
  215. package/dist/chart/drawers/chart-type-drawers/scatter-plot.drawer.js +20 -2
  216. package/dist/chart/drawers/clear-canvas.drawer.d.ts +1 -1
  217. package/dist/chart/drawers/clear-canvas.drawer.js +15 -2
  218. package/dist/chart/drawers/composite.drawer.d.ts +1 -1
  219. package/dist/chart/drawers/composite.drawer.js +68 -2
  220. package/dist/chart/drawers/data-series-drawers/candle-series-wrapper.d.ts +1 -1
  221. package/dist/chart/drawers/data-series-drawers/candle-series-wrapper.js +51 -2
  222. package/dist/chart/drawers/data-series-drawers/color-candle.drawer.d.ts +1 -1
  223. package/dist/chart/drawers/data-series-drawers/color-candle.drawer.js +36 -2
  224. package/dist/chart/drawers/data-series-drawers/data-series-drawers.utils.d.ts +1 -1
  225. package/dist/chart/drawers/data-series-drawers/data-series-drawers.utils.js +17 -2
  226. package/dist/chart/drawers/data-series-drawers/difference-cloud.drawer.d.ts +1 -1
  227. package/dist/chart/drawers/data-series-drawers/difference-cloud.drawer.js +107 -2
  228. package/dist/chart/drawers/data-series-drawers/histogram.drawer.d.ts +1 -1
  229. package/dist/chart/drawers/data-series-drawers/histogram.drawer.js +24 -2
  230. package/dist/chart/drawers/data-series-drawers/linear.drawer.d.ts +1 -1
  231. package/dist/chart/drawers/data-series-drawers/linear.drawer.js +20 -2
  232. package/dist/chart/drawers/data-series-drawers/points.drawer.d.ts +1 -1
  233. package/dist/chart/drawers/data-series-drawers/points.drawer.js +20 -2
  234. package/dist/chart/drawers/data-series-drawers/rectangular-tool.drawer.d.ts +1 -1
  235. package/dist/chart/drawers/data-series-drawers/rectangular-tool.drawer.js +8 -2
  236. package/dist/chart/drawers/data-series-drawers/text.drawer.d.ts +1 -1
  237. package/dist/chart/drawers/data-series-drawers/text.drawer.js +26 -2
  238. package/dist/chart/drawers/data-series-drawers/trend-histogram.drawer.d.ts +1 -1
  239. package/dist/chart/drawers/data-series-drawers/trend-histogram.drawer.js +36 -2
  240. package/dist/chart/drawers/data-series-drawers/triangle.drawer.d.ts +1 -1
  241. package/dist/chart/drawers/data-series-drawers/triangle.drawer.js +23 -2
  242. package/dist/chart/drawers/data-series.drawer.d.ts +6 -8
  243. package/dist/chart/drawers/data-series.drawer.js +57 -2
  244. package/dist/chart/drawers/drawing-manager.d.ts +2 -2
  245. package/dist/chart/drawers/drawing-manager.js +178 -2
  246. package/dist/chart/drawers/ht-data-series.drawer.d.ts +1 -1
  247. package/dist/chart/drawers/ht-data-series.drawer.js +38 -2
  248. package/dist/chart/events/event-bus.d.ts +1 -1
  249. package/dist/chart/events/event-bus.js +74 -2
  250. package/dist/chart/events/events.d.ts +1 -1
  251. package/dist/chart/events/events.js +4 -2
  252. package/dist/chart/inputhandlers/candle-tap.handler.d.ts +1 -1
  253. package/dist/chart/inputhandlers/candle-tap.handler.js +47 -2
  254. package/dist/chart/inputhandlers/chart-resize.handler.d.ts +1 -1
  255. package/dist/chart/inputhandlers/chart-resize.handler.js +99 -2
  256. package/dist/chart/inputhandlers/cross-event-producer.component.d.ts +1 -1
  257. package/dist/chart/inputhandlers/cross-event-producer.component.js +68 -2
  258. package/dist/chart/inputhandlers/hover-producer.component.d.ts +3 -3
  259. package/dist/chart/inputhandlers/hover-producer.component.js +229 -2
  260. package/dist/chart/inputhandlers/main-canvas-touch.handler.d.ts +3 -3
  261. package/dist/chart/inputhandlers/main-canvas-touch.handler.js +81 -2
  262. package/dist/chart/inputlisteners/canvas-input-listener.component.d.ts +1 -1
  263. package/dist/chart/inputlisteners/canvas-input-listener.component.js +630 -2
  264. package/dist/chart/model/baseline.model.d.ts +1 -1
  265. package/dist/chart/model/baseline.model.js +89 -2
  266. package/dist/chart/model/bounds.model.d.ts +1 -1
  267. package/dist/chart/model/bounds.model.js +2 -2
  268. package/dist/chart/model/candle-hover.d.ts +1 -1
  269. package/dist/chart/model/candle-hover.js +71 -2
  270. package/dist/chart/model/candle-series-high-low.provider.d.ts +1 -1
  271. package/dist/chart/model/candle-series-high-low.provider.js +46 -2
  272. package/dist/chart/model/candle-series.model.d.ts +4 -4
  273. package/dist/chart/model/candle-series.model.js +246 -2
  274. package/dist/chart/model/candle.model.d.ts +1 -1
  275. package/dist/chart/model/candle.model.js +70 -2
  276. package/dist/chart/model/canvas.model.d.ts +1 -1
  277. package/dist/chart/model/canvas.model.js +229 -2
  278. package/dist/chart/model/chart-base-element.d.ts +1 -1
  279. package/dist/chart/model/chart-base-element.js +130 -2
  280. package/dist/chart/model/compare-series-hover.d.ts +1 -1
  281. package/dist/chart/model/compare-series-hover.js +26 -2
  282. package/dist/chart/model/data-series-view.d.ts +6 -6
  283. package/dist/chart/model/data-series-view.js +112 -2
  284. package/dist/chart/model/data-series.config.d.ts +1 -1
  285. package/dist/chart/model/data-series.config.js +15 -2
  286. package/dist/chart/model/data-series.model.d.ts +5 -5
  287. package/dist/chart/model/data-series.model.js +282 -2
  288. package/dist/chart/model/date-time.formatter.d.ts +1 -1
  289. package/dist/chart/model/date-time.formatter.js +152 -2
  290. package/dist/chart/model/hit-test-canvas.model.d.ts +2 -2
  291. package/dist/chart/model/hit-test-canvas.model.js +257 -2
  292. package/dist/chart/model/main-candle-series.model.d.ts +2 -2
  293. package/dist/chart/model/main-candle-series.model.js +30 -2
  294. package/dist/chart/model/scale.model.d.ts +3 -2
  295. package/dist/chart/model/scale.model.js +317 -2
  296. package/dist/chart/model/scaling/auto-scale.model.d.ts +1 -1
  297. package/dist/chart/model/scaling/auto-scale.model.js +98 -2
  298. package/dist/chart/model/scaling/constrait.functions.d.ts +1 -1
  299. package/dist/chart/model/scaling/constrait.functions.js +62 -2
  300. package/dist/chart/model/scaling/lock-ratio.model.d.ts +1 -1
  301. package/dist/chart/model/scaling/lock-ratio.model.js +18 -2
  302. package/dist/chart/model/scaling/move-chart.functions.d.ts +1 -1
  303. package/dist/chart/model/scaling/move-chart.functions.js +23 -2
  304. package/dist/chart/model/scaling/viewport.model.d.ts +3 -3
  305. package/dist/chart/model/scaling/viewport.model.js +280 -2
  306. package/dist/chart/model/scaling/x-zooming.functions.d.ts +1 -1
  307. package/dist/chart/model/scaling/x-zooming.functions.js +36 -2
  308. package/dist/chart/model/time-zone.model.d.ts +1 -1
  309. package/dist/chart/model/time-zone.model.js +110 -2
  310. package/dist/chart/model/visual-candle.d.ts +1 -1
  311. package/dist/chart/model/visual-candle.js +135 -2
  312. package/dist/chart/utils/__tests__/array.utils.test.d.ts +1 -1
  313. package/dist/chart/utils/__tests__/array.utils.test.js +136 -2
  314. package/dist/chart/utils/{perfomance/debounce.utils.js → __tests__/math.utils.test.d.ts} +2 -2
  315. package/dist/chart/utils/__tests__/math.utils.test.js +19 -0
  316. package/dist/chart/utils/__tests__/object.utils.test.d.ts +1 -1
  317. package/dist/chart/utils/__tests__/object.utils.test.js +12 -2
  318. package/dist/chart/utils/__tests__/priceIncrementsUtils.test.d.ts +1 -1
  319. package/dist/chart/utils/__tests__/priceIncrementsUtils.test.js +30 -2
  320. package/dist/chart/utils/array.utils.d.ts +2 -2
  321. package/dist/chart/utils/array.utils.js +270 -2
  322. package/dist/chart/utils/auto-period-detector.utils.d.ts +1 -1
  323. package/dist/chart/utils/auto-period-detector.utils.js +40 -2
  324. package/dist/chart/utils/candles-generator-ts.utils.d.ts +1 -1
  325. package/dist/chart/utils/candles-generator-ts.utils.js +21 -2
  326. package/dist/chart/utils/candles-generator.utils.d.ts +1 -1
  327. package/dist/chart/utils/candles-generator.utils.js +162 -2
  328. package/dist/chart/utils/candles.utils.d.ts +1 -1
  329. package/dist/chart/utils/candles.utils.js +43 -2
  330. package/dist/chart/utils/canvas/canvas-drawing-functions.utils.d.ts +1 -1
  331. package/dist/chart/utils/canvas/canvas-drawing-functions.utils.js +145 -2
  332. package/dist/chart/utils/canvas/canvas-font-measure-tool.utils.d.ts +1 -1
  333. package/dist/chart/utils/canvas/canvas-font-measure-tool.utils.js +52 -2
  334. package/dist/chart/utils/canvas/canvas-text-functions.utils.d.ts +1 -1
  335. package/dist/chart/utils/canvas/canvas-text-functions.utils.js +157 -2
  336. package/dist/chart/utils/color.utils.d.ts +1 -1
  337. package/dist/chart/utils/color.utils.js +32 -2
  338. package/dist/chart/utils/device/browser.utils.d.ts +1 -1
  339. package/dist/chart/utils/device/browser.utils.js +11 -2
  340. package/dist/chart/utils/device/device-detector.utils.d.ts +1 -1
  341. package/dist/chart/utils/device/device-detector.utils.js +25 -2
  342. package/dist/chart/utils/device/device-pixel-ratio.utils.d.ts +1 -1
  343. package/dist/chart/utils/device/device-pixel-ratio.utils.js +22 -2
  344. package/dist/chart/utils/device/touchpad.utils.d.ts +1 -1
  345. package/dist/chart/utils/device/touchpad.utils.js +92 -2
  346. package/dist/chart/utils/dom.utils.d.ts +1 -1
  347. package/dist/chart/utils/dom.utils.js +16 -2
  348. package/dist/chart/utils/function.utils.d.ts +1 -1
  349. package/dist/chart/utils/function.utils.js +17 -2
  350. package/dist/chart/utils/linkedList.utils.d.ts +28 -0
  351. package/dist/chart/utils/linkedList.utils.js +138 -0
  352. package/dist/chart/utils/math.utils.d.ts +1 -1
  353. package/dist/chart/utils/math.utils.js +116 -2
  354. package/dist/chart/utils/merge.utils.d.ts +1 -1
  355. package/dist/chart/utils/merge.utils.js +57 -2
  356. package/dist/chart/utils/object.utils.d.ts +1 -1
  357. package/dist/chart/utils/object.utils.js +44 -2
  358. package/dist/chart/utils/{perfomance → performance}/animation-frame-cache.utils.d.ts +1 -1
  359. package/dist/chart/utils/performance/animation-frame-cache.utils.js +77 -0
  360. package/dist/chart/utils/{perfomance → performance}/debounce.utils.d.ts +1 -1
  361. package/dist/chart/utils/performance/debounce.utils.js +12 -0
  362. package/dist/chart/utils/{perfomance → performance}/memoize.utils.d.ts +1 -1
  363. package/dist/chart/utils/performance/memoize.utils.js +74 -0
  364. package/dist/chart/utils/{perfomance → performance}/request-animation-frame-throttle.utils.d.ts +1 -1
  365. package/dist/chart/utils/performance/request-animation-frame-throttle.utils.js +43 -0
  366. package/dist/chart/utils/{perfomance → performance}/throttle.utils.d.ts +1 -1
  367. package/dist/chart/utils/performance/throttle.utils.js +26 -0
  368. package/dist/chart/utils/price-increments.utils.d.ts +2 -1
  369. package/dist/chart/utils/price-increments.utils.js +128 -2
  370. package/dist/chart/utils/uuid.utils.d.ts +1 -1
  371. package/dist/chart/utils/uuid.utils.js +5 -2
  372. package/dist/dxchart.min.js +10 -13
  373. package/dist/index.d.ts +4 -4
  374. package/dist/index.js +21 -2
  375. package/package.json +4 -4
  376. package/dist/chart/utils/perfomance/animation-frame-cache.utils.js +0 -6
  377. package/dist/chart/utils/perfomance/memoize.utils.js +0 -6
  378. package/dist/chart/utils/perfomance/request-animation-frame-throttle.utils.js +0 -6
  379. package/dist/chart/utils/perfomance/throttle.utils.js +0 -6
@@ -1,6 +1,634 @@
1
1
  /*
2
- * Copyright (C) 2002 - 2023 Devexperts LLC
2
+ * Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
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 };
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (C) 2002 - 2023 Devexperts LLC
2
+ * Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
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
  */