]>
Commit | Line | Data |
---|---|---|
6527f429 DM |
1 | /**\r |
2 | * @class Ext.chart.interactions.Rotate\r | |
3 | * @extends Ext.chart.interactions.Abstract\r | |
4 | *\r | |
5 | * The Rotate interaction allows the user to rotate a polar chart about its central point.\r | |
6 | *\r | |
7 | * @example\r | |
8 | * Ext.create('Ext.Container', {\r | |
9 | * renderTo: Ext.getBody(),\r | |
10 | * width: 600,\r | |
11 | * height: 400,\r | |
12 | * layout: 'fit',\r | |
13 | * items: {\r | |
14 | * xtype: 'polar',\r | |
15 | * interactions: 'rotate',\r | |
16 | * colors: ["#115fa6", "#94ae0a", "#a61120", "#ff8809", "#ffd13e"],\r | |
17 | * store: {\r | |
18 | * fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'],\r | |
19 | * data: [\r | |
20 | * {'name':'metric one', 'data1':10, 'data2':12, 'data3':14, 'data4':8, 'data5':13},\r | |
21 | * {'name':'metric two', 'data1':7, 'data2':8, 'data3':16, 'data4':10, 'data5':3},\r | |
22 | * {'name':'metric three', 'data1':5, 'data2':2, 'data3':14, 'data4':12, 'data5':7},\r | |
23 | * {'name':'metric four', 'data1':2, 'data2':14, 'data3':6, 'data4':1, 'data5':23},\r | |
24 | * {'name':'metric five', 'data1':27, 'data2':38, 'data3':36, 'data4':13, 'data5':33}\r | |
25 | * ]\r | |
26 | * },\r | |
27 | * series: {\r | |
28 | * type: 'pie',\r | |
29 | * label: {\r | |
30 | * field: 'name',\r | |
31 | * display: 'rotate'\r | |
32 | * },\r | |
33 | * xField: 'data3',\r | |
34 | * donut: 30\r | |
35 | * }\r | |
36 | * }\r | |
37 | * });\r | |
38 | */\r | |
39 | Ext.define('Ext.chart.interactions.Rotate', {\r | |
40 | extend: 'Ext.chart.interactions.Abstract',\r | |
41 | \r | |
42 | type: 'rotate',\r | |
43 | \r | |
44 | alias: 'interaction.rotate',\r | |
45 | \r | |
46 | /**\r | |
47 | * @event rotate\r | |
48 | * Fires on every tick of the rotation\r | |
49 | * @param {Ext.chart.interactions.Rotate} this This interaction.\r | |
50 | * @param {Number} angle The new current rotation angle.\r | |
51 | */\r | |
52 | \r | |
53 | /**\r | |
54 | * @event rotationEnd\r | |
55 | * Fires after a user finishes the rotation\r | |
56 | * @param {Ext.chart.interactions.Rotate} this This interaction.\r | |
57 | * @param {Number} angle The new current rotation angle.\r | |
58 | */\r | |
59 | \r | |
60 | config: {\r | |
61 | /**\r | |
62 | * @cfg {String} gesture\r | |
63 | * Defines the gesture type that will be used to rotate the chart. Currently only\r | |
64 | * supports `pinch` for two-finger rotation and `drag` for single-finger rotation.\r | |
65 | * @private\r | |
66 | */\r | |
67 | gesture: 'rotate',\r | |
68 | \r | |
69 | gestures: {\r | |
70 | rotate: 'onRotate',\r | |
71 | rotateend: 'onRotate',\r | |
72 | dragstart: 'onGestureStart',\r | |
73 | drag: 'onGesture',\r | |
74 | dragend: 'onGestureEnd'\r | |
75 | },\r | |
76 | \r | |
77 | /**\r | |
78 | * @cfg {Number} rotation\r | |
79 | * Saves the current rotation of the series. Accepts negative values and values > 360 ( / 180 * Math.PI)\r | |
80 | * @private\r | |
81 | */\r | |
82 | rotation: 0\r | |
83 | },\r | |
84 | \r | |
85 | oldRotations: null,\r | |
86 | \r | |
87 | getAngle: function(e) {\r | |
88 | var me = this,\r | |
89 | chart = me.getChart(),\r | |
90 | xy = chart.getEventXY(e),\r | |
91 | center = chart.getCenter();\r | |
92 | \r | |
93 | return Math.atan2(\r | |
94 | xy[1] - center[1],\r | |
95 | xy[0] - center[0]\r | |
96 | );\r | |
97 | },\r | |
98 | \r | |
99 | getRadius: function (e) {\r | |
100 | return this.getChart().getRadius();\r | |
101 | },\r | |
102 | \r | |
103 | getEventRadius: function(e) {\r | |
104 | var me = this,\r | |
105 | chart = me.getChart(),\r | |
106 | xy = chart.getEventXY(e),\r | |
107 | center = chart.getCenter(),\r | |
108 | dx = xy[0] - center[0],\r | |
109 | dy = xy[1] - center[1];\r | |
110 | \r | |
111 | return Math.sqrt(dx * dx + dy * dy);\r | |
112 | },\r | |
113 | \r | |
114 | onGestureStart: function(e) {\r | |
115 | var me = this,\r | |
116 | radius = me.getRadius(e),\r | |
117 | eventRadius = me.getEventRadius(e);\r | |
118 | \r | |
119 | if (radius >= eventRadius) {\r | |
120 | me.lockEvents('drag');\r | |
121 | me.angle = me.getAngle(e);\r | |
122 | me.oldRotations = {};\r | |
123 | return false;\r | |
124 | }\r | |
125 | },\r | |
126 | \r | |
127 | onGesture: function(e) {\r | |
128 | var me = this,\r | |
129 | angle = me.getAngle(e) - me.angle;\r | |
130 | \r | |
131 | if (me.getLocks().drag === me) {\r | |
132 | me.doRotateTo(angle, true);\r | |
133 | return false;\r | |
134 | }\r | |
135 | },\r | |
136 | \r | |
137 | /**\r | |
138 | * @private\r | |
139 | */\r | |
140 | doRotateTo: function(angle, relative, animate) {\r | |
141 | var me = this,\r | |
142 | chart = me.getChart(),\r | |
143 | axes = chart.getAxes(),\r | |
144 | series = chart.getSeries(),\r | |
145 | oldRotations = me.oldRotations,\r | |
146 | axis, seriesItem, oldRotation,\r | |
147 | i, ln;\r | |
148 | \r | |
149 | if (!animate) {\r | |
150 | chart.suspendAnimation();\r | |
151 | }\r | |
152 | \r | |
153 | for (i = 0, ln = axes.length; i < ln; i++) {\r | |
154 | axis = axes[i];\r | |
155 | oldRotation = oldRotations[axis.getId()] || (oldRotations[axis.getId()] = axis.getRotation());\r | |
156 | axis.setRotation( angle + (relative ? oldRotation : 0) );\r | |
157 | }\r | |
158 | \r | |
159 | for (i = 0, ln = series.length; i < ln; i++) {\r | |
160 | seriesItem = series[i];\r | |
161 | oldRotation = oldRotations[seriesItem.getId()] || (oldRotations[seriesItem.getId()] = seriesItem.getRotation());\r | |
162 | seriesItem.setRotation( angle + (relative ? oldRotation : 0) );\r | |
163 | }\r | |
164 | \r | |
165 | me.setRotation(angle + (relative ? oldRotation : 0));\r | |
166 | \r | |
167 | me.fireEvent('rotate', me, me.getRotation());\r | |
168 | \r | |
169 | me.sync();\r | |
170 | if (!animate) {\r | |
171 | chart.resumeAnimation();\r | |
172 | }\r | |
173 | },\r | |
174 | \r | |
175 | /**\r | |
176 | * Rotates a polar chart about its center point to the specified angle.\r | |
177 | * @param {Number} angle The angle to rotate to.\r | |
178 | * @param {Boolean} [relative=false] Whether the rotation is relative to the current angle or not.\r | |
179 | * @param {Boolean} [animate=false] Whether to animate the rotation or not.\r | |
180 | */\r | |
181 | rotateTo: function (angle, relative, animate) {\r | |
182 | this.doRotateTo(angle, relative, animate);\r | |
183 | this.oldRotations = {};\r | |
184 | },\r | |
185 | \r | |
186 | onGestureEnd: function(e) {\r | |
187 | var me = this;\r | |
188 | if (me.getLocks().drag === me) {\r | |
189 | me.onGesture(e);\r | |
190 | me.unlockEvents('drag');\r | |
191 | \r | |
192 | me.fireEvent('rotationEnd', me, me.getRotation());\r | |
193 | \r | |
194 | return false;\r | |
195 | }\r | |
196 | },\r | |
197 | \r | |
198 | onRotate: function(e) {\r | |
199 | \r | |
200 | }\r | |
201 | });\r |