tracker.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. /**
  2. * DevExtreme (viz/gauges/tracker.js)
  3. * Version: 19.1.16
  4. * Build date: Tue Oct 18 2022
  5. *
  6. * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
  7. * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
  8. */
  9. "use strict";
  10. var eventsEngine = require("../../events/core/events_engine");
  11. var Class = require("../../core/class");
  12. var domAdapter = require("../../core/dom_adapter");
  13. var ready = require("../../core/utils/ready_callbacks").add;
  14. var wheelEvent = require("../../events/core/wheel");
  15. var TOOLTIP_HIDE_DELAY = 100;
  16. var Tracker = Class.inherit({
  17. ctor: function(parameters) {
  18. var that = this;
  19. that._element = parameters.renderer.g().attr({
  20. "class": "dxg-tracker",
  21. stroke: "none",
  22. "stroke-width": 0,
  23. fill: "#000000",
  24. opacity: 1e-4
  25. }).linkOn(parameters.container, {
  26. name: "tracker",
  27. after: "peripheral"
  28. });
  29. that._showTooltipCallback = function() {
  30. var target = that._tooltipEvent.target;
  31. var data_target = target["gauge-data-target"];
  32. var data_info = target["gauge-data-info"];
  33. that._targetEvent = null;
  34. if (that._tooltipTarget !== target && that._callbacks["tooltip-show"](data_target, data_info)) {
  35. that._tooltipTarget = target
  36. }
  37. };
  38. that._hideTooltipCallback = function() {
  39. that._hideTooltipTimeout = null;
  40. that._targetEvent = null;
  41. if (that._tooltipTarget) {
  42. that._callbacks["tooltip-hide"]();
  43. that._tooltipTarget = null
  44. }
  45. };
  46. that._dispose = function() {
  47. clearTimeout(that._hideTooltipTimeout);
  48. that._showTooltipCallback = that._hideTooltipCallback = that._dispose = null
  49. }
  50. },
  51. dispose: function() {
  52. var that = this;
  53. that._dispose();
  54. that.deactivate();
  55. that._element.linkOff();
  56. that._element = that._context = that._callbacks = null;
  57. return that
  58. },
  59. activate: function() {
  60. this._element.linkAppend();
  61. return this
  62. },
  63. deactivate: function() {
  64. this._element.linkRemove().clear();
  65. return this
  66. },
  67. attach: function(element, target, info) {
  68. element.data({
  69. "gauge-data-target": target,
  70. "gauge-data-info": info
  71. }).append(this._element);
  72. return this
  73. },
  74. detach: function(element) {
  75. element.remove();
  76. return this
  77. },
  78. setTooltipState: function(state) {
  79. var that = this;
  80. var data;
  81. that._element.off(tooltipMouseEvents).off(tooltipTouchEvents).off(tooltipMouseWheelEvents);
  82. if (state) {
  83. data = {
  84. tracker: that
  85. };
  86. that._element.on(tooltipMouseEvents, data).on(tooltipTouchEvents, data).on(tooltipMouseWheelEvents, data)
  87. }
  88. return that
  89. },
  90. setCallbacks: function(callbacks) {
  91. this._callbacks = callbacks;
  92. return this
  93. },
  94. _showTooltip: function(event) {
  95. var that = this;
  96. clearTimeout(that._hideTooltipTimeout);
  97. that._hideTooltipTimeout = null;
  98. if (that._tooltipTarget === event.target) {
  99. return
  100. }
  101. that._tooltipEvent = event;
  102. that._showTooltipCallback()
  103. },
  104. _hideTooltip: function(delay) {
  105. var that = this;
  106. clearTimeout(that._hideTooltipTimeout);
  107. if (delay) {
  108. that._hideTooltipTimeout = setTimeout(that._hideTooltipCallback, delay)
  109. } else {
  110. that._hideTooltipCallback()
  111. }
  112. }
  113. });
  114. var tooltipMouseEvents = {
  115. "mouseover.gauge-tooltip": handleTooltipMouseOver,
  116. "mouseout.gauge-tooltip": handleTooltipMouseOut
  117. };
  118. var tooltipMouseMoveEvents = {
  119. "mousemove.gauge-tooltip": handleTooltipMouseMove
  120. };
  121. var tooltipMouseWheelEvents = {};
  122. tooltipMouseWheelEvents[wheelEvent.name + ".gauge-tooltip"] = handleTooltipMouseWheel;
  123. var tooltipTouchEvents = {
  124. "touchstart.gauge-tooltip": handleTooltipTouchStart
  125. };
  126. function handleTooltipMouseOver(event) {
  127. var tracker = event.data.tracker;
  128. tracker._x = event.pageX;
  129. tracker._y = event.pageY;
  130. tracker._element.off(tooltipMouseMoveEvents).on(tooltipMouseMoveEvents, event.data);
  131. tracker._showTooltip(event)
  132. }
  133. function handleTooltipMouseMove(event) {
  134. var tracker = event.data.tracker;
  135. tracker._x = event.pageX;
  136. tracker._y = event.pageY;
  137. tracker._showTooltip(event)
  138. }
  139. function handleTooltipMouseOut(event) {
  140. var tracker = event.data.tracker;
  141. tracker._element.off(tooltipMouseMoveEvents);
  142. tracker._hideTooltip(TOOLTIP_HIDE_DELAY)
  143. }
  144. function handleTooltipMouseWheel(event) {
  145. event.data.tracker._hideTooltip()
  146. }
  147. var active_touch_tooltip_tracker = null;
  148. function handleTooltipTouchStart(event) {
  149. event.preventDefault();
  150. var tracker = active_touch_tooltip_tracker;
  151. if (tracker && tracker !== event.data.tracker) {
  152. tracker._hideTooltip(TOOLTIP_HIDE_DELAY)
  153. }
  154. tracker = active_touch_tooltip_tracker = event.data.tracker;
  155. tracker._showTooltip(event);
  156. tracker._touch = true
  157. }
  158. function handleTooltipDocumentTouchStart() {
  159. var tracker = active_touch_tooltip_tracker;
  160. if (tracker) {
  161. if (!tracker._touch) {
  162. tracker._hideTooltip(TOOLTIP_HIDE_DELAY);
  163. active_touch_tooltip_tracker = null
  164. }
  165. tracker._touch = null
  166. }
  167. }
  168. function handleTooltipDocumentTouchEnd() {
  169. var tracker = active_touch_tooltip_tracker;
  170. if (tracker) {
  171. tracker._hideTooltip(TOOLTIP_HIDE_DELAY);
  172. active_touch_tooltip_tracker = null
  173. }
  174. }
  175. ready(function() {
  176. eventsEngine.subscribeGlobal(domAdapter.getDocument(), {
  177. "touchstart.gauge-tooltip": handleTooltipDocumentTouchStart,
  178. "touchend.gauge-tooltip": handleTooltipDocumentTouchEnd
  179. })
  180. });
  181. module.exports = Tracker;