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());
}