SequenceBrowser should handle the copying
[mussa.git] / qui / seqbrowser / SequenceBrowserWidget.cpp
1 #include <iostream>
2
3 #include <QLabel>
4 #include <QScrollBar>
5 #include <QSpacerItem>
6 #include <QSplitter>
7 #include <QVBoxLayout>
8 #include <QWidget>
9
10 #include "qui/seqbrowser/SequenceBrowserWidget.hpp"
11 #include "qui/seqbrowser/SequenceBrowser.hpp"
12 #include "qui/seqbrowser/ScrollableSequenceBrowser.hpp"
13 #include "qui/seqbrowser/SequenceDescription.hpp"
14 #include "qui/ImageSaveDialog.hpp"
15
16 #include "alg/glsequence.hpp"
17
18 #include <math.h>
19 using namespace std;
20
21 SequenceBrowserWidget::SequenceBrowserWidget(QWidget *parent)
22   : QWidget(parent),
23     scrollable_browser(parent)
24 {
25   QHBoxLayout *hlayout = new QHBoxLayout;
26   hlayout->addWidget(&left_sidebar, 0);
27   hlayout->addWidget(&scrollable_browser, 1);
28   hlayout->addWidget(&right_sidebar, 0);
29   setLayout(hlayout);
30
31   // update position values when something in the SequenceBrowser changes
32   connect(&scrollable_browser.browser(), SIGNAL(viewportChanged()),
33           this, SLOT(updatePosition()));
34 }
35
36 void SequenceBrowserWidget::clear()
37 {
38   converted_sequences.clear();
39   scrollable_browser.browser().clear();
40   left_sidebar.clear();
41   right_sidebar.clear();
42 }
43
44 void SequenceBrowserWidget::copySelectedSequenceAsFasta()
45 {
46   scrollable_browser.browser().copySelectedSequenceAsFasta();
47 }
48
49 void SequenceBrowserWidget::setSequences(const std::vector<Sequence>& sequences,
50                                             AnnotationColors& cm)
51 {
52   SequenceBrowser& browser = scrollable_browser.browser();
53   clear();
54   for(vector<Sequence>::const_iterator seq_i = sequences.begin();
55       seq_i != sequences.end();
56       ++seq_i)
57   {
58     GlSequence *gs= new GlSequence(*seq_i, cm);
59     converted_sequences.push_back(*gs);
60     browser.push_sequence(*gs);
61   }
62   left_sidebar.setSequences(converted_sequences);
63   right_sidebar.setSequences(converted_sequences);
64   updatePosition();
65 }
66
67 void SequenceBrowserWidget::setSequences(std::vector<GlSequence>& sequences)
68 {
69   SequenceBrowser& browser = scrollable_browser.browser();
70   clear();
71   for(vector<GlSequence>::iterator seq_i = sequences.begin();
72       seq_i != sequences.end();
73       ++seq_i)
74   {
75     browser.push_sequence(*seq_i);
76   }
77   left_sidebar.setSequences(sequences);
78   right_sidebar.setSequences(sequences);
79   updatePosition();
80 }
81
82 const vector<GlSequence>& SequenceBrowserWidget::sequences() const
83 {
84   return scrollable_browser.browser().sequences();
85 }
86
87 void SequenceBrowserWidget::clear_links()
88 {
89   scrollable_browser.browser().clear_links();
90 }
91
92 void SequenceBrowserWidget::link(const std::vector<int>& path, 
93                                  const std::vector<bool>& isRC, 
94                                  int length)
95 {
96   scrollable_browser.browser().link(path, isRC, length);
97   scrollable_browser.browser().update();
98 }
99
100 const std::set<int> SequenceBrowserWidget::selectedPaths() const
101 {
102   return scrollable_browser.browser().selectedPaths();
103 }
104
105 void SequenceBrowserWidget::centerOnPath(const vector<int>& paths)
106 {
107   scrollable_browser.browser().centerOnPath(paths);
108   updatePosition();
109 }
110
111 /* This could theoretically be pushed down to some set 
112  * of signals and slots connecting SequenceDescriptions and 
113  * some signal emitted by the browser's viewportChanged code
114  * but evertime I tried to figure it out, I got confused about 
115  * how the descriptions in one of the sidebars was supposed to know
116  * if it was mapping the rightbase or the leftbase.
117  * And so though this could be better the typical use cases 
118  * can just talk to the SequenceBrowserWidget for rendering
119  * or mussa output
120  */
121 void SequenceBrowserWidget::updatePosition()
122 {
123   const SequenceBrowser& browser = scrollable_browser.browser();
124   const vector<GlSequence> &sequences = browser.sequences();
125   vector<SequenceDescription *> left = left_sidebar.descriptions;
126   vector<SequenceDescription *> right = right_sidebar.descriptions;
127   for(size_t i = 0; i != sequences.size() and i != right.size(); ++i)
128   {
129     left[i]->setPosition(sequences[i].leftbase(browser.viewportLeft()));
130     right[i]->setPosition(sequences[i].rightbase(browser.viewportRight()));
131   }
132   scrollable_browser.browser().update();
133   scrollable_browser.updateScrollBar();
134 }
135
136 void SequenceBrowserWidget::promptSaveBrowserPixmap()
137 {
138   QSize size;
139   size = scrollable_browser.browser().size();
140   //Image Save Dialog
141   ImageSaveDialog imageSaveDialog(&scrollable_browser.browser(), this);
142   imageSaveDialog.setSize(size.width(), size.height());
143   imageSaveDialog.exec();
144 }
145
146 double SequenceBrowserWidget::zoom()
147 {
148   return scrollable_browser.browser().zoom();
149 }
150
151 double SequenceBrowserWidget::zoomOut()
152 {
153   double zoom_level = scrollable_browser.browser().zoomOut();
154   scrollable_browser.updateScrollBar();
155   return zoom_level;
156 }
157
158 double SequenceBrowserWidget::zoomToSequence()
159 {
160   double zoom_level = scrollable_browser.browser().zoomToSequence();
161   scrollable_browser.updateScrollBar();
162   return zoom_level;
163 }
164
165 void SequenceBrowserWidget::setZoom(double z)
166 {
167   scrollable_browser.browser().setZoom(z);
168 }
169
170 void SequenceBrowserWidget::update()
171 {
172   QWidget::update();
173   scrollable_browser.browser().update();
174 }