1 #include <QApplication>
15 #include "qui/seqbrowser/SequenceBrowser.hpp"
16 #include "mussa_exceptions.hpp"
20 SequenceBrowser::SequenceBrowser(QWidget *parent)
24 copySelectedSequenceAsFastaAction(0),
25 copySelectedSequenceAsStringAction(0),
26 editSequencePropertiesAction(0)
28 popupMenu = new QMenu(this);
29 copySelectedSequenceAsFastaAction = new QAction(tr("&Copy as Fasta"), this);
30 copySelectedSequenceAsStringAction = new QAction(tr("&Copy Sequence"), this);
31 editSequencePropertiesAction = new QAction(tr("Sequence &Properties"), this);
33 connect(copySelectedSequenceAsFastaAction, SIGNAL(triggered()),
34 this, SLOT(copySelectedSequenceAsFasta()));
35 popupMenu->addAction(copySelectedSequenceAsFastaAction);
36 copySelectedSequenceAsStringAction->setShortcut(Qt::CTRL | Qt::Key_C);
37 connect(copySelectedSequenceAsStringAction, SIGNAL(triggered()),
38 this, SLOT(copySelectedSequenceAsString()));
39 popupMenu->addAction(copySelectedSequenceAsStringAction);
40 // connect edit properties action
41 connect(editSequencePropertiesAction, SIGNAL(triggered()),
42 this, SLOT(editSequenceProperties()));
45 SequenceBrowser::SequenceBrowser(const SequenceBrowser& sb, QWidget *parent)
48 rubberBand(sb.rubberBand),
49 popupMenu(sb.popupMenu),
50 copySelectedSequenceAsFastaAction(sb.copySelectedSequenceAsFastaAction)
52 resize(sb.width(), sb.height());
57 QMenu *SequenceBrowser::getPopupMenu()
62 QAction *SequenceBrowser::getCopySelectedSequenceAsFastaAction()
64 return copySelectedSequenceAsFastaAction;
67 QAction *SequenceBrowser::getCopySelectedSequenceAsStringAction()
69 return copySelectedSequenceAsStringAction;
72 QAction *SequenceBrowser::getEditSequencePropertiesAction()
74 return editSequencePropertiesAction;
77 QSize SequenceBrowser::sizeHint() const
79 return QSize(viewportPixelWidth(), viewportPixelHeight());
82 void SequenceBrowser::setViewportCenter(float x)
84 const float epsilon = 1e-10;
85 float center = GlSeqBrowser::viewportCenter();
86 float difference = fabsf(x - center);
87 float abs_x = fabsf(x);
88 center = fabsf(center);
90 // the difference < epsilon * val is one of the recommended tests
91 // for float equality.
92 // of course since we're looking for not equals, we need to toss a
93 // not at the beginning
94 if (not (difference < epsilon * abs_x or difference < epsilon * center))
96 GlSeqBrowser::setViewportCenter(x);
97 emit viewportChanged();
102 void SequenceBrowser::setZoom(double new_zoom)
104 if (new_zoom != GlSeqBrowser::zoom()) {
105 GlSeqBrowser::setZoom(new_zoom);
106 emit viewportChanged();
111 void SequenceBrowser::setClipPlane(int )
114 if (clipZ != (double) newZ){
115 clipZ = (double) newZ;
121 void SequenceBrowser::copySelectedSequenceAsFasta()
125 size_t base_pairs_copied = copySelectedTracksAsFasta(buffer);
127 // get reference to clipboard
128 QClipboard *clipboard = QApplication::clipboard();
129 clipboard->setText(buffer.c_str());
130 emit basepairsCopied(base_pairs_copied);
133 void SequenceBrowser::copySelectedSequenceAsString()
137 size_t base_pairs_copied = copySelectedTracksAsString(buffer);
139 // get reference to clipboard
140 QClipboard *clipboard = QApplication::clipboard();
141 clipboard->setText(buffer.c_str());
142 emit basepairsCopied(base_pairs_copied);
145 void SequenceBrowser::clear()
147 GlSeqBrowser::clear();
148 emit tracksChanged();
151 void SequenceBrowser::displayContextMenu(const QPoint& point)
153 popupMenu->popup(point);
156 void SequenceBrowser::editSequenceProperties()
158 // if there's a previous window, disconnect its signal
160 disconnect(properties.get(), SIGNAL(propertiesChanged()),
161 this, SLOT(updateGL()));
163 PropertiesWindowRef new_properties(new PropertiesWindow(track_container));
164 properties = new_properties;
165 connect(properties.get(), SIGNAL(propertiesChanged()),
166 this, SLOT(updateGL()));
170 void SequenceBrowser::push_sequence(boost::shared_ptr<Sequence> s)
172 GlSeqBrowser::push_sequence(s);
173 emit tracksChanged();
176 void SequenceBrowser::push_sequence(boost::shared_ptr<GlSequence> gs)
178 GlSeqBrowser::push_sequence(gs);
179 emit tracksChanged();
184 void SequenceBrowser::initializeGL()
186 GlSeqBrowser::initializeGL();
189 void SequenceBrowser::resizeGL(int width, int height)
191 GlSeqBrowser::resizeGL(width, height);
192 emit viewportChanged();
195 void SequenceBrowser::paintGL()
197 GlSeqBrowser::paintGL();
200 void SequenceBrowser::mousePressEvent( QMouseEvent *e)
202 switch(e->button()) {
206 case Qt::RightButton:
213 void SequenceBrowser::mouseMoveEvent( QMouseEvent *e )
215 if (rubberBand and rubberBand->isVisible()) {
216 rubberBand->setGeometry(QRect(bandOrigin, e->pos()).normalized());
220 void SequenceBrowser::mouseReleaseEvent( QMouseEvent *e)
222 switch(e->button()) {
226 case Qt::RightButton:
227 // ok so selectedMode and drawing mode should probably be combinded
228 // into a single state variable.
230 not rubberBand->isVisible() and
231 selectedCanvasRegion.contains(e->pos())) {
232 displayContextMenu(e->globalPos());
241 void SequenceBrowser::startSelecting(QMouseEvent *e)
244 rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
246 if (not rubberBand->isVisible()) {
247 bandOrigin = e->pos();
248 rubberBand->setGeometry(QRect(bandOrigin, QSize()));
253 void SequenceBrowser::stopSelecting(QMouseEvent *e)
255 if (rubberBand and rubberBand->isVisible()) {
257 selectedMode = false;
258 QRect r = QRect(bandOrigin, e->pos()).normalized();
259 bandOrigin = r.topLeft();
261 selectRegion(r.top(), r.left(), r.bottom(), r.right());
262 selectedCanvasRegion = r;