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"
16 #include "alg/glsequence.hpp"
21 SequenceBrowserWidget::SequenceBrowserWidget(
22 boost::shared_ptr<QDir> default_dir_,
25 : QScrollArea(parent),
26 default_dir(default_dir_),
27 left_sidebar(new SequenceBrowserSidebar),
28 scrollable_browser(new ScrollableSequenceBrowser),
29 right_sidebar(new SequenceBrowserSidebar),
30 layout(new QHBoxLayout),
31 layout_container(new QWidget(this))
33 layout->addWidget(left_sidebar, 0);
34 layout->addWidget(scrollable_browser, 1);
35 layout->addWidget(right_sidebar, 0);
37 layout_container->setLayout(layout);
38 setWidget(layout_container);
39 setWidgetResizable(true);
41 // update position values when something in the SequenceBrowser changes
42 connect(&(scrollable_browser->browser()), SIGNAL(viewportChanged()),
43 this, SLOT(updatePosition()));
44 connect(&(scrollable_browser->browser()), SIGNAL(basepairsCopied(size_t)),
45 this, SIGNAL(basepairsCopied(size_t)));
48 QSize SequenceBrowserWidget::sizeHint() const
50 // don't trust the layouts size computation
51 // use some heavy handed brute force to compute
52 // the correct size so our stupid scrollable_browser
53 // will show the full viewport.
54 QSize left = left_sidebar->sizeHint();
55 QSize center = scrollable_browser->sizeHint();
56 QSize right = right_sidebar->sizeHint();
58 int width = left.width()+center.width()+right.width();
59 width += 2 * layout->margin();
60 if (layout->spacing() > 0) {
61 width += layout->spacing() * 3;
63 return QSize(width, center.height());
67 void SequenceBrowserWidget::clear()
69 converted_sequences.clear();
70 scrollable_browser->browser().clear();
72 SequenceBrowserSidebar::collection left = left_sidebar->descriptions;
73 SequenceBrowserSidebar::collection right = right_sidebar->descriptions;
74 for(size_t i = 0; i != left_sidebar->size(); ++i)
76 disconnect(left[i], SIGNAL(nameChanged(const QString &)),
77 right[i], SLOT(setName(const QString &)));
78 disconnect(right[i], SIGNAL(nameChanged(const QString &)),
79 left[i], SLOT(setName(const QString &)));
81 left_sidebar->clear();
82 right_sidebar->clear();
85 QMenu *SequenceBrowserWidget::getPopupMenu()
87 return scrollable_browser->browser().getPopupMenu();
90 QAction *SequenceBrowserWidget::getCopySelectedSequenceAsStringAction()
92 return scrollable_browser->browser().getCopySelectedSequenceAsStringAction();
95 QAction *SequenceBrowserWidget::getCopySelectedSequenceAsFastaAction()
97 return scrollable_browser->browser().getCopySelectedSequenceAsFastaAction();
100 QAction *SequenceBrowserWidget::getEditSequencePropertiesAction()
102 return scrollable_browser->browser().getEditSequencePropertiesAction();
105 void SequenceBrowserWidget::copySelectedSequenceAsFasta()
107 scrollable_browser->browser().copySelectedSequenceAsFasta();
110 void SequenceBrowserWidget::copySelectedTracksAsSeqLocation(
111 std::list<SequenceLocation>& locations
114 scrollable_browser->browser().copySelectedTracksAsSeqLocation(locations);
117 void SequenceBrowserWidget::setSequences(
118 const std::vector<boost::shared_ptr<Sequence> >& sequences,
119 boost::shared_ptr<AnnotationColors> cm)
121 SequenceBrowser& browser = scrollable_browser->browser();
123 for(Mussa::vector_sequence_type::const_iterator seq_i = sequences.begin();
124 seq_i != sequences.end();
127 boost::shared_ptr<GlSequence> gs(new GlSequence(*seq_i, cm));
128 converted_sequences.push_back(gs);
129 browser.push_sequence(gs);
131 left_sidebar->setSequences(converted_sequences);
132 right_sidebar->setSequences(converted_sequences);
134 // connect the text change signals to each other
135 SequenceBrowserSidebar::collection left = left_sidebar->descriptions;
136 SequenceBrowserSidebar::collection right = right_sidebar->descriptions;
137 for(size_t i = 0; i != sequences.size() and i != right.size(); ++i)
139 connect(left[i], SIGNAL(nameChanged(const QString &)),
140 right[i], SLOT(setName(const QString &)));
141 connect(right[i], SIGNAL(nameChanged(const QString &)),
142 left[i], SLOT(setName(const QString &)));
148 void SequenceBrowserWidget::setSequences(
149 std::vector<boost::shared_ptr<GlSequence> >& sequences
152 SequenceBrowser& browser = scrollable_browser->browser();
154 for(vector<boost::shared_ptr<GlSequence> >::iterator seq_i = sequences.begin();
155 seq_i != sequences.end();
158 browser.push_sequence(*seq_i);
160 left_sidebar->setSequences(sequences);
161 right_sidebar->setSequences(sequences);
165 const vector<boost::shared_ptr<GlSequence> >& SequenceBrowserWidget::sequences() const
167 return scrollable_browser->browser().sequences();
170 void SequenceBrowserWidget::clear_links()
172 scrollable_browser->browser().clear_links();
175 void SequenceBrowserWidget::link(const std::vector<int>& path,
176 const std::vector<bool>& isRC,
179 scrollable_browser->browser().link(path, isRC, length);
180 scrollable_browser->browser().update();
183 const std::set<int> SequenceBrowserWidget::selectedPaths() const
185 return scrollable_browser->browser().selectedPaths();
188 void SequenceBrowserWidget::centerOnPath(const vector<int>& paths)
190 scrollable_browser->browser().centerOnPath(paths);
194 /* This could theoretically be pushed down to some set
195 * of signals and slots connecting SequenceDescriptions and
196 * some signal emitted by the browser's viewportChanged code
197 * but evertime I tried to figure it out, I got confused about
198 * how the descriptions in one of the sidebars was supposed to know
199 * if it was mapping the rightbase or the leftbase.
200 * And so though this could be better the typical use cases
201 * can just talk to the SequenceBrowserWidget for rendering
204 void SequenceBrowserWidget::updatePosition()
206 const SequenceBrowser& browser = scrollable_browser->browser();
207 const vector<boost::shared_ptr<GlSequence> > &sequences = browser.sequences();
208 SequenceBrowserSidebar::collection left = left_sidebar->descriptions;
209 SequenceBrowserSidebar::collection right = right_sidebar->descriptions;
210 for(size_t i = 0; i != sequences.size() and i != right.size(); ++i)
212 left[i]->setPosition(sequences[i]->leftbase(browser.viewportLeft()));
213 right[i]->setPosition(sequences[i]->rightbase(browser.viewportRight()));
215 scrollable_browser->browser().update();
216 scrollable_browser->updateScrollBar();
219 void SequenceBrowserWidget::promptSaveBrowserPixmap()
222 size = scrollable_browser->browser().size();
224 ImageSaveDialog imageSaveDialog(default_dir, scrollable_browser, this);
225 imageSaveDialog.setSize(size.width(), size.height());
226 imageSaveDialog.exec();
229 double SequenceBrowserWidget::zoom()
231 return scrollable_browser->browser().zoom();
234 double SequenceBrowserWidget::zoomOut()
236 double zoom_level = scrollable_browser->browser().zoomOut();
237 scrollable_browser->updateScrollBar();
241 double SequenceBrowserWidget::zoomToSequence()
243 double zoom_level = scrollable_browser->browser().zoomToSequence();
244 scrollable_browser->updateScrollBar();
248 void SequenceBrowserWidget::setZoom(double z)
250 scrollable_browser->browser().setZoom(z);
253 void SequenceBrowserWidget::update()
256 scrollable_browser->browser().update();