From 2a8ba70047ddc4a2b68574ee567a2c2c7970b048 Mon Sep 17 00:00:00 2001 From: Ethereal Date: Sun, 27 Feb 2011 13:03:42 -0700 Subject: [PATCH] Implemented basic scaling in BasicViewport. --- doc/ROADMAP | 14 ++++++------- include/artisan/gviewport/BasicViewport.h | 5 +++++ include/artisan/gviewport/Rect.h | 16 +++++++++++++++ src/artisan/gviewport/BasicViewport.cpp | 34 +++++++++++++++++++++++++------ 4 files changed, 55 insertions(+), 14 deletions(-) diff --git a/doc/ROADMAP b/doc/ROADMAP index 02f534b..4e20409 100644 --- a/doc/ROADMAP +++ b/doc/ROADMAP @@ -1,13 +1,11 @@ -0.5.0: Working communication between monitor and visualizer, no visualizations. - Estimated date: 05/11 -0.6.0: Visualization framework complete. - Estimated date: 06/11 +0.6.0: Artisan GViewport implementation complete. + Estimated date: 04/11 0.7.0: Basic module visualizations. - Estimated date: 07/11 + Estimated date: 04/11 0.8.0: Module implementations. - Estimated date: 08/11 + Estimated date: 05/11 0.9.0: 32-bit support. - Estimated date: 09/11 + Estimated date: 06/11 1.0.0: Polishing, release. - Estimated date: 10/11 + Estimated date: 08/11 diff --git a/include/artisan/gviewport/BasicViewport.h b/include/artisan/gviewport/BasicViewport.h index 8b67dd9..2fe4395 100644 --- a/include/artisan/gviewport/BasicViewport.h +++ b/include/artisan/gviewport/BasicViewport.h @@ -19,6 +19,8 @@ namespace Artisan { namespace GViewport { +class Renderer; + class BasicViewport : public Viewport { Q_OBJECT private: Data *m_data; @@ -47,6 +49,9 @@ protected: virtual void paintEvent(QPaintEvent *event); virtual void mouseMoveEvent(QMouseEvent *event); virtual void mousePressEvent(QMouseEvent *event); + virtual void wheelEvent(QWheelEvent *event); +private: + void enqueue(Renderer *renderer); }; } // namespace GViewport diff --git a/include/artisan/gviewport/Rect.h b/include/artisan/gviewport/Rect.h index fcc0e28..8c3d57a 100644 --- a/include/artisan/gviewport/Rect.h +++ b/include/artisan/gviewport/Rect.h @@ -83,6 +83,22 @@ public: Rect operator+(const Point &point) const { return Rect(m_left + point.x(), m_right + point.x(), m_top + point.y(), m_bottom + point.y()); } + + void scaleWidth(double factor) { + double w = width() / 2; + double centreX = m_left + w; + w *= factor; + m_left = centreX - w; + m_right = centreX + w; + } + + void scaleHeight(double factor) { + double h = height()/2; + double centreY = m_top + h; + h *= factor; + m_top = centreY - h; + m_bottom = centreY + h; + } }; } // namespace GViewport diff --git a/src/artisan/gviewport/BasicViewport.cpp b/src/artisan/gviewport/BasicViewport.cpp index 431112f..379b8a4 100644 --- a/src/artisan/gviewport/BasicViewport.cpp +++ b/src/artisan/gviewport/BasicViewport.cpp @@ -52,18 +52,14 @@ void BasicViewport::updateRange(const Rect &range) { image.merge(m_image); m_image = image; - Renderer *renderer = new Renderer(m_image.dataRange(), m_image.pixelSize(), m_data); - connect(renderer, SIGNAL(finishedRendering(RenderedImage *)), this, SLOT(acceptRenderedImage(RenderedImage *))); - renderer->enqueue(); + enqueue(new Renderer(m_image.dataRange(), m_image.pixelSize(), m_data)); } void BasicViewport::resizeEvent(QResizeEvent *event) { RenderedImage image(m_image.dataRange(), Rect(event->size())); image.merge(m_image); m_image = image; - Renderer *renderer = new Renderer(m_image.dataRange(), Rect(event->size()), m_data); - connect(renderer, SIGNAL(finishedRendering(RenderedImage *)), this, SLOT(acceptRenderedImage(RenderedImage *))); - renderer->enqueue(); + enqueue(new Renderer(m_image.dataRange(), Rect(event->size()), m_data)); } void BasicViewport::paintEvent(QPaintEvent *event) { @@ -85,5 +81,31 @@ void BasicViewport::mousePressEvent(QMouseEvent *event) { m_lastPoint = event->pos(); } +void BasicViewport::wheelEvent(QWheelEvent *event) { + double factor = 1.0 - (event->delta() / 1200.0); + + Rect newRange = m_image.dataRange(); + + if(event->modifiers() & Qt::ShiftModifier) { + newRange.scaleHeight(factor); + } + else if(event->modifiers() & Qt::ControlModifier) { + newRange.scaleWidth(factor); + } + else { + newRange.scaleHeight(factor); + newRange.scaleWidth(factor); + } + + updateRange(newRange); +} + +void BasicViewport::enqueue(Renderer *renderer) { + connect(renderer, SIGNAL(finishedRendering(RenderedImage *)), + this, SLOT(acceptRenderedImage(RenderedImage *)), + Qt::QueuedConnection); + renderer->enqueue(); +} + } // namespace GViewport } // namespace Artisan -- 2.11.4.GIT