UNPKG

3.09 kBJavaScriptView Raw
1
2const Util = require('./util');
3const Interaction = require('./base');
4// const G2 = require('../core.js');
5
6const DRAGGING_TYPES = [ 'X', 'Y', 'XY' ];
7const DEFAULT_TYPE = 'X';
8
9class 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 // onDragstart() { }
49 // onDrag() { }
50 // onDragend() { }
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
119module.exports = Drag;