devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
143 lines (136 loc) • 4.79 kB
JavaScript
/**
* DevExtreme (esm/viz/chart_components/shutter_zoom.js)
* Version: 21.1.4
* Build date: Mon Jun 21 2021
*
* Copyright (c) 2012 - 2021 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
import {
start as dragEventStart,
move as dragEventMove,
end as dragEventEnd
} from "../../events/drag";
var SHUTTER_EVENTS_NS = ".shutter-zoom";
var DRAG_START_EVENT_NAME = dragEventStart + SHUTTER_EVENTS_NS;
var DRAG_UPDATE_EVENT_NAME = dragEventMove + SHUTTER_EVENTS_NS;
var DRAG_END_EVENT_NAME = dragEventEnd + SHUTTER_EVENTS_NS;
function getPointerCoord(rootOffset, canvas, rotated, e) {
var coord = Math.floor(rotated ? e.pageY - rootOffset.top : e.pageX - rootOffset.left);
var min = rotated ? canvas.y1 : canvas.x1;
var max = rotated ? canvas.y2 : canvas.x2;
if (coord < min) {
coord = min
} else if (coord > max) {
coord = max
}
return coord
}
function checkCoords(rootOffset, canvas, e) {
var x = e.pageX - rootOffset.left;
var y = e.pageY - rootOffset.top;
return x >= canvas.x1 && x <= canvas.x2 && y >= canvas.y1 && y <= canvas.y2
}
function dragStartHandler(ctx) {
return function(e) {
var offset = ctx.getRootOffset();
var canvas = ctx.getCanvas();
if (!checkCoords(offset, canvas, e)) {
e.cancel = true;
return
}
ctx.rootOffset = offset;
ctx.canvas = canvas;
ctx.startCoord = getPointerCoord(offset, canvas, ctx.rotated, e);
ctx.triggerStart();
ctx.rect.attr({
x: canvas.x1,
y: canvas.y1,
width: canvas.width,
height: canvas.height
}).append(ctx.root)
}
}
function dragHandler(ctx) {
return function(e) {
var curCoord = getPointerCoord(ctx.rootOffset, ctx.canvas, ctx.rotated, e);
var attr = {};
ctx.curCoord = curCoord;
attr[ctx.rotated ? "y" : "x"] = Math.min(ctx.startCoord, curCoord);
attr[ctx.rotated ? "height" : "width"] = Math.abs(ctx.startCoord - curCoord);
ctx.rect.attr(attr)
}
}
function dragEndHandler(ctx) {
return function(e) {
ctx.triggerEnd();
ctx.rect.remove()
}
}
function shutterZoom(options) {
var chart = options.chart;
var renderer = options.renderer;
var rotated = options.rotated;
var rect = renderer.rect(0, 0, 0, 0).attr(options.shutterOptions);
var shutter = {
rect: rect,
root: renderer.root,
rotated: rotated,
triggerStart: function() {
chart._eventTrigger("zoomStart")
},
triggerEnd: function() {
var tr = chart._argumentAxes[0].getTranslator();
var rangeStart = Math.min(this.startCoord, this.curCoord);
var rangeEnd = Math.max(this.startCoord, this.curCoord);
chart._eventTrigger("zoomEnd", {
rangeStart: tr.from(rangeStart),
rangeEnd: tr.from(rangeEnd)
})
},
dispose: function() {
renderer.root.off(SHUTTER_EVENTS_NS);
rect.dispose()
},
getRootOffset: function() {
return renderer.getRootOffset()
},
getCanvas: function() {
var canvas = chart._canvas;
var panes = chart.panes;
var firstPane = panes[0].canvas;
var lastPane = panes[panes.length - 1].canvas;
return {
x1: firstPane.left,
y1: firstPane.top,
x2: canvas.width - lastPane.right,
y2: canvas.height - lastPane.bottom,
width: canvas.width - firstPane.left - lastPane.right,
height: canvas.height - firstPane.top - lastPane.bottom
}
}
};
renderer.root.off(SHUTTER_EVENTS_NS).on(DRAG_START_EVENT_NAME, {
direction: rotated ? "vertical" : "horizontal",
immediate: true
}, dragStartHandler(shutter)).on(DRAG_UPDATE_EVENT_NAME, dragHandler(shutter)).on(DRAG_END_EVENT_NAME, dragEndHandler(shutter));
return shutter
}
export default {
name: "shutter_zoom",
init: function() {
var options = this.option("shutterZoom") || {};
if (!options.enabled) {
return
}
this._shutterZoom = shutterZoom({
chart: this,
renderer: this._renderer,
rotated: this.option("rotated"),
shutterOptions: options
})
},
dispose: function() {
this._shutterZoom && this._shutterZoom.dispose()
}
};