2 * @class Ext.fx.PropertyHandler
5 Ext.define('Ext.fx.PropertyHandler', {
7 /* Begin Definitions */
9 requires: ['Ext.draw.Draw'],
13 pixelDefaults: ['width', 'height', 'top', 'left'],
14 unitRE: /^(-?\d*\.?\d*){1}(em|ex|px|in|cm|mm|pt|pc|%)*$/,
16 computeDelta: function(from, end, damper, initial, attr) {
17 damper = (typeof damper == 'number') ? damper : 1;
18 var match = this.unitRE.exec(from),
23 if (!units && Ext.Array.contains(this.pixelDefaults, attr)) {
29 match = this.unitRE.exec(end);
32 units = match[2] || units;
35 start = (initial != null) ? initial : from;
38 delta: (end - start) * damper,
43 get: function(from, end, damper, initialFrom, attr) {
46 i, initial, res, j, len;
47 for (i = 0; i < ln; i++) {
49 initial = initialFrom[i][1].from;
51 if (Ext.isArray(from[i][1]) && Ext.isArray(end)) {
54 len = from[i][1].length;
55 for (; j < len; j++) {
56 res.push(this.computeDelta(from[i][1][j], end[j], damper, initial, attr));
58 out.push([from[i][0], res]);
61 out.push([from[i][0], this.computeDelta(from[i][1], end, damper, initial, attr)]);
67 set: function(values, easing) {
68 var ln = values.length,
71 for (i = 0; i < ln; i++) {
73 if (Ext.isArray(val)) {
77 for (; j < len; j++) {
78 res.push(val[j].from + (val[j].delta * easing) + (val[j].units || 0));
80 out.push([values[i][0], res]);
82 out.push([values[i][0], val.from + (val.delta * easing) + (val.units || 0)]);
89 rgbRE: /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i,
90 hexRE: /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i,
91 hex3RE: /^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i,
93 parseColor : function(color, damper) {
94 damper = (typeof damper == 'number') ? damper : 1;
99 Ext.each([this.hexRE, this.rgbRE, this.hex3RE], function(re, idx) {
100 base = (idx % 2 == 0) ? 16 : 10;
101 match = re.exec(color);
102 if (match && match.length == 4) {
104 match[1] += match[1];
105 match[2] += match[2];
106 match[3] += match[3];
109 red: parseInt(match[1], base),
110 green: parseInt(match[2], base),
111 blue: parseInt(match[3], base)
119 computeDelta: function(from, end, damper, initial) {
120 from = this.parseColor(from);
121 end = this.parseColor(end, damper);
122 var start = initial ? initial : from,
123 tfrom = typeof start,
125 //Extra check for when the color string is not recognized.
126 if (tfrom == 'string' || tfrom == 'undefined'
127 || tend == 'string' || tend == 'undefined') {
133 red: Math.round((end.red - start.red) * damper),
134 green: Math.round((end.green - start.green) * damper),
135 blue: Math.round((end.blue - start.blue) * damper)
140 get: function(start, end, damper, initialFrom) {
141 var ln = start.length,
144 for (i = 0; i < ln; i++) {
146 initial = initialFrom[i][1].from;
148 out.push([start[i][0], this.computeDelta(start[i][1], end, damper, initial)]);
153 set: function(values, easing) {
154 var ln = values.length,
156 i, val, parsedString, from, delta;
157 for (i = 0; i < ln; i++) {
162 //multiple checks to reformat the color if it can't recognized by computeDelta.
163 val = (typeof val == 'object' && 'red' in val)?
164 'rgb(' + val.red + ', ' + val.green + ', ' + val.blue + ')' : val;
165 val = (typeof val == 'object' && val.length)? val[0] : val;
166 if (typeof val == 'undefined') {
169 parsedString = typeof val == 'string'? val :
171 (from.red + Math.round(delta.red * easing)) % 256,
172 (from.green + Math.round(delta.green * easing)) % 256,
173 (from.blue + Math.round(delta.blue * easing)) % 256
185 interpolate: function(prop, damper) {
186 damper = (typeof damper == 'number') ? damper : 1;
190 out[p] = parseInt(prop[p], 10) * damper;
195 computeDelta: function(from, end, damper, initial) {
196 from = this.interpolate(from);
197 end = this.interpolate(end, damper);
198 var start = initial ? initial : from,
203 delta[p] = end[p] - start[p];
211 get: function(start, end, damper, initialFrom) {
212 var ln = start.length,
215 for (i = 0; i < ln; i++) {
217 initial = initialFrom[i][1].from;
219 out.push([start[i][0], this.computeDelta(start[i][1], end, damper, initial)]);
224 set: function(values, easing) {
225 var ln = values.length,
228 i, from, delta, val, p;
229 for (i = 0; i < ln; i++) {
234 outObject[p] = Math.round(from[p] + delta[p] * easing);
246 computeDelta: function(from, end, damper, initial) {
247 damper = (typeof damper == 'number') ? damper : 1;
251 start = (initial != null) ? initial : from;
254 delta: (end - start) * damper
258 forcePath: function(path) {
259 if (!Ext.isArray(path) && !Ext.isArray(path[0])) {
260 path = Ext.draw.Draw.parsePathString(path);
265 get: function(start, end, damper, initialFrom) {
266 var endPath = this.forcePath(end),
268 startLn = start.length,
269 startPathLn, pointsLn, i, deltaPath, initial, j, k, path, startPath;
270 for (i = 0; i < startLn; i++) {
271 startPath = this.forcePath(start[i][1]);
273 deltaPath = Ext.draw.Draw.interpolatePaths(startPath, endPath);
274 startPath = deltaPath[0];
275 endPath = deltaPath[1];
277 startPathLn = startPath.length;
279 for (j = 0; j < startPathLn; j++) {
280 deltaPath = [startPath[j][0]];
281 pointsLn = startPath[j].length;
282 for (k = 1; k < pointsLn; k++) {
283 initial = initialFrom && initialFrom[0][1][j][k].from;
284 deltaPath.push(this.computeDelta(startPath[j][k], endPath[j][k], damper, initial));
286 path.push(deltaPath);
288 out.push([start[i][0], path]);
293 set: function(values, easing) {
294 var ln = values.length,
296 i, j, k, newPath, calcPath, deltaPath, deltaPathLn, pointsLn;
297 for (i = 0; i < ln; i++) {
298 deltaPath = values[i][1];
300 deltaPathLn = deltaPath.length;
301 for (j = 0; j < deltaPathLn; j++) {
302 calcPath = [deltaPath[j][0]];
303 pointsLn = deltaPath[j].length;
304 for (k = 1; k < pointsLn; k++) {
305 calcPath.push(deltaPath[j][k].from + deltaPath[j][k].delta * easing);
307 newPath.push(calcPath.join(','));
309 out.push([values[i][0], newPath.join(',')]);
314 /* End Definitions */
328 this[prop] = this.color;