blob: 63a0e056e9e772dcfcfb57533728159290bb4cee [file] [log] [blame]
chudy@google.com902ebe52012-06-29 14:21:22 +00001
2/*
3 * Copyright 2012 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9
chudy@google.com902ebe52012-06-29 14:21:22 +000010#include "SkCanvasWidget.h"
chudy@google.com902ebe52012-06-29 14:21:22 +000011
chudy@google.com607357f2012-08-07 16:12:23 +000012SkCanvasWidget::SkCanvasWidget(QWidget* parent,
13 SkDebugger* debugger) : QWidget(parent)
chudy@google.comea5488b2012-07-26 19:38:22 +000014 , fHorizontalLayout(this)
chudy@google.com607357f2012-08-07 16:12:23 +000015 , fRasterWidget(debugger)
16 , fGLWidget(debugger)
chudy@google.comea5488b2012-07-26 19:38:22 +000017{
chudy@google.com607357f2012-08-07 16:12:23 +000018
19 fDebugger = debugger;
20
chudy@google.comea5488b2012-07-26 19:38:22 +000021 fHorizontalLayout.setSpacing(6);
22 fHorizontalLayout.setContentsMargins(0,0,0,0);
23 fRasterWidget.setSizePolicy(QSizePolicy::Expanding,
24 QSizePolicy::Expanding);
25 fGLWidget.setSizePolicy(QSizePolicy::Expanding,
26 QSizePolicy::Expanding);
chudy@google.com902ebe52012-06-29 14:21:22 +000027
chudy@google.comea5488b2012-07-26 19:38:22 +000028 fHorizontalLayout.addWidget(&fRasterWidget);
29 fHorizontalLayout.addWidget(&fGLWidget);
chudy@google.com2f891792012-07-03 16:05:59 +000030
chudy@google.com2f891792012-07-03 16:05:59 +000031 fPreviousPoint.set(0,0);
bungeman@google.come8cc6e82013-01-17 16:30:56 +000032 fUserMatrix.reset();
chudy@google.com2f891792012-07-03 16:05:59 +000033
chudy@google.comea5488b2012-07-26 19:38:22 +000034 setWidgetVisibility(kGPU_WidgetType, true);
chudy@google.coma9e937c2012-08-03 17:32:05 +000035 connect(&fRasterWidget, SIGNAL(drawComplete()),
36 this->parentWidget(), SLOT(drawComplete()));
chudy@google.com902ebe52012-06-29 14:21:22 +000037}
38
chudy@google.com607357f2012-08-07 16:12:23 +000039SkCanvasWidget::~SkCanvasWidget() {}
chudy@google.com2d537a12012-07-31 12:49:52 +000040
chudy@google.comea5488b2012-07-26 19:38:22 +000041void SkCanvasWidget::drawTo(int index) {
chudy@google.com607357f2012-08-07 16:12:23 +000042 fDebugger->setIndex(index);
43 fRasterWidget.draw();
44 fGLWidget.draw();
45 emit commandChanged(fDebugger->index());
chudy@google.com2f891792012-07-03 16:05:59 +000046}
47
48void SkCanvasWidget::mouseMoveEvent(QMouseEvent* event) {
chudy@google.com2f891792012-07-03 16:05:59 +000049 SkIPoint eventPoint = SkIPoint::Make(event->globalX(), event->globalY());
bungeman@google.come8cc6e82013-01-17 16:30:56 +000050 SkIPoint eventOffset = eventPoint - fPreviousPoint;
chudy@google.com2f891792012-07-03 16:05:59 +000051 fPreviousPoint = eventPoint;
bungeman@google.come8cc6e82013-01-17 16:30:56 +000052 fUserMatrix.postTranslate(eventOffset.fX, eventOffset.fY);
53 fDebugger->setUserMatrix(fUserMatrix);
chudy@google.com607357f2012-08-07 16:12:23 +000054 drawTo(fDebugger->index());
chudy@google.com2f891792012-07-03 16:05:59 +000055}
56
57void SkCanvasWidget::mousePressEvent(QMouseEvent* event) {
58 fPreviousPoint.set(event->globalX(), event->globalY());
chudy@google.com607357f2012-08-07 16:12:23 +000059 emit hitChanged(fDebugger->getCommandAtPoint(event->x(), event->y(),
60 fDebugger->index()));
chudy@google.com2f891792012-07-03 16:05:59 +000061}
62
63void SkCanvasWidget::mouseDoubleClickEvent(QMouseEvent* event) {
bungeman@google.come8cc6e82013-01-17 16:30:56 +000064 Qt::KeyboardModifiers modifiers = event->modifiers();
65 if (modifiers.testFlag(Qt::ControlModifier)) {
66 snapWidgetTransform();
67 } else {
68 resetWidgetTransform();
69 }
70}
71
72#define ZOOM_FACTOR (1.25f)
73
74void SkCanvasWidget::wheelEvent(QWheelEvent* event) {
75 Qt::KeyboardModifiers modifiers = event->modifiers();
76 if (modifiers.testFlag(Qt::ControlModifier)) {
77 zoom(event->delta() > 0 ? ZOOM_FACTOR : (1.0f / ZOOM_FACTOR), event->x(), event->y());
78 } else {
79 if (Qt::Horizontal == event->orientation()) {
80 fUserMatrix.postTranslate(event->delta(), 0.0f);
81 } else {
82 fUserMatrix.postTranslate(0.0f, event->delta());
83 }
84 fDebugger->setUserMatrix(fUserMatrix);
85 drawTo(fDebugger->index());
86 }
87}
88
89void SkCanvasWidget::zoom(int zoomCommand) {
90 zoom(kIn_ZoomCommand == zoomCommand ? ZOOM_FACTOR : (1.0f / ZOOM_FACTOR),
91 this->size().width() / 2, this->size().height() / 2);
92}
93
94void SkCanvasWidget::snapWidgetTransform() {
95 double x, y;
96 modf(fUserMatrix.getTranslateX(), &x);
97 modf(fUserMatrix.getTranslateY(), &y);
98 fUserMatrix[SkMatrix::kMTransX] = x;
99 fUserMatrix[SkMatrix::kMTransY] = y;
100 fDebugger->setUserMatrix(fUserMatrix);
101 drawTo(fDebugger->index());
chudy@google.com902ebe52012-06-29 14:21:22 +0000102}
103
chudy@google.comea5488b2012-07-26 19:38:22 +0000104void SkCanvasWidget::resetWidgetTransform() {
bungeman@google.come8cc6e82013-01-17 16:30:56 +0000105 fUserMatrix.reset();
106 fDebugger->setUserMatrix(fUserMatrix);
107 emit scaleFactorChanged(fUserMatrix.getScaleX());
chudy@google.com607357f2012-08-07 16:12:23 +0000108 drawTo(fDebugger->index());
chudy@google.comea5488b2012-07-26 19:38:22 +0000109}
chudy@google.com902ebe52012-06-29 14:21:22 +0000110
chudy@google.comea5488b2012-07-26 19:38:22 +0000111void SkCanvasWidget::setWidgetVisibility(WidgetType type, bool isHidden) {
112 if (type == kRaster_8888_WidgetType) {
113 fRasterWidget.setHidden(isHidden);
114 } else if (type == kGPU_WidgetType) {
115 fGLWidget.setHidden(isHidden);
116 }
117}
chudy@google.com2f891792012-07-03 16:05:59 +0000118
bungeman@google.come8cc6e82013-01-17 16:30:56 +0000119void SkCanvasWidget::zoom(float scale, int px, int py) {
120 fUserMatrix.postScale(scale, scale, px, py);
121 emit scaleFactorChanged(fUserMatrix.getScaleX());
122 fDebugger->setUserMatrix(fUserMatrix);
chudy@google.com607357f2012-08-07 16:12:23 +0000123 drawTo(fDebugger->index());
chudy@google.com902ebe52012-06-29 14:21:22 +0000124}