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(editSequencePropertiesAction, SIGNAL(triggered()),
36 this, SLOT(editSequenceProperties()));
37 popupMenu->addAction(editSequencePropertiesAction);
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 QSize SequenceBrowser::sizeHint() const
69 return QSize(viewportPixelWidth(), viewportPixelHeight());
72 void SequenceBrowser::setViewportCenter(float x)
74 const float epsilon = 1e-10;
75 float center = GlSeqBrowser::viewportCenter();
76 float difference = fabsf(x - center);
77 float abs_x = fabsf(x);
78 center = fabsf(center);
80 // the difference < epsilon * val is one of the recommended tests
81 // for float equality.
82 // of course since we're looking for not equals, we need to toss a
83 // not at the beginning
84 if (not (difference < epsilon * abs_x or difference < epsilon * center))
86 GlSeqBrowser::setViewportCenter(x);
87 emit viewportChanged();
92 void SequenceBrowser::setZoom(double new_zoom)
94 if (new_zoom != GlSeqBrowser::zoom()) {
95 GlSeqBrowser::setZoom(new_zoom);
96 emit viewportChanged();
101 void SequenceBrowser::setClipPlane(int )
104 if (clipZ != (double) newZ){
105 clipZ = (double) newZ;
111 void SequenceBrowser::copySelectedSequenceAsFasta()
115 size_t base_pairs_copied = copySelectedTracksAsFasta(buffer);
117 // get reference to clipboard
118 QClipboard *clipboard = QApplication::clipboard();
119 clipboard->setText(buffer.c_str());
120 emit basepairsCopied(base_pairs_copied);
123 void SequenceBrowser::copySelectedSequenceAsString()
127 size_t base_pairs_copied = copySelectedTracksAsString(buffer);
129 // get reference to clipboard
130 QClipboard *clipboard = QApplication::clipboard();
131 clipboard->setText(buffer.c_str());
132 emit basepairsCopied(base_pairs_copied);
135 void SequenceBrowser::clear()
137 GlSeqBrowser::clear();
138 emit tracksChanged();
141 void SequenceBrowser::displayContextMenu(const QPoint& point)
143 popupMenu->popup(point);
146 void SequenceBrowser::editSequenceProperties()
148 PropertiesWindowRef new_properties(new PropertiesWindow(sequences()));
149 properties = new_properties;
153 void SequenceBrowser::push_sequence(boost::shared_ptr<Sequence> s)
155 GlSeqBrowser::push_sequence(s);
156 emit tracksChanged();
159 void SequenceBrowser::push_sequence(boost::shared_ptr<GlSequence> gs)
161 GlSeqBrowser::push_sequence(gs);
162 emit tracksChanged();
167 void SequenceBrowser::initializeGL()
169 GlSeqBrowser::initializeGL();
172 void SequenceBrowser::resizeGL(int width, int height)
174 GlSeqBrowser::resizeGL(width, height);
175 emit viewportChanged();
178 void SequenceBrowser::paintGL()
180 GlSeqBrowser::paintGL();
183 void SequenceBrowser::mousePressEvent( QMouseEvent *e)
185 switch(e->button()) {
189 case Qt::RightButton:
196 void SequenceBrowser::mouseMoveEvent( QMouseEvent *e )
198 if (rubberBand and rubberBand->isVisible()) {
199 rubberBand->setGeometry(QRect(bandOrigin, e->pos()).normalized());
203 void SequenceBrowser::mouseReleaseEvent( QMouseEvent *e)
205 switch(e->button()) {
209 case Qt::RightButton:
210 // ok so selectedMode and drawing mode should probably be combinded
211 // into a single state variable.
213 not rubberBand->isVisible() and
214 selectedCanvasRegion.contains(e->pos())) {
215 displayContextMenu(e->globalPos());
224 void SequenceBrowser::startSelecting(QMouseEvent *e)
227 rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
229 if (not rubberBand->isVisible()) {
230 bandOrigin = e->pos();
231 rubberBand->setGeometry(QRect(bandOrigin, QSize()));
236 void SequenceBrowser::stopSelecting(QMouseEvent *e)
238 if (rubberBand and rubberBand->isVisible()) {
240 selectedMode = false;
241 QRect r = QRect(bandOrigin, e->pos()).normalized();
242 bandOrigin = r.topLeft();
244 selectRegion(r.top(), r.left(), r.bottom(), r.right());
245 selectedCanvasRegion = r;