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),
27 clearSelectionAction(0)
29 popupMenu = new QMenu(this);
30 copySelectedSequenceAsFastaAction = new QAction(tr("&Copy as Fasta"), this);
31 connect(copySelectedSequenceAsFastaAction, SIGNAL(triggered()),
32 this, SLOT(copySelectedSequenceAsFasta()));
33 popupMenu->addAction(copySelectedSequenceAsFastaAction);
35 copySelectedSequenceAsStringAction = new QAction(tr("&Copy Sequence"), this);
36 copySelectedSequenceAsStringAction->setShortcut(Qt::CTRL | Qt::Key_C);
37 connect(copySelectedSequenceAsStringAction, SIGNAL(triggered()),
38 this, SLOT(copySelectedSequenceAsString()));
39 popupMenu->addAction(copySelectedSequenceAsStringAction);
41 // connect edit properties action
42 editSequencePropertiesAction = new QAction(tr("Sequence &Properties"), this);
43 connect(editSequencePropertiesAction, SIGNAL(triggered()),
44 this, SLOT(editSequenceProperties()));
46 clearSelectionAction = new QAction(tr("Clear Selection"), this);
47 clearSelectionAction->setShortcut(Qt::Key_Escape);
48 connect(clearSelectionAction, SIGNAL(triggered()),
49 this, SLOT(clearSelection()));
50 this->addAction(clearSelectionAction);
54 SequenceBrowser::SequenceBrowser(const SequenceBrowser& sb, QWidget *parent)
57 rubberBand(sb.rubberBand),
58 popupMenu(sb.popupMenu),
59 copySelectedSequenceAsFastaAction(sb.copySelectedSequenceAsFastaAction),
60 copySelectedSequenceAsStringAction(sb.copySelectedSequenceAsStringAction),
61 editSequencePropertiesAction(sb.editSequencePropertiesAction),
62 clearSelectionAction(sb.clearSelectionAction)
64 resize(sb.width(), sb.height());
69 QMenu *SequenceBrowser::getPopupMenu()
74 QAction *SequenceBrowser::getCopySelectedSequenceAsFastaAction()
76 return copySelectedSequenceAsFastaAction;
79 QAction *SequenceBrowser::getCopySelectedSequenceAsStringAction()
81 return copySelectedSequenceAsStringAction;
84 QAction *SequenceBrowser::getEditSequencePropertiesAction()
86 return editSequencePropertiesAction;
89 QSize SequenceBrowser::sizeHint() const
91 return QSize(viewportPixelWidth(), viewportPixelHeight());
94 void SequenceBrowser::setViewportCenter(float x)
96 const float epsilon = 1e-10;
97 float center = GlSeqBrowser::viewportCenter();
98 float difference = fabsf(x - center);
99 float abs_x = fabsf(x);
100 center = fabsf(center);
102 // the difference < epsilon * val is one of the recommended tests
103 // for float equality.
104 // of course since we're looking for not equals, we need to toss a
105 // not at the beginning
106 if (not (difference < epsilon * abs_x or difference < epsilon * center))
108 GlSeqBrowser::setViewportCenter(x);
109 emit viewportChanged();
114 void SequenceBrowser::setZoom(double new_zoom)
116 if (new_zoom != GlSeqBrowser::zoom()) {
117 GlSeqBrowser::setZoom(new_zoom);
118 emit viewportChanged();
123 void SequenceBrowser::setClipPlane(int )
126 if (clipZ != (double) newZ){
127 clipZ = (double) newZ;
133 void SequenceBrowser::copySelectedSequenceAsFasta()
137 size_t base_pairs_copied = copySelectedTracksAsFasta(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::copySelectedSequenceAsString()
149 size_t base_pairs_copied = copySelectedTracksAsString(buffer);
151 // get reference to clipboard
152 QClipboard *clipboard = QApplication::clipboard();
153 clipboard->setText(buffer.c_str());
154 emit basepairsCopied(base_pairs_copied);
157 void SequenceBrowser::clear()
159 GlSeqBrowser::clear();
160 emit tracksChanged();
163 void SequenceBrowser::displayContextMenu(const QPoint& point)
165 popupMenu->popup(point);
168 void SequenceBrowser::editSequenceProperties()
170 // if there's a previous window, disconnect its signal
172 disconnect(properties.get(), SIGNAL(propertiesChanged()),
173 this, SLOT(updateGL()));
175 PropertiesWindowRef new_properties(new PropertiesWindow(track_container));
176 properties = new_properties;
177 connect(properties.get(), SIGNAL(propertiesChanged()),
178 this, SLOT(updateGL()));
182 void SequenceBrowser::push_sequence(boost::shared_ptr<Sequence> s)
184 GlSeqBrowser::push_sequence(s);
185 emit tracksChanged();
188 void SequenceBrowser::push_sequence(boost::shared_ptr<GlSequence> gs)
190 GlSeqBrowser::push_sequence(gs);
191 emit tracksChanged();
196 void SequenceBrowser::initializeGL()
198 GlSeqBrowser::initializeGL();
201 void SequenceBrowser::resizeGL(int width, int height)
203 GlSeqBrowser::resizeGL(width, height);
204 emit viewportChanged();
207 void SequenceBrowser::paintGL()
209 GlSeqBrowser::paintGL();
212 void SequenceBrowser::mousePressEvent( QMouseEvent *e)
214 switch(e->button()) {
218 case Qt::RightButton:
225 void SequenceBrowser::mouseMoveEvent( QMouseEvent *e )
227 if (rubberBand and rubberBand->isVisible()) {
228 rubberBand->setGeometry(QRect(bandOrigin, e->pos()).normalized());
232 void SequenceBrowser::mouseReleaseEvent( QMouseEvent *e)
234 switch(e->button()) {
238 case Qt::RightButton:
239 // ok so selectedMode and drawing mode should probably be combinded
240 // into a single state variable.
242 not rubberBand->isVisible() and
243 selectedCanvasRegion.contains(e->pos())) {
244 displayContextMenu(e->globalPos());
253 void SequenceBrowser::startSelecting(QMouseEvent *e)
256 rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
258 if (not rubberBand->isVisible()) {
259 bandOrigin = e->pos();
260 rubberBand->setGeometry(QRect(bandOrigin, QSize()));
265 void SequenceBrowser::stopSelecting(QMouseEvent *e)
267 if (rubberBand and rubberBand->isVisible()) {
269 selectedMode = false;
270 QRect r = QRect(bandOrigin, e->pos()).normalized();
271 bandOrigin = r.topLeft();
273 selectRegion(r.top(), r.left(), r.bottom(), r.right());
274 selectedCanvasRegion = r;
278 void SequenceBrowser::clearSelection()
280 GlSeqBrowser::clearSelection();
281 if (rubberBand and rubberBand->isVisible()) {