@@ -26,6 +26,7 @@ function init(element){
26
26
window . addEventListener ( 'graph_edge' , onViewEdge , false ) ;
27
27
window . addEventListener ( 'graph' , onGraph , false ) ;
28
28
window . addEventListener ( 'graph_mouse' , onViewMouse , false ) ;
29
+ svg_transform_init ( document . getElementById ( 'svg_graph' ) ) ;
29
30
console . log ( `view_svg> init() in ${ Date . now ( ) - start } ms` ) ;
30
31
}
31
32
@@ -72,55 +73,73 @@ function init(element){
72
73
}
73
74
74
75
function onViewMouse ( e ) {
76
+ let svg = document . getElementById ( 'svg_graph' ) ;
75
77
if ( e . detail . type == "view_scale" ) {
76
- console . log ( `view_svg> ${ e . detail . step } ` ) ;
77
- svg_scale ( document . getElementById ( 'svg_graph' ) , e . detail . step ) ;
78
+ //svg_move(svg,0,0);
79
+ svg_scale ( svg , e . detail . step , e . detail . origin ) ;
80
+ } else if ( e . detail . type == "view_move" ) {
81
+ svg_shift ( svg , e . detail . tx , e . detail . ty ) ;
78
82
}
79
83
}
80
84
//---- SVG Utils ----
81
- function svg_get_scale ( element ) {
82
- let sx = 1 ;
83
- let sy = 1 ;
84
- let scale_exist = false ;
85
- element . transform . baseVal . forEach ( transform => {
86
- if ( transform . type == SVGTransform . SVG_TRANSFORM_SCALE ) {
87
- scale_exist = true ;
88
- sx = transform . matrix . a ;
89
- sy = transform . matrix . d ;
90
- }
91
- } ) ;
92
- return { sx :sx , sy :sy , exists :scale_exist } ;
85
+ //important to call so that translate comes before the scale
86
+ function svg_transform_init ( element ) {
87
+ let svg = document . getElementById ( 'svg_graph' ) ;
88
+ svg . style . backgroundColor = "#fafafa" ;
89
+ let tr_translate = element . createSVGTransform ( ) ;
90
+ tr_translate . setTranslate ( 0 , 0 ) ;
91
+ element . transform . baseVal . appendItem ( tr_translate ) ;
92
+
93
+ let tr_scale = element . createSVGTransform ( ) ;
94
+ tr_scale . setScale ( 1 , 1 ) ;
95
+ element . transform . baseVal . appendItem ( tr_scale ) ;
96
+
97
+ element . style . transformOrigin = "0% 0%" ;
93
98
}
94
99
95
- function svg_scale ( element , step ) {
96
- let scale_exist = false ;
97
- element . transform . baseVal . forEach ( transform => {
98
- if ( transform . type == SVGTransform . SVG_TRANSFORM_SCALE ) {
99
- scale_exist = true ;
100
- let sx = transform . matrix . a ;
101
- if ( step == 'up' ) {
102
- let new_scale = sx / config . system . view . scale_ratio ;
103
- if ( new_scale > config . system . view . scale_min ) {
104
- transform . setScale ( new_scale , new_scale ) ;
105
- }
106
- } else {
107
- let new_scale = sx * config . system . view . scale_ratio ;
108
- if ( new_scale < config . system . view . scale_max ) {
109
- transform . setScale ( new_scale , new_scale ) ;
110
- }
111
- }
112
- }
113
- } ) ;
114
- if ( ! scale_exist ) {
115
- let transform = element . createSVGTransform ( ) ;
100
+ function svg_scale ( element , step , origin ) {
101
+ let rect_prev = element . getBoundingClientRect ( ) ;
102
+ let transform = element . transform . baseVal [ 1 ] ;
103
+ let tochange = false ;
104
+ let new_scale ;
105
+ if ( transform . type == SVGTransform . SVG_TRANSFORM_SCALE ) {
106
+ let sx = transform . matrix . a ;
116
107
if ( step == 'up' ) {
117
- let new_scale = 1 / config . system . view . scale_ratio ;
118
- transform . setScale ( new_scale , new_scale ) ;
108
+ new_scale = sx / config . system . view . scale_ratio ;
109
+ if ( new_scale > config . system . view . scale_min ) {
110
+ tochange = true ;
111
+ }
119
112
} else {
120
- let new_scale = config . system . view . scale_ratio ;
121
- transform . setScale ( new_scale , new_scale ) ;
113
+ new_scale = sx * config . system . view . scale_ratio ;
114
+ if ( new_scale < config . system . view . scale_max ) {
115
+ tochange = true ;
116
+ }
122
117
}
123
- element . transform . baseVal . appendItem ( transform ) ;
118
+ }
119
+ if ( tochange ) {
120
+ transform . setScale ( new_scale , new_scale ) ;
121
+ let rect = element . getBoundingClientRect ( ) ;
122
+ let dx = origin . rx * ( rect . width - rect_prev . width ) ;
123
+ let dy = origin . ry * ( rect . height - rect_prev . height ) ;
124
+ svg_shift ( element , - dx , - dy ) ;
125
+ }
126
+ //console.log(`after scale w = ${rect.width} ; h = ${rect.height}`);
127
+ }
128
+
129
+ function svg_move ( element , px , py ) {
130
+ let transform = element . transform . baseVal [ 0 ] ;
131
+ if ( transform . type == SVGTransform . SVG_TRANSFORM_TRANSLATE ) {
132
+ transform . setTranslate ( px , py ) ;
133
+ }
134
+ }
135
+
136
+ function svg_shift ( element , tx , ty ) {
137
+ console . log ( `tx = ${ tx } ; ty = ${ ty } ` ) ;
138
+ let transform = element . transform . baseVal [ 0 ] ;
139
+ if ( transform . type == SVGTransform . SVG_TRANSFORM_TRANSLATE ) {
140
+ let new_tx = transform . matrix . e + tx ;
141
+ let new_ty = transform . matrix . f + ty ;
142
+ transform . setTranslate ( new_tx , new_ty ) ;
124
143
}
125
144
}
126
145
@@ -138,7 +157,7 @@ function svg_scale(element,step){
138
157
. attr ( { fill : dat . params . VertexColor } )
139
158
. on ( [
140
159
'mousedown' , 'mouseup' ,
141
- 'click' , 'mouseover ' ,
160
+ 'click' , 'mouseenter ' ,
142
161
'mouseleave' , 'contextmenu' ,
143
162
'touchstart' , 'touchend' ] , mouse . onMouseVertex ) ;
144
163
vert . center ( 0 , 0 ) ;
0 commit comments