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 size_t base_pairs_copied = copySelectedTracksAsFasta(buffer);
106 // get reference to clipboard
107 QClipboard *clipboard = QApplication::clipboard();
108 clipboard->setText(buffer.c_str());
109 emit basepairsCopied(base_pairs_copied);
113 void SequenceBrowser::clear()
115 GlSeqBrowser::clear();
116 emit tracksChanged();
119 void SequenceBrowser::displayContextMenu(const QPoint& point)
121 popupMenu->popup(point);
124 void SequenceBrowser::push_sequence(boost::shared_ptr<Sequence> s)
126 GlSeqBrowser::push_sequence(s);
127 emit tracksChanged();
130 void SequenceBrowser::push_sequence(boost::shared_ptr<GlSequence> gs)
132 GlSeqBrowser::push_sequence(gs);
133 emit tracksChanged();
138 void SequenceBrowser::initializeGL()
140 GlSeqBrowser::initializeGL();
143 void SequenceBrowser::resizeGL(int width, int height)
145 GlSeqBrowser::resizeGL(width, height);
146 emit viewportChanged();
149 void SequenceBrowser::paintGL()
151 GlSeqBrowser::paintGL();
154 void SequenceBrowser::mousePressEvent( QMouseEvent *e)
156 switch(e->button()) {
160 case Qt::RightButton:
167 void SequenceBrowser::mouseMoveEvent( QMouseEvent *e )
169 if (rubberBand and rubberBand->isVisible()) {
170 rubberBand->setGeometry(QRect(bandOrigin, e->pos()).normalized());
174 void SequenceBrowser::mouseReleaseEvent( QMouseEvent *e)
176 switch(e->button()) {
180 case Qt::RightButton:
181 // ok so selectedMode and drawing mode should probably be combinded
182 // into a single state variable.
184 not rubberBand->isVisible() and
185 selectedCanvasRegion.contains(e->pos())) {
186 displayContextMenu(e->globalPos());
195 void SequenceBrowser::startSelecting(QMouseEvent *e)
198 rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
200 if (not rubberBand->isVisible()) {
201 bandOrigin = e->pos();
202 rubberBand->setGeometry(QRect(bandOrigin, QSize()));
207 void SequenceBrowser::stopSelecting(QMouseEvent *e)
209 if (rubberBand and rubberBand->isVisible()) {
211 selectedMode = false;
212 QRect r = QRect(bandOrigin, e->pos()).normalized();
213 bandOrigin = r.topLeft();
215 selectRegion(r.top(), r.left(), r.bottom(), r.right());
216 selectedCanvasRegion = r;