define window for showing a mussa alignment
[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 /* This could theoretically be pushed down to some set 
99  * of signals and slots connecting SequenceDescriptions and 
100  * some signal emitted by the browser's viewportChanged code
101  * but evertime I tried to figure it out, I got confused about 
102  * how the descriptions in one of the sidebars was supposed to know
103  * if it was mapping the rightbase or the leftbase.
104  * And so though this could be better the typical use cases 
105  * can just talk to the SequenceBrowserWidget for rendering
106  * or mussa output
107  */
108 void SequenceBrowserWidget::updatePosition()
109 {
110   const SequenceBrowser& browser = scrollable_browser.browser();
111   const vector<GlSequence> &sequences = browser.sequences();
112   vector<SequenceDescription *> left = left_sidebar.descriptions;
113   vector<SequenceDescription *> right = right_sidebar.descriptions;
114   for(size_t i = 0; i != sequences.size() and i != right.size(); ++i)
115   {
116     left[i]->setPosition(sequences[i].leftbase(browser.viewportLeft()));
117     right[i]->setPosition(sequences[i].rightbase(browser.viewportRight()));
118   }
119 }
120
121 void SequenceBrowserWidget::promptSaveBrowserPixmap()
122 {
123   QSize size;
124   size = scrollable_browser.browser().size();
125   //Image Save Dialog
126   ImageSaveDialog imageSaveDialog(&scrollable_browser.browser(), this);
127   imageSaveDialog.setSize(size.width(), size.height());
128   int result = imageSaveDialog.exec();
129   cout << "Result: " << result << "\n";
130 }
131
132 void SequenceBrowserWidget::setZoom(int z)
133 {
134   scrollable_browser.browser().setZoom(z);
135 }