implement selection context menu
authorDiane Trout <diane@caltech.edu>
Wed, 14 Jun 2006 02:43:50 +0000 (02:43 +0000)
committerDiane Trout <diane@caltech.edu>
Wed, 14 Jun 2006 02:43:50 +0000 (02:43 +0000)
so it isn't perfect, left clicking can cause it to get confused and lose
the selection. But it mostly works if one doesn't taunt it too much.

qui/seqbrowser/SequenceBrowser.cpp
qui/seqbrowser/SequenceBrowser.hpp

index 587d1705a60b251c37f307902ad513e6e91e7033..d92840dd635492ee63ca39bc96c3637badec219a 100644 (file)
@@ -20,8 +20,12 @@ using namespace std;
 SequenceBrowser::SequenceBrowser(QWidget *parent)
   : QGLWidget(parent),
     rubberBand(0),
-    drawingBand(false)
+    popupMenu(this),
+    copySelectedSequenceAsFastaAction(tr("&Copy as Fasta"), this)
 { 
+  connect(&copySelectedSequenceAsFastaAction, SIGNAL(triggered()), 
+          this, SLOT(copySelectedSequenceAsFasta()));
+  popupMenu.addAction(&copySelectedSequenceAsFastaAction);
 }
 
 QSize SequenceBrowser::sizeHint() const
@@ -87,6 +91,11 @@ void SequenceBrowser::clear()
   emit tracksChanged();
 }
 
+void SequenceBrowser::displayContextMenu(const QPoint& point)
+{
+  popupMenu.popup(point);
+}
+
 void SequenceBrowser::push_sequence(const Sequence &s)
 {
   GlSeqBrowser::push_sequence(s);
@@ -119,31 +128,66 @@ void SequenceBrowser::paintGL()
 
 void SequenceBrowser::mousePressEvent( QMouseEvent *e)
 {
-  drawingBand = true;
-
-  selectedMode = false;
-  bandOrigin = e->pos();
-  if (!rubberBand)
-    rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
-  
-  rubberBand->setGeometry(QRect(bandOrigin, QSize()));
-  rubberBand->show();
+  switch(e->button()) {
+    case Qt::LeftButton:
+      startSelecting(e);
+      break;
+   case Qt::RightButton:
+      break;
+   default:
+      break;
+  }
 }
 
-void SequenceBrowser::mouseMoveEvent( QMouseEvent *e)
+void SequenceBrowser::mouseMoveEvent( QMouseEvent *e )
 {
-  if (drawingBand)
+  if (rubberBand and rubberBand->isVisible()) {
     rubberBand->setGeometry(QRect(bandOrigin, e->pos()).normalized());
+  }
 }
 
 void SequenceBrowser::mouseReleaseEvent( QMouseEvent *e)
 {
-  drawingBand = false;
-  if (rubberBand != 0) {
+  switch(e->button()) {
+    case Qt::LeftButton:
+      stopSelecting(e);
+      break;
+   case Qt::RightButton:
+      // ok so selectedMode and drawing mode should probably be combinded
+      // into a single state variable.
+      if (rubberBand and 
+          not rubberBand->isVisible() and
+          selectedCanvasRegion.contains(e->pos())) {
+        displayContextMenu(e->globalPos());
+      }
+      break;
+   default:
+      break;
+  }
+
+}
+
+void SequenceBrowser::startSelecting(QMouseEvent *e)
+{
+  if (!rubberBand)
+    rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
+
+  if (not rubberBand->isVisible()) {
+    bandOrigin = e->pos();
+    rubberBand->setGeometry(QRect(bandOrigin, QSize()));
+    rubberBand->show();
+  }
+}
+
+void SequenceBrowser::stopSelecting(QMouseEvent *e)
+{
+  if (rubberBand and rubberBand->isVisible()) {
     rubberBand->hide();
+    selectedMode = false;
     QRect r = QRect(bandOrigin, e->pos()).normalized();
     bandOrigin = r.topLeft();
   
     selectRegion(r.top(), r.left(), r.bottom(), r.right());
+    selectedCanvasRegion = r;
   }
 }
index f50558dc89851a07ff0f405600c0ae306da03dd4..bfdcf6a444626141a3deebdcbd4e0365e89f409b 100644 (file)
@@ -1,11 +1,13 @@
 #ifndef _PATHSCENE_H_
 #define _PATHSCENE_H_
 
+#include <QAction>
 #include <QGLWidget>
+#include <QMenu>
 #include <QRectF>
 #include <QPoint>
-#include <vector>
 
+#include <vector>
 #include <set>
 
 #include "alg/mussa.hpp"
@@ -31,6 +33,7 @@ public:
       
 public slots:
   void copySelectedSequenceAsFasta();
+  void displayContextMenu(const QPoint &p);
   void setClipPlane(int z);
   //! set the center of the current viewport
   void setViewportCenter(float x);
@@ -42,17 +45,26 @@ signals:
   void tracksChanged();
   void viewportChanged();
 
-private:
+protected:
   void initializeGL();
   void resizeGL(int height, int width);
   void paintGL();
 
   //! \defgroup Selection
+  /* \@{ */
   QRubberBand *rubberBand;
   QPoint bandOrigin;
-  bool drawingBand;
+  QRect selectedDisplayRegion;
+  QRect selectedCanvasRegion;
   void mousePressEvent(QMouseEvent *);
   void mouseMoveEvent(QMouseEvent *);
   void mouseReleaseEvent(QMouseEvent *);
+
+  void startSelecting(QMouseEvent *);
+  void stopSelecting(QMouseEvent *);
+  /* \@} */
+
+  QMenu popupMenu;
+  QAction copySelectedSequenceAsFastaAction;
 };
 #endif