choose alignment needs to force the sequences to redraw
[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   : QSplitter(parent),
23     scrollable_browser(parent)
24 {
25   setOrientation(Qt::Horizontal);
26
27   addWidget(&left_sidebar);
28   addWidget(&scrollable_browser);
29   addWidget(&right_sidebar);
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::setSequences(const std::vector<Sequence>& sequences,
45                                             AnnotationColors& cm)
46 {
47   SequenceBrowser& browser = scrollable_browser.browser();
48   clear();
49   for(vector<Sequence>::const_iterator seq_i = sequences.begin();
50       seq_i != sequences.end();
51       ++seq_i)
52   {
53     GlSequence *gs= new GlSequence(*seq_i, cm);
54     converted_sequences.push_back(*gs);
55     browser.push_sequence(*gs);
56   }
57   left_sidebar.setSequences(converted_sequences);
58   right_sidebar.setSequences(converted_sequences);
59   updatePosition();
60 }
61
62 void SequenceBrowserWidget::setSequences(std::vector<GlSequence>& sequences)
63 {
64   SequenceBrowser& browser = scrollable_browser.browser();
65   clear();
66   for(vector<GlSequence>::iterator seq_i = sequences.begin();
67       seq_i != sequences.end();
68       ++seq_i)
69   {
70     browser.push_sequence(*seq_i);
71   }
72   left_sidebar.setSequences(sequences);
73   right_sidebar.setSequences(sequences);
74   updatePosition();
75 }
76
77 const vector<GlSequence>& SequenceBrowserWidget::sequences() const
78 {
79   return scrollable_browser.browser().sequences();
80 }
81
82 void SequenceBrowserWidget::clear_links()
83 {
84   scrollable_browser.browser().clear_links();
85 }
86
87 void SequenceBrowserWidget::link(const std::vector<int>& path, 
88                                  const std::vector<bool>& isRC, 
89                                  int length)
90 {
91   scrollable_browser.browser().link(path, isRC, length);
92   scrollable_browser.browser().update();
93 }
94
95 const std::set<int> SequenceBrowserWidget::selectedPaths() const
96 {
97   return scrollable_browser.browser().selectedPaths();
98 }
99
100 void SequenceBrowserWidget::centerOnPath(const vector<int>& paths)
101 {
102   scrollable_browser.browser().centerOnPath(paths);
103   updatePosition();
104 }
105
106 /* This could theoretically be pushed down to some set 
107  * of signals and slots connecting SequenceDescriptions and 
108  * some signal emitted by the browser's viewportChanged code
109  * but evertime I tried to figure it out, I got confused about 
110  * how the descriptions in one of the sidebars was supposed to know
111  * if it was mapping the rightbase or the leftbase.
112  * And so though this could be better the typical use cases 
113  * can just talk to the SequenceBrowserWidget for rendering
114  * or mussa output
115  */
116 void SequenceBrowserWidget::updatePosition()
117 {
118   const SequenceBrowser& browser = scrollable_browser.browser();
119   const vector<GlSequence> &sequences = browser.sequences();
120   vector<SequenceDescription *> left = left_sidebar.descriptions;
121   vector<SequenceDescription *> right = right_sidebar.descriptions;
122   for(size_t i = 0; i != sequences.size() and i != right.size(); ++i)
123   {
124     left[i]->setPosition(sequences[i].leftbase(browser.viewportLeft()));
125     right[i]->setPosition(sequences[i].rightbase(browser.viewportRight()));
126   }
127   scrollable_browser.browser().update();
128   scrollable_browser.updateScrollBar();
129 }
130
131 void SequenceBrowserWidget::promptSaveBrowserPixmap()
132 {
133   QSize size;
134   size = scrollable_browser.browser().size();
135   //Image Save Dialog
136   ImageSaveDialog imageSaveDialog(&scrollable_browser.browser(), this);
137   imageSaveDialog.setSize(size.width(), size.height());
138   int result = imageSaveDialog.exec();
139   cout << "Result: " << result << "\n";
140 }
141
142 double SequenceBrowserWidget::zoom()
143 {
144   return scrollable_browser.browser().zoom();
145 }
146
147 double SequenceBrowserWidget::zoomOut()
148 {
149   double zoom_level = scrollable_browser.browser().zoomOut();
150   scrollable_browser.updateScrollBar();
151   return zoom_level;
152 }
153
154 double SequenceBrowserWidget::zoomToSequence()
155 {
156   double zoom_level = scrollable_browser.browser().zoomToSequence();
157   scrollable_browser.updateScrollBar();
158   return zoom_level;
159 }
160
161 void SequenceBrowserWidget::setZoom(double z)
162 {
163   scrollable_browser.browser().setZoom(z);
164 }
165
166 void SequenceBrowserWidget::update()
167 {
168   scrollable_browser.browser().update();
169 }