@@ -55,20 +55,19 @@ $.widget('ui.rotatable', $.ui.mouse, {
55
55
/*animate: false,
56
56
animateDuration: 'slow',
57
57
animateEasing: 'swing',*/
58
- rotate : function ( event , ui ) { } , // callback while rotating
59
- start : function ( event , ui ) { } , // callback when rotation starts
60
- stop : function ( event , ui ) { } , // callback when rotation stops
58
+ start : function ( event , ui ) { return true ; } , // callback when rotation starts
59
+ rotate : function ( event , ui ) { return true ; } , // callback while rotating
60
+ stop : function ( event , ui ) { return true ; } , // callback when rotation stops
61
61
wheel : true ,
62
- wheelStep : 7.5
62
+ wheelingVerticalStep : null ,
63
+ wheelingHorizontalStep : null
63
64
} ,
64
65
plugins : { } ,
65
66
handlers : { } ,
66
67
elementStartAngle : 0 ,
67
68
elementCurrentAngle : 0 ,
68
69
elementStopAngle : 0 ,
69
70
mouseStartAngle : 0 ,
70
- isRotating : false ,
71
- hasRotated : false ,
72
71
73
72
_num : function ( value ) {
74
73
return parseFloat ( value ) || 0 ;
@@ -86,10 +85,6 @@ $.widget('ui.rotatable', $.ui.mouse, {
86
85
return roundedTempNumber / factor ;
87
86
} ,
88
87
89
- _mod : function ( n , m ) {
90
- return ( ( n % m ) + m ) % m ;
91
- } ,
92
-
93
88
_canBeParent : function ( ) {
94
89
if ( this . element [ 0 ] . nodeName . match ( / ^ ( c a n v a s | t e x t a r e a | i n p u t | s e l e c t | b u t t o n | i m g ) $ / i) ) {
95
90
return false ;
@@ -114,14 +109,25 @@ $.widget('ui.rotatable', $.ui.mouse, {
114
109
return radians * 180 / Math . PI ;
115
110
} ,
116
111
112
+ _calculateAbsoluteAngle : function ( exactDegrees ) {
113
+ if ( exactDegrees > 360 ) {
114
+ return exactDegrees - 360 ;
115
+ }
116
+ if ( exactDegrees < 0 ) {
117
+ return exactDegrees + 360 ;
118
+ }
119
+ return exactDegrees ;
120
+ } ,
121
+
117
122
_calculateSnap : function ( degrees ) {
118
123
return ( Math . round ( degrees / this . options . snapStep ) * this . options . snapStep ) ;
119
124
} ,
120
125
121
126
_getElementOffset : function ( ) {
122
- this . _do ( 0 ) ;
123
- var offset = this . element . offset ( ) ;
124
- this . _do ( this . elementCurrentAngle ) ;
127
+ var element = this . element ;
128
+ this . perform ( element , 0 ) ;
129
+ var offset = element . offset ( ) ;
130
+ this . perform ( element , this . elementCurrentAngle ) ;
125
131
return offset ;
126
132
} ,
127
133
@@ -171,22 +177,25 @@ $.widget('ui.rotatable', $.ui.mouse, {
171
177
172
178
_calculateRotationAngleViaMousePosition : function ( event ) {
173
179
var origin = this . _calculateOrigin ( ) ;
174
- var xFromOrigin = event . pageX - origin . x ;
175
- var yFromOrigin = event . pageY - origin . y ;
176
- var mouseAngle = this . _angleInDegrees ( Math . atan2 ( yFromOrigin , xFromOrigin ) ) ;
177
- var rotateAngle = mouseAngle - this . mouseStartAngle + this . elementStartAngle ;
178
- if ( this . options . snap || event . shiftKey ) {
179
- rotateAngle = this . _calculateSnap ( rotateAngle ) ;
180
+ var mouseAngle = this . _calculateMouseAngle ( event , origin ) ;
181
+ var rotationAngle = mouseAngle - this . mouseStartAngle + this . elementStartAngle ;
182
+ if ( this . options . snap ) {
183
+ rotationAngle = this . _calculateSnap ( rotationAngle ) ;
180
184
}
181
- return this . _mod ( rotateAngle , 360 ) ;
185
+ return this . _calculateAbsoluteAngle ( rotationAngle ) ;
182
186
} ,
183
187
184
- _do : function ( angle ) {
185
- var element = this . element ;
188
+ _calculateMouseAngle : function ( event , origin ) {
189
+ var horizontalOffsetFromOrigin = event . pageX - origin . x ;
190
+ var verticalOffsetFromOrigin = event . pageY - origin . y ;
191
+ return this . _angleInDegrees ( Math . atan2 ( verticalOffsetFromOrigin , horizontalOffsetFromOrigin ) ) ;
192
+ } ,
193
+
194
+ perform : function ( element , angle ) {
186
195
var oldAngle = null ;
187
196
var currentTransform = element . css ( 'transform' ) ;
188
197
if ( currentTransform === undefined ) {
189
- return ;
198
+ return 0 ;
190
199
}
191
200
if ( this . _isRotationOriginPositionGiven ( ) ) {
192
201
element . css ( 'transform-origin' , this . _getRotationOriginPositionLeft ( ) + 'px ' + this . _getRotationOriginPositionTop ( ) + 'px' ) ;
@@ -245,6 +254,12 @@ $.widget('ui.rotatable', $.ui.mouse, {
245
254
}
246
255
}
247
256
element . css ( 'transform' , newTransform ) ;
257
+ return angle ;
258
+ } ,
259
+
260
+ _angle : function ( angle ) {
261
+ this . elementCurrentAngle = this . _calculateAbsoluteAngle ( this . _num ( angle ) ) ;
262
+ return this . perform ( this . element , this . elementCurrentAngle ) ;
248
263
} ,
249
264
250
265
_create : function ( ) {
@@ -260,8 +275,7 @@ $.widget('ui.rotatable', $.ui.mouse, {
260
275
this . element . bind ( 'wheel' , this . handlers . _mouseWheel ) ;
261
276
}
262
277
this . rotationOriginPosition ( o . rotationOriginPosition ) ;
263
- this . elementCurrentAngle = this . _mod ( this . options . angle || 0 , 360 ) ;
264
- this . _do ( this . elementCurrentAngle ) ;
278
+ this . _angle ( o . angle ) ;
265
279
this . _mouseInit ( ) ;
266
280
} ,
267
281
@@ -323,18 +337,13 @@ $.widget('ui.rotatable', $.ui.mouse, {
323
337
return this . element ;
324
338
} ,
325
339
326
- _propagate : function ( n , event ) { // propagates events
327
- $ . ui . plugin . call ( this , n , [ event , this . ui ( ) ] ) ;
328
- ( n !== 'rotate' && this . _trigger ( n , event , this . ui ( ) ) ) ;
329
- } ,
330
-
331
340
_setOption : function ( key , value ) {
332
341
this . _super ( key , value ) ;
333
342
} ,
334
343
335
344
_mouseCapture : function ( event ) { // event handler
336
- var o = this . options ;
337
- if ( ! this . element || this . element . disabled || o . disabled ) {
345
+ var element = this . element , o = this . options ;
346
+ if ( ! element || element . disabled || o . disabled ) {
338
347
return false ;
339
348
}
340
349
if ( o . handle ) {
@@ -344,98 +353,121 @@ $.widget('ui.rotatable', $.ui.mouse, {
344
353
}
345
354
}
346
355
else {
347
- if ( event . target !== this . element [ 0 ] ) {
356
+ if ( event . target !== element [ 0 ] ) {
348
357
return false ;
349
358
}
350
359
}
351
360
return true ;
352
361
} ,
353
362
354
363
_mouseStart : function ( event ) { // event handler
364
+ var element = this . element ;
355
365
var jqHandle = this . _getJqHandle ( ) ;
356
366
var origin = this . _calculateOrigin ( ) ;
357
- var startXFromOrigin = event . pageX - origin . x ;
358
- var startYFromOrigin = event . pageY - origin . y ;
359
- this . mouseStartAngle = this . _angleInDegrees ( Math . atan2 ( startYFromOrigin , startXFromOrigin ) ) ;
367
+ this . mouseStartAngle = this . _calculateMouseAngle ( event , origin ) ;
360
368
this . elementStartAngle = this . elementCurrentAngle ;
361
- this . isRotating = true ;
362
- this . hasRotated = false ;
363
- this . element . addClass ( 'ui-rotatable-rotating' ) ;
369
+ element . removeClass ( 'ui-rotatable-rotated' ) ;
370
+ element . addClass ( 'ui-rotatable-rotating' ) ;
364
371
if ( jqHandle . length > 0 ) {
365
372
if ( jqHandle . css ( 'cursor' ) === 'grab' ) {
366
373
jqHandle . css ( 'cursor' , 'grabbing' ) ;
367
374
}
368
375
}
369
- this . _propagate ( 'start' , event ) ;
370
- return true ;
376
+ var ui = this . ui ( ) ;
377
+ $ . ui . plugin . call ( this , 'start' , [ event , ui ] ) ; // calling extension methods
378
+ return this . _trigger ( 'start' , event , ui ) ; // calling callback
371
379
} ,
372
380
373
- _mouseDrag : function ( event ) { // event handler
374
- if ( ! this . element || this . element . disabled || this . options . disabled ) {
381
+ _mouseDrag : function ( event , originalUi ) { // event handler
382
+ var element = this . element , o = this . options ;
383
+ if ( ! element || element . disabled || o . disabled ) {
375
384
return false ;
376
385
}
377
- var rotateAngle = this . _calculateRotationAngleViaMousePosition ( event ) ;
386
+ var rotationAngle = this . _calculateRotationAngleViaMousePosition ( event ) ;
378
387
var previousRotateAngle = this . elementCurrentAngle ;
379
- this . elementCurrentAngle = rotateAngle ;
380
- if ( this . _propagate ( 'rotate' , event ) === false ) {
381
- this . elementCurrentAngle = previousRotateAngle ;
382
- return false ;
383
- }
388
+ this . elementCurrentAngle = rotationAngle ;
384
389
var ui = this . ui ( ) ;
385
- if ( this . _trigger ( 'rotate' , event , ui ) === false ) {
390
+ $ . ui . plugin . call ( this , 'rotate' , [ event , ui ] ) ; // calling extension methods
391
+ if ( this . _trigger ( 'rotate' , event , ui ) === false ) { // when callback returns false
386
392
this . elementCurrentAngle = previousRotateAngle ;
387
393
return false ;
388
394
}
389
- else if ( ui . angle . current !== rotateAngle ) {
390
- rotateAngle = ui . angle . current ;
391
- this . elementCurrentAngle = rotateAngle ;
392
- }
393
- this . _do ( rotateAngle ) ;
394
- if ( previousRotateAngle !== rotateAngle ) {
395
- this . hasRotated = true ;
395
+ if ( previousRotateAngle !== this . _angle ( rotationAngle ) ) {
396
+ element . addClass ( 'ui-rotatable-rotated' ) ;
396
397
}
397
398
return false ;
398
399
} ,
399
400
400
401
_mouseStop : function ( event ) { // event handler
401
- if ( ! this . element ) {
402
+ var element = this . element ;
403
+ if ( ! element ) {
402
404
return false ;
403
405
}
404
- var jqHandle = this . _getJqHandle ( ) ;
405
- this . isRotating = false ;
406
406
this . elementStopAngle = this . elementCurrentAngle ;
407
- this . element . removeClass ( 'ui-rotatable-rotating' ) ;
407
+ element . removeClass ( 'ui-rotatable-rotating' ) ;
408
+ var jqHandle = this . _getJqHandle ( ) ;
408
409
if ( jqHandle . length > 0 ) {
409
410
if ( jqHandle . css ( 'cursor' ) === 'grabbing' ) {
410
411
jqHandle . css ( 'cursor' , 'grab' ) ;
411
412
}
412
413
}
413
- this . _propagate ( 'stop' , event ) ;
414
+ var ui = this . ui ( ) ;
415
+ $ . ui . plugin . call ( this , 'stop' , [ event , ui ] ) ; // calling extension methods
416
+ this . _trigger ( 'stop' , event , ui ) ; // calling callback
414
417
return false ;
415
418
} ,
416
419
417
420
_mouseWheel : function ( event ) { // event handler
418
- if ( ! this . element || this . element . disabled || this . options . disabled ) {
419
- return false ;
421
+ var o = this . options ;
422
+ if ( ! this . element || this . element . disabled || o . disabled ) {
423
+ return true ;
424
+ }
425
+ var wheelingVerticalStep = 1 ;
426
+ var wheelingHorizontalStep = 1 ;
427
+ var snapStep = this . _num ( o . snapStep ) ;
428
+ if ( snapStep !== 0 ) {
429
+ wheelingVerticalStep = snapStep ;
430
+ wheelingHorizontalStep = snapStep ;
431
+ }
432
+ if ( typeof o . wheelingVerticalStep === 'number' ) {
433
+ wheelingHorizontalStep = wheelingVerticalStep = o . wheelingVerticalStep ;
434
+ }
435
+ if ( typeof o . wheelingHorizontalStep === 'number' ) {
436
+ wheelingHorizontalStep = o . wheelingHorizontalStep ;
420
437
}
421
- var angle = Math . round ( event . originalEvent . deltaY * this . _num ( this . options . wheelStep ) ) ;
422
- if ( this . options . snap || event . shiftKey ) {
438
+ var angle = 0 ;
439
+ if ( this . _num ( event . originalEvent . deltaY ) > 0 ) {
440
+ angle = wheelingVerticalStep ;
441
+ }
442
+ else if ( this . _num ( event . originalEvent . deltaY ) < 0 ) {
443
+ angle = - 1 * wheelingVerticalStep ;
444
+ }
445
+ else if ( this . _num ( event . originalEvent . deltaX ) > 0 ) {
446
+ angle = wheelingHorizontalStep ;
447
+ }
448
+ else if ( this . _num ( event . originalEvent . deltaX ) < 0 ) {
449
+ angle = - 1 * wheelingHorizontalStep ;
450
+ }
451
+ if ( o . snap ) {
423
452
angle = this . _calculateSnap ( angle ) ;
424
453
}
454
+ if ( angle === 0 ) {
455
+ return true ;
456
+ }
425
457
angle = this . elementCurrentAngle + angle ;
426
- this . angle ( angle ) ;
427
- this . _trigger ( 'rotate' , event , this . ui ( ) ) ;
428
- return true ;
458
+ this . _angle ( angle ) ;
459
+ var ui = this . ui ( ) ;
460
+ $ . ui . plugin . call ( this , 'rotate' , [ event , ui ] ) ; // calling extension methods
461
+ this . _trigger ( 'rotate' , event , ui ) ;
462
+ return false ; // false means preventing default
429
463
} ,
430
464
431
465
angle : function ( angle ) { // accessor
432
466
var o = this . options ;
433
467
if ( angle === undefined ) {
434
468
return o . angle ;
435
469
}
436
- o . angle = angle ;
437
- this . elementCurrentAngle = this . _mod ( angle , 360 ) ;
438
- this . _do ( o . angle ) ;
470
+ o . angle = this . _angle ( angle ) ;
439
471
} ,
440
472
441
473
handle : function ( handle ) {
@@ -477,6 +509,7 @@ $.widget('ui.rotatable', $.ui.mouse, {
477
509
return {
478
510
element : this . element ,
479
511
angle : {
512
+ mouseStart : this . mouseStartAngle ,
480
513
start : this . elementStartAngle ,
481
514
current : this . elementCurrentAngle ,
482
515
stop : this . elementStopAngle
@@ -488,10 +521,18 @@ $.widget('ui.rotatable', $.ui.mouse, {
488
521
489
522
// Rotatable Extensions
490
523
524
+ $ . ui . plugin . add ( 'rotatable' , 'animate' , {
525
+
526
+ stop : function ( event , ui ) {
527
+ // todo: complete here
528
+ }
529
+
530
+ } ) ;
531
+
491
532
$ . ui . plugin . add ( 'rotatable' , 'alsoRotate' , {
492
533
493
- start : function ( ) {
494
- var that = $ ( this ) . rotatable ( 'instance' ) , o = that . options ;
534
+ start : function ( event , ui ) {
535
+ var instance = $ ( this ) . rotatable ( 'instance' ) , o = instance . options ;
495
536
$ ( o . alsoRotate ) . each ( function ( ) {
496
537
var element = $ ( this ) ;
497
538
element . data ( 'ui-rotatable-alsorotate' , { } ) ;
@@ -500,28 +541,21 @@ $.ui.plugin.add('rotatable', 'alsoRotate', {
500
541
} ,
501
542
502
543
rotate : function ( event , ui ) {
503
- var that = $ ( this ) . rotatable ( 'instance' ) , o = that . options ; console . log ( JSON . stringify ( o , null , 2 ) ) ;
544
+ var instance = $ ( this ) . rotatable ( 'instance' ) , o = instance . options ;
504
545
$ ( o . alsoRotate ) . each ( function ( ) {
505
546
var element = $ ( this ) ;
506
547
var start = element . data ( 'ui-rotatable-alsorotate' ) ;
548
+ instance . perform ( element , instance . elementCurrentAngle ) ;
507
549
// todo: complete here
508
550
} ) ;
509
551
} ,
510
552
511
- stop : function ( ) {
553
+ stop : function ( event , ui ) {
512
554
$ ( this ) . removeData ( 'ui-rotatable-alsorotate' ) ;
513
555
}
514
556
515
557
} ) ;
516
558
517
- $ . ui . plugin . add ( 'rotatable' , 'animate' , {
518
-
519
- stop : function ( ) {
520
- // todo: complete here
521
- }
522
-
523
- } ) ;
524
-
525
559
// /Rotatable Extensions
526
560
527
561
var widgetsRotatable = $ . ui . rotatable ;
0 commit comments