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(viewportPixelWidth(), viewportPixelHeight());
68 void SequenceBrowser::setViewportCenter(float x)
70 const float epsilon = 1e-10;
71 float center = GlSeqBrowser::viewportCenter();
72 float difference = fabsf(x - center);
73 float abs_x = fabsf(x);
74 center = fabsf(center);
76 // the difference < epsilon * val is one of the recommended tests
77 // for float equality.
78 // of course since we're looking for not equals, we need to toss a
79 // not at the beginning
80 if (not (difference < epsilon * abs_x or difference < epsilon * center))
82 GlSeqBrowser::setViewportCenter(x);
83 emit viewportChanged();
88 void SequenceBrowser::setZoom(double new_zoom)
90 if (new_zoom != GlSeqBrowser::zoom()) {
91 GlSeqBrowser::setZoom(new_zoom);
92 emit viewportChanged();
97 void SequenceBrowser::setClipPlane(int )
100 if (clipZ != (double) newZ){
101 clipZ = (double) newZ;
107 void SequenceBrowser::copySelectedSequenceAsFasta()
111 size_t base_pairs_copied = copySelectedTracksAsFasta(buffer);
113 // get reference to clipboard
114 QClipboard *clipboard = QApplication::clipboard();
115 clipboard->setText(buffer.c_str());
116 emit basepairsCopied(base_pairs_copied);
119 void SequenceBrowser::copySelectedSequenceAsString()
123 size_t base_pairs_copied = copySelectedTracksAsString(buffer);
125 // get reference to clipboard
126 QClipboard *clipboard = QApplication::clipboard();
127 clipboard->setText(buffer.c_str());
128 emit basepairsCopied(base_pairs_copied);
131 void SequenceBrowser::clear()
133 GlSeqBrowser::clear();
134 emit tracksChanged();
137 void SequenceBrowser::displayContextMenu(const QPoint& point)
139 popupMenu->popup(point);
142 void SequenceBrowser::push_sequence(boost::shared_ptr<Sequence> s)
144 GlSeqBrowser::push_sequence(s);
145 emit tracksChanged();
148 void SequenceBrowser::push_sequence(boost::shared_ptr<GlSequence> gs)
150 GlSeqBrowser::push_sequence(gs);
151 emit tracksChanged();
156 void SequenceBrowser::initializeGL()
158 GlSeqBrowser::initializeGL();
161 void SequenceBrowser::resizeGL(int width, int height)
163 GlSeqBrowser::resizeGL(width, height);
164 emit viewportChanged();
167 void SequenceBrowser::paintGL()
169 GlSeqBrowser::paintGL();
172 void SequenceBrowser::mousePressEvent( QMouseEvent *e)
174 switch(e->button()) {
178 case Qt::RightButton:
185 void SequenceBrowser::mouseMoveEvent( QMouseEvent *e )
187 if (rubberBand and rubberBand->isVisible()) {
188 rubberBand->setGeometry(QRect(bandOrigin, e->pos()).normalized());
192 void SequenceBrowser::mouseReleaseEvent( QMouseEvent *e)
194 switch(e->button()) {
198 case Qt::RightButton:
199 // ok so selectedMode and drawing mode should probably be combinded
200 // into a single state variable.
202 not rubberBand->isVisible() and
203 selectedCanvasRegion.contains(e->pos())) {
204 displayContextMenu(e->globalPos());
213 void SequenceBrowser::startSelecting(QMouseEvent *e)
216 rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
218 if (not rubberBand->isVisible()) {
219 bandOrigin = e->pos();
220 rubberBand->setGeometry(QRect(bandOrigin, QSize()));
225 void SequenceBrowser::stopSelecting(QMouseEvent *e)
227 if (rubberBand and rubberBand->isVisible()) {
229 selectedMode = false;
230 QRect r = QRect(bandOrigin, e->pos()).normalized();
231 bandOrigin = r.topLeft();
233 selectRegion(r.top(), r.left(), r.bottom(), r.right());
234 selectedCanvasRegion = r;