SequenceBrowser should handle the copying
[mussa.git] / qui / seqbrowser / SequenceBrowser.cpp
1 #include <QApplication>
2 #include <QClipboard>
3 #include <QDir>
4 #include <QFileDialog>
5 #include <QMessageBox>
6 #include <QMouseEvent>
7 #include <QRubberBand>
8 #include <QRect>
9 #include <QString>
10 #include <iostream>
11 #include <set>
12
13 #include <math.h>
14
15 #include "qui/seqbrowser/SequenceBrowser.hpp"
16 #include "mussa_exceptions.hpp"
17
18 using namespace std;
19
20 SequenceBrowser::SequenceBrowser(QWidget *parent)
21   : QGLWidget(parent),
22     rubberBand(0),
23     drawingBand(false)
24
25 }
26
27 QSize SequenceBrowser::sizeHint() const
28 {
29   //return QSize((int)GlSeqBrowser::viewportHeight(), (int)GlSeqBrowser::viewportWidth());
30   return QSize(600, 400);
31 }
32
33 void SequenceBrowser::setViewportCenter(float x)
34 {
35   const float epsilon = 1e-10;
36   float center = GlSeqBrowser::viewportCenter();
37   float difference = fabsf(x - center);
38   float abs_x = fabsf(x);
39   center = fabsf(center);
40
41   // the difference < epsilon * val is one of the recommended tests
42   // for float equality.
43   // of course since we're looking for not equals, we need to toss a
44   // not at the beginning
45   if (not (difference < epsilon * abs_x or difference < epsilon * center))
46   {
47     GlSeqBrowser::setViewportCenter(x);
48     emit viewportChanged();
49     update();
50   }
51 }
52
53 void SequenceBrowser::setZoom(double new_zoom)
54 {
55   if (new_zoom != GlSeqBrowser::zoom()) {
56     GlSeqBrowser::setZoom(new_zoom);
57     emit viewportChanged();
58     update();
59   }
60 }
61
62 void SequenceBrowser::setClipPlane(int )
63 {
64 /*
65   if (clipZ != (double) newZ){
66     clipZ = (double) newZ;
67     update();
68   }
69 */
70 }
71
72 void SequenceBrowser::copySelectedSequenceAsFasta()
73 {
74   // get fasta data
75   std::string buffer;
76   copySelectedTracksAsFasta(buffer);
77
78   // get reference to clipboard
79   QClipboard *clipboard = QApplication::clipboard();
80   clipboard->setText(buffer.c_str());
81 }
82
83
84 void SequenceBrowser::clear()
85 {
86   GlSeqBrowser::clear();
87   emit tracksChanged();
88 }
89
90 void SequenceBrowser::push_sequence(const Sequence &s)
91 {
92   GlSeqBrowser::push_sequence(s);
93   emit tracksChanged();
94 }
95
96 void SequenceBrowser::push_sequence(GlSequence &gs)
97 {
98   GlSeqBrowser::push_sequence(gs);
99   emit tracksChanged();
100 }
101
102 ////////////////////
103 // Rendering code
104 void SequenceBrowser::initializeGL()
105 {
106   GlSeqBrowser::initializeGL();
107 }
108
109 void SequenceBrowser::resizeGL(int width, int height)
110 {
111   GlSeqBrowser::resizeGL(width, height);
112   emit viewportChanged();
113 }
114
115 void SequenceBrowser::paintGL()
116 {
117   GlSeqBrowser::paintGL();
118 }
119
120 void SequenceBrowser::mousePressEvent( QMouseEvent *e)
121 {
122   drawingBand = true;
123
124   selectedMode = false;
125   bandOrigin = e->pos();
126   if (!rubberBand)
127     rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
128   
129   rubberBand->setGeometry(QRect(bandOrigin, QSize()));
130   rubberBand->show();
131 }
132
133 void SequenceBrowser::mouseMoveEvent( QMouseEvent *e)
134 {
135   if (drawingBand)
136     rubberBand->setGeometry(QRect(bandOrigin, e->pos()).normalized());
137 }
138
139 void SequenceBrowser::mouseReleaseEvent( QMouseEvent *e)
140 {
141   drawingBand = false;
142   if (rubberBand != 0) {
143     rubberBand->hide();
144     QRect r = QRect(bandOrigin, e->pos()).normalized();
145     bandOrigin = r.topLeft();
146   
147     selectRegion(r.top(), r.left(), r.bottom(), r.right());
148   }
149 }