Mouse scroll wheel zooming! =o)
[mussa.git] / qui / seqbrowser / SequenceBrowser.cpp
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();