UNPKG

3.06 kBJavaScriptView Raw
1const Util = require('./util');
2const Interaction = require('./base');
3
4function getOriginalAttrs(attrs, styles) {
5 const origin = {};
6 for (const style in styles) {
7 origin[style] = attrs[style];
8 }
9 return origin;
10}
11
12class Select extends Interaction {
13 getDefaultCfg() {
14 const defaultCfg = super.getDefaultCfg();
15 return Util.mix({}, defaultCfg, {
16 startEvent: 'mouseup',
17 processEvent: null,
18 selectStyle: {
19 fillOpacity: 1
20 },
21 unSelectStyle: {
22 fillOpacity: 0.1
23 },
24 cancelable: true
25 });
26 }
27
28 start(ev) {
29 const self = this;
30 const chart = self.view;
31
32 let selectedShape;
33 const unSelectedShapes = [];
34 chart.eachShape((obj, shape) => {
35 if (shape.isPointInPath(ev.x, ev.y)) {
36 selectedShape = shape;
37 } else {
38 unSelectedShapes.push(shape);
39 }
40 });
41
42 if (!selectedShape) {
43 self.reset();
44 return;
45 }
46
47 if (selectedShape.get('_selected')) { // 已经被选中
48 if (!self.cancelable) { // 不允许取消选中则不处理
49 return;
50 }
51 self.reset(); // 允许取消选中
52 } else { // 未被选中
53 const { selectStyle, unSelectStyle } = self;
54 // 获取选中效果对应的本来效果,保存下来
55 const originAttrs = getOriginalAttrs(selectedShape.attr(), selectedShape);
56 selectedShape.set('_originAttrs', originAttrs);
57 selectedShape.attr(selectStyle);
58
59 Util.each(unSelectedShapes, child => {
60 let originAttrs = child.get('_originAttrs');
61 // 先恢复到默认状态下
62 if (originAttrs) {
63 child.attr(originAttrs);
64 }
65 child.set('_selected', false);
66 // 保存未选中效果对应的原始效果
67 if (unSelectStyle) {
68 originAttrs = getOriginalAttrs(child.attr(), unSelectStyle);
69 child.set('_originAttrs', originAttrs);
70 child.attr(unSelectStyle);
71 }
72 });
73
74 selectedShape.set('_selected', true);
75 self.selectedShape = selectedShape;
76 self.canvas.draw();
77 }
78 }
79
80 end(ev) {
81 const selectedShape = this.selectedShape;
82 if (selectedShape && !selectedShape.get('destroyed') && selectedShape.get('origin')) {
83 ev.data = selectedShape.get('origin')._origin; // 绘制数据,包含原始数据啊
84 ev.shapeInfo = selectedShape.get('origin');
85 ev.shape = selectedShape;
86 ev.selected = !!selectedShape.get('_selected'); // 返回选中的状态
87 }
88 }
89
90 reset() {
91 const self = this;
92 if (!self.selectedShape) {
93 return;
94 }
95 const chart = self.view;
96 const geom = chart.get('geoms')[0];
97 const container = geom.get('container').get('children')[0];
98 const children = container.get('children');
99
100 Util.each(children, child => {
101 const originAttrs = child.get('_originAttrs');
102 if (originAttrs) {
103 child._attrs = originAttrs;
104 child.set('_originAttrs', null);
105 }
106 child.set('_selected', false);
107 });
108 self.canvas.draw();
109 }
110}
111
112module.exports = Select;