X-Git-Url: http://woldlab.caltech.edu/gitweb/?a=blobdiff_plain;f=qui%2Fseqbrowser%2FSequenceBrowser.cpp;h=4e1fbcd74421572b0b587bbe5fd1fc508b33f141;hb=a4afd5d6682accf2e2d0f414fb2e16813786eff3;hp=d92840dd635492ee63ca39bc96c3637badec219a;hpb=5adc65abb642a721263a58b49ac594993e7da5b6;p=mussa.git diff --git a/qui/seqbrowser/SequenceBrowser.cpp b/qui/seqbrowser/SequenceBrowser.cpp index d92840d..4e1fbcd 100644 --- a/qui/seqbrowser/SequenceBrowser.cpp +++ b/qui/seqbrowser/SequenceBrowser.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -20,18 +21,75 @@ using namespace std; SequenceBrowser::SequenceBrowser(QWidget *parent) : QGLWidget(parent), rubberBand(0), - popupMenu(this), - copySelectedSequenceAsFastaAction(tr("&Copy as Fasta"), this) + popupMenu(0), + copySelectedSequenceAsFastaAction(0), + copySelectedSequenceAsStringAction(0), + editSequencePropertiesAction(0), + clearSelectionAction(0) { - connect(©SelectedSequenceAsFastaAction, SIGNAL(triggered()), + popupMenu = new QMenu(this); + copySelectedSequenceAsFastaAction = new QAction(tr("&Copy as Fasta"), this); + connect(copySelectedSequenceAsFastaAction, SIGNAL(triggered()), this, SLOT(copySelectedSequenceAsFasta())); - popupMenu.addAction(©SelectedSequenceAsFastaAction); + 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) @@ -77,13 +135,25 @@ void SequenceBrowser::copySelectedSequenceAsFasta() { // 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() { @@ -93,16 +163,30 @@ void SequenceBrowser::clear() void SequenceBrowser::displayContextMenu(const QPoint& point) { - popupMenu.popup(point); + popupMenu->popup(point); } -void SequenceBrowser::push_sequence(const Sequence &s) +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 s) { GlSeqBrowser::push_sequence(s); emit tracksChanged(); } -void SequenceBrowser::push_sequence(GlSequence &gs) +void SequenceBrowser::push_sequence(boost::shared_ptr gs) { GlSeqBrowser::push_sequence(gs); emit tracksChanged(); @@ -131,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; } } @@ -143,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(); } } @@ -162,9 +249,11 @@ void SequenceBrowser::mouseReleaseEvent( QMouseEvent *e) } break; default: + e->ignore(); + return; break; } - + e->accept(); } void SequenceBrowser::startSelecting(QMouseEvent *e) @@ -191,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(); +}