devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
201 lines (193 loc) • 6.88 kB
JavaScript
/**
* DevExtreme (viz/gauges/tracker.js)
* Version: 18.1.3
* Build date: Tue May 15 2018
*
* Copyright (c) 2012 - 2018 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
;
var eventsEngine = require("../../events/core/events_engine"),
_abs = Math.abs,
Class = require("../../core/class"),
domAdapter = require("../../core/dom_adapter"),
ready = require("../../core/utils/ready_callbacks").add,
wheelEvent = require("../../events/core/wheel"),
TOOLTIP_SHOW_DELAY = 300,
TOOLTIP_HIDE_DELAY = 300,
TOOLTIP_TOUCH_SHOW_DELAY = 400,
TOOLTIP_TOUCH_HIDE_DELAY = 300;
var Tracker = Class.inherit({
ctor: function(parameters) {
var that = this;
that._element = parameters.renderer.g().attr({
"class": "dxg-tracker",
stroke: "none",
"stroke-width": 0,
fill: "#000000",
opacity: 1e-4
}).linkOn(parameters.container, {
name: "tracker",
after: "peripheral"
});
that._showTooltipCallback = function() {
that._showTooltipTimeout = null;
var target = that._tooltipEvent.target,
data_target = target["gauge-data-target"],
data_info = target["gauge-data-info"];
that._targetEvent = null;
if (that._tooltipTarget !== target && that._callbacks["tooltip-show"](data_target, data_info)) {
that._tooltipTarget = target
}
};
that._hideTooltipCallback = function() {
that._hideTooltipTimeout = null;
that._targetEvent = null;
if (that._tooltipTarget) {
that._callbacks["tooltip-hide"]();
that._tooltipTarget = null
}
};
that._dispose = function() {
clearTimeout(that._showTooltipTimeout);
clearTimeout(that._hideTooltipTimeout);
that._showTooltipCallback = that._hideTooltipCallback = that._dispose = null
}
},
dispose: function() {
var that = this;
that._dispose();
that.deactivate();
that._element.linkOff();
that._element = that._context = that._callbacks = null;
return that
},
activate: function() {
this._element.linkAppend();
return this
},
deactivate: function() {
this._element.linkRemove().clear();
return this
},
attach: function(element, target, info) {
element.data({
"gauge-data-target": target,
"gauge-data-info": info
}).append(this._element);
return this
},
detach: function(element) {
element.remove();
return this
},
setTooltipState: function(state) {
var data, that = this;
that._element.off(tooltipMouseEvents).off(tooltipTouchEvents).off(tooltipMouseWheelEvents);
if (state) {
data = {
tracker: that
};
that._element.on(tooltipMouseEvents, data).on(tooltipTouchEvents, data).on(tooltipMouseWheelEvents, data)
}
return that
},
setCallbacks: function(callbacks) {
this._callbacks = callbacks;
return this
},
_showTooltip: function(event, delay) {
var that = this;
clearTimeout(that._hideTooltipTimeout);
that._hideTooltipTimeout = null;
if (that._tooltipTarget === event.target) {
return
}
clearTimeout(that._showTooltipTimeout);
that._tooltipEvent = event;
that._showTooltipTimeout = setTimeout(that._showTooltipCallback, delay)
},
_hideTooltip: function(delay) {
var that = this;
clearTimeout(that._showTooltipTimeout);
that._showTooltipTimeout = null;
clearTimeout(that._hideTooltipTimeout);
if (delay) {
that._hideTooltipTimeout = setTimeout(that._hideTooltipCallback, delay)
} else {
that._hideTooltipCallback()
}
}
});
var tooltipMouseEvents = {
"mouseover.gauge-tooltip": handleTooltipMouseOver,
"mouseout.gauge-tooltip": handleTooltipMouseOut
};
var tooltipMouseMoveEvents = {
"mousemove.gauge-tooltip": handleTooltipMouseMove
};
var tooltipMouseWheelEvents = {};
tooltipMouseWheelEvents[wheelEvent.name + ".gauge-tooltip"] = handleTooltipMouseWheel;
var tooltipTouchEvents = {
"touchstart.gauge-tooltip": handleTooltipTouchStart
};
function handleTooltipMouseOver(event) {
var tracker = event.data.tracker;
tracker._x = event.pageX;
tracker._y = event.pageY;
tracker._element.off(tooltipMouseMoveEvents).on(tooltipMouseMoveEvents, event.data);
tracker._showTooltip(event, TOOLTIP_SHOW_DELAY)
}
function handleTooltipMouseMove(event) {
var tracker = event.data.tracker;
if (tracker._showTooltipTimeout && _abs(event.pageX - tracker._x) > 4 || _abs(event.pageY - tracker._y) > 4) {
tracker._x = event.pageX;
tracker._y = event.pageY;
tracker._showTooltip(event, TOOLTIP_SHOW_DELAY)
}
}
function handleTooltipMouseOut(event) {
var tracker = event.data.tracker;
tracker._element.off(tooltipMouseMoveEvents);
tracker._hideTooltip(TOOLTIP_HIDE_DELAY)
}
function handleTooltipMouseWheel(event) {
event.data.tracker._hideTooltip()
}
var active_touch_tooltip_tracker = null;
function handleTooltipTouchStart(event) {
event.preventDefault();
var tracker = active_touch_tooltip_tracker;
if (tracker && tracker !== event.data.tracker) {
tracker._hideTooltip(TOOLTIP_TOUCH_HIDE_DELAY)
}
tracker = active_touch_tooltip_tracker = event.data.tracker;
tracker._showTooltip(event, TOOLTIP_TOUCH_SHOW_DELAY);
tracker._touch = true
}
function handleTooltipDocumentTouchStart() {
var tracker = active_touch_tooltip_tracker;
if (tracker) {
if (!tracker._touch) {
tracker._hideTooltip(TOOLTIP_TOUCH_HIDE_DELAY);
active_touch_tooltip_tracker = null
}
tracker._touch = null
}
}
function handleTooltipDocumentTouchEnd() {
var tracker = active_touch_tooltip_tracker;
if (tracker) {
if (tracker._showTooltipTimeout) {
tracker._hideTooltip(TOOLTIP_TOUCH_HIDE_DELAY);
active_touch_tooltip_tracker = null
}
}
}
ready(function() {
eventsEngine.subscribeGlobal(domAdapter.getDocument(), {
"touchstart.gauge-tooltip": handleTooltipDocumentTouchStart,
"touchend.gauge-tooltip": handleTooltipDocumentTouchEnd
})
});
module.exports = Tracker;