pass default_dir around
[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(
22     boost::shared_ptr<QDir> default_dir_,
23     QWidget *parent
24 )
25   : QWidget(parent),
26     default_dir(default_dir_),
27     scrollable_browser(this)
28 {
29   QHBoxLayout *hlayout = new QHBoxLayout;
30   hlayout->addWidget(&left_sidebar, 0);
31   hlayout->addWidget(&scrollable_browser, 1);
32   hlayout->addWidget(&right_sidebar, 0);
33   setLayout(hlayout);
34
35   // update position values when something in the SequenceBrowser changes
36   connect(&scrollable_browser.browser(), SIGNAL(viewportChanged()),
37           this, SLOT(updatePosition()));
38 }
39
40 void SequenceBrowserWidget::clear()
41 {
42   converted_sequences.clear();
43   scrollable_browser.browser().clear();
44
45   SequenceBrowserSidebar::collection left = left_sidebar.descriptions;
46   SequenceBrowserSidebar::collection right = right_sidebar.descriptions;
47   for(size_t i = 0; i != left_sidebar.size(); ++i)
48   {
49     disconnect(left[i], SIGNAL(nameChanged(const QString &)),
50                right[i], SLOT(setName(const QString &)));
51     disconnect(right[i], SIGNAL(nameChanged(const QString &)),
52                left[i], SLOT(setName(const QString &)));
53   }
54   left_sidebar.clear();
55   right_sidebar.clear();
56 }
57
58 QMenu *SequenceBrowserWidget::getPopupMenu()
59 {
60   return scrollable_browser.browser().getPopupMenu();
61 }
62
63 QAction *SequenceBrowserWidget::getCopySelectedSequenceAsFastaAction()
64 {
65   return scrollable_browser.browser().getCopySelectedSequenceAsFastaAction();
66 }
67
68
69 void SequenceBrowserWidget::copySelectedSequenceAsFasta()
70 {
71   scrollable_browser.browser().copySelectedSequenceAsFasta();
72 }
73
74 void SequenceBrowserWidget::copySelectedTracksAsSeqLocation(
75     std::list<SequenceLocation>& locations
76 )
77 {
78   scrollable_browser.browser().copySelectedTracksAsSeqLocation(locations);
79 }
80
81 void SequenceBrowserWidget::setSequences(
82     const std::vector<boost::shared_ptr<Sequence> >& sequences,
83     boost::shared_ptr<AnnotationColors> cm)
84 {
85   SequenceBrowser& browser = scrollable_browser.browser();
86   clear();
87   for(Mussa::vector_sequence_type::const_iterator seq_i = sequences.begin();
88       seq_i != sequences.end();
89       ++seq_i)
90   {
91     boost::shared_ptr<GlSequence> gs(new GlSequence(*seq_i, cm));
92     converted_sequences.push_back(gs);
93     browser.push_sequence(gs);
94   }
95   left_sidebar.setSequences(converted_sequences);
96   right_sidebar.setSequences(converted_sequences);
97
98   // connect the text change signals to each other
99   SequenceBrowserSidebar::collection left = left_sidebar.descriptions;
100   SequenceBrowserSidebar::collection right = right_sidebar.descriptions;
101   for(size_t i = 0; i != sequences.size() and i != right.size(); ++i)
102   {
103     connect(left[i], SIGNAL(nameChanged(const QString &)),
104             right[i], SLOT(setName(const QString &)));
105     connect(right[i], SIGNAL(nameChanged(const QString &)),
106             left[i], SLOT(setName(const QString &)));
107   }
108
109   updatePosition();
110 }
111
112 void SequenceBrowserWidget::setSequences(
113   std::vector<boost::shared_ptr<GlSequence> >& sequences
114 )
115 {
116   SequenceBrowser& browser = scrollable_browser.browser();
117   clear();
118   for(vector<boost::shared_ptr<GlSequence> >::iterator seq_i = sequences.begin();
119       seq_i != sequences.end();
120       ++seq_i)
121   {
122     browser.push_sequence(*seq_i);
123   }
124   left_sidebar.setSequences(sequences);
125   right_sidebar.setSequences(sequences);
126   updatePosition();
127 }
128
129 const vector<boost::shared_ptr<GlSequence> >& SequenceBrowserWidget::sequences() const
130 {
131   return scrollable_browser.browser().sequences();
132 }
133
134 void SequenceBrowserWidget::clear_links()
135 {
136   scrollable_browser.browser().clear_links();
137 }
138
139 void SequenceBrowserWidget::link(const std::vector<int>& path, 
140                                  const std::vector<bool>& isRC, 
141                                  int length)
142 {
143   scrollable_browser.browser().link(path, isRC, length);
144   scrollable_browser.browser().update();
145 }
146
147 const std::set<int> SequenceBrowserWidget::selectedPaths() const
148 {
149   return scrollable_browser.browser().selectedPaths();
150 }
151
152 void SequenceBrowserWidget::centerOnPath(const vector<int>& paths)
153 {
154   scrollable_browser.browser().centerOnPath(paths);
155   updatePosition();
156 }
157
158 /* This could theoretically be pushed down to some set 
159  * of signals and slots connecting SequenceDescriptions and 
160  * some signal emitted by the browser's viewportChanged code
161  * but evertime I tried to figure it out, I got confused about 
162  * how the descriptions in one of the sidebars was supposed to know
163  * if it was mapping the rightbase or the leftbase.
164  * And so though this could be better the typical use cases 
165  * can just talk to the SequenceBrowserWidget for rendering
166  * or mussa output
167  */
168 void SequenceBrowserWidget::updatePosition()
169 {
170   const SequenceBrowser& browser = scrollable_browser.browser();
171   const vector<boost::shared_ptr<GlSequence> > &sequences = browser.sequences();
172   SequenceBrowserSidebar::collection left = left_sidebar.descriptions;
173   SequenceBrowserSidebar::collection right = right_sidebar.descriptions;
174   for(size_t i = 0; i != sequences.size() and i != right.size(); ++i)
175   {
176     left[i]->setPosition(sequences[i]->leftbase(browser.viewportLeft()));
177     right[i]->setPosition(sequences[i]->rightbase(browser.viewportRight()));
178   }
179   scrollable_browser.browser().update();
180   scrollable_browser.updateScrollBar();
181 }
182
183 void SequenceBrowserWidget::promptSaveBrowserPixmap()
184 {
185   QSize size;
186   size = scrollable_browser.browser().size();
187   //Image Save Dialog
188   ImageSaveDialog imageSaveDialog(default_dir, &scrollable_browser.browser(), this);
189   imageSaveDialog.setSize(size.width(), size.height());
190   imageSaveDialog.exec();
191 }
192
193 double SequenceBrowserWidget::zoom()
194 {
195   return scrollable_browser.browser().zoom();
196 }
197
198 double SequenceBrowserWidget::zoomOut()
199 {
200   double zoom_level = scrollable_browser.browser().zoomOut();
201   scrollable_browser.updateScrollBar();
202   return zoom_level;
203 }
204
205 double SequenceBrowserWidget::zoomToSequence()
206 {
207   double zoom_level = scrollable_browser.browser().zoomToSequence();
208   scrollable_browser.updateScrollBar();
209   return zoom_level;
210 }
211
212 void SequenceBrowserWidget::setZoom(double z)
213 {
214   scrollable_browser.browser().setZoom(z);
215 }
216
217 void SequenceBrowserWidget::update()
218 {
219   QWidget::update();
220   scrollable_browser.browser().update();
221 }