1 | import * as util from '../util';
|
2 | import * as is from '../is';
|
3 | import Set from '../set';
|
4 |
|
5 |
|
6 | let Element = function( cy, params, restore = true ){
|
7 | if( cy === undefined || params === undefined || !is.core( cy ) ){
|
8 | util.error( 'An element must have a core reference and parameters set' );
|
9 | return;
|
10 | }
|
11 |
|
12 | let group = params.group;
|
13 |
|
14 |
|
15 | if( group == null ){
|
16 | if( params.data && params.data.source != null && params.data.target != null ){
|
17 | group = 'edges';
|
18 | } else {
|
19 | group = 'nodes';
|
20 | }
|
21 | }
|
22 |
|
23 |
|
24 | if( group !== 'nodes' && group !== 'edges' ){
|
25 | util.error( 'An element must be of type `nodes` or `edges`; you specified `' + group + '`' );
|
26 | return;
|
27 | }
|
28 |
|
29 |
|
30 | this.length = 1;
|
31 | this[0] = this;
|
32 |
|
33 |
|
34 | let _p = this._private = {
|
35 | cy: cy,
|
36 | single: true,
|
37 | data: params.data || {},
|
38 | position: params.position || { x: 0, y: 0 },
|
39 | autoWidth: undefined,
|
40 | autoHeight: undefined,
|
41 | autoPadding: undefined,
|
42 | compoundBoundsClean: false,
|
43 | listeners: [],
|
44 | group: group,
|
45 | style: {},
|
46 | rstyle: {},
|
47 | styleCxts: [],
|
48 | styleKeys: {},
|
49 | removed: true,
|
50 | selected: params.selected ? true : false,
|
51 | selectable: params.selectable === undefined ? true : ( params.selectable ? true : false ),
|
52 | locked: params.locked ? true : false,
|
53 | grabbed: false,
|
54 | grabbable: params.grabbable === undefined ? true : ( params.grabbable ? true : false ),
|
55 | pannable: params.pannable === undefined ? (group === 'edges' ? true : false) : ( params.pannable ? true : false ),
|
56 | active: false,
|
57 | classes: new Set(),
|
58 | animation: {
|
59 | current: [],
|
60 | queue: []
|
61 | },
|
62 | rscratch: {},
|
63 | scratch: params.scratch || {},
|
64 | edges: [],
|
65 | children: [],
|
66 | parent: params.parent && params.parent.isNode() ? params.parent : null,
|
67 | traversalCache: {},
|
68 | backgrounding: false,
|
69 | bbCache: null,
|
70 | bbCacheShift: { x: 0, y: 0 },
|
71 | bodyBounds: null,
|
72 | overlayBounds: null,
|
73 | labelBounds: {
|
74 | all: null,
|
75 | source: null,
|
76 | target: null,
|
77 | main: null
|
78 | },
|
79 | arrowBounds: {
|
80 | source: null,
|
81 | target: null,
|
82 | 'mid-source': null,
|
83 | 'mid-target': null
|
84 | }
|
85 | };
|
86 |
|
87 | if( _p.position.x == null ){ _p.position.x = 0; }
|
88 | if( _p.position.y == null ){ _p.position.y = 0; }
|
89 |
|
90 |
|
91 | if( params.renderedPosition ){
|
92 | let rpos = params.renderedPosition;
|
93 | let pan = cy.pan();
|
94 | let zoom = cy.zoom();
|
95 |
|
96 | _p.position = {
|
97 | x: (rpos.x - pan.x) / zoom,
|
98 | y: (rpos.y - pan.y) / zoom
|
99 | };
|
100 | }
|
101 |
|
102 | let classes = [];
|
103 | if( is.array( params.classes ) ){
|
104 | classes = params.classes;
|
105 | } else if( is.string( params.classes ) ){
|
106 | classes = params.classes.split( /\s+/ );
|
107 | }
|
108 | for( let i = 0, l = classes.length; i < l; i++ ){
|
109 | let cls = classes[ i ];
|
110 | if( !cls || cls === '' ){ continue; }
|
111 |
|
112 | _p.classes.add(cls);
|
113 | }
|
114 |
|
115 | this.createEmitter();
|
116 |
|
117 | let bypass = params.style || params.css;
|
118 | if( bypass ){
|
119 | util.warn('Setting a `style` bypass at element creation should be done only when absolutely necessary. Try to use the stylesheet instead.');
|
120 |
|
121 | this.style(bypass);
|
122 | }
|
123 |
|
124 | if( restore === undefined || restore ){
|
125 | this.restore();
|
126 | }
|
127 |
|
128 | };
|
129 |
|
130 | export default Element;
|