fabric-rails 1.0.12 → 1.0.12.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/CHANGELOG.md +16 -0
  2. data/README.md +1 -1
  3. data/lib/fabric/rails/version.rb +2 -2
  4. data/vendor/assets/javascripts/event.js +1909 -0
  5. data/vendor/assets/javascripts/fabric.js +64 -16464
  6. data/vendor/assets/javascripts/fabric/HEADER.js +31 -0
  7. data/vendor/assets/javascripts/fabric/canvas.class.js +1007 -0
  8. data/vendor/assets/javascripts/fabric/canvas_animation.mixin.js +113 -0
  9. data/vendor/assets/javascripts/fabric/canvas_events.mixin.js +482 -0
  10. data/vendor/assets/javascripts/fabric/canvas_gestures.mixin.js +79 -0
  11. data/vendor/assets/javascripts/fabric/canvas_serialization.mixin.js +311 -0
  12. data/vendor/assets/javascripts/fabric/circle.class.js +182 -0
  13. data/vendor/assets/javascripts/fabric/color.class.js +284 -0
  14. data/vendor/assets/javascripts/fabric/ellipse.class.js +169 -0
  15. data/vendor/assets/javascripts/fabric/freedrawing.class.js +256 -0
  16. data/vendor/assets/javascripts/fabric/gradient.class.js +211 -0
  17. data/vendor/assets/javascripts/fabric/group.class.js +556 -0
  18. data/vendor/assets/javascripts/fabric/image.class.js +418 -0
  19. data/vendor/assets/javascripts/fabric/image_filters.js +809 -0
  20. data/vendor/assets/javascripts/fabric/intersection.class.js +178 -0
  21. data/vendor/assets/javascripts/fabric/line.class.js +188 -0
  22. data/vendor/assets/javascripts/fabric/log.js +26 -0
  23. data/vendor/assets/javascripts/fabric/node.js +149 -0
  24. data/vendor/assets/javascripts/fabric/object.class.js +1068 -0
  25. data/vendor/assets/javascripts/fabric/object_geometry.mixin.js +308 -0
  26. data/vendor/assets/javascripts/fabric/object_interactivity.mixin.js +496 -0
  27. data/vendor/assets/javascripts/fabric/object_origin.mixin.js +207 -0
  28. data/vendor/assets/javascripts/fabric/object_straightening.mixin.js +94 -0
  29. data/vendor/assets/javascripts/fabric/observable.mixin.js +91 -0
  30. data/vendor/assets/javascripts/fabric/parser.js +750 -0
  31. data/vendor/assets/javascripts/fabric/path.class.js +794 -0
  32. data/vendor/assets/javascripts/fabric/path_group.class.js +240 -0
  33. data/vendor/assets/javascripts/fabric/pattern.class.js +69 -0
  34. data/vendor/assets/javascripts/fabric/point.class.js +327 -0
  35. data/vendor/assets/javascripts/fabric/polygon.class.js +184 -0
  36. data/vendor/assets/javascripts/fabric/polyline.class.js +157 -0
  37. data/vendor/assets/javascripts/fabric/rect.class.js +298 -0
  38. data/vendor/assets/javascripts/fabric/scout.js +45 -0
  39. data/vendor/assets/javascripts/fabric/shadow.class.js +70 -0
  40. data/vendor/assets/javascripts/fabric/stateful.js +88 -0
  41. data/vendor/assets/javascripts/fabric/static_canvas.class.js +1298 -0
  42. data/vendor/assets/javascripts/fabric/text.class.js +934 -0
  43. data/vendor/assets/javascripts/fabric/triangle.class.js +108 -0
  44. data/vendor/assets/javascripts/fabric/util/anim_ease.js +360 -0
  45. data/vendor/assets/javascripts/fabric/util/dom_event.js +237 -0
  46. data/vendor/assets/javascripts/fabric/util/dom_misc.js +245 -0
  47. data/vendor/assets/javascripts/fabric/util/dom_request.js +72 -0
  48. data/vendor/assets/javascripts/fabric/util/dom_style.js +71 -0
  49. data/vendor/assets/javascripts/fabric/util/lang_array.js +250 -0
  50. data/vendor/assets/javascripts/fabric/util/lang_class.js +97 -0
  51. data/vendor/assets/javascripts/fabric/util/lang_function.js +35 -0
  52. data/vendor/assets/javascripts/fabric/util/lang_object.js +34 -0
  53. data/vendor/assets/javascripts/fabric/util/lang_string.js +60 -0
  54. data/vendor/assets/javascripts/fabric/util/misc.js +406 -0
  55. data/vendor/assets/javascripts/json2.js +491 -0
  56. metadata +53 -2
@@ -0,0 +1,113 @@
1
+ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @scope fabric.StaticCanvas.prototype */ {
2
+
3
+ /**
4
+ * Animation duration (in ms) for fx* methods
5
+ * @type Number
6
+ */
7
+ FX_DURATION: 500,
8
+
9
+ /**
10
+ * Centers object horizontally with animation.
11
+ * @method fxCenterObjectH
12
+ * @param {fabric.Object} object Object to center
13
+ * @param {Object} [callbacks] Callbacks object with optional "onComplete" and/or "onChange" properties
14
+ * @return {fabric.Canvas} thisArg
15
+ * @chainable
16
+ */
17
+ fxCenterObjectH: function (object, callbacks) {
18
+ callbacks = callbacks || { };
19
+
20
+ var empty = function() { },
21
+ onComplete = callbacks.onComplete || empty,
22
+ onChange = callbacks.onChange || empty,
23
+ _this = this;
24
+
25
+ fabric.util.animate({
26
+ startValue: object.get('left'),
27
+ endValue: this.getCenter().left,
28
+ duration: this.FX_DURATION,
29
+ onChange: function(value) {
30
+ object.set('left', value);
31
+ _this.renderAll();
32
+ onChange();
33
+ },
34
+ onComplete: function() {
35
+ object.setCoords();
36
+ onComplete();
37
+ }
38
+ });
39
+
40
+ return this;
41
+ },
42
+
43
+ /**
44
+ * Centers object vertically with animation.
45
+ * @method fxCenterObjectV
46
+ * @param {fabric.Object} object Object to center
47
+ * @param {Object} [callbacks] Callbacks object with optional "onComplete" and/or "onChange" properties
48
+ * @return {fabric.Canvas} thisArg
49
+ * @chainable
50
+ */
51
+ fxCenterObjectV: function (object, callbacks) {
52
+ callbacks = callbacks || { };
53
+
54
+ var empty = function() { },
55
+ onComplete = callbacks.onComplete || empty,
56
+ onChange = callbacks.onChange || empty,
57
+ _this = this;
58
+
59
+ fabric.util.animate({
60
+ startValue: object.get('top'),
61
+ endValue: this.getCenter().top,
62
+ duration: this.FX_DURATION,
63
+ onChange: function(value) {
64
+ object.set('top', value);
65
+ _this.renderAll();
66
+ onChange();
67
+ },
68
+ onComplete: function() {
69
+ object.setCoords();
70
+ onComplete();
71
+ }
72
+ });
73
+
74
+ return this;
75
+ },
76
+
77
+ /**
78
+ * Same as `fabric.Canvas#remove` but animated
79
+ * @method fxRemove
80
+ * @param {fabric.Object} object Object to remove
81
+ * @param {Function} callback Callback, invoked on effect completion
82
+ * @return {fabric.Canvas} thisArg
83
+ * @chainable
84
+ */
85
+ fxRemove: function (object, callbacks) {
86
+ callbacks = callbacks || { };
87
+
88
+ var empty = function() { },
89
+ onComplete = callbacks.onComplete || empty,
90
+ onChange = callbacks.onChange || empty,
91
+ _this = this;
92
+
93
+ fabric.util.animate({
94
+ startValue: object.get('opacity'),
95
+ endValue: 0,
96
+ duration: this.FX_DURATION,
97
+ onStart: function() {
98
+ object.setActive(false);
99
+ },
100
+ onChange: function(value) {
101
+ object.set('opacity', value);
102
+ _this.renderAll();
103
+ onChange();
104
+ },
105
+ onComplete: function () {
106
+ _this.remove(object);
107
+ onComplete();
108
+ }
109
+ });
110
+
111
+ return this;
112
+ }
113
+ });
@@ -0,0 +1,482 @@
1
+ (function(){
2
+
3
+ var cursorMap = {
4
+ 'tr': 'ne-resize',
5
+ 'br': 'se-resize',
6
+ 'bl': 'sw-resize',
7
+ 'tl': 'nw-resize',
8
+ 'ml': 'w-resize',
9
+ 'mt': 'n-resize',
10
+ 'mr': 'e-resize',
11
+ 'mb': 's-resize'
12
+ },
13
+ addListener = fabric.util.addListener,
14
+ removeListener = fabric.util.removeListener,
15
+ getPointer = fabric.util.getPointer;
16
+
17
+ fabric.util.object.extend(fabric.Canvas.prototype, /** @scope fabric.Canvas.prototype */ {
18
+
19
+ /**
20
+ * Adds mouse listeners to canvas
21
+ * @method _initEvents
22
+ * @private
23
+ * See configuration documentation for more details.
24
+ */
25
+ _initEvents: function () {
26
+ var _this = this;
27
+
28
+ this._onMouseDown = this._onMouseDown.bind(this);
29
+ this._onMouseMove = this._onMouseMove.bind(this);
30
+ this._onMouseUp = this._onMouseUp.bind(this);
31
+ this._onResize = this._onResize.bind(this);
32
+
33
+ addListener(fabric.window, 'resize', this._onResize);
34
+
35
+ if (fabric.isTouchSupported) {
36
+ addListener(this.upperCanvasEl, 'touchstart', this._onMouseDown);
37
+ addListener(this.upperCanvasEl, 'touchmove', this._onMouseMove);
38
+
39
+ if (typeof Event !== 'undefined' && 'add' in Event) {
40
+ Event.add(this.upperCanvasEl, 'gesture', function(e, s) {
41
+ _this.__onTransformGesture(e, s);
42
+ });
43
+ }
44
+ }
45
+ else {
46
+ addListener(this.upperCanvasEl, 'mousedown', this._onMouseDown);
47
+ addListener(this.upperCanvasEl, 'mousemove', this._onMouseMove);
48
+ }
49
+ },
50
+
51
+ /**
52
+ * @method _onMouseDown
53
+ * @private
54
+ */
55
+ _onMouseDown: function (e) {
56
+ this.__onMouseDown(e);
57
+
58
+ !fabric.isTouchSupported && addListener(fabric.document, 'mouseup', this._onMouseUp);
59
+ fabric.isTouchSupported && addListener(fabric.document, 'touchend', this._onMouseUp);
60
+
61
+ !fabric.isTouchSupported && addListener(fabric.document, 'mousemove', this._onMouseMove);
62
+ fabric.isTouchSupported && addListener(fabric.document, 'touchmove', this._onMouseMove);
63
+
64
+ !fabric.isTouchSupported && removeListener(this.upperCanvasEl, 'mousemove', this._onMouseMove);
65
+ fabric.isTouchSupported && removeListener(this.upperCanvasEl, 'touchmove', this._onMouseMove);
66
+ },
67
+
68
+ /**
69
+ * @method _onMouseUp
70
+ * @private
71
+ */
72
+ _onMouseUp: function (e) {
73
+ this.__onMouseUp(e);
74
+
75
+ !fabric.isTouchSupported && removeListener(fabric.document, 'mouseup', this._onMouseUp);
76
+ fabric.isTouchSupported && removeListener(fabric.document, 'touchend', this._onMouseUp);
77
+
78
+ !fabric.isTouchSupported && removeListener(fabric.document, 'mousemove', this._onMouseMove);
79
+ fabric.isTouchSupported && removeListener(fabric.document, 'touchmove', this._onMouseMove);
80
+
81
+ !fabric.isTouchSupported && addListener(this.upperCanvasEl, 'mousemove', this._onMouseMove);
82
+ fabric.isTouchSupported && addListener(this.upperCanvasEl, 'touchmove', this._onMouseMove);
83
+ },
84
+
85
+ /**
86
+ * @method _onMouseMove
87
+ * @private
88
+ */
89
+ _onMouseMove: function (e) {
90
+ e.preventDefault && e.preventDefault();
91
+ this.__onMouseMove(e);
92
+ },
93
+
94
+ /**
95
+ * @method _onResize
96
+ * @private
97
+ */
98
+ _onResize: function () {
99
+ this.calcOffset();
100
+ },
101
+
102
+ /**
103
+ * Method that defines the actions when mouse is released on canvas.
104
+ * The method resets the currentTransform parameters, store the image corner
105
+ * position in the image object and render the canvas on top.
106
+ * @method __onMouseUp
107
+ * @param {Event} e Event object fired on mouseup
108
+ *
109
+ */
110
+ __onMouseUp: function (e) {
111
+
112
+ var target;
113
+
114
+ if (this.isDrawingMode && this._isCurrentlyDrawing) {
115
+ this.freeDrawing._finalizeAndAddPath();
116
+ this.fire('mouse:up', { e: e });
117
+ return;
118
+ }
119
+
120
+ if (this._currentTransform) {
121
+
122
+ var transform = this._currentTransform;
123
+
124
+ target = transform.target;
125
+ if (target._scaling) {
126
+ target._scaling = false;
127
+ }
128
+
129
+ // determine the new coords everytime the image changes its position
130
+ var i = this._objects.length;
131
+ while (i--) {
132
+ this._objects[i].setCoords();
133
+ }
134
+
135
+ target.isMoving = false;
136
+
137
+ // only fire :modified event if target coordinates were changed during mousedown-mouseup
138
+ if (this.stateful && target.hasStateChanged()) {
139
+ this.fire('object:modified', { target: target });
140
+ target.fire('modified');
141
+ }
142
+
143
+ if (this._previousOriginX) {
144
+ this._currentTransform.target.adjustPosition(this._previousOriginX);
145
+ this._previousOriginX = null;
146
+ }
147
+ }
148
+
149
+ this._currentTransform = null;
150
+
151
+ if (this._groupSelector) {
152
+ // group selection was completed, determine its bounds
153
+ this._findSelectedObjects(e);
154
+ }
155
+ var activeGroup = this.getActiveGroup();
156
+ if (activeGroup) {
157
+ activeGroup.setObjectsCoords();
158
+ activeGroup.set('isMoving', false);
159
+ this._setCursor(this.defaultCursor);
160
+ }
161
+
162
+ // clear selection
163
+ this._groupSelector = null;
164
+ this.renderAll();
165
+
166
+ this._setCursorFromEvent(e, target);
167
+
168
+ // fix for FF
169
+ this._setCursor('');
170
+
171
+ var _this = this;
172
+ setTimeout(function () {
173
+ _this._setCursorFromEvent(e, target);
174
+ }, 50);
175
+
176
+ this.fire('mouse:up', { target: target, e: e });
177
+ target && target.fire('mouseup', { e: e });
178
+ },
179
+
180
+ /**
181
+ * Method that defines the actions when mouse is clic ked on canvas.
182
+ * The method inits the currentTransform parameters and renders all the
183
+ * canvas so the current image can be placed on the top canvas and the rest
184
+ * in on the container one.
185
+ * @method __onMouseDown
186
+ * @param e {Event} Event object fired on mousedown
187
+ *
188
+ */
189
+ __onMouseDown: function (e) {
190
+
191
+ var pointer;
192
+
193
+ // accept only left clicks
194
+ var isLeftClick = 'which' in e ? e.which === 1 : e.button === 1;
195
+ if (!isLeftClick && !fabric.isTouchSupported) return;
196
+
197
+ if (this.isDrawingMode) {
198
+ pointer = this.getPointer(e);
199
+ this.freeDrawing._prepareForDrawing(pointer);
200
+
201
+ // capture coordinates immediately;
202
+ // this allows to draw dots (when movement never occurs)
203
+ this.freeDrawing._captureDrawingPath(pointer);
204
+
205
+ this.fire('mouse:down', { e: e });
206
+ return;
207
+ }
208
+
209
+ // ignore if some object is being transformed at this moment
210
+ if (this._currentTransform) return;
211
+
212
+ var target = this.findTarget(e), corner;
213
+ pointer = this.getPointer(e);
214
+
215
+ if (this._shouldClearSelection(e)) {
216
+ this._groupSelector = {
217
+ ex: pointer.x,
218
+ ey: pointer.y,
219
+ top: 0,
220
+ left: 0
221
+ };
222
+ this.deactivateAllWithDispatch();
223
+ }
224
+ else {
225
+ // determine if it's a drag or rotate case
226
+ this.stateful && target.saveState();
227
+
228
+ if ((corner = target._findTargetCorner(e, this._offset))) {
229
+ this.onBeforeScaleRotate(target);
230
+ }
231
+
232
+ if (this._shouldHandleGroupLogic(e, target)) {
233
+ this._handleGroupLogic(e, target);
234
+ target = this.getActiveGroup();
235
+ }
236
+ else {
237
+ if (target !== this.getActiveGroup()) {
238
+ this.deactivateAll();
239
+ }
240
+ this.setActiveObject(target, e);
241
+ }
242
+
243
+ this._setupCurrentTransform(e, target);
244
+ }
245
+ // we must renderAll so that active image is placed on the top canvas
246
+ this.renderAll();
247
+
248
+ this.fire('mouse:down', { target: target, e: e });
249
+ target && target.fire('mousedown', { e: e });
250
+
251
+ // center origin when rotating
252
+ if (corner === 'mtr') {
253
+ this._previousOriginX = this._currentTransform.target.originX;
254
+ this._currentTransform.target.adjustPosition('center');
255
+ this._currentTransform.left = this._currentTransform.target.left;
256
+ this._currentTransform.top = this._currentTransform.target.top;
257
+ }
258
+ },
259
+
260
+ /**
261
+ * Method that defines the actions when mouse is hovering the canvas.
262
+ * The currentTransform parameter will definde whether the user is rotating/scaling/translating
263
+ * an image or neither of them (only hovering). A group selection is also possible and would cancel
264
+ * all any other type of action.
265
+ * In case of an image transformation only the top canvas will be rendered.
266
+ * @method __onMouseMove
267
+ * @param e {Event} Event object fired on mousemove
268
+ *
269
+ */
270
+ __onMouseMove: function (e) {
271
+
272
+ var target, pointer;
273
+
274
+ if (this.isDrawingMode) {
275
+ if (this._isCurrentlyDrawing) {
276
+ pointer = this.getPointer(e);
277
+ this.freeDrawing._captureDrawingPath(pointer);
278
+
279
+ // redraw curve
280
+ // clear top canvas
281
+ this.clearContext(this.contextTop);
282
+ this.freeDrawing._render(this.contextTop);
283
+ }
284
+ this.upperCanvasEl.style.cursor = this.freeDrawingCursor;
285
+ this.fire('mouse:move', { e: e });
286
+ return;
287
+ }
288
+
289
+ var groupSelector = this._groupSelector;
290
+
291
+ // We initially clicked in an empty area, so we draw a box for multiple selection.
292
+ if (groupSelector !== null) {
293
+ pointer = getPointer(e, this.upperCanvasEl);
294
+
295
+ groupSelector.left = pointer.x - this._offset.left - groupSelector.ex;
296
+ groupSelector.top = pointer.y - this._offset.top - groupSelector.ey;
297
+ this.renderTop();
298
+ }
299
+ else if (!this._currentTransform) {
300
+
301
+ // alias style to elimintate unnecessary lookup
302
+ var style = this.upperCanvasEl.style;
303
+
304
+ // Here we are hovering the canvas then we will determine
305
+ // what part of the pictures we are hovering to change the caret symbol.
306
+ // We won't do that while dragging or rotating in order to improve the
307
+ // performance.
308
+ target = this.findTarget(e);
309
+
310
+ if (!target) {
311
+ // image/text was hovered-out from, we remove its borders
312
+ for (var i = this._objects.length; i--; ) {
313
+ if (this._objects[i] && !this._objects[i].active) {
314
+ this._objects[i].setActive(false);
315
+ }
316
+ }
317
+ style.cursor = this.defaultCursor;
318
+ }
319
+ else {
320
+ // set proper cursor
321
+ this._setCursorFromEvent(e, target);
322
+ }
323
+ }
324
+ else {
325
+ // object is being transformed (scaled/rotated/moved/etc.)
326
+ pointer = getPointer(e, this.upperCanvasEl);
327
+
328
+ var x = pointer.x,
329
+ y = pointer.y;
330
+
331
+ this._currentTransform.target.isMoving = true;
332
+
333
+ var t = this._currentTransform, reset = false;
334
+ if (
335
+ (t.action === 'scale' || t.action === 'scaleX' || t.action === 'scaleY')
336
+ &&
337
+ (
338
+ // Switch from a normal resize to center-based
339
+ (e.altKey && (t.originX !== 'center' || t.originY !== 'center'))
340
+ ||
341
+ // Switch from center-based resize to normal one
342
+ (!e.altKey && t.originX === 'center' && t.originY === 'center')
343
+ )
344
+ ) {
345
+ this._resetCurrentTransform(e);
346
+ reset = true;
347
+ }
348
+
349
+ if (this._currentTransform.action === 'rotate') {
350
+ this._rotateObject(x, y);
351
+
352
+ this.fire('object:rotating', {
353
+ target: this._currentTransform.target,
354
+ e: e
355
+ });
356
+ this._currentTransform.target.fire('rotating');
357
+ }
358
+ else if (this._currentTransform.action === 'scale') {
359
+ // rotate object only if shift key is not pressed
360
+ // and if it is not a group we are transforming
361
+
362
+ // TODO
363
+ /*if (!e.shiftKey) {
364
+ this._rotateObject(x, y);
365
+
366
+ this.fire('object:rotating', {
367
+ target: this._currentTransform.target,
368
+ e: e
369
+ });
370
+ this._currentTransform.target.fire('rotating');
371
+ }*/
372
+
373
+ // if (!this._currentTransform.target.hasRotatingPoint) {
374
+ // this._scaleObject(x, y);
375
+ // this.fire('object:scaling', {
376
+ // target: this._currentTransform.target
377
+ // });
378
+ // this._currentTransform.target.fire('scaling');
379
+ // }
380
+
381
+ if (e.shiftKey || this.uniScaleTransform) {
382
+ this._currentTransform.currentAction = 'scale';
383
+ this._scaleObject(x, y);
384
+ }
385
+ else {
386
+ if (!reset && t.currentAction === 'scale') {
387
+ // Switch from a normal resize to proportional
388
+ this._resetCurrentTransform(e);
389
+ }
390
+
391
+ this._currentTransform.currentAction = 'scaleEqually';
392
+ this._scaleObject(x, y, 'equally');
393
+ }
394
+
395
+ this.fire('object:scaling', {
396
+ target: this._currentTransform.target,
397
+ e: e
398
+ });
399
+ }
400
+ // else if (this._currentTransform.action === 'scale') {
401
+ // this._scaleObject(x, y);
402
+ // this.fire('object:scaling', {
403
+ // target: this._currentTransform.target
404
+ // });
405
+ // this._currentTransform.target.fire('scaling');
406
+ // }
407
+ else if (this._currentTransform.action === 'scaleX') {
408
+ this._scaleObject(x, y, 'x');
409
+
410
+ this.fire('object:scaling', {
411
+ target: this._currentTransform.target,
412
+ e: e
413
+ });
414
+ this._currentTransform.target.fire('scaling', { e: e });
415
+ }
416
+ else if (this._currentTransform.action === 'scaleY') {
417
+ this._scaleObject(x, y, 'y');
418
+
419
+ this.fire('object:scaling', {
420
+ target: this._currentTransform.target,
421
+ e: e
422
+ });
423
+ this._currentTransform.target.fire('scaling', { e: e });
424
+ }
425
+ else {
426
+ this._translateObject(x, y);
427
+
428
+ this.fire('object:moving', {
429
+ target: this._currentTransform.target,
430
+ e: e
431
+ });
432
+
433
+ this._setCursor(this.moveCursor);
434
+
435
+ this._currentTransform.target.fire('moving', { e: e });
436
+ }
437
+ // only commit here. when we are actually moving the pictures
438
+ this.renderAll();
439
+ }
440
+ this.fire('mouse:move', { target: target, e: e });
441
+ target && target.fire('mousemove', { e: e });
442
+ },
443
+ /**
444
+ * Sets the cursor depending on where the canvas is being hovered.
445
+ * Note: very buggy in Opera
446
+ * @method _setCursorFromEvent
447
+ * @param e {Event} Event object
448
+ * @param target {Object} Object that the mouse is hovering, if so.
449
+ */
450
+ _setCursorFromEvent: function (e, target) {
451
+ var s = this.upperCanvasEl.style;
452
+ if (!target) {
453
+ s.cursor = this.defaultCursor;
454
+ return false;
455
+ }
456
+ else {
457
+ var activeGroup = this.getActiveGroup();
458
+ // only show proper corner when group selection is not active
459
+ var corner = target._findTargetCorner
460
+ && (!activeGroup || !activeGroup.contains(target))
461
+ && target._findTargetCorner(e, this._offset);
462
+
463
+ if (!corner) {
464
+ s.cursor = this.hoverCursor;
465
+ }
466
+ else {
467
+ if (corner in cursorMap) {
468
+ s.cursor = cursorMap[corner];
469
+ }
470
+ else if (corner === 'mtr' && target.hasRotatingPoint) {
471
+ s.cursor = this.rotationCursor;
472
+ }
473
+ else {
474
+ s.cursor = this.defaultCursor;
475
+ return false;
476
+ }
477
+ }
478
+ }
479
+ return true;
480
+ }
481
+ });
482
+ })();