simplify zoom code
[mussa.git] / qui / seqbrowser / SequenceBrowser.cpp
index 0f2868eb23e1cc6d144e6bbed4e847a76eb21f52..4e1fbcd74421572b0b587bbe5fd1fc508b33f141 100644 (file)
@@ -4,6 +4,7 @@
 #include <QFileDialog>
 #include <QMessageBox>
 #include <QMouseEvent>
+#include <QWheelEvent>
 #include <QRubberBand>
 #include <QRect>
 #include <QString>
@@ -20,21 +21,35 @@ using namespace std;
 SequenceBrowser::SequenceBrowser(QWidget *parent)
   : QGLWidget(parent),
     rubberBand(0),
-    popupMenu(new QMenu(this)),
-    copySelectedSequenceAsFastaAction(new QAction(tr("&Copy as Fasta"), this)),
-    copySelectedSequenceAsStringAction(new QAction(tr("&Copy Sequence"), this)),
-    editSequencePropertiesAction(new QAction(tr("Sequence &Properties"), this))
+    popupMenu(0),
+    copySelectedSequenceAsFastaAction(0),
+    copySelectedSequenceAsStringAction(0),
+    editSequencePropertiesAction(0),
+    clearSelectionAction(0)
 { 
+  popupMenu = new QMenu(this);
+  copySelectedSequenceAsFastaAction = new QAction(tr("&Copy as Fasta"), this);
   connect(copySelectedSequenceAsFastaAction, SIGNAL(triggered()), 
           this, SLOT(copySelectedSequenceAsFasta()));
   popupMenu->addAction(copySelectedSequenceAsFastaAction);
+
+  copySelectedSequenceAsStringAction = new QAction(tr("&Copy Sequence"), this);
   copySelectedSequenceAsStringAction->setShortcut(Qt::CTRL | Qt::Key_C);
   connect(copySelectedSequenceAsStringAction, SIGNAL(triggered()), 
           this, SLOT(copySelectedSequenceAsString()));
   popupMenu->addAction(copySelectedSequenceAsStringAction);
+
   // connect edit properties action
+  editSequencePropertiesAction = new QAction(tr("Sequence &Properties"), this);
   connect(editSequencePropertiesAction, SIGNAL(triggered()), 
           this, SLOT(editSequenceProperties()));
+          
+  clearSelectionAction = new QAction(tr("Clear Selection"), this);
+  clearSelectionAction->setShortcut(Qt::Key_Escape);
+  connect(clearSelectionAction, SIGNAL(triggered()), 
+          this, SLOT(clearSelection()));
+  this->addAction(clearSelectionAction);          
+  
 }
 
 SequenceBrowser::SequenceBrowser(const SequenceBrowser& sb, QWidget *parent)
@@ -42,7 +57,10 @@ SequenceBrowser::SequenceBrowser(const SequenceBrowser& sb, QWidget *parent)
     GlSeqBrowser(sb),
     rubberBand(sb.rubberBand),
     popupMenu(sb.popupMenu),
-    copySelectedSequenceAsFastaAction(sb.copySelectedSequenceAsFastaAction)
+    copySelectedSequenceAsFastaAction(sb.copySelectedSequenceAsFastaAction),
+    copySelectedSequenceAsStringAction(sb.copySelectedSequenceAsStringAction),
+    editSequencePropertiesAction(sb.editSequencePropertiesAction),
+    clearSelectionAction(sb.clearSelectionAction)
 {
   resize(sb.width(), sb.height());
   setZoom(sb.zoom());
@@ -197,10 +215,10 @@ void SequenceBrowser::mousePressEvent( QMouseEvent *e)
   switch(e->button()) {
     case Qt::LeftButton:
       startSelecting(e);
-      break;
-   case Qt::RightButton:
+      e->accept();
       break;
    default:
+      e->ignore();
       break;
   }
 }
@@ -209,6 +227,9 @@ void SequenceBrowser::mouseMoveEvent( QMouseEvent *e )
 {
   if (rubberBand and rubberBand->isVisible()) {
     rubberBand->setGeometry(QRect(bandOrigin, e->pos()).normalized());
+    e->accept();
+  } else {
+    e->ignore();
   }
 }
 
@@ -228,9 +249,11 @@ void SequenceBrowser::mouseReleaseEvent( QMouseEvent *e)
       }
       break;
    default:
+      e->ignore();
+      return;
       break;
   }
-
+  e->accept();
 }
 
 void SequenceBrowser::startSelecting(QMouseEvent *e)
@@ -257,3 +280,28 @@ void SequenceBrowser::stopSelecting(QMouseEvent *e)
     selectedCanvasRegion = r;
   }
 }
+
+void SequenceBrowser::wheelEvent(QWheelEvent *e)
+{
+  e->accept();
+  double cur_zoom = GlSeqBrowser::zoom();
+  
+  // Normalize so one turn of the mouse wheel
+  // is equal to 1 step.
+  const int normalize_tick = 120;
+  // arbitrary scaling factor that seems to "work"
+  const int scaling = 50;
+  int num_steps = e->delta() / normalize_tick;
+
+  cur_zoom = pow(10, log10(cur_zoom) - ((double)num_steps/scaling));
+  emit mouseWheelZoom(cur_zoom);
+}
+
+void SequenceBrowser::clearSelection()
+{
+  GlSeqBrowser::clearSelection();
+  if (rubberBand and rubberBand->isVisible()) {
+    rubberBand->hide();
+  }
+  updateGL();
+}