Mouse scroll wheel zooming! =o)
authorBrandon King <kingb@caltech.edu>
Mon, 23 Apr 2007 17:11:12 +0000 (17:11 +0000)
committerBrandon King <kingb@caltech.edu>
Mon, 23 Apr 2007 17:11:12 +0000 (17:11 +0000)
 * 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.

qui/MussaAlignedWindow.cpp
qui/MussaWindow.cpp
qui/seqbrowser/SequenceBrowser.cpp
qui/seqbrowser/SequenceBrowser.hpp
qui/seqbrowser/SequenceBrowserWidget.cpp
qui/seqbrowser/SequenceBrowserWidget.hpp

index 085a8b67e2bc4788602a2b231ad0e03bab0d4dd9..7e4246dfb79509db70a90d15dd275605d9e4646e 100644 (file)
@@ -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();
index 80d855d438089c4ead1c6ccf595190c9e801c79f..b0342e40c0e186ba7731a28367735985f424d12d 100644 (file)
@@ -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)),
index 3e96ab9470160ff59fae82def121a0fe5ae9b62a..3fe84d58eb28620c419425e10509d595216bb9b1 100644 (file)
@@ -4,6 +4,7 @@
 #include <QFileDialog>
 #include <QMessageBox>
 #include <QMouseEvent>
+#include <QWheelEvent>
 #include <QRubberBand>
 #include <QRect>
 #include <QString>
@@ -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();
index 65765198e415e1d7e82439e9674a38c20a4ceec6..cea5f069bbc51df0303702d13b37e2a77f6deb54 100644 (file)
@@ -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 *);
index 7ccf966ab9962ea57cfb663a1ee791c264c5d3a5..0ec2a6afe8fe098ba21ce08fafd853d1840233b1 100644 (file)
@@ -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
index 9b4e9c7d74e21706313959d56fd7d45f65504b0a..f57f9bb3a256703b30bca7a4ec864448e1593a93 100644 (file)
@@ -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<QDir> default_dir;