From: leon Date: Wed, 10 Aug 2022 06:01:06 +0000 (+0800) Subject: roojs-core.js X-Git-Url: http://git.roojs.org/?p=roojs1;a=commitdiff_plain;h=9ae306e5d9fc221f8327c490f8f602cbe90284d8 roojs-core.js roojs-core-debug.js roojs-ui.js roojs-ui-debug.js roojs-all.js roojs-debug.js --- diff --git a/roojs-all.js b/roojs-all.js index 03d41d86a9..17ec609819 100644 --- a/roojs-all.js +++ b/roojs-all.js @@ -2903,20 +2903,26 @@ this.footerEl.hide();this.setThumbBoxSize();this.bind();this.resize();this.fireE this.bodyEl.on('touchmove',this.onTouchMove,this);this.bodyEl.on('touchend',this.onTouchEnd,this);}if(!Roo.isTouch){this.bodyEl.on('mousedown',this.onMouseDown,this);this.bodyEl.on('mousemove',this.onMouseMove,this);var B=(/Firefox/i.test(navigator.userAgent))?'DOMMouseScroll':'mousewheel'; this.bodyEl.on(B,this.onMouseWheel,this);Roo.get(document).on('mouseup',this.onMouseUp,this);}this.selectorEl.on('change',this.onFileSelected,this);},reset:function(){this.scale=0;this.baseScale=1;this.rotate=0;this.baseRotate=1;this.dragable=false;this.pinching=false; this.mouseX=0;this.mouseY=0;this.cropData=false;this.notifyEl.dom.innerHTML=this.emptyText;},resize:function(){if(this.fireEvent('resize',this)!=false){this.setThumbBoxPosition();this.setCanvasPosition();}},onFooterButtonClick:function(e,el,o,A){switch(A){case 'rotate-left':this.onRotateLeft(e); -break;case 'rotate-right':this.onRotateRight(e);break;case 'picture':this.beforeSelectFile(e);break;case 'trash':this.trash(e);break;case 'crop':this.crop(e);break;case 'download':this.download(e);break;default:break;}this.fireEvent('footerbuttonclick',this,A); +break;case 'rotate-right':this.onRotateRight(e);break;case 'picture':this.beforeSelectFile(e);break;case 'trash':this.trash(e);break;case 'crop':this.crop(e);break;case 'download':this.download(e);break;case 'center':this.center(e);break;default:break;}this.fireEvent('footerbuttonclick',this,A); },beforeSelectFile:function(e){e.preventDefault();if(this.fireEvent('beforeselectfile',this)!=false){this.selectorEl.dom.click();}},onFileSelected:function(e){e.preventDefault();if(typeof(this.selectorEl.dom.files)=='undefined'||!this.selectorEl.dom.files.length){return; -}var A=this.selectorEl.dom.files[0];if(this.fireEvent('inspect',this,A)!=false){this.prepare(A);}},trash:function(e){this.fireEvent('trash',this);},download:function(e){this.fireEvent('download',this);},loadCanvas:function(A){if(this.fireEvent('beforeloadcanvas',this,A)!=false){this.reset(); +}var A=this.selectorEl.dom.files[0];if(this.fireEvent('inspect',this,A)!=false){this.prepare(A);}},trash:function(e){this.fireEvent('trash',this);},download:function(e){this.fireEvent('download',this);},center:function(e){this.setCanvasPosition();},loadCanvas:function(A){if(this.fireEvent('beforeloadcanvas',this,A)!=false){this.reset(); this.imageEl=document.createElement('img');var B=this;this.imageEl.addEventListener("load",function(){B.onLoadCanvas();});this.imageEl.src=A;}},onLoadCanvas:function(){this.imageEl.OriginWidth=this.imageEl.naturalWidth||this.imageEl.width;this.imageEl.OriginHeight=this.imageEl.naturalHeight||this.imageEl.height; if(this.fireEvent('loadcanvas',this,this.imageEl)!=false){this.bodyEl.un('click',this.beforeSelectFile,this);this.notifyEl.hide();this.thumbEl.show();this.footerEl.show();this.baseRotateLevel();if(this.isDocument){this.setThumbBoxSize();}this.setThumbBoxPosition(); -this.baseScaleLevel();this.draw();this.resize();this.canvasLoaded=true;}if(this.loadMask){this.maskEl.unmask();}},setCanvasPosition:function(){if(!this.canvasEl){return;}var pw=Math.ceil((this.bodyEl.getWidth()-this.canvasEl.width)/2);var ph=Math.ceil((this.bodyEl.getHeight()-this.canvasEl.height)/2); -this.previewEl.setLeft(pw);this.previewEl.setTop(ph);},onMouseDown:function(e){e.stopEvent();this.dragable=true;this.pinching=false;if(this.isDocument&&(this.canvasEl.widthC){var E=A;A=C;C=E;}if(B>D){var F=B;B=D;D=F;}var x=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX(); -var y=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();x=x-this.mouseX;y=y-this.mouseY;var G=Math.ceil(x+this.previewEl.getLeft(true));var H=Math.ceil(y+this.previewEl.getTop(true));G=(GC)?C:G);H=(HD)?D:H);this.previewEl.setLeft(G); -this.previewEl.setTop(H);this.mouseX=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();this.mouseY=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();},onMouseUp:function(e){e.stopEvent();this.dragable=false;},onMouseWheel:function(e){e.stopEvent(); -this.startScale=this.scale;this.scale=(e.getWheelDelta()>0)?(this.scale+1):(this.scale-1);if(!this.zoomable()){this.scale=this.startScale;return;}this.draw();return;},zoomable:function(){var A=this.thumbEl.getWidth()/this.minWidth;if(this.minWidththis.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(Bthis.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(B=this.minWidth/this.minHeight)&&BD||C>E)){return false; +this.baseScaleLevel();this.draw();this.resize();this.canvasLoaded=true;}if(this.loadMask){this.maskEl.unmask();}},setCanvasPosition:function(A=true){if(!this.canvasEl){return;}var B=Math.ceil((this.bodyEl.getWidth()-this.canvasEl.width)/2);var C=Math.ceil((this.bodyEl.getHeight()-this.canvasEl.height)/2); +if(A){this.previewEl.setLeft(B);this.previewEl.setTop(C);return;}var D=this.baseScale*Math.pow(1.02,this.startScale);var E=Math.floor(this.imageEl.OriginWidth*D);var F=Math.floor(this.imageEl.OriginHeight*D);var G=Math.ceil((this.bodyEl.getWidth()-E)/2);var H=Math.ceil((this.bodyEl.getHeight()-F)/2); +var I=B-G;var J=C-H;var K=this.previewEl.getLeft(true)+I;var L=this.previewEl.getTop(true)+J;this.previewEl.setLeft(K);this.previewEl.setTop(L);},onMouseDown:function(e){e.stopEvent();this.dragable=true;this.pinching=false;if(this.isDocument&&(this.canvasEl.width=this.minWidth/this.minHeight)){B=(this.canvasEl.width*this.minHeight/this.minWidth-this.canvasEl.height)/2+B; +}var C=Math.ceil(this.thumbEl.getLeft(true)+this.thumbEl.getWidth()-this.canvasEl.width-A);var D=Math.ceil(this.thumbEl.getTop(true)+this.thumbEl.getHeight()-this.canvasEl.height-B);var E=Math.ceil(this.thumbEl.getLeft(true)+A);var F=Math.ceil(this.thumbEl.getTop(true)+B); +if(C>E){var G=C;C=E;E=G;}if(D>F){var H=D;D=F;F=H;}var x=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();var y=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();x=x-this.mouseX;y=y-this.mouseY;var I=Math.ceil(x+this.previewEl.getLeft(true)); +var J=Math.ceil(y+this.previewEl.getTop(true));I=(IE)?E:I);J=(JF)?F:J);this.previewEl.setLeft(I);this.previewEl.setTop(J);this.mouseX=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();this.mouseY=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY(); +},onMouseUp:function(e){e.stopEvent();this.dragable=false;},onMouseWheel:function(e){e.stopEvent();this.startScale=this.scale;this.scale=(e.getWheelDelta()>0)?(this.scale+1):(this.scale-1);if(!this.zoomable()){this.scale=this.startScale;return;}this.draw(); +return;},zoomable:function(){var A=this.thumbEl.getWidth()/this.minWidth;if(this.minWidth=this.minWidth/this.minHeight)){U=(F*this.minHeight/this.minWidth-G)/2+U;}if(this.isDocument&&(this.rotate==0||this.rotate==180)&&(B>this.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(Bthis.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(BT||R>T||Q>U||S>U||B>D||C>E)){return false; }if(!this.isDocument&&(this.rotate==90||this.rotate==270)&&(Bthis.imageEl.OriginWidth||Cthis.imageEl.OriginHeight)){return false;}return true;},onRotateLeft:function(e){if(!this.isDocument&&(this.canvasEl.heightthis.imageEl.OriginHeight){this.contextEl.drawImage(A,0,Math.abs(this.canvasEl.width-this.canvasEl.height),this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);break;}this.contextEl.drawImage(A,Math.abs(this.canvasEl.width-this.canvasEl.height),0,this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height); break;case 270:this.canvasEl.width=this.imageEl.OriginHeight*this.getScaleLevel();this.canvasEl.height=this.imageEl.OriginWidth*this.getScaleLevel();if(this.imageEl.OriginWidth>this.imageEl.OriginHeight){this.contextEl.drawImage(A,0,0,this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height); -break;}this.contextEl.drawImage(A,0,Math.abs(this.canvasEl.width-this.canvasEl.height),this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);break;default:break;}this.previewEl.appendChild(this.canvasEl);this.setCanvasPosition(); +break;}this.contextEl.drawImage(A,0,Math.abs(this.canvasEl.width-this.canvasEl.height),this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);break;default:break;}this.previewEl.appendChild(this.canvasEl);this.setCanvasPosition(false); },crop:function(){if(!this.canvasLoaded){return;}var A=document.createElement("canvas");var B=A.getContext("2d");A.width=(this.imageEl.OriginWidth>this.imageEl.OriginHeight)?this.imageEl.OriginWidth:this.imageEl.OriginHeight;A.height=(this.imageEl.OriginWidth>this.imageEl.OriginHeight)?this.imageEl.OriginWidth:this.imageEl.OriginHeight; var C=A.width/2;B.translate(C,C);B.rotate(this.rotate*Math.PI/180);B.drawImage(this.imageEl,0,0,this.imageEl.OriginWidth,this.imageEl.OriginHeight,C*-1,C*-1,this.imageEl.OriginWidth,this.imageEl.OriginHeight);var D=document.createElement("canvas");var E=D.getContext("2d"); D.width=this.thumbEl.getWidth()/this.getScaleLevel();D.height=this.thumbEl.getHeight()/this.getScaleLevel();switch(this.rotate){case 0:var F=(this.thumbEl.getWidth()/this.getScaleLevel()>this.imageEl.OriginWidth)?this.imageEl.OriginWidth:(this.thumbEl.getWidth()/this.getScaleLevel()); @@ -2986,4 +2992,4 @@ return;}if(E===1){return G.getValue(A,I,F);}J=[];for(i=0;i'}]},{tag:'div',cls:'btn-group roo-upload-cropbox-crop',action:'crop',cn:[{tag:'button',cls:'btn btn-default',html:''} ]},{tag:'div',cls:'btn-group roo-upload-cropbox-trash',action:'trash',cn:[{tag:'button',cls:'btn btn-default',html:''}]},{tag:'div',cls:'btn-group roo-upload-cropbox-rotate-right',action:'rotate-right',cn:[{tag:'button',cls:'btn btn-default',html:''} ]}],ROTATOR:[{tag:'div',cls:'btn-group roo-upload-cropbox-rotate-left',action:'rotate-left',cn:[{tag:'button',cls:'btn btn-default',html:''}]},{tag:'div',cls:'btn-group roo-upload-cropbox-rotate-right',action:'rotate-right',cn:[{tag:'button',cls:'btn btn-default',html:''} -]}]}}); +]}],CENTER:[{tag:'div',cls:'btn-group roo-upload-cropbox-center',action:'center',cn:[{tag:'button',cls:'btn btn-default',html:'CENTER'}]}]}}); diff --git a/roojs-debug.js b/roojs-debug.js index db783cf0d6..18256ed880 100644 --- a/roojs-debug.js +++ b/roojs-debug.js @@ -68605,6 +68605,9 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component, { case 'download' : this.download(e); break; + case 'center' : + this.center(e); + break; default : break; } @@ -68646,6 +68649,11 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component, { { this.fireEvent('download', this); }, + + center : function(e) + { + this.setCanvasPosition(); + }, loadCanvas : function(src) { @@ -68700,17 +68708,37 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component, { }, - setCanvasPosition : function() + setCanvasPosition : function(center = true) { if(!this.canvasEl){ return; } + + var newCenterLeft = Math.ceil((this.bodyEl.getWidth() - this.canvasEl.width) / 2); + var newCenterTop = Math.ceil((this.bodyEl.getHeight() - this.canvasEl.height) / 2); + + if(center) { + this.previewEl.setLeft(newCenterLeft); + this.previewEl.setTop(newCenterTop); + + return; + } - var pw = Math.ceil((this.bodyEl.getWidth() - this.canvasEl.width) / 2); - var ph = Math.ceil((this.bodyEl.getHeight() - this.canvasEl.height) / 2); - - this.previewEl.setLeft(pw); - this.previewEl.setTop(ph); + var oldScaleLevel = this.baseScale * Math.pow(1.02, this.startScale); + var oldCanvasWidth = Math.floor(this.imageEl.OriginWidth * oldScaleLevel); + var oldCanvasHeight = Math.floor(this.imageEl.OriginHeight * oldScaleLevel); + + var oldCenterLeft = Math.ceil((this.bodyEl.getWidth() - oldCanvasWidth) / 2); + var oldCenterTop = Math.ceil((this.bodyEl.getHeight() - oldCanvasHeight) / 2); + + var leftDiff = newCenterLeft - oldCenterLeft; + var topDiff = newCenterTop - oldCenterTop; + + var newPreviewLeft = this.previewEl.getLeft(true) + leftDiff; + var newPreviewTop = this.previewEl.getTop(true) + topDiff; + + this.previewEl.setLeft(newPreviewLeft); + this.previewEl.setTop(newPreviewTop); }, @@ -68742,12 +68770,23 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component, { if (!this.dragable){ return; } + + var maxPaddingLeft = this.canvasEl.width / 0.9 * 0.05; + var maxPaddingTop = maxPaddingLeft * this.minHeight / this.minWidth; + + if ((this.imageEl.OriginWidth / this.imageEl.OriginHeight <= this.minWidth / this.minHeight)) { + maxPaddingLeft = (this.canvasEl.height * this.minWidth / this.minHeight - this.canvasEl.width) / 2 + maxPaddingLeft; + } + + if ((this.imageEl.OriginWidth / this.imageEl.OriginHeight >= this.minWidth / this.minHeight)) { + maxPaddingTop = (this.canvasEl.width * this.minHeight / this.minWidth - this.canvasEl.height) / 2 + maxPaddingTop; + } - var minX = Math.ceil(this.thumbEl.getLeft(true)); - var minY = Math.ceil(this.thumbEl.getTop(true)); + var minX = Math.ceil(this.thumbEl.getLeft(true) + this.thumbEl.getWidth() - this.canvasEl.width - maxPaddingLeft); + var minY = Math.ceil(this.thumbEl.getTop(true) + this.thumbEl.getHeight() - this.canvasEl.height - maxPaddingTop); - var maxX = Math.ceil(minX + this.thumbEl.getWidth() - this.canvasEl.width); - var maxY = Math.ceil(minY + this.thumbEl.getHeight() - this.canvasEl.height); + var maxX = Math.ceil(this.thumbEl.getLeft(true) + maxPaddingLeft); + var maxY = Math.ceil(this.thumbEl.getTop(true) + maxPaddingTop); if(minX > maxX) { var tempX = minX; @@ -68818,6 +68857,39 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component, { var maxWidth = this.imageEl.OriginWidth; var maxHeight = this.imageEl.OriginHeight; + + + var newCanvasWidth = Math.floor(this.imageEl.OriginWidth * this.getScaleLevel()); + var newCanvasHeight = Math.floor(this.imageEl.OriginHeight * this.getScaleLevel()); + + var oldCenterLeft = Math.ceil((this.bodyEl.getWidth() - this.canvasEl.width) / 2); + var oldCenterTop = Math.ceil((this.bodyEl.getHeight() - this.canvasEl.height) / 2); + + var newCenterLeft = Math.ceil((this.bodyEl.getWidth() - newCanvasWidth) / 2); + var newCenterTop = Math.ceil((this.bodyEl.getHeight() - newCanvasHeight) / 2); + + var leftDiff = newCenterLeft - oldCenterLeft; + var topDiff = newCenterTop - oldCenterTop; + + var newPreviewLeft = this.previewEl.getLeft(true) + leftDiff; + var newPreviewTop = this.previewEl.getTop(true) + topDiff; + + var paddingLeft = newPreviewLeft - this.thumbEl.getLeft(true); + var paddingTop = newPreviewTop - this.thumbEl.getTop(true); + + var paddingRight = this.thumbEl.getLeft(true) + this.thumbEl.getWidth() - newCanvasWidth - newPreviewLeft; + var paddingBottom = this.thumbEl.getTop(true) + this.thumbEl.getHeight() - newCanvasHeight - newPreviewTop; + + var maxPaddingLeft = newCanvasWidth / 0.9 * 0.05; + var maxPaddingTop = maxPaddingLeft * this.minHeight / this.minWidth; + + if ((this.imageEl.OriginWidth / this.imageEl.OriginHeight <= this.minWidth / this.minHeight)) { + maxPaddingLeft = (newCanvasHeight * this.minWidth / this.minHeight - newCanvasWidth) / 2 + maxPaddingLeft; + } + + if ((this.imageEl.OriginWidth / this.imageEl.OriginHeight >= this.minWidth / this.minHeight)) { + maxPaddingTop = (newCanvasWidth * this.minHeight / this.minWidth - newCanvasHeight) / 2 + maxPaddingTop; + } if( this.isDocument && @@ -68847,8 +68919,12 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component, { !this.isDocument && (this.rotate == 0 || this.rotate == 180) && ( - (this.imageEl.OriginWidth / this.imageEl.OriginHeight >= this.minWidth / this.minHeight) && width < this.minWidth || - (this.imageEl.OriginWidth / this.imageEl.OriginHeight <= this.minWidth / this.minHeight) && height < this.minHeight || + // for zoom out + paddingLeft > maxPaddingLeft || + paddingRight > maxPaddingLeft || + paddingTop > maxPaddingTop || + paddingBottom > maxPaddingTop || + // for zoom in width > maxWidth || height > maxHeight ) @@ -69072,7 +69148,7 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component, { this.previewEl.appendChild(this.canvasEl); - this.setCanvasPosition(); + this.setCanvasPosition(false); }, crop : function() @@ -70032,6 +70108,20 @@ Roo.apply(Roo.dialog.UploadCropbox, { } ] } + ], + CENTER : [ + { + tag : 'div', + cls : 'btn-group roo-upload-cropbox-center', + action : 'center', + cn : [ + { + tag : 'button', + cls : 'btn btn-default', + html : 'CENTER' + } + ] + } ] } }); diff --git a/roojs-ui-debug.js b/roojs-ui-debug.js index e76a862c52..5f029813d6 100644 --- a/roojs-ui-debug.js +++ b/roojs-ui-debug.js @@ -44113,6 +44113,9 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component, { case 'download' : this.download(e); break; + case 'center' : + this.center(e); + break; default : break; } @@ -44154,6 +44157,11 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component, { { this.fireEvent('download', this); }, + + center : function(e) + { + this.setCanvasPosition(); + }, loadCanvas : function(src) { @@ -44208,17 +44216,37 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component, { }, - setCanvasPosition : function() + setCanvasPosition : function(center = true) { if(!this.canvasEl){ return; } + + var newCenterLeft = Math.ceil((this.bodyEl.getWidth() - this.canvasEl.width) / 2); + var newCenterTop = Math.ceil((this.bodyEl.getHeight() - this.canvasEl.height) / 2); + + if(center) { + this.previewEl.setLeft(newCenterLeft); + this.previewEl.setTop(newCenterTop); + + return; + } - var pw = Math.ceil((this.bodyEl.getWidth() - this.canvasEl.width) / 2); - var ph = Math.ceil((this.bodyEl.getHeight() - this.canvasEl.height) / 2); - - this.previewEl.setLeft(pw); - this.previewEl.setTop(ph); + var oldScaleLevel = this.baseScale * Math.pow(1.02, this.startScale); + var oldCanvasWidth = Math.floor(this.imageEl.OriginWidth * oldScaleLevel); + var oldCanvasHeight = Math.floor(this.imageEl.OriginHeight * oldScaleLevel); + + var oldCenterLeft = Math.ceil((this.bodyEl.getWidth() - oldCanvasWidth) / 2); + var oldCenterTop = Math.ceil((this.bodyEl.getHeight() - oldCanvasHeight) / 2); + + var leftDiff = newCenterLeft - oldCenterLeft; + var topDiff = newCenterTop - oldCenterTop; + + var newPreviewLeft = this.previewEl.getLeft(true) + leftDiff; + var newPreviewTop = this.previewEl.getTop(true) + topDiff; + + this.previewEl.setLeft(newPreviewLeft); + this.previewEl.setTop(newPreviewTop); }, @@ -44250,12 +44278,23 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component, { if (!this.dragable){ return; } + + var maxPaddingLeft = this.canvasEl.width / 0.9 * 0.05; + var maxPaddingTop = maxPaddingLeft * this.minHeight / this.minWidth; + + if ((this.imageEl.OriginWidth / this.imageEl.OriginHeight <= this.minWidth / this.minHeight)) { + maxPaddingLeft = (this.canvasEl.height * this.minWidth / this.minHeight - this.canvasEl.width) / 2 + maxPaddingLeft; + } + + if ((this.imageEl.OriginWidth / this.imageEl.OriginHeight >= this.minWidth / this.minHeight)) { + maxPaddingTop = (this.canvasEl.width * this.minHeight / this.minWidth - this.canvasEl.height) / 2 + maxPaddingTop; + } - var minX = Math.ceil(this.thumbEl.getLeft(true)); - var minY = Math.ceil(this.thumbEl.getTop(true)); + var minX = Math.ceil(this.thumbEl.getLeft(true) + this.thumbEl.getWidth() - this.canvasEl.width - maxPaddingLeft); + var minY = Math.ceil(this.thumbEl.getTop(true) + this.thumbEl.getHeight() - this.canvasEl.height - maxPaddingTop); - var maxX = Math.ceil(minX + this.thumbEl.getWidth() - this.canvasEl.width); - var maxY = Math.ceil(minY + this.thumbEl.getHeight() - this.canvasEl.height); + var maxX = Math.ceil(this.thumbEl.getLeft(true) + maxPaddingLeft); + var maxY = Math.ceil(this.thumbEl.getTop(true) + maxPaddingTop); if(minX > maxX) { var tempX = minX; @@ -44326,6 +44365,39 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component, { var maxWidth = this.imageEl.OriginWidth; var maxHeight = this.imageEl.OriginHeight; + + + var newCanvasWidth = Math.floor(this.imageEl.OriginWidth * this.getScaleLevel()); + var newCanvasHeight = Math.floor(this.imageEl.OriginHeight * this.getScaleLevel()); + + var oldCenterLeft = Math.ceil((this.bodyEl.getWidth() - this.canvasEl.width) / 2); + var oldCenterTop = Math.ceil((this.bodyEl.getHeight() - this.canvasEl.height) / 2); + + var newCenterLeft = Math.ceil((this.bodyEl.getWidth() - newCanvasWidth) / 2); + var newCenterTop = Math.ceil((this.bodyEl.getHeight() - newCanvasHeight) / 2); + + var leftDiff = newCenterLeft - oldCenterLeft; + var topDiff = newCenterTop - oldCenterTop; + + var newPreviewLeft = this.previewEl.getLeft(true) + leftDiff; + var newPreviewTop = this.previewEl.getTop(true) + topDiff; + + var paddingLeft = newPreviewLeft - this.thumbEl.getLeft(true); + var paddingTop = newPreviewTop - this.thumbEl.getTop(true); + + var paddingRight = this.thumbEl.getLeft(true) + this.thumbEl.getWidth() - newCanvasWidth - newPreviewLeft; + var paddingBottom = this.thumbEl.getTop(true) + this.thumbEl.getHeight() - newCanvasHeight - newPreviewTop; + + var maxPaddingLeft = newCanvasWidth / 0.9 * 0.05; + var maxPaddingTop = maxPaddingLeft * this.minHeight / this.minWidth; + + if ((this.imageEl.OriginWidth / this.imageEl.OriginHeight <= this.minWidth / this.minHeight)) { + maxPaddingLeft = (newCanvasHeight * this.minWidth / this.minHeight - newCanvasWidth) / 2 + maxPaddingLeft; + } + + if ((this.imageEl.OriginWidth / this.imageEl.OriginHeight >= this.minWidth / this.minHeight)) { + maxPaddingTop = (newCanvasWidth * this.minHeight / this.minWidth - newCanvasHeight) / 2 + maxPaddingTop; + } if( this.isDocument && @@ -44355,8 +44427,12 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component, { !this.isDocument && (this.rotate == 0 || this.rotate == 180) && ( - (this.imageEl.OriginWidth / this.imageEl.OriginHeight >= this.minWidth / this.minHeight) && width < this.minWidth || - (this.imageEl.OriginWidth / this.imageEl.OriginHeight <= this.minWidth / this.minHeight) && height < this.minHeight || + // for zoom out + paddingLeft > maxPaddingLeft || + paddingRight > maxPaddingLeft || + paddingTop > maxPaddingTop || + paddingBottom > maxPaddingTop || + // for zoom in width > maxWidth || height > maxHeight ) @@ -44580,7 +44656,7 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component, { this.previewEl.appendChild(this.canvasEl); - this.setCanvasPosition(); + this.setCanvasPosition(false); }, crop : function() @@ -45540,6 +45616,20 @@ Roo.apply(Roo.dialog.UploadCropbox, { } ] } + ], + CENTER : [ + { + tag : 'div', + cls : 'btn-group roo-upload-cropbox-center', + action : 'center', + cn : [ + { + tag : 'button', + cls : 'btn btn-default', + html : 'CENTER' + } + ] + } ] } }); diff --git a/roojs-ui.js b/roojs-ui.js index aaadc8656c..23c5068cee 100644 --- a/roojs-ui.js +++ b/roojs-ui.js @@ -1957,20 +1957,26 @@ this.footerEl.hide();this.setThumbBoxSize();this.bind();this.resize();this.fireE this.bodyEl.on('touchmove',this.onTouchMove,this);this.bodyEl.on('touchend',this.onTouchEnd,this);}if(!Roo.isTouch){this.bodyEl.on('mousedown',this.onMouseDown,this);this.bodyEl.on('mousemove',this.onMouseMove,this);var B=(/Firefox/i.test(navigator.userAgent))?'DOMMouseScroll':'mousewheel'; this.bodyEl.on(B,this.onMouseWheel,this);Roo.get(document).on('mouseup',this.onMouseUp,this);}this.selectorEl.on('change',this.onFileSelected,this);},reset:function(){this.scale=0;this.baseScale=1;this.rotate=0;this.baseRotate=1;this.dragable=false;this.pinching=false; this.mouseX=0;this.mouseY=0;this.cropData=false;this.notifyEl.dom.innerHTML=this.emptyText;},resize:function(){if(this.fireEvent('resize',this)!=false){this.setThumbBoxPosition();this.setCanvasPosition();}},onFooterButtonClick:function(e,el,o,A){switch(A){case 'rotate-left':this.onRotateLeft(e); -break;case 'rotate-right':this.onRotateRight(e);break;case 'picture':this.beforeSelectFile(e);break;case 'trash':this.trash(e);break;case 'crop':this.crop(e);break;case 'download':this.download(e);break;default:break;}this.fireEvent('footerbuttonclick',this,A); +break;case 'rotate-right':this.onRotateRight(e);break;case 'picture':this.beforeSelectFile(e);break;case 'trash':this.trash(e);break;case 'crop':this.crop(e);break;case 'download':this.download(e);break;case 'center':this.center(e);break;default:break;}this.fireEvent('footerbuttonclick',this,A); },beforeSelectFile:function(e){e.preventDefault();if(this.fireEvent('beforeselectfile',this)!=false){this.selectorEl.dom.click();}},onFileSelected:function(e){e.preventDefault();if(typeof(this.selectorEl.dom.files)=='undefined'||!this.selectorEl.dom.files.length){return; -}var A=this.selectorEl.dom.files[0];if(this.fireEvent('inspect',this,A)!=false){this.prepare(A);}},trash:function(e){this.fireEvent('trash',this);},download:function(e){this.fireEvent('download',this);},loadCanvas:function(A){if(this.fireEvent('beforeloadcanvas',this,A)!=false){this.reset(); +}var A=this.selectorEl.dom.files[0];if(this.fireEvent('inspect',this,A)!=false){this.prepare(A);}},trash:function(e){this.fireEvent('trash',this);},download:function(e){this.fireEvent('download',this);},center:function(e){this.setCanvasPosition();},loadCanvas:function(A){if(this.fireEvent('beforeloadcanvas',this,A)!=false){this.reset(); this.imageEl=document.createElement('img');var B=this;this.imageEl.addEventListener("load",function(){B.onLoadCanvas();});this.imageEl.src=A;}},onLoadCanvas:function(){this.imageEl.OriginWidth=this.imageEl.naturalWidth||this.imageEl.width;this.imageEl.OriginHeight=this.imageEl.naturalHeight||this.imageEl.height; if(this.fireEvent('loadcanvas',this,this.imageEl)!=false){this.bodyEl.un('click',this.beforeSelectFile,this);this.notifyEl.hide();this.thumbEl.show();this.footerEl.show();this.baseRotateLevel();if(this.isDocument){this.setThumbBoxSize();}this.setThumbBoxPosition(); -this.baseScaleLevel();this.draw();this.resize();this.canvasLoaded=true;}if(this.loadMask){this.maskEl.unmask();}},setCanvasPosition:function(){if(!this.canvasEl){return;}var pw=Math.ceil((this.bodyEl.getWidth()-this.canvasEl.width)/2);var ph=Math.ceil((this.bodyEl.getHeight()-this.canvasEl.height)/2); -this.previewEl.setLeft(pw);this.previewEl.setTop(ph);},onMouseDown:function(e){e.stopEvent();this.dragable=true;this.pinching=false;if(this.isDocument&&(this.canvasEl.widthC){var E=A;A=C;C=E;}if(B>D){var F=B;B=D;D=F;}var x=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX(); -var y=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();x=x-this.mouseX;y=y-this.mouseY;var G=Math.ceil(x+this.previewEl.getLeft(true));var H=Math.ceil(y+this.previewEl.getTop(true));G=(GC)?C:G);H=(HD)?D:H);this.previewEl.setLeft(G); -this.previewEl.setTop(H);this.mouseX=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();this.mouseY=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();},onMouseUp:function(e){e.stopEvent();this.dragable=false;},onMouseWheel:function(e){e.stopEvent(); -this.startScale=this.scale;this.scale=(e.getWheelDelta()>0)?(this.scale+1):(this.scale-1);if(!this.zoomable()){this.scale=this.startScale;return;}this.draw();return;},zoomable:function(){var A=this.thumbEl.getWidth()/this.minWidth;if(this.minWidththis.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(Bthis.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(B=this.minWidth/this.minHeight)&&BD||C>E)){return false; +this.baseScaleLevel();this.draw();this.resize();this.canvasLoaded=true;}if(this.loadMask){this.maskEl.unmask();}},setCanvasPosition:function(A=true){if(!this.canvasEl){return;}var B=Math.ceil((this.bodyEl.getWidth()-this.canvasEl.width)/2);var C=Math.ceil((this.bodyEl.getHeight()-this.canvasEl.height)/2); +if(A){this.previewEl.setLeft(B);this.previewEl.setTop(C);return;}var D=this.baseScale*Math.pow(1.02,this.startScale);var E=Math.floor(this.imageEl.OriginWidth*D);var F=Math.floor(this.imageEl.OriginHeight*D);var G=Math.ceil((this.bodyEl.getWidth()-E)/2);var H=Math.ceil((this.bodyEl.getHeight()-F)/2); +var I=B-G;var J=C-H;var K=this.previewEl.getLeft(true)+I;var L=this.previewEl.getTop(true)+J;this.previewEl.setLeft(K);this.previewEl.setTop(L);},onMouseDown:function(e){e.stopEvent();this.dragable=true;this.pinching=false;if(this.isDocument&&(this.canvasEl.width=this.minWidth/this.minHeight)){B=(this.canvasEl.width*this.minHeight/this.minWidth-this.canvasEl.height)/2+B; +}var C=Math.ceil(this.thumbEl.getLeft(true)+this.thumbEl.getWidth()-this.canvasEl.width-A);var D=Math.ceil(this.thumbEl.getTop(true)+this.thumbEl.getHeight()-this.canvasEl.height-B);var E=Math.ceil(this.thumbEl.getLeft(true)+A);var F=Math.ceil(this.thumbEl.getTop(true)+B); +if(C>E){var G=C;C=E;E=G;}if(D>F){var H=D;D=F;F=H;}var x=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();var y=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();x=x-this.mouseX;y=y-this.mouseY;var I=Math.ceil(x+this.previewEl.getLeft(true)); +var J=Math.ceil(y+this.previewEl.getTop(true));I=(IE)?E:I);J=(JF)?F:J);this.previewEl.setLeft(I);this.previewEl.setTop(J);this.mouseX=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();this.mouseY=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY(); +},onMouseUp:function(e){e.stopEvent();this.dragable=false;},onMouseWheel:function(e){e.stopEvent();this.startScale=this.scale;this.scale=(e.getWheelDelta()>0)?(this.scale+1):(this.scale-1);if(!this.zoomable()){this.scale=this.startScale;return;}this.draw(); +return;},zoomable:function(){var A=this.thumbEl.getWidth()/this.minWidth;if(this.minWidth=this.minWidth/this.minHeight)){U=(F*this.minHeight/this.minWidth-G)/2+U;}if(this.isDocument&&(this.rotate==0||this.rotate==180)&&(B>this.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(Bthis.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(BT||R>T||Q>U||S>U||B>D||C>E)){return false; }if(!this.isDocument&&(this.rotate==90||this.rotate==270)&&(Bthis.imageEl.OriginWidth||Cthis.imageEl.OriginHeight)){return false;}return true;},onRotateLeft:function(e){if(!this.isDocument&&(this.canvasEl.heightthis.imageEl.OriginHeight){this.contextEl.drawImage(A,0,Math.abs(this.canvasEl.width-this.canvasEl.height),this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);break;}this.contextEl.drawImage(A,Math.abs(this.canvasEl.width-this.canvasEl.height),0,this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height); break;case 270:this.canvasEl.width=this.imageEl.OriginHeight*this.getScaleLevel();this.canvasEl.height=this.imageEl.OriginWidth*this.getScaleLevel();if(this.imageEl.OriginWidth>this.imageEl.OriginHeight){this.contextEl.drawImage(A,0,0,this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height); -break;}this.contextEl.drawImage(A,0,Math.abs(this.canvasEl.width-this.canvasEl.height),this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);break;default:break;}this.previewEl.appendChild(this.canvasEl);this.setCanvasPosition(); +break;}this.contextEl.drawImage(A,0,Math.abs(this.canvasEl.width-this.canvasEl.height),this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);break;default:break;}this.previewEl.appendChild(this.canvasEl);this.setCanvasPosition(false); },crop:function(){if(!this.canvasLoaded){return;}var A=document.createElement("canvas");var B=A.getContext("2d");A.width=(this.imageEl.OriginWidth>this.imageEl.OriginHeight)?this.imageEl.OriginWidth:this.imageEl.OriginHeight;A.height=(this.imageEl.OriginWidth>this.imageEl.OriginHeight)?this.imageEl.OriginWidth:this.imageEl.OriginHeight; var C=A.width/2;B.translate(C,C);B.rotate(this.rotate*Math.PI/180);B.drawImage(this.imageEl,0,0,this.imageEl.OriginWidth,this.imageEl.OriginHeight,C*-1,C*-1,this.imageEl.OriginWidth,this.imageEl.OriginHeight);var D=document.createElement("canvas");var E=D.getContext("2d"); D.width=this.thumbEl.getWidth()/this.getScaleLevel();D.height=this.thumbEl.getHeight()/this.getScaleLevel();switch(this.rotate){case 0:var F=(this.thumbEl.getWidth()/this.getScaleLevel()>this.imageEl.OriginWidth)?this.imageEl.OriginWidth:(this.thumbEl.getWidth()/this.getScaleLevel()); @@ -2040,4 +2046,4 @@ return;}if(E===1){return G.getValue(A,I,F);}J=[];for(i=0;i'}]},{tag:'div',cls:'btn-group roo-upload-cropbox-crop',action:'crop',cn:[{tag:'button',cls:'btn btn-default',html:''} ]},{tag:'div',cls:'btn-group roo-upload-cropbox-trash',action:'trash',cn:[{tag:'button',cls:'btn btn-default',html:''}]},{tag:'div',cls:'btn-group roo-upload-cropbox-rotate-right',action:'rotate-right',cn:[{tag:'button',cls:'btn btn-default',html:''} ]}],ROTATOR:[{tag:'div',cls:'btn-group roo-upload-cropbox-rotate-left',action:'rotate-left',cn:[{tag:'button',cls:'btn btn-default',html:''}]},{tag:'div',cls:'btn-group roo-upload-cropbox-rotate-right',action:'rotate-right',cn:[{tag:'button',cls:'btn btn-default',html:''} -]}]}}); +]}],CENTER:[{tag:'div',cls:'btn-group roo-upload-cropbox-center',action:'center',cn:[{tag:'button',cls:'btn btn-default',html:'CENTER'}]}]}});