ui/widgets/glxzoomwidget/src/glxzoomwidget.cpp
changeset 69 45459746d5e8
parent 62 36d93b4dc635
child 71 27f2d7aec52a
--- a/ui/widgets/glxzoomwidget/src/glxzoomwidget.cpp	Mon Sep 20 12:39:08 2010 +0530
+++ b/ui/widgets/glxzoomwidget/src/glxzoomwidget.cpp	Mon Sep 27 15:13:20 2010 +0530
@@ -29,6 +29,8 @@
 const int NOOFSTEPSZI = 24;
 const int NOOFSTEPSZO = 18;
 const float MAXDTZOOMIN = 3.5;
+const int NO_OF_STEPS_FOR_SPRINGBACK_AT_MAX = 12;
+const int NO_OF_STEPS_FOR_SPRINGBACK_AT_MIN = 5;
 
 GlxZoomWidget::GlxZoomWidget(QGraphicsItem *parent):HbScrollArea(parent), 
             mModel(NULL), mMinZValue(MINZVALUE), 
@@ -62,6 +64,7 @@
 	//AA: signal and slot to perform double tap animation
     //after every step redraw, signal is emitted to perform the next step
 	connect( this, SIGNAL( stepZoom() ), this, SLOT( animateDoubleTap() ), Qt::QueuedConnection );
+	mDoubleTap = false;
 }
 
 GlxZoomWidget::~GlxZoomWidget()
@@ -144,6 +147,7 @@
         resetDecoder();
     }
     mZoomItem->setPixmap(QPixmap());
+	mBlackBackgroundItem->setParentItem(this);
 }
 
 void GlxZoomWidget::activate()
@@ -238,26 +242,26 @@
 
        if (pinchG->state() == Qt::GestureFinished) {
                //For giving a spring effect when user has zoomed more than normal.
-               if(mStepCurrentSize.width() > mMaxScaleDecSize.width())   {
-                   //scale the image to limited size
-                   qreal value = mMaxScaleDecSize.width()/mCurrentSize.width();
-                   QPointF center(mWindowSize.width()/2, mWindowSize.height()/2);
-                   QPointF sceneGestureCenter = source->sceneTransform().map(center);
-                   zoomImage(value, sceneGestureCenter);
-               }
-               mPinchGestureOngoing = false;
-                //finalize the transforms to the geometry else panning will not work
-                finalizeWidgetTransform();
+		  mPinchGestureOngoing = false;               
+        //scale the image to limited size
+		if(mCurrentSize.width() > mMaxScaleDecSize.width() )
+        {
+        	  QPointF center(mWindowSize.width()/2, mWindowSize.height()/2);
+		       m_AnimRefPoint = source->sceneTransform().map(center);
+		       springEffectAtMax();
+               return true;
+		}
        
-//push the Zoom widget to background when zoomed image size nears FS image
-           if(mStepCurrentSize.width() <= mMinDecScaleSize.width()*1.3)  {
-               mBlackBackgroundItem->hide();
-               //push the widget back to background
-               setZValue(mMinZValue);
-               mZoomOngoing = false;
-               emit zoomWidgetMovedBackground(mFocusIndex);
+		if(mCurrentSize.width() < mMinDecScaleSize.width())
+        {
+              QPointF center(mWindowSize.width()/2, mWindowSize.height()/2);
+              m_AnimRefPoint = source->sceneTransform().map(center);
+              springEffectAtMin();
+              return true;
                //do not reset the transform here as it will then zoom-in the widget to decoded image size
-           }
+        }
+        //finalize the transforms to the geometry else panning will not work
+        finalizeWidgetTransform();
        }
        //gesture accepted
        return true;
@@ -269,6 +273,38 @@
      return true;
 
 }
+void GlxZoomWidget::springEffectAtMax()
+{
+    //set the no. of steps for double tap animation 
+    mdoubletapSteps = NO_OF_STEPS_FOR_SPRINGBACK_AT_MAX;
+    //initiale variable for double tap animation
+    mIncSF = 1;
+    
+    //For giving a spring effect when user has zoomed out more than normal.
+    //Zoom out to mMaxScaleDecSize from the currentsize
+    m_FinalAnimatedScaleFactor = mMaxScaleDecSize.width()/mCurrentSize.width();
+    //calculate the step increment SF for each step
+    msfInc = (1 - m_FinalAnimatedScaleFactor)/(mdoubletapSteps);
+    //preserve the size when zoom out was initiated, requried for calculates applicable/req scale factor
+    minitSize = mCurrentSize;
+    animateDoubleTap();
+}
+
+void GlxZoomWidget::springEffectAtMin()
+{
+      
+        m_FinalAnimatedScaleFactor = mMinDecScaleSize.width()/mCurrentSize.width();
+        //set the no. of steps for double tap animation 
+        mdoubletapSteps = NO_OF_STEPS_FOR_SPRINGBACK_AT_MIN;
+        //initiale variable for double tap animation
+        mIncSF = 1;
+        //SF has to always greater than 1 for upscaling, hence range for zoomout is [1,m_FinalAnimatedScaleFactor]
+        msfInc = (m_FinalAnimatedScaleFactor-1)/mdoubletapSteps;
+        //preserve the size when zoom out was initiated, requried for calculates applicable/req scale factor
+        minitSize = mCurrentSize;
+        animateDoubleTap();
+       
+}
 
 void GlxZoomWidget::zoomImage(qreal zoomFactor, QPointF center)
 {
@@ -297,8 +333,8 @@
     if(requiredSize.width() > mMaxScaleSize.width() ) {
         requiredSize = mMaxScaleSize ;
     }
-    else if(requiredSize.width() < mMinDecScaleSize.width() ) {
-        requiredSize = mMinDecScaleSize ;
+    else if(requiredSize.width() < mMinScaleSize.width() ) {
+        requiredSize = mMinScaleSize ;
     }
 
 
@@ -579,6 +615,7 @@
 
 void GlxZoomWidget::animateDoubleTap()
     {
+    mDoubleTap = true;
     //calculate increamental scale factor based on the step and then calculate the applicable scale factor this step
     //increamental SF works on the ImageSize when double tap started, applicable(required) SF calculates the delate SF
     if(m_FinalAnimatedScaleFactor > 1) {
@@ -609,15 +646,24 @@
 void GlxZoomWidget::animationTimeLineFinished()
 {
 	finalizeWidgetTransform();
-//push the Zoom widget to background when zoomed image size nears FS image
-           if(mStepCurrentSize.width() <= mMinDecScaleSize.width()*1.3)  {
+    //push the Zoom widget to background when zoomed image size nears FS image
+	if(mDoubleTap && (mStepCurrentSize.width() <= mMinDecScaleSize.width()*1.3))  {
                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
-           }
+			   mDoubleTap = false;
+    }
+	if(mCurrentSize.width() == mMinDecScaleSize.width()) {
+	    	mBlackBackgroundItem->hide();
+    	 	//push the widget back to background
+	         setZValue(mMinZValue);
+	         mZoomOngoing = false;
+	         emit zoomWidgetMovedBackground(mFocusIndex);
+	       
+	}
 }