Make navigating the picture view in debugger more functional.
https://codereview.appspot.com/7134049/


git-svn-id: http://skia.googlecode.com/svn/trunk@7253 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/debugger/QT/SkCanvasWidget.cpp b/debugger/QT/SkCanvasWidget.cpp
index 2f714d7..63a0e05 100644
--- a/debugger/QT/SkCanvasWidget.cpp
+++ b/debugger/QT/SkCanvasWidget.cpp
@@ -29,8 +29,7 @@
     fHorizontalLayout.addWidget(&fGLWidget);
 
     fPreviousPoint.set(0,0);
-    fUserOffset.set(0,0);
-    fUserScaleFactor = 1.0;
+    fUserMatrix.reset();
 
     setWidgetVisibility(kGPU_WidgetType, true);
     connect(&fRasterWidget, SIGNAL(drawComplete()),
@@ -48,9 +47,10 @@
 
 void SkCanvasWidget::mouseMoveEvent(QMouseEvent* event) {
     SkIPoint eventPoint = SkIPoint::Make(event->globalX(), event->globalY());
-    fUserOffset += eventPoint - fPreviousPoint;
+    SkIPoint eventOffset = eventPoint - fPreviousPoint;
     fPreviousPoint = eventPoint;
-    fDebugger->setUserOffset(fUserOffset);
+    fUserMatrix.postTranslate(eventOffset.fX, eventOffset.fY);
+    fDebugger->setUserMatrix(fUserMatrix);
     drawTo(fDebugger->index());
 }
 
@@ -61,15 +61,50 @@
 }
 
 void SkCanvasWidget::mouseDoubleClickEvent(QMouseEvent* event) {
-    resetWidgetTransform();
+    Qt::KeyboardModifiers modifiers = event->modifiers();
+    if (modifiers.testFlag(Qt::ControlModifier)) {
+        snapWidgetTransform();
+    } else {
+        resetWidgetTransform();
+    }
+}
+
+#define ZOOM_FACTOR (1.25f)
+
+void SkCanvasWidget::wheelEvent(QWheelEvent* event) {
+    Qt::KeyboardModifiers modifiers = event->modifiers();
+    if (modifiers.testFlag(Qt::ControlModifier)) {
+        zoom(event->delta() > 0 ? ZOOM_FACTOR : (1.0f / ZOOM_FACTOR), event->x(), event->y());
+    } else {
+        if (Qt::Horizontal == event->orientation()) {
+            fUserMatrix.postTranslate(event->delta(), 0.0f);
+        } else {
+            fUserMatrix.postTranslate(0.0f, event->delta());
+        }
+        fDebugger->setUserMatrix(fUserMatrix);
+        drawTo(fDebugger->index());
+    }
+}
+
+void SkCanvasWidget::zoom(int zoomCommand) {
+    zoom(kIn_ZoomCommand == zoomCommand ? ZOOM_FACTOR : (1.0f / ZOOM_FACTOR),
+         this->size().width() / 2, this->size().height() / 2);
+}
+
+void SkCanvasWidget::snapWidgetTransform() {
+    double x, y;
+    modf(fUserMatrix.getTranslateX(), &x);
+    modf(fUserMatrix.getTranslateY(), &y);
+    fUserMatrix[SkMatrix::kMTransX] = x;
+    fUserMatrix[SkMatrix::kMTransY] = y;
+    fDebugger->setUserMatrix(fUserMatrix);
+    drawTo(fDebugger->index());
 }
 
 void SkCanvasWidget::resetWidgetTransform() {
-    fUserOffset.set(0,0);
-    fUserScaleFactor = 1.0;
-    fDebugger->setUserOffset(fUserOffset);
-    fDebugger->setUserScale(fUserScaleFactor);
-    emit scaleFactorChanged(fUserScaleFactor);
+    fUserMatrix.reset();
+    fDebugger->setUserMatrix(fUserMatrix);
+    emit scaleFactorChanged(fUserMatrix.getScaleX());
     drawTo(fDebugger->index());
 }
 
@@ -81,17 +116,9 @@
     }
 }
 
-void SkCanvasWidget::zoom(float zoomIncrement) {
-    fUserScaleFactor += zoomIncrement;
-
-    /* The range of the fUserScaleFactor crosses over the range -1,0,1 frequently.
-    * Based on the code below, -1 and 1 both scale the image to it's original
-    * size we do the following to never have a registered wheel scroll
-    * not effect the fUserScaleFactor. */
-    if (fUserScaleFactor == 0) {
-        fUserScaleFactor = 2 * zoomIncrement;
-    }
-    emit scaleFactorChanged(fUserScaleFactor);
-    fDebugger->setUserScale(fUserScaleFactor);
+void SkCanvasWidget::zoom(float scale, int px, int py) {
+    fUserMatrix.postScale(scale, scale, px, py);
+    emit scaleFactorChanged(fUserMatrix.getScaleX());
+    fDebugger->setUserMatrix(fUserMatrix);
     drawTo(fDebugger->index());
 }