ui/widgets/glxzoomwidget/src/glxzoomwidget.cpp
changeset 50 a0f57508af73
parent 45 863223ea6961
child 52 a3a4c0de738e
--- a/ui/widgets/glxzoomwidget/src/glxzoomwidget.cpp	Fri Jun 25 15:41:33 2010 +0530
+++ b/ui/widgets/glxzoomwidget/src/glxzoomwidget.cpp	Sat Jul 10 00:59:39 2010 +0530
@@ -19,11 +19,12 @@
 #include <hbiconitem.h>
 #include <QTimeLine>
 #include <QGesture>
+#include <hbinstance.h>
 #include "glximagedecoderwrapper.h"
 #include "glxmodelparm.h"
 #include "glxzoomwidget.h"
 
-GlxZoomWidget::GlxZoomWidget(QGraphicsItem *parent):HbScrollArea(parent), mModel(NULL), mMinZValue(MINZVALUE), mMaxZValue(MAXZVALUE), mImageDecodeRequestSend(false), mPinchGestureOngoing(false), mDecodedImageAvailable(false), mTimerId(0)
+GlxZoomWidget::GlxZoomWidget(QGraphicsItem *parent):HbScrollArea(parent), mModel(NULL), mMinZValue(MINZVALUE), mMaxZValue(MAXZVALUE), mImageDecodeRequestSend(false), mPinchGestureOngoing(false), mDecodedImageAvailable(false),mZoomOngoing(false), mTimerId(0)
 {
     grabGesture(Qt::PinchGesture);
     grabGesture(Qt::TapGesture);
@@ -83,11 +84,30 @@
     mWindowSize = windowSize;
     mBlackBackgroundItem->setGeometry(QRectF(QPointF(0,0), mWindowSize));
     //try to reset the max and min zoomed size here
+    //In case the zoom widget is in background reset it
+    if(!mZoomOngoing && mModel) {
+        retreiveFocusedImage();
+    }
+    setZoomParams();
+}
+
+void GlxZoomWidget::forceZoomToBackground()
+{
+    mBlackBackgroundItem->hide();
+    //push the widget back to background
+    setZValue(mMinZValue);
+    mZoomOngoing = false;
+    emit zoomWidgetMovedBackground(mFocusIndex);
+    //this actually resets the ZoomWidget and decoder
+    if(mImageDecoder) {
+        mImageDecoder->resetDecoder();
+    }
+    retreiveFocusedImage();
+
 }
 
 void GlxZoomWidget::indexChanged(int index)
 {
-    Q_UNUSED(index);
     if(mFocusIndex != index) {
         mImageDecoder->resetDecoder();//reset the decoder first to cancel pending tasks
         mImageDecodeRequestSend = false;
@@ -162,7 +182,7 @@
             else {
                 killTimer(mTimerId);
                 mTimerId = 0;
-                animateZoomOut(gesture->position());
+                animateZoomOut(hbInstance->allMainWindows().first()->mapToScene(gesture->position().toPoint()));
             }
         }
         event->accept(gesture);
@@ -173,6 +193,7 @@
        QPinchGesture::ChangeFlags changeFlags = pinchG->changeFlags();
        if (changeFlags & QPinchGesture::ScaleFactorChanged) {
             mPinchGestureOngoing = true;
+            mZoomOngoing = true;
             //bring the zoom widget to foreground
             setZValue(mMaxZValue);
             //show the black background
@@ -184,7 +205,7 @@
             qreal value = pinchG->scaleFactor() / pinchG->lastScaleFactor();
             QPointF center = pinchG->property("centerPoint").toPointF();
             //set the gesture center to the scene coordinates
-            QPointF sceneGestureCenter = source->sceneTransform().map(center);
+            QPointF sceneGestureCenter = hbInstance->allMainWindows().first()->mapToScene(center.toPoint());
             zoomImage(value, sceneGestureCenter);
 
         }
@@ -211,6 +232,7 @@
                mBlackBackgroundItem->hide();
                //push the widget back to background
                setZValue(mMinZValue);
+               mZoomOngoing = false;
                emit zoomWidgetMovedBackground(mFocusIndex);
                //do not reset the transform here as it will then zoom-in the widget to decoded image size
            }
@@ -228,6 +250,10 @@
 
 void GlxZoomWidget::zoomImage(qreal zoomFactor, QPointF center)
 {
+        // Pinch event filtering for very small zoom factors
+    if (qAbs(1.0 - zoomFactor) < 0.007) {
+        return;
+    }
     adjustGestureCenter(center, zoomFactor);
     QSizeF requiredSize(mCurrentSize.width()*zoomFactor, mCurrentSize.height()*zoomFactor);
     limitRequiredSize(requiredSize);
@@ -279,42 +305,49 @@
 
     }
     //maintains the boundary of the edges for zoom out conditions
-    if(zoomFactor < 1)
-    {
+    if(zoomFactor < 1) {
         QPointF itemOriginPos = mZoomWidget->sceneTransform().map(QPointF(0,0));
         bool hasWidthExceededWindow = mCurrentSize.width() > mWindowSize.width();
         bool hasHeightExceededWindow = mCurrentSize.height() > mWindowSize.height();
-        if(itemOriginPos.x() >= 0)  {
-        //image has crossed left boundry leaving blank space
-            if(hasWidthExceededWindow) {
+        if(hasWidthExceededWindow) {
+            bool hasItemCrossedBoundary = false;
+            if(itemOriginPos.x() >= -5)  {
+                //image has crossed left boundry leaving blank space
                 //stick the gesture to the left corner
                 gestureCenter.setX(itemOriginPos.x());
+                hasItemCrossedBoundary = true;
+            }
+        
+            //Check if the right boundry can be adjusted
+            if(itemOriginPos.x()+ mCurrentSize.width() <= mWindowSize.width()+5) {
+                //Image is before the right boundry leaving blank space
+                gestureCenter.setX(itemOriginPos.x()+ mCurrentSize.width() );
+                hasItemCrossedBoundary = true;
+            }
+            if((mCurrentSize.width() - mWindowSize.width() <= 20) && !hasItemCrossedBoundary) {
+                gestureCenter.setX(mWindowSize.width()/2 + (qAbs(itemOriginPos.x()) - 10));
             }
         }
-        //Check if the right boundry can be adjusted
-        if(itemOriginPos.x()+ mCurrentSize.width() <= mWindowSize.width()) {
+
+        if(hasHeightExceededWindow) {
+             bool hasItemCrossedBoundary = false;
+            //check if the upper boundry could be adjusted
+            if(itemOriginPos.y() >= -5) {
+                //image has crossed the upper boundry leaving blank space
+                //stick the image to the upper boundry
+                gestureCenter.setY(itemOriginPos.y());
+                hasItemCrossedBoundary = true;
+            }
+            //check if the lower boundry could be adjusted
+            if(itemOriginPos.y()+ mCurrentSize.height() <= mWindowSize.height()+5) {
                 //Image is before the right boundry leaving blank space
-                if(hasWidthExceededWindow) {
-                    //stick the gesture to the right corner
-                    gestureCenter.setX(itemOriginPos.x()+ mCurrentSize.width());
-                }
-        }
-        //check if the upper boundry could be adjusted
-        if(itemOriginPos.y() >= 0) {
-                //image has crossed the upper boundry leaving blank space
-                if(hasHeightExceededWindow) {
-                    //stick the image to the upper boundry
-                    gestureCenter.setY(itemOriginPos.y());
-                }
-        }
-        //check if the lower boundry could be adjusted
-        if(itemOriginPos.y()+ mCurrentSize.height() <= mWindowSize.height()) {
-        //Image is before the right boundry leaving blank space
-            if(hasHeightExceededWindow) {
                 //stick the image to the right corner
                 gestureCenter.setY(itemOriginPos.y()+ mCurrentSize.height());
+                hasItemCrossedBoundary = true;
             }
-
+            if((mCurrentSize.height() - mWindowSize.height() <= 20) && !hasItemCrossedBoundary) {
+                gestureCenter.setY(mWindowSize.height()/2 + (qAbs(itemOriginPos.y()) - 10));
+            }
         }
     }
     //control the zoom Factor to boundaries
@@ -460,14 +493,35 @@
 
 }
 
+void GlxZoomWidget::setZoomParams()
+{
+    if (mModel)  {
+        QVariant sizeVariant = mModel->data(mModel->index(mFocusIndex,0),GlxDimensionsRole);
+        QSize fsSize;
+        if(sizeVariant.isValid() &&  sizeVariant.canConvert<QSize> ()) {
+            fsSize = sizeVariant.toSize();
+            if(!(fsSize.width() < mWindowSize.width() && fsSize.height() < mWindowSize.height()))  {
+                fsSize.scale( mWindowSize, Qt::KeepAspectRatio);
+            }
+            mMaxScaleSize = fsSize;
+            mMaxScaleSize.scale(mWindowSize*13, Qt::KeepAspectRatio);
+            mMaxScaleDecSize = fsSize;
+            mMaxScaleDecSize.scale(mWindowSize*7, Qt::KeepAspectRatio);
+            mMinScaleSize = fsSize* 0.7;
+            mMinDecScaleSize = fsSize;
+        }
+    }
 
 
+}
+
 
 
 void GlxZoomWidget::animateZoomIn(QPointF animRefPoint)
 {
       emit pinchGestureReceived(mFocusIndex);
             //bring the zoom widget to foreground
+            mZoomOngoing = true;
             setZValue(mMaxZValue);
             //show the black background
             mBlackBackgroundItem->setParentItem(parentItem());
@@ -510,6 +564,7 @@
                mBlackBackgroundItem->hide();
                //push the widget back to background
                setZValue(mMinZValue);
+               mZoomOngoing = false;
                emit zoomWidgetMovedBackground(mFocusIndex);
                //do not reset the transform here as it will then zoom-in the widget to decoded image size
            }