1 |
|
2 | const Util = require('./util');
|
3 | const Interaction = require('./base');
|
4 |
|
5 |
|
6 | const DRAGGING_TYPES = [ 'X', 'Y', 'XY' ];
|
7 | const DEFAULT_TYPE = 'X';
|
8 |
|
9 | class Drag extends Interaction {
|
10 | getDefaultCfg() {
|
11 | const cfg = super.getDefaultCfg();
|
12 | return Util.mix({}, cfg, {
|
13 | type: DEFAULT_TYPE,
|
14 | stepRatio: 0.05,
|
15 | stepByField: {},
|
16 | originScaleDefsByField: {},
|
17 | previousPoint: null,
|
18 | isDragging: false
|
19 | });
|
20 | }
|
21 |
|
22 | constructor(cfg, view) {
|
23 | super(cfg, view);
|
24 | const me = this;
|
25 | me.type = me.type.toUpperCase();
|
26 | me.chart = view;
|
27 |
|
28 | const scales = view.getYScales();
|
29 | const xScale = view.getXScale();
|
30 | scales.push(xScale);
|
31 | const scaleController = view.get('scaleController');
|
32 | scales.forEach(scale => {
|
33 | const field = scale.field;
|
34 | const def = scaleController.defs[field];
|
35 | me.originScaleDefsByField[field] = Util.mix(def, {
|
36 | nice: !!def.nice
|
37 | });
|
38 | if (scale.isLinear) {
|
39 | me.stepByField[field] = (scale.max - scale.min) * me.stepRatio;
|
40 | }
|
41 | });
|
42 |
|
43 | if (DRAGGING_TYPES.indexOf(me.type) === -1) {
|
44 | me.type = DEFAULT_TYPE;
|
45 | }
|
46 | }
|
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 | _applyTranslate(scale, offset = 0) {
|
53 | const me = this;
|
54 | const { chart } = me;
|
55 | const { min, max, field } = scale;
|
56 | const range = max - min;
|
57 | chart.scale(field, {
|
58 | nice: false,
|
59 | min: min - offset * range,
|
60 | max: max - offset * range
|
61 | });
|
62 | }
|
63 |
|
64 | start(ev) {
|
65 | const me = this;
|
66 | const { chart, canvas } = me;
|
67 | const canvasDOM = canvas.get('canvasDOM');
|
68 | canvasDOM.style.cursor = 'pointer';
|
69 | const coord = chart.get('coord');
|
70 | me.isDragging = true;
|
71 | me.previousPoint = coord.invertPoint(ev);
|
72 | }
|
73 | process(ev) {
|
74 | const me = this;
|
75 | if (me.isDragging) {
|
76 | const { chart, type, canvas } = me;
|
77 | const canvasDOM = canvas.get('canvasDOM');
|
78 | canvasDOM.style.cursor = 'move';
|
79 | const coord = chart.get('coord');
|
80 | const previousPoint = me.previousPoint;
|
81 | const currentPoint = coord.invertPoint(ev);
|
82 | if (type.indexOf('X') > -1) {
|
83 | me._applyTranslate(chart.getXScale(), currentPoint.x - previousPoint.x);
|
84 | }
|
85 | if (type.indexOf('Y') > -1) {
|
86 | const yScales = chart.getYScales();
|
87 | yScales.forEach(yScale => {
|
88 | me._applyTranslate(yScale, currentPoint.y - previousPoint.y);
|
89 | });
|
90 | }
|
91 | me.previousPoint = currentPoint;
|
92 | chart.repaint();
|
93 | }
|
94 | }
|
95 | end() {
|
96 | const me = this;
|
97 | me.isDragging = false;
|
98 | const { canvas } = me;
|
99 | const canvasDOM = canvas.get('canvasDOM');
|
100 | canvasDOM.style.cursor = 'default';
|
101 | }
|
102 |
|
103 | reset() {
|
104 | const me = this;
|
105 | const { view, originScaleDefsByField } = me;
|
106 | const scales = view.getYScales();
|
107 | const xScale = view.getXScale();
|
108 | scales.push(xScale);
|
109 | scales.forEach(scale => {
|
110 | if (scale.isLinear) {
|
111 | const field = scale.field;
|
112 | view.scale(field, originScaleDefsByField[field]);
|
113 | }
|
114 | });
|
115 | view.repaint();
|
116 | }
|
117 | }
|
118 |
|
119 | module.exports = Drag;
|