123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- 'use strict';
- crop.factory('cropAreaSquare', ['cropArea', function(CropArea) {
- var CropAreaSquare = function() {
- CropArea.apply(this, arguments);
- this._resizeCtrlBaseRadius = 10;
- this._resizeCtrlNormalRatio = 0.75;
- this._resizeCtrlHoverRatio = 1;
- this._iconMoveNormalRatio = 0.9;
- this._iconMoveHoverRatio = 1.2;
- this._resizeCtrlNormalRadius = this._resizeCtrlBaseRadius*this._resizeCtrlNormalRatio;
- this._resizeCtrlHoverRadius = this._resizeCtrlBaseRadius*this._resizeCtrlHoverRatio;
- this._posDragStartX=0;
- this._posDragStartY=0;
- this._posResizeStartX=0;
- this._posResizeStartY=0;
- this._posResizeStartSize=0;
- this._resizeCtrlIsHover = -1;
- this._areaIsHover = false;
- this._resizeCtrlIsDragging = -1;
- this._areaIsDragging = false;
- };
- CropAreaSquare.prototype = new CropArea();
- CropAreaSquare.prototype._calcSquareCorners=function() {
- var hSize=this._size/2;
- return [
- [this._x-hSize, this._y-hSize],
- [this._x+hSize, this._y-hSize],
- [this._x-hSize, this._y+hSize],
- [this._x+hSize, this._y+hSize]
- ];
- };
- CropAreaSquare.prototype._calcSquareDimensions=function() {
- var hSize=this._size/2;
- return {
- left: this._x-hSize,
- top: this._y-hSize,
- right: this._x+hSize,
- bottom: this._y+hSize
- };
- };
- CropAreaSquare.prototype._isCoordWithinArea=function(coord) {
- var squareDimensions=this._calcSquareDimensions();
- return (coord[0]>=squareDimensions.left&&coord[0]<=squareDimensions.right&&coord[1]>=squareDimensions.top&&coord[1]<=squareDimensions.bottom);
- };
- CropAreaSquare.prototype._isCoordWithinResizeCtrl=function(coord) {
- var resizeIconsCenterCoords=this._calcSquareCorners();
- var res=-1;
- for(var i=0,len=resizeIconsCenterCoords.length;i<len;i++) {
- var resizeIconCenterCoords=resizeIconsCenterCoords[i];
- if(coord[0] > resizeIconCenterCoords[0] - this._resizeCtrlHoverRadius && coord[0] < resizeIconCenterCoords[0] + this._resizeCtrlHoverRadius &&
- coord[1] > resizeIconCenterCoords[1] - this._resizeCtrlHoverRadius && coord[1] < resizeIconCenterCoords[1] + this._resizeCtrlHoverRadius) {
- res=i;
- break;
- }
- }
- return res;
- };
- CropAreaSquare.prototype._drawArea=function(ctx,centerCoords,size){
- var hSize=size/2;
- ctx.rect(centerCoords[0]-hSize,centerCoords[1]-hSize,size,size);
- };
- CropAreaSquare.prototype.draw=function() {
- CropArea.prototype.draw.apply(this, arguments);
- // draw move icon
- this._cropCanvas.drawIconMove([this._x,this._y], this._areaIsHover?this._iconMoveHoverRatio:this._iconMoveNormalRatio);
- // draw resize cubes
- var resizeIconsCenterCoords=this._calcSquareCorners();
- for(var i=0,len=resizeIconsCenterCoords.length;i<len;i++) {
- var resizeIconCenterCoords=resizeIconsCenterCoords[i];
- this._cropCanvas.drawIconResizeCircle(resizeIconCenterCoords, this._resizeCtrlBaseRadius, this._resizeCtrlIsHover===i?this._resizeCtrlHoverRatio:this._resizeCtrlNormalRatio);
- }
- };
- CropAreaSquare.prototype.processMouseMove=function(mouseCurX, mouseCurY) {
- var cursor='default';
- var res=false;
- this._resizeCtrlIsHover = -1;
- this._areaIsHover = false;
- if (this._areaIsDragging) {
- this._x = mouseCurX - this._posDragStartX;
- this._y = mouseCurY - this._posDragStartY;
- this._areaIsHover = true;
- cursor='move';
- res=true;
- this._events.trigger('area-move');
- } else if (this._resizeCtrlIsDragging>-1) {
- var xMulti, yMulti;
- switch(this._resizeCtrlIsDragging) {
- case 0: // Top Left
- xMulti=-1;
- yMulti=-1;
- cursor = 'nwse-resize';
- break;
- case 1: // Top Right
- xMulti=1;
- yMulti=-1;
- cursor = 'nesw-resize';
- break;
- case 2: // Bottom Left
- xMulti=-1;
- yMulti=1;
- cursor = 'nesw-resize';
- break;
- case 3: // Bottom Right
- xMulti=1;
- yMulti=1;
- cursor = 'nwse-resize';
- break;
- }
- var iFX = (mouseCurX - this._posResizeStartX)*xMulti;
- var iFY = (mouseCurY - this._posResizeStartY)*yMulti;
- var iFR;
- if(iFX>iFY) {
- iFR = this._posResizeStartSize + iFY;
- } else {
- iFR = this._posResizeStartSize + iFX;
- }
- var wasSize=this._size;
- this._size = Math.max(this._minSize, iFR);
- var posModifier=(this._size-wasSize)/2;
- this._x+=posModifier*xMulti;
- this._y+=posModifier*yMulti;
- this._resizeCtrlIsHover = this._resizeCtrlIsDragging;
- res=true;
- this._events.trigger('area-resize');
- } else {
- var hoveredResizeBox=this._isCoordWithinResizeCtrl([mouseCurX,mouseCurY]);
- if (hoveredResizeBox>-1) {
- switch(hoveredResizeBox) {
- case 0:
- cursor = 'nwse-resize';
- break;
- case 1:
- cursor = 'nesw-resize';
- break;
- case 2:
- cursor = 'nesw-resize';
- break;
- case 3:
- cursor = 'nwse-resize';
- break;
- }
- this._areaIsHover = false;
- this._resizeCtrlIsHover = hoveredResizeBox;
- res=true;
- } else if(this._isCoordWithinArea([mouseCurX,mouseCurY])) {
- cursor = 'move';
- this._areaIsHover = true;
- res=true;
- }
- }
- this._dontDragOutside();
- angular.element(this._ctx.canvas).css({'cursor': cursor});
- return res;
- };
- CropAreaSquare.prototype.processMouseDown=function(mouseDownX, mouseDownY) {
- var isWithinResizeCtrl=this._isCoordWithinResizeCtrl([mouseDownX,mouseDownY]);
- if (isWithinResizeCtrl>-1) {
- this._areaIsDragging = false;
- this._areaIsHover = false;
- this._resizeCtrlIsDragging = isWithinResizeCtrl;
- this._resizeCtrlIsHover = isWithinResizeCtrl;
- this._posResizeStartX=mouseDownX;
- this._posResizeStartY=mouseDownY;
- this._posResizeStartSize = this._size;
- this._events.trigger('area-resize-start');
- } else if (this._isCoordWithinArea([mouseDownX,mouseDownY])) {
- this._areaIsDragging = true;
- this._areaIsHover = true;
- this._resizeCtrlIsDragging = -1;
- this._resizeCtrlIsHover = -1;
- this._posDragStartX = mouseDownX - this._x;
- this._posDragStartY = mouseDownY - this._y;
- this._events.trigger('area-move-start');
- }
- };
- CropAreaSquare.prototype.processMouseUp=function(/*mouseUpX, mouseUpY*/) {
- if(this._areaIsDragging) {
- this._areaIsDragging = false;
- this._events.trigger('area-move-end');
- }
- if(this._resizeCtrlIsDragging>-1) {
- this._resizeCtrlIsDragging = -1;
- this._events.trigger('area-resize-end');
- }
- this._areaIsHover = false;
- this._resizeCtrlIsHover = -1;
- this._posDragStartX = 0;
- this._posDragStartY = 0;
- };
- return CropAreaSquare;
- }]);
|