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)),
25 copySelectedSequenceAsStringAction(new QAction(tr("&Copy Sequence"), this))
27 connect(copySelectedSequenceAsFastaAction, SIGNAL(triggered()),
28 this, SLOT(copySelectedSequenceAsFasta()));
29 popupMenu->addAction(copySelectedSequenceAsFastaAction);
30 copySelectedSequenceAsStringAction->setShortcut(Qt::CTRL | Qt::Key_C);
31 connect(copySelectedSequenceAsStringAction, SIGNAL(triggered()),
32 this, SLOT(copySelectedSequenceAsString()));
33 popupMenu->addAction(copySelectedSequenceAsStringAction);
36 SequenceBrowser::SequenceBrowser(const SequenceBrowser& sb, QWidget *parent)
39 rubberBand(sb.rubberBand),
40 popupMenu(sb.popupMenu),
41 copySelectedSequenceAsFastaAction(sb.copySelectedSequenceAsFastaAction)
43 resize(sb.width(), sb.height());
48 QMenu *SequenceBrowser::getPopupMenu()
53 QAction *SequenceBrowser::getCopySelectedSequenceAsFastaAction()
55 return copySelectedSequenceAsFastaAction;
58 QAction *SequenceBrowser::getCopySelectedSequenceAsStringAction()
60 return copySelectedSequenceAsStringAction;
63 QSize SequenceBrowser::sizeHint() const
65 //return QSize((int)GlSeqBrowser::viewportHeight(), (int)GlSeqBrowser::viewportWidth());
66 return QSize(600, 400);
69 void SequenceBrowser::setViewportCenter(float x)
71 const float epsilon = 1e-10;
72 float center = GlSeqBrowser::viewportCenter();
73 float difference = fabsf(x - center);
74 float abs_x = fabsf(x);
75 center = fabsf(center);
77 // the difference < epsilon * val is one of the recommended tests
78 // for float equality.
79 // of course since we're looking for not equals, we need to toss a
80 // not at the beginning
81 if (not (difference < epsilon * abs_x or difference < epsilon * center))
83 GlSeqBrowser::setViewportCenter(x);
84 emit viewportChanged();
89 void SequenceBrowser::setZoom(double new_zoom)
91 if (new_zoom != GlSeqBrowser::zoom()) {
92 GlSeqBrowser::setZoom(new_zoom);
93 emit viewportChanged();
98 void SequenceBrowser::setClipPlane(int )
101 if (clipZ != (double) newZ){
102 clipZ = (double) newZ;
108 void SequenceBrowser::copySelectedSequenceAsFasta()
112 size_t base_pairs_copied = copySelectedTracksAsFasta(buffer);
114 // get reference to clipboard
115 QClipboard *clipboard = QApplication::clipboard();
116 clipboard->setText(buffer.c_str());
117 emit basepairsCopied(base_pairs_copied);
120 void SequenceBrowser::copySelectedSequenceAsString()
124 size_t base_pairs_copied = copySelectedTracksAsString(buffer);
126 // get reference to clipboard
127 QClipboard *clipboard = QApplication::clipboard();
128 clipboard->setText(buffer.c_str());
129 emit basepairsCopied(base_pairs_copied);
132 void SequenceBrowser::clear()
134 GlSeqBrowser::clear();
135 emit tracksChanged();
138 void SequenceBrowser::displayContextMenu(const QPoint& point)
140 popupMenu->popup(point);
143 void SequenceBrowser::push_sequence(boost::shared_ptr<Sequence> s)
145 GlSeqBrowser::push_sequence(s);
146 emit tracksChanged();
149 void SequenceBrowser::push_sequence(boost::shared_ptr<GlSequence> gs)
151 GlSeqBrowser::push_sequence(gs);
152 emit tracksChanged();
157 void SequenceBrowser::initializeGL()
159 GlSeqBrowser::initializeGL();
162 void SequenceBrowser::resizeGL(int width, int height)
164 GlSeqBrowser::resizeGL(width, height);
165 emit viewportChanged();
168 void SequenceBrowser::paintGL()
170 GlSeqBrowser::paintGL();
173 void SequenceBrowser::mousePressEvent( QMouseEvent *e)
175 switch(e->button()) {
179 case Qt::RightButton:
186 void SequenceBrowser::mouseMoveEvent( QMouseEvent *e )
188 if (rubberBand and rubberBand->isVisible()) {
189 rubberBand->setGeometry(QRect(bandOrigin, e->pos()).normalized());
193 void SequenceBrowser::mouseReleaseEvent( QMouseEvent *e)
195 switch(e->button()) {
199 case Qt::RightButton:
200 // ok so selectedMode and drawing mode should probably be combinded
201 // into a single state variable.
203 not rubberBand->isVisible() and
204 selectedCanvasRegion.contains(e->pos())) {
205 displayContextMenu(e->globalPos());
214 void SequenceBrowser::startSelecting(QMouseEvent *e)
217 rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
219 if (not rubberBand->isVisible()) {
220 bandOrigin = e->pos();
221 rubberBand->setGeometry(QRect(bandOrigin, QSize()));
226 void SequenceBrowser::stopSelecting(QMouseEvent *e)
228 if (rubberBand and rubberBand->isVisible()) {
230 selectedMode = false;
231 QRect r = QRect(bandOrigin, e->pos()).normalized();
232 bandOrigin = r.topLeft();
234 selectRegion(r.top(), r.left(), r.bottom(), r.right());
235 selectedCanvasRegion = r;