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)),
26 editSequencePropertiesAction(new QAction(tr("Sequence &Properties"), this))
28 connect(copySelectedSequenceAsFastaAction, SIGNAL(triggered()),
29 this, SLOT(copySelectedSequenceAsFasta()));
30 popupMenu->addAction(copySelectedSequenceAsFastaAction);
31 copySelectedSequenceAsStringAction->setShortcut(Qt::CTRL | Qt::Key_C);
32 connect(copySelectedSequenceAsStringAction, SIGNAL(triggered()),
33 this, SLOT(copySelectedSequenceAsString()));
34 popupMenu->addAction(copySelectedSequenceAsStringAction);
35 // connect edit properties action
36 connect(editSequencePropertiesAction, SIGNAL(triggered()),
37 this, SLOT(editSequenceProperties()));
40 SequenceBrowser::SequenceBrowser(const SequenceBrowser& sb, QWidget *parent)
43 rubberBand(sb.rubberBand),
44 popupMenu(sb.popupMenu),
45 copySelectedSequenceAsFastaAction(sb.copySelectedSequenceAsFastaAction)
47 resize(sb.width(), sb.height());
52 QMenu *SequenceBrowser::getPopupMenu()
57 QAction *SequenceBrowser::getCopySelectedSequenceAsFastaAction()
59 return copySelectedSequenceAsFastaAction;
62 QAction *SequenceBrowser::getCopySelectedSequenceAsStringAction()
64 return copySelectedSequenceAsStringAction;
67 QAction *SequenceBrowser::getEditSequencePropertiesAction()
69 return editSequencePropertiesAction;
72 QSize SequenceBrowser::sizeHint() const
74 return QSize(viewportPixelWidth(), viewportPixelHeight());
77 void SequenceBrowser::setViewportCenter(float x)
79 const float epsilon = 1e-10;
80 float center = GlSeqBrowser::viewportCenter();
81 float difference = fabsf(x - center);
82 float abs_x = fabsf(x);
83 center = fabsf(center);
85 // the difference < epsilon * val is one of the recommended tests
86 // for float equality.
87 // of course since we're looking for not equals, we need to toss a
88 // not at the beginning
89 if (not (difference < epsilon * abs_x or difference < epsilon * center))
91 GlSeqBrowser::setViewportCenter(x);
92 emit viewportChanged();
97 void SequenceBrowser::setZoom(double new_zoom)
99 if (new_zoom != GlSeqBrowser::zoom()) {
100 GlSeqBrowser::setZoom(new_zoom);
101 emit viewportChanged();
106 void SequenceBrowser::setClipPlane(int )
109 if (clipZ != (double) newZ){
110 clipZ = (double) newZ;
116 void SequenceBrowser::copySelectedSequenceAsFasta()
120 size_t base_pairs_copied = copySelectedTracksAsFasta(buffer);
122 // get reference to clipboard
123 QClipboard *clipboard = QApplication::clipboard();
124 clipboard->setText(buffer.c_str());
125 emit basepairsCopied(base_pairs_copied);
128 void SequenceBrowser::copySelectedSequenceAsString()
132 size_t base_pairs_copied = copySelectedTracksAsString(buffer);
134 // get reference to clipboard
135 QClipboard *clipboard = QApplication::clipboard();
136 clipboard->setText(buffer.c_str());
137 emit basepairsCopied(base_pairs_copied);
140 void SequenceBrowser::clear()
142 GlSeqBrowser::clear();
143 emit tracksChanged();
146 void SequenceBrowser::displayContextMenu(const QPoint& point)
148 popupMenu->popup(point);
151 void SequenceBrowser::editSequenceProperties()
153 // if there's a previous window, disconnect its signal
155 disconnect(properties.get(), SIGNAL(propertiesChanged()),
156 this, SLOT(updateGL()));
158 PropertiesWindowRef new_properties(new PropertiesWindow(track_container));
159 properties = new_properties;
160 connect(properties.get(), SIGNAL(propertiesChanged()),
161 this, SLOT(updateGL()));
165 void SequenceBrowser::push_sequence(boost::shared_ptr<Sequence> s)
167 GlSeqBrowser::push_sequence(s);
168 emit tracksChanged();
171 void SequenceBrowser::push_sequence(boost::shared_ptr<GlSequence> gs)
173 GlSeqBrowser::push_sequence(gs);
174 emit tracksChanged();
179 void SequenceBrowser::initializeGL()
181 GlSeqBrowser::initializeGL();
184 void SequenceBrowser::resizeGL(int width, int height)
186 GlSeqBrowser::resizeGL(width, height);
187 emit viewportChanged();
190 void SequenceBrowser::paintGL()
192 GlSeqBrowser::paintGL();
195 void SequenceBrowser::mousePressEvent( QMouseEvent *e)
197 switch(e->button()) {
201 case Qt::RightButton:
208 void SequenceBrowser::mouseMoveEvent( QMouseEvent *e )
210 if (rubberBand and rubberBand->isVisible()) {
211 rubberBand->setGeometry(QRect(bandOrigin, e->pos()).normalized());
215 void SequenceBrowser::mouseReleaseEvent( QMouseEvent *e)
217 switch(e->button()) {
221 case Qt::RightButton:
222 // ok so selectedMode and drawing mode should probably be combinded
223 // into a single state variable.
225 not rubberBand->isVisible() and
226 selectedCanvasRegion.contains(e->pos())) {
227 displayContextMenu(e->globalPos());
236 void SequenceBrowser::startSelecting(QMouseEvent *e)
239 rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
241 if (not rubberBand->isVisible()) {
242 bandOrigin = e->pos();
243 rubberBand->setGeometry(QRect(bandOrigin, QSize()));
248 void SequenceBrowser::stopSelecting(QMouseEvent *e)
250 if (rubberBand and rubberBand->isVisible()) {
252 selectedMode = false;
253 QRect r = QRect(bandOrigin, e->pos()).normalized();
254 bandOrigin = r.topLeft();
256 selectRegion(r.top(), r.left(), r.bottom(), r.right());
257 selectedCanvasRegion = r;