Yang Visualizer
[dlux.git] / modules / common-sigmatopology-resources / src / main / resources / sigmatopology / sigma.directive.js
1 var modules = [\r
2   'common/sigmatopology/sigmatopology.module',\r
3   'sigma', \r
4   'sigma-parsers-gexf', \r
5   'sigma-forceAtlas2', \r
6   'sigma-dragNodes',\r
7   'sigma-customShapes'\r
8 ];\r
9 \r
10 define(modules, function(topologyModule) {\r
11   topologyModule.register.directive('sigmaTopology', function() {\r
12     // constants\r
13     return {\r
14       restrict: 'E',\r
15       scope: {\r
16           topologyData: '=topologyData',\r
17           topologyOptions: '=topologyOptions',\r
18           topologyCustfunc: '=topologyCustfunc',\r
19           panel: '=panel',\r
20           customShapes: '=customShapes',\r
21           dragNodes: '=dragNodes',\r
22           settings: '=settingsSigma',\r
23           settingsAtlas: '=settingsAtlas',\r
24           triggerResizeSigma: '=triggerResizeSigma'\r
25       },\r
26       templateUrl: 'src/common/sigmatopology/sigma.tpl.html',\r
27       link: function($scope, iElm, iAttrs, controller) {\r
28 \r
29           var sigmaIstance = null,\r
30               getSlowDownNum = function(numOfNodes){\r
31                   // return 1/numOfNodes;\r
32                   x = 10;\r
33               switch(true){\r
34                 case (numOfNodes < 20):\r
35                   x = 15;\r
36                   break;\r
37                 case (numOfNodes < 50):\r
38                   x = 5;\r
39                   break;\r
40                 case (numOfNodes < 100):\r
41                   x = 2;\r
42                   break;\r
43                 case (numOfNodes < 250):\r
44                   x = 1;\r
45                   break;\r
46                 case (numOfNodes < 500):\r
47                   x = 0.8;\r
48                   break;\r
49                 case (numOfNodes < 1000):\r
50                   x = 0.4;\r
51                   break;\r
52                 case (numOfNodes < 2000):\r
53                   x = 0.3;\r
54                   break;\r
55                 // case (numOfNodes < 5000):\r
56                 //   x = 0.1;\r
57                 //   break;\r
58                 case (numOfNodes < 10000):\r
59                   x = 0.1;\r
60                   break;\r
61               }\r
62 \r
63 \r
64               return x;\r
65             },\r
66             Sigma = sigma,\r
67             defaulSettings = {\r
68               defaultLabelColor: '#fff',\r
69               doubleClickEnabled: false,\r
70               labelThreshold: 8\r
71             };\r
72 \r
73           $scope.$watch('topologyData', function (ntdata) {\r
74 \r
75             if(ntdata){\r
76 \r
77               if ( sigmaIstance !== null ) {\r
78                 sigmaIstance.kill();\r
79               }\r
80               var timeToStopAtlas;\r
81 \r
82               // Instantiate sigma:\r
83               Sigma.renderers.def = Sigma.renderers.canvas;\r
84 \r
85               Sigma.prototype.resetZoom = function(camera){\r
86                   if(typeof camera == "undefined"){\r
87                       camera = this.cameras[0];\r
88                   }\r
89                   camera.ratio = 1;\r
90                   camera.x = 0;\r
91                   camera.y = 0;   \r
92                   this.refresh();\r
93               };\r
94 \r
95               // console.info('sigma topology data', ntdata, $scope.topologyData);\r
96               sigmaIstance = new Sigma({\r
97                 graph: {\r
98                   nodes: $scope.topologyData.nodes ? $scope.topologyData.nodes : [],\r
99                   edges: $scope.topologyData.links\r
100                 },\r
101                 container: 'graph-container',\r
102                 settings: $scope.settings ? $scope.settings : defaulSettings\r
103               });\r
104 \r
105               if ( $scope.settingsAtlas ) {\r
106                 $scope.settingsAtlas.slowDown = getSlowDownNum($scope.topologyData.nodes.length);\r
107               }\r
108 \r
109               var defaultConfigAtlas = {\r
110                     adjustSizes: true,\r
111                     // scalingRatio: 10,\r
112                     gravity: 1,\r
113                     slowDown: getSlowDownNum($scope.topologyData.nodes.length)\r
114                   },\r
115                   configAtlas = $scope.settingsAtlas ? $scope.settingsAtlas : defaultConfigAtlas;\r
116 \r
117               if ( $scope.customShapes ) {\r
118                 CustomShapes.init(sigmaIstance);\r
119                 sigmaIstance.refresh();\r
120               }\r
121 \r
122               var dragListener = null;\r
123 \r
124               if ( $scope.dragNodes ) {\r
125                 dragListener = Sigma.plugins.dragNodes(sigmaIstance, sigmaIstance.renderers[0]);\r
126               }\r
127 \r
128               if ( !$scope.topologyData.disabledAtlas ) {\r
129                 sigmaIstance.startForceAtlas2(configAtlas);\r
130               }\r
131 \r
132               if ( $scope.topologyCustfunc && angular.isFunction($scope.topologyCustfunc) ) {\r
133                 $scope.topologyCustfunc(sigmaIstance, getSlowDownNum, dragListener);\r
134               }\r
135 \r
136             }\r
137           });\r
138 \r
139           $scope.$watch('triggerResizeSigma', function () {\r
140               var topoData = {\r
141                     nodes: [],\r
142                     links: []\r
143                   };\r
144 \r
145               if ( sigmaIstance !== null ) {\r
146                 topoData.nodes = sigmaIstance.graph.nodes();\r
147                 topoData.links = sigmaIstance.graph.edges();\r
148                 sigmaIstance.kill();\r
149               }\r
150 \r
151               // Instantiate sigma:\r
152               Sigma.renderers.def = Sigma.renderers.canvas;\r
153 \r
154               sigmaIstance = new Sigma({\r
155                 graph: {\r
156                   nodes: topoData ? topoData.nodes : [],\r
157                   edges: topoData ? topoData.links : []\r
158                 },\r
159                 container: 'graph-container',\r
160                 settings: $scope.settings ? $scope.settings : defaulSettings\r
161               });\r
162 \r
163 \r
164 \r
165               if ( $scope.customShapes ) {\r
166                 CustomShapes.init(sigmaIstance);\r
167                 sigmaIstance.refresh();\r
168               }\r
169 \r
170               var dragListener = null;\r
171 \r
172               if ( $scope.dragNodes ) {\r
173                 dragListener = Sigma.plugins.dragNodes(sigmaIstance, sigmaIstance.renderers[0]);\r
174               }\r
175 \r
176               if ( $scope.topologyCustfunc && angular.isFunction($scope.topologyCustfunc) ) {\r
177                 var resize = true;\r
178                 $scope.topologyCustfunc(sigmaIstance, getSlowDownNum, dragListener, resize);\r
179               }\r
180 \r
181           });\r
182 \r
183       }\r
184     };\r
185   });\r
186 });\r