From: Alan Date: Thu, 22 Sep 2022 04:12:44 +0000 (+0800) Subject: fix #7330 - upload cropbox padding / edit X-Git-Url: http://git.roojs.org/?p=roojs1;a=commitdiff_plain;h=1c33232af891dfe3f34cf26d74e8b443ff61e3d5 fix #7330 - upload cropbox padding / edit --- diff --git a/Roo/dialog/UploadCropbox.js b/Roo/dialog/UploadCropbox.js index 7bc78e356b..1dace0d256 100644 --- a/Roo/dialog/UploadCropbox.js +++ b/Roo/dialog/UploadCropbox.js @@ -373,6 +373,9 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component, { case 'download' : this.download(e); break; + case 'center' : + this.center(e); + break; default : break; } @@ -414,6 +417,11 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component, { { this.fireEvent('download', this); }, + + center : function(e) + { + this.setCanvasPosition(); + }, loadCanvas : function(src) { @@ -468,17 +476,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); }, @@ -510,12 +538,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; @@ -586,6 +625,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 && @@ -615,8 +687,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 ) @@ -840,7 +916,7 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component, { this.previewEl.appendChild(this.canvasEl); - this.setCanvasPosition(); + this.setCanvasPosition(false); }, crop : function() @@ -1800,6 +1876,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/examples/dialog/uploadCropbox.js b/examples/dialog/uploadCropbox.js index 8be50a9895..9535a31123 100644 --- a/examples/dialog/uploadCropbox.js +++ b/examples/dialog/uploadCropbox.js @@ -19,8 +19,13 @@ var uploadCropbox = { this.dialog = Roo.factory({ xns : Roo, xtype : 'LayoutDialog', - width : 700, + width : 800, height : 600, + north : { + xns : Roo, + xtype : 'LayoutRegion', + height : 50 + }, center : { xns : Roo, xtype : 'LayoutRegion' @@ -39,11 +44,13 @@ var uploadCropbox = { outputMaxWidth : 1200, windowSize : 300, url: 'http://localhost/web.MediaOutreach/press.local.php/Roo/Images.php', - buttons: [], + buttons: Roo.dialog.UploadCropbox.footer.CENTER, listeners : { render : function (_self) { _this.cropbox = _self; + _this.cropbox.bodyEl.dom.style.height = (parseInt(_this.cropbox.bodyEl.dom.parentNode.parentNode.parentNode.style.height) - 34) + 'px'; + _this.cropbox.bodyEl.dom.style.maxHeight = (parseInt(_this.cropbox.bodyEl.dom.parentNode.parentNode.parentNode.style.height) - 34) + 'px'; }, loadcanvas : function (_self, imageEl) { @@ -68,7 +75,21 @@ var uploadCropbox = { } } ] - } + }, + { + xtype : 'ContentPanel', + xns: Roo, + region : 'north', + listeners : { + activate : function (_self) + { + var style = 'font:bold 16px sans serif,tahoma,verdana,helvetica; color:rgba(0, 0, 0, 0.5);'; + this.setContent("
" + + "

Scroll the mouse wheel to resize the image

" + + "

Drag the image to move the image

"); + } + } + } ], buttons : [ { diff --git a/roojs-all.js b/roojs-all.js index 3b081c753a..c6f920e518 100644 --- a/roojs-all.js +++ b/roojs-all.js @@ -236,7 +236,7 @@ if(typeof Range!="undefined"&&typeof Range.prototype.createContextualFragment==" for(var N in o){if(N=="tag"||N=="children"||N=="cn"||N=="html"||typeof o[N]=="function"){continue;}if(N=="style"){var s=o["style"];if(typeof s=="function"){s=s.call();}if(typeof s=="string"){b+=' style="'+s+'"';}else if(typeof s=="object"){b+=' style="';for(var O in s){if(typeof s[O]!="function"){b+=O+":"+s[O]+";"; }}b+='"';}}else{if(N=="cls"){b+=' class="'+o["cls"]+'"';}else if(N=="htmlFor"){b+=' for="'+o["htmlFor"]+'"';}else{b+=" "+N+'="'+o[N]+'"';}}}if(B.test(o.tag)){b+="/>";}else{b+=">";var cn=o.children||o.cn;if(cn){if((cn instanceof Array)||(Roo.isSafari&&typeof(cn.join)=="function")){for(var i=0,P=cn.length; i";}return b;};var F=function(o,N){var ns=false;if(o.ns&&o.ns!='html'){if(o.xmlns&&typeof(D[o.ns])=='undefined'){D[o.ns]=o.xmlns;ns=o.xmlns;}if(typeof(D[o.ns])=='undefined'){console.log("Trying to create namespace element "+o.ns+", however no xmlns was sent to builder previously"); -}ns=D[o.ns];}if(typeof(o)=='string'){return N.appendChild(document.createTextNode(o));}o.tag=o.tag||div;if(o.ns&&Roo.isIE){ns=false;o.tag=o.ns+':'+o.tag;}var el=ns?document.createElementNS(ns,o.tag||'div'):document.createElement(o.tag||'div');var O=el.setAttribute?true:false; +}ns=D[o.ns];}if(typeof(o)=='string'){return N.appendChild(document.createTextNode(o));}o.tag=o.tag||'div';if(o.ns&&Roo.isIE){ns=false;o.tag=o.ns+':'+o.tag;}var el=ns?document.createElementNS(ns,o.tag||'div'):document.createElement(o.tag||'div');var O=el.setAttribute?true:false; for(var P in o){if(P=="tag"||P=="ns"||P=="xmlns"||P=="children"||P=="cn"||P=="html"||P=="style"||typeof o[P]=="function"){continue;}if(P=="cls"&&Roo.isIE){el.className=o["cls"];}else{if(O){el.setAttribute(P=="cls"?'class':P,o[P]);}else{el[P]=o[P];}}}Roo.DomHelper.applyStyles(el,o.style); var cn=o.children||o.cn;if(cn){if((cn instanceof Array)||(Roo.isSafari&&typeof(cn.join)=="function")){for(var i=0,Q=cn.length;i',I=''+te,J=H+'',K=''+I;var L=function(N,O,el,P){if(!A){A=document.createElement('div');}var Q;var R=null;if(N=='td'){if(O=='afterbegin'||O=='beforeend'){return; @@ -2905,20 +2905,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()); @@ -2988,4 +2994,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-core-debug.js b/roojs-core-debug.js index 9b168d72b6..932c8c7437 100644 --- a/roojs-core-debug.js +++ b/roojs-core-debug.js @@ -5513,7 +5513,7 @@ Roo.DomHelper = function(){ if (typeof(o) == 'string') { return parentNode.appendChild(document.createTextNode(o)); } - o.tag = o.tag || div; + o.tag = o.tag || 'div'; if (o.ns && Roo.isIE) { ns = false; o.tag = o.ns + ':' + o.tag; diff --git a/roojs-core.js b/roojs-core.js index eadff0020a..a382ef5e20 100644 --- a/roojs-core.js +++ b/roojs-core.js @@ -236,7 +236,7 @@ if(typeof Range!="undefined"&&typeof Range.prototype.createContextualFragment==" for(var N in o){if(N=="tag"||N=="children"||N=="cn"||N=="html"||typeof o[N]=="function"){continue;}if(N=="style"){var s=o["style"];if(typeof s=="function"){s=s.call();}if(typeof s=="string"){b+=' style="'+s+'"';}else if(typeof s=="object"){b+=' style="';for(var O in s){if(typeof s[O]!="function"){b+=O+":"+s[O]+";"; }}b+='"';}}else{if(N=="cls"){b+=' class="'+o["cls"]+'"';}else if(N=="htmlFor"){b+=' for="'+o["htmlFor"]+'"';}else{b+=" "+N+'="'+o[N]+'"';}}}if(B.test(o.tag)){b+="/>";}else{b+=">";var cn=o.children||o.cn;if(cn){if((cn instanceof Array)||(Roo.isSafari&&typeof(cn.join)=="function")){for(var i=0,P=cn.length; i";}return b;};var F=function(o,N){var ns=false;if(o.ns&&o.ns!='html'){if(o.xmlns&&typeof(D[o.ns])=='undefined'){D[o.ns]=o.xmlns;ns=o.xmlns;}if(typeof(D[o.ns])=='undefined'){console.log("Trying to create namespace element "+o.ns+", however no xmlns was sent to builder previously"); -}ns=D[o.ns];}if(typeof(o)=='string'){return N.appendChild(document.createTextNode(o));}o.tag=o.tag||div;if(o.ns&&Roo.isIE){ns=false;o.tag=o.ns+':'+o.tag;}var el=ns?document.createElementNS(ns,o.tag||'div'):document.createElement(o.tag||'div');var O=el.setAttribute?true:false; +}ns=D[o.ns];}if(typeof(o)=='string'){return N.appendChild(document.createTextNode(o));}o.tag=o.tag||'div';if(o.ns&&Roo.isIE){ns=false;o.tag=o.ns+':'+o.tag;}var el=ns?document.createElementNS(ns,o.tag||'div'):document.createElement(o.tag||'div');var O=el.setAttribute?true:false; for(var P in o){if(P=="tag"||P=="ns"||P=="xmlns"||P=="children"||P=="cn"||P=="html"||P=="style"||typeof o[P]=="function"){continue;}if(P=="cls"&&Roo.isIE){el.className=o["cls"];}else{if(O){el.setAttribute(P=="cls"?'class':P,o[P]);}else{el[P]=o[P];}}}Roo.DomHelper.applyStyles(el,o.style); var cn=o.children||o.cn;if(cn){if((cn instanceof Array)||(Roo.isSafari&&typeof(cn.join)=="function")){for(var i=0,Q=cn.length;i',I=''+te,J=H+'',K=''+I;var L=function(N,O,el,P){if(!A){A=document.createElement('div');}var Q;var R=null;if(N=='td'){if(O=='afterbegin'||O=='beforeend'){return; diff --git a/roojs-debug.js b/roojs-debug.js index 64cd4ad1e0..0e683fb6a6 100644 --- a/roojs-debug.js +++ b/roojs-debug.js @@ -5513,7 +5513,7 @@ Roo.DomHelper = function(){ if (typeof(o) == 'string') { return parentNode.appendChild(document.createTextNode(o)); } - o.tag = o.tag || div; + o.tag = o.tag || 'div'; if (o.ns && Roo.isIE) { ns = false; o.tag = o.ns + ':' + o.tag; @@ -68643,6 +68643,9 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component, { case 'download' : this.download(e); break; + case 'center' : + this.center(e); + break; default : break; } @@ -68684,6 +68687,11 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component, { { this.fireEvent('download', this); }, + + center : function(e) + { + this.setCanvasPosition(); + }, loadCanvas : function(src) { @@ -68738,17 +68746,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); }, @@ -68780,12 +68808,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; @@ -68856,6 +68895,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 && @@ -68885,8 +68957,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 ) @@ -69110,7 +69186,7 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component, { this.previewEl.appendChild(this.canvasEl); - this.setCanvasPosition(); + this.setCanvasPosition(false); }, crop : function() @@ -70070,6 +70146,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 36301cbb81..94e89a3cdd 100644 --- a/roojs-ui-debug.js +++ b/roojs-ui-debug.js @@ -44144,6 +44144,9 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component, { case 'download' : this.download(e); break; + case 'center' : + this.center(e); + break; default : break; } @@ -44185,6 +44188,11 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component, { { this.fireEvent('download', this); }, + + center : function(e) + { + this.setCanvasPosition(); + }, loadCanvas : function(src) { @@ -44239,17 +44247,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); }, @@ -44281,12 +44309,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; @@ -44357,6 +44396,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 && @@ -44386,8 +44458,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 ) @@ -44611,7 +44687,7 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component, { this.previewEl.appendChild(this.canvasEl); - this.setCanvasPosition(); + this.setCanvasPosition(false); }, crop : function() @@ -45571,6 +45647,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 320437ca94..d59a2525b1 100644 --- a/roojs-ui.js +++ b/roojs-ui.js @@ -1958,20 +1958,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()); @@ -2041,4 +2047,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'}]}]}});