From: Brandon King Date: Mon, 23 Apr 2007 17:11:12 +0000 (+0000) Subject: Mouse scroll wheel zooming! =o) X-Git-Url: http://woldlab.caltech.edu/gitweb/?p=mussa.git;a=commitdiff_plain;h=58fe385bd7703c81343e08b13f2492380a5089c2 Mouse scroll wheel zooming! =o) * ticket:252 * MussaWindow & MussaAlignedWindows now zoom when using the mouse wheel. * SequenceBrowser emits mouseWheelZoom(double) when mouse whell use is detected. * SequenceBrowserWidget perculates the mouseWheelZoom(double) signal upward. * If you need to act on new mouse wheel zoom, you can connect to the signal at the SequenceBrowserWidget level. * Zoom automatically adjusts increment when switching form 1.0, 0.1, 0.01 levels for smooth zooming. --- diff --git a/qui/MussaAlignedWindow.cpp b/qui/MussaAlignedWindow.cpp index 085a8b6..7e4246d 100644 --- a/qui/MussaAlignedWindow.cpp +++ b/qui/MussaAlignedWindow.cpp @@ -40,6 +40,11 @@ MussaAlignedWindow::MussaAlignedWindow(MussaRef m, connect(zoom, SIGNAL(valueChanged(double)), &browser, SLOT(setZoom(double))); zoom->setValue(zoom_level); + + // Mouse scroll wheel zooming! + connect(&browser, SIGNAL(mouseWheelZoom(double)), + zoom, SLOT(setValue(double))); + computeMatchLines(); setupMenus(); setupAlignmentMenus(); diff --git a/qui/MussaWindow.cpp b/qui/MussaWindow.cpp index 80d855d..b0342e4 100644 --- a/qui/MussaWindow.cpp +++ b/qui/MussaWindow.cpp @@ -89,6 +89,10 @@ MussaWindow::MussaWindow(MussaRef analysis_, QWidget *parent) : connect(zoom, SIGNAL(valueChanged(double)), browser, SLOT(setZoom(double))); mussaViewTB->addWidget(zoom); + + // Mouse Wheel triggered zooming + connect(browser, SIGNAL(mouseWheelZoom(double)), + zoom, SLOT(setValue(double))); // threshold range is set in updateAnalysis connect(threshold, SIGNAL(thresholdChanged(int)), diff --git a/qui/seqbrowser/SequenceBrowser.cpp b/qui/seqbrowser/SequenceBrowser.cpp index 3e96ab9..3fe84d5 100644 --- a/qui/seqbrowser/SequenceBrowser.cpp +++ b/qui/seqbrowser/SequenceBrowser.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -275,6 +276,79 @@ void SequenceBrowser::stopSelecting(QMouseEvent *e) } } +void SequenceBrowser::wheelEvent(QWheelEvent *e) +{ + e->accept(); + double cur_zoom = GlSeqBrowser::zoom(); + + // Normalize so one 15 degree turn of the mouse wheel + // is equal to 1 step. + int num_degrees = e->delta() / 8; + int num_steps = num_degrees / 15; + + // Positive + if (num_steps >= 0) + { + // Invert number of steps because code was written + // thinking that adding a positve num_steps was zooming + // in, but because it's bp/pixel, it's actually zooming out. + // To get mouse wheel to zoom in, when pushing the wheel + // forward, I can use the existing code, by making num_steps + // negative here. + num_steps = num_steps * (-1); + + if (cur_zoom + num_steps >= 1.0) + { + emit mouseWheelZoom(cur_zoom + num_steps); + } + else if (cur_zoom > 1.0 && cur_zoom + num_steps < 1.0) + { + emit mouseWheelZoom(1.0); + } + else if (cur_zoom <= 0.1) + { + emit mouseWheelZoom(cur_zoom + ((double)num_steps*0.01)); + } + else if (cur_zoom <= 1.0 && cur_zoom + ((double)num_steps*0.1) >= 0.1) + { + emit mouseWheelZoom(cur_zoom + ((double)num_steps*0.1)); + } + else if (cur_zoom <= 1.0 && cur_zoom + ((double)num_steps*0.1) < 0.1) + { + emit mouseWheelZoom(0.1); + } + + } + // Negative + else + { + + // Invert number of steps because code was written + // thinking that adding a positve num_steps was zooming + // in, but because it's bp/pixel, it's actually zooming out. + // To get mouse wheel to zoom out, when pulling the wheel + // backwards, I can use the existing code, by making num_steps + // positive here. + num_steps = num_steps * (-1); + + if (cur_zoom >= 1.0) + { + emit mouseWheelZoom(cur_zoom+num_steps); + } + else if (cur_zoom < 1.0 && cur_zoom >= 0.1) + { + emit mouseWheelZoom(cur_zoom + ((double)num_steps*0.1)); + } + else if (cur_zoom < 0.1) + { + emit mouseWheelZoom(cur_zoom + ((double)num_steps*0.01)); + } + + } + + //cout << "Mouse wheel delta: " << num_degrees << "; " << num_steps << "\n"; +} + void SequenceBrowser::clearSelection() { GlSeqBrowser::clearSelection(); diff --git a/qui/seqbrowser/SequenceBrowser.hpp b/qui/seqbrowser/SequenceBrowser.hpp index 6576519..cea5f06 100644 --- a/qui/seqbrowser/SequenceBrowser.hpp +++ b/qui/seqbrowser/SequenceBrowser.hpp @@ -18,6 +18,7 @@ #include "qui/seqbrowser/seqproperties/PropertiesWindow.hpp" class QMouseEvent; +class QWheelEvent; class QRubberBand; /*! \brief Render mussa sequences and paths @@ -63,6 +64,7 @@ signals: void viewportChanged(); //! emit when someone copies basepairs void basepairsCopied(size_t); + void mouseWheelZoom(double); protected: void initializeGL(); @@ -78,6 +80,7 @@ protected: void mousePressEvent(QMouseEvent *); void mouseMoveEvent(QMouseEvent *); void mouseReleaseEvent(QMouseEvent *); + void wheelEvent(QWheelEvent *); void startSelecting(QMouseEvent *); void stopSelecting(QMouseEvent *); diff --git a/qui/seqbrowser/SequenceBrowserWidget.cpp b/qui/seqbrowser/SequenceBrowserWidget.cpp index 7ccf966..0ec2a6a 100644 --- a/qui/seqbrowser/SequenceBrowserWidget.cpp +++ b/qui/seqbrowser/SequenceBrowserWidget.cpp @@ -50,6 +50,10 @@ SequenceBrowserWidget::SequenceBrowserWidget( this, SLOT(updatePosition())); connect(&(scrollable_browser->browser()), SIGNAL(basepairsCopied(size_t)), this, SIGNAL(basepairsCopied(size_t))); + + // Send the signal mouseWheelZoom signal from seq browser upward. + connect(&(scrollable_browser->browser()), SIGNAL(mouseWheelZoom(double)), + this, SIGNAL(mouseWheelZoom(double))); } QSize SequenceBrowserWidget::sizeHint() const diff --git a/qui/seqbrowser/SequenceBrowserWidget.hpp b/qui/seqbrowser/SequenceBrowserWidget.hpp index 9b4e9c7..f57f9bb 100644 --- a/qui/seqbrowser/SequenceBrowserWidget.hpp +++ b/qui/seqbrowser/SequenceBrowserWidget.hpp @@ -84,6 +84,8 @@ public slots: signals: //! emit when someone copies basepairs void basepairsCopied(size_t); + //! emit when sequence browser alerts this widget of mouse wheel zoom event + void mouseWheelZoom(double); private: boost::shared_ptr default_dir;