]> git.proxmox.com Git - extjs.git/blame - extjs/packages/core/src/event/gesture/Rotate.js
add extjs 6.0.1 sources
[extjs.git] / extjs / packages / core / src / event / gesture / Rotate.js
CommitLineData
6527f429
DM
1/**\r
2 * A simple event recognizer which knows when you rotate.\r
3 */\r
4Ext.define('Ext.event.gesture.Rotate', {\r
5 extend: 'Ext.event.gesture.MultiTouch',\r
6\r
7 priority: 700,\r
8\r
9 handledEvents: ['rotatestart', 'rotate', 'rotateend', 'rotatecancel'],\r
10\r
11 /**\r
12 * @member Ext.dom.Element\r
13 * @event rotatestart\r
14 * Fired once when a rotation has started.\r
15 * @param {Ext.event.Event} event The {@link Ext.event.Event} event encapsulating the DOM event.\r
16 * @param {HTMLElement} node The target of the event.\r
17 * @param {Object} options The options object passed to Ext.mixin.Observable.addListener.\r
18 */\r
19\r
20 /**\r
21 * @member Ext.dom.Element\r
22 * @event rotate\r
23 * Fires continuously when there is rotation (the touch must move for this to be fired).\r
24 * When listening to this, ensure you know about the {@link Ext.event.Event#angle} and {@link Ext.event.Event#rotation}\r
25 * properties in the `event` object.\r
26 * @param {Ext.event.Event} event The {@link Ext.event.Event} event encapsulating the DOM event.\r
27 * @param {HTMLElement} node The target of the event.\r
28 * @param {Object} options The options object passed to Ext.mixin.Observable.addListener.\r
29 */\r
30\r
31 /**\r
32 * @member Ext.dom.Element\r
33 * @event rotateend\r
34 * Fires when a rotation event has ended.\r
35 * @param {Ext.event.Event} event The {@link Ext.event.Event} event encapsulating the DOM event.\r
36 * @param {HTMLElement} node The target of the event.\r
37 * @param {Object} options The options object passed to Ext.mixin.Observable.addListener.\r
38 */\r
39\r
40 /**\r
41 * @property {Number} angle\r
42 * The angle of the rotation.\r
43 *\r
44 * **This is only available when the event type is `rotate`**\r
45 * @member Ext.event.Event\r
46 */\r
47\r
48 /**\r
49 * @property {Number} rotation\r
50 * A amount of rotation, since the start of the event.\r
51 *\r
52 * **This is only available when the event type is `rotate`**\r
53 * @member Ext.event.Event\r
54 */\r
55\r
56 startAngle: 0,\r
57\r
58 lastTouches: null,\r
59\r
60 lastAngle: null,\r
61\r
62 onTouchMove: function(e) {\r
63 if (!this.isTracking) {\r
64 return;\r
65 }\r
66\r
67 var touches = e.touches,\r
68 lastAngle = this.lastAngle,\r
69 firstPoint, secondPoint, angle, nextAngle, previousAngle, diff;\r
70\r
71 firstPoint = touches[0].point;\r
72 secondPoint = touches[1].point;\r
73\r
74 angle = firstPoint.getAngleTo(secondPoint);\r
75\r
76 if (lastAngle !== null) {\r
77 diff = Math.abs(lastAngle - angle);\r
78 nextAngle = angle + 360;\r
79 previousAngle = angle - 360;\r
80\r
81 if (Math.abs(nextAngle - lastAngle) < diff) {\r
82 angle = nextAngle;\r
83 }\r
84 else if (Math.abs(previousAngle - lastAngle) < diff) {\r
85 angle = previousAngle;\r
86 }\r
87 }\r
88\r
89 this.lastAngle = angle;\r
90\r
91 if (!this.isStarted) {\r
92 this.isStarted = true;\r
93\r
94 this.startAngle = angle;\r
95\r
96 this.fire('rotatestart', e, {\r
97 touches: touches,\r
98 angle: angle,\r
99 rotation: 0\r
100 });\r
101 }\r
102 else {\r
103 this.fire('rotate', e, {\r
104 touches: touches,\r
105 angle: angle,\r
106 rotation: angle - this.startAngle\r
107 });\r
108 }\r
109\r
110 this.lastTouches = Ext.Array.clone(touches);\r
111 },\r
112\r
113 fireEnd: function(e) {\r
114 this.lastAngle = null;\r
115 this.fire('rotateend', e);\r
116 },\r
117\r
118 fireCancel: function(e) {\r
119 this.lastAngle = null;\r
120 this.fire('rotatecancel', e);\r
121 },\r
122\r
123 reset: function() {\r
124 var me = this;\r
125\r
126 me.lastTouches = me.lastAngle = me.startAngle = null;\r
127\r
128 this.callParent();\r
129 }\r
130}, function(Rotate) {\r
131 var gestures = Ext.manifest.gestures;\r
132 Rotate.instance = new Rotate(gestures && gestures.rotate);\r
133});\r