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