]> git.proxmox.com Git - extjs.git/blame - extjs/packages/charts/src/chart/interactions/Rotate.js
add extjs 6.0.1 sources
[extjs.git] / extjs / packages / charts / src / chart / interactions / Rotate.js
CommitLineData
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
39Ext.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