1 #include <QApplication>
15 #include "qui/seqbrowser/SequenceBrowser.hpp"
16 #include "mussa_exceptions.hpp"
20 SequenceBrowser::SequenceBrowser(QWidget *parent)
23 popupMenu(new QMenu(this)),
24 copySelectedSequenceAsFastaAction(new QAction(tr("&Copy as Fasta"), this))
26 connect(copySelectedSequenceAsFastaAction, SIGNAL(triggered()),
27 this, SLOT(copySelectedSequenceAsFasta()));
28 copySelectedSequenceAsFastaAction->setShortcut(Qt::CTRL | Qt::Key_C);
29 popupMenu->addAction(copySelectedSequenceAsFastaAction);
32 SequenceBrowser::SequenceBrowser(const SequenceBrowser& sb, QWidget *parent)
35 rubberBand(sb.rubberBand),
36 popupMenu(sb.popupMenu),
37 copySelectedSequenceAsFastaAction(sb.copySelectedSequenceAsFastaAction)
39 resize(sb.width(), sb.height());
44 QMenu *SequenceBrowser::getPopupMenu()
49 QAction *SequenceBrowser::getCopySelectedSequenceAsFastaAction()
51 return copySelectedSequenceAsFastaAction;
55 QSize SequenceBrowser::sizeHint() const
57 //return QSize((int)GlSeqBrowser::viewportHeight(), (int)GlSeqBrowser::viewportWidth());
58 return QSize(600, 400);
61 void SequenceBrowser::setViewportCenter(float x)
63 const float epsilon = 1e-10;
64 float center = GlSeqBrowser::viewportCenter();
65 float difference = fabsf(x - center);
66 float abs_x = fabsf(x);
67 center = fabsf(center);
69 // the difference < epsilon * val is one of the recommended tests
70 // for float equality.
71 // of course since we're looking for not equals, we need to toss a
72 // not at the beginning
73 if (not (difference < epsilon * abs_x or difference < epsilon * center))
75 GlSeqBrowser::setViewportCenter(x);
76 emit viewportChanged();
81 void SequenceBrowser::setZoom(double new_zoom)
83 if (new_zoom != GlSeqBrowser::zoom()) {
84 GlSeqBrowser::setZoom(new_zoom);
85 emit viewportChanged();
90 void SequenceBrowser::setClipPlane(int )
93 if (clipZ != (double) newZ){
94 clipZ = (double) newZ;
100 void SequenceBrowser::copySelectedSequenceAsFasta()
104 copySelectedTracksAsFasta(buffer);
106 // get reference to clipboard
107 QClipboard *clipboard = QApplication::clipboard();
108 clipboard->setText(buffer.c_str());
112 void SequenceBrowser::clear()
114 GlSeqBrowser::clear();
115 emit tracksChanged();
118 void SequenceBrowser::displayContextMenu(const QPoint& point)
120 popupMenu->popup(point);
123 void SequenceBrowser::push_sequence(boost::shared_ptr<Sequence> s)
125 GlSeqBrowser::push_sequence(s);
126 emit tracksChanged();
129 void SequenceBrowser::push_sequence(boost::shared_ptr<GlSequence> gs)
131 GlSeqBrowser::push_sequence(gs);
132 emit tracksChanged();
137 void SequenceBrowser::initializeGL()
139 GlSeqBrowser::initializeGL();
142 void SequenceBrowser::resizeGL(int width, int height)
144 GlSeqBrowser::resizeGL(width, height);
145 emit viewportChanged();
148 void SequenceBrowser::paintGL()
150 GlSeqBrowser::paintGL();
153 void SequenceBrowser::mousePressEvent( QMouseEvent *e)
155 switch(e->button()) {
159 case Qt::RightButton:
166 void SequenceBrowser::mouseMoveEvent( QMouseEvent *e )
168 if (rubberBand and rubberBand->isVisible()) {
169 rubberBand->setGeometry(QRect(bandOrigin, e->pos()).normalized());
173 void SequenceBrowser::mouseReleaseEvent( QMouseEvent *e)
175 switch(e->button()) {
179 case Qt::RightButton:
180 // ok so selectedMode and drawing mode should probably be combinded
181 // into a single state variable.
183 not rubberBand->isVisible() and
184 selectedCanvasRegion.contains(e->pos())) {
185 displayContextMenu(e->globalPos());
194 void SequenceBrowser::startSelecting(QMouseEvent *e)
197 rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
199 if (not rubberBand->isVisible()) {
200 bandOrigin = e->pos();
201 rubberBand->setGeometry(QRect(bandOrigin, QSize()));
206 void SequenceBrowser::stopSelecting(QMouseEvent *e)
208 if (rubberBand and rubberBand->isVisible()) {
210 selectedMode = false;
211 QRect r = QRect(bandOrigin, e->pos()).normalized();
212 bandOrigin = r.topLeft();
214 selectRegion(r.top(), r.left(), r.bottom(), r.right());
215 selectedCanvasRegion = r;