SequenceBrowser::SequenceBrowser(QWidget *parent)
: QGLWidget(parent),
rubberBand(0),
- drawingBand(false)
+ 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)
+ : QGLWidget(parent),
+ GlSeqBrowser(sb),
+ rubberBand(sb.rubberBand),
+ popupMenu(sb.popupMenu),
+ copySelectedSequenceAsFastaAction(sb.copySelectedSequenceAsFastaAction),
+ copySelectedSequenceAsStringAction(sb.copySelectedSequenceAsStringAction),
+ editSequencePropertiesAction(sb.editSequencePropertiesAction),
+ clearSelectionAction(sb.clearSelectionAction)
+{
+ resize(sb.width(), sb.height());
+ setZoom(sb.zoom());
+ paintGL();
+}
+
+QMenu *SequenceBrowser::getPopupMenu()
+{
+ return popupMenu;
+}
+
+QAction *SequenceBrowser::getCopySelectedSequenceAsFastaAction()
+{
+ return copySelectedSequenceAsFastaAction;
+}
+
+QAction *SequenceBrowser::getCopySelectedSequenceAsStringAction()
+{
+ return copySelectedSequenceAsStringAction;
+}
+
+QAction *SequenceBrowser::getEditSequencePropertiesAction()
+{
+ return editSequencePropertiesAction;
}
QSize SequenceBrowser::sizeHint() const
{
- //return QSize((int)GlSeqBrowser::viewportHeight(), (int)GlSeqBrowser::viewportWidth());
- return QSize(600, 400);
+ return QSize(viewportPixelWidth(), viewportPixelHeight());
}
void SequenceBrowser::setViewportCenter(float x)
{
// get fasta data
std::string buffer;
- copySelectedTracksAsFasta(buffer);
+ size_t base_pairs_copied = copySelectedTracksAsFasta(buffer);
// get reference to clipboard
QClipboard *clipboard = QApplication::clipboard();
clipboard->setText(buffer.c_str());
+ emit basepairsCopied(base_pairs_copied);
}
+void SequenceBrowser::copySelectedSequenceAsString()
+{
+ // get fasta data
+ std::string buffer;
+ size_t base_pairs_copied = copySelectedTracksAsString(buffer);
+
+ // get reference to clipboard
+ QClipboard *clipboard = QApplication::clipboard();
+ clipboard->setText(buffer.c_str());
+ emit basepairsCopied(base_pairs_copied);
+}
void SequenceBrowser::clear()
{
emit tracksChanged();
}
-void SequenceBrowser::push_sequence(const Sequence &s)
+void SequenceBrowser::displayContextMenu(const QPoint& point)
+{
+ popupMenu->popup(point);
+}
+
+void SequenceBrowser::editSequenceProperties()
+{
+ // if there's a previous window, disconnect its signal
+ if (properties) {
+ disconnect(properties.get(), SIGNAL(propertiesChanged()),
+ this, SLOT(updateGL()));
+ }
+ PropertiesWindowRef new_properties(new PropertiesWindow(track_container));
+ properties = new_properties;
+ connect(properties.get(), SIGNAL(propertiesChanged()),
+ this, SLOT(updateGL()));
+ properties->show();
+}
+
+void SequenceBrowser::push_sequence(boost::shared_ptr<Sequence> s)
{
GlSeqBrowser::push_sequence(s);
emit tracksChanged();
}
-void SequenceBrowser::push_sequence(GlSequence &gs)
+void SequenceBrowser::push_sequence(boost::shared_ptr<GlSequence> gs)
{
GlSeqBrowser::push_sequence(gs);
emit tracksChanged();
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;
+ }
+}
+
+void SequenceBrowser::clearSelection()
+{
+ GlSeqBrowser::clearSelection();
+ if (rubberBand and rubberBand->isVisible()) {
+ rubberBand->hide();
}
+ updateGL();
}