]> git.proxmox.com Git - extjs.git/blame - extjs/modern/modern/src/util/TapRepeater.js
add extjs 6.0.1 sources
[extjs.git] / extjs / modern / modern / src / util / TapRepeater.js
CommitLineData
6527f429
DM
1/**\r
2 * A wrapper class which can be applied to any element. Fires a "tap" event while\r
3 * touching the device. The interval between firings may be specified in the config but\r
4 * defaults to 20 milliseconds.\r
5 */\r
6Ext.define('Ext.util.TapRepeater', {\r
7\r
8 mixins: {\r
9 observable: 'Ext.mixin.Observable'\r
10 },\r
11\r
12 /**\r
13 * @event touchstart\r
14 * Fires when the touch is started.\r
15 * @param {Ext.util.TapRepeater} this\r
16 * @param {Ext.event.Event} e\r
17 */\r
18\r
19 /**\r
20 * @event tap\r
21 * Fires on a specified interval during the time the element is pressed.\r
22 * @param {Ext.util.TapRepeater} this\r
23 * @param {Ext.event.Event} e\r
24 */\r
25\r
26 /**\r
27 * @event touchend\r
28 * Fires when the touch is ended.\r
29 * @param {Ext.util.TapRepeater} this\r
30 * @param {Ext.event.Event} e\r
31 */\r
32\r
33 config: {\r
34 el: null,\r
35 accelerate: true,\r
36 interval: 10,\r
37 delay: 250,\r
38 preventDefault: true,\r
39 stopDefault: false,\r
40 timer: 0,\r
41 pressCls: null\r
42 },\r
43\r
44 /**\r
45 * Creates new TapRepeater.\r
46 * @param {Object} config\r
47 */\r
48 constructor: function(config) {\r
49 var me = this;\r
50 //<debug>\r
51 for (var configName in config) {\r
52 if (me.self.prototype.config && !(configName in me.self.prototype.config)) {\r
53 me[configName] = config[configName];\r
54 Ext.Logger.warn('Applied config as instance property: "' + configName + '"', me);\r
55 }\r
56 }\r
57 //</debug>\r
58 me.mixins.observable.constructor.call(me, config);\r
59 },\r
60\r
61 updateEl: function(newEl, oldEl) {\r
62 var eventCfg = {\r
63 touchstart: 'onTouchStart',\r
64 touchend: 'onTouchEnd',\r
65 tap: 'eventOptions',\r
66 scope: this\r
67 };\r
68 if (oldEl) {\r
69 oldEl.un(eventCfg)\r
70 }\r
71 newEl.on(eventCfg);\r
72 },\r
73\r
74 /**\r
75 * @private\r
76 */\r
77 eventOptions: function(e) {\r
78 if (this.getPreventDefault()) {\r
79 e.preventDefault();\r
80 }\r
81 if (this.getStopDefault()) {\r
82 e.stopEvent();\r
83 }\r
84 },\r
85\r
86 destroy: function() {\r
87 this.el = Ext.destroy(this.el);\r
88 this.callParent();\r
89 },\r
90\r
91 /**\r
92 * @private\r
93 */\r
94 onTouchStart: function(e) {\r
95 var me = this,\r
96 pressCls = me.getPressCls();\r
97 clearTimeout(me.getTimer());\r
98 if (pressCls) {\r
99 me.getEl().addCls(pressCls);\r
100 }\r
101 me.tapStartTime = new Date();\r
102\r
103 me.fireEvent('touchstart', me, e);\r
104 me.fireEvent('tap', me, e);\r
105\r
106 // Do not honor delay or interval if acceleration wanted.\r
107 if (me.getAccelerate()) {\r
108 me.delay = 400;\r
109 }\r
110 me.setTimer(Ext.defer(me.tap, me.getDelay() || me.getInterval(), me, [e]));\r
111 },\r
112\r
113 /**\r
114 * @private\r
115 */\r
116 tap: function(e) {\r
117 var me = this;\r
118 me.fireEvent('tap', me, e);\r
119 me.setTimer(Ext.defer(me.tap, me.getAccelerate() ? me.easeOutExpo(Ext.Date.getElapsed(me.tapStartTime),\r
120 400,\r
121 -390,\r
122 12000) : me.getInterval(), me, [e]));\r
123 },\r
124\r
125 /**\r
126 * @private\r
127 * Easing calculation\r
128 */\r
129 easeOutExpo: function(t, b, c, d) {\r
130 return (t == d) ? b + c : c * ( - Math.pow(2, -10 * t / d) + 1) + b;\r
131 },\r
132\r
133 /**\r
134 * @private\r
135 */\r
136 onTouchEnd: function(e) {\r
137 var me = this;\r
138 clearTimeout(me.getTimer());\r
139 me.getEl().removeCls(me.getPressCls());\r
140 me.fireEvent('touchend', me, e);\r
141 }\r
142});\r