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_,
26 default_dir(default_dir_),
27 scrollable_browser(this)
29 QHBoxLayout *hlayout = new QHBoxLayout;
30 hlayout->addWidget(&left_sidebar, 0);
31 hlayout->addWidget(&scrollable_browser, 1);
32 hlayout->addWidget(&right_sidebar, 0);
35 // update position values when something in the SequenceBrowser changes
36 connect(&scrollable_browser.browser(), SIGNAL(viewportChanged()),
37 this, SLOT(updatePosition()));
38 connect(&scrollable_browser.browser(), SIGNAL(basepairsCopied(size_t)),
39 this, SIGNAL(basepairsCopied(size_t)));
42 void SequenceBrowserWidget::clear()
44 converted_sequences.clear();
45 scrollable_browser.browser().clear();
47 SequenceBrowserSidebar::collection left = left_sidebar.descriptions;
48 SequenceBrowserSidebar::collection right = right_sidebar.descriptions;
49 for(size_t i = 0; i != left_sidebar.size(); ++i)
51 disconnect(left[i], SIGNAL(nameChanged(const QString &)),
52 right[i], SLOT(setName(const QString &)));
53 disconnect(right[i], SIGNAL(nameChanged(const QString &)),
54 left[i], SLOT(setName(const QString &)));
57 right_sidebar.clear();
60 QMenu *SequenceBrowserWidget::getPopupMenu()
62 return scrollable_browser.browser().getPopupMenu();
65 QAction *SequenceBrowserWidget::getCopySelectedSequenceAsStringAction()
67 return scrollable_browser.browser().getCopySelectedSequenceAsStringAction();
70 QAction *SequenceBrowserWidget::getCopySelectedSequenceAsFastaAction()
72 return scrollable_browser.browser().getCopySelectedSequenceAsFastaAction();
75 void SequenceBrowserWidget::copySelectedSequenceAsFasta()
77 scrollable_browser.browser().copySelectedSequenceAsFasta();
80 void SequenceBrowserWidget::copySelectedTracksAsSeqLocation(
81 std::list<SequenceLocation>& locations
84 scrollable_browser.browser().copySelectedTracksAsSeqLocation(locations);
87 void SequenceBrowserWidget::setSequences(
88 const std::vector<boost::shared_ptr<Sequence> >& sequences,
89 boost::shared_ptr<AnnotationColors> cm)
91 SequenceBrowser& browser = scrollable_browser.browser();
93 for(Mussa::vector_sequence_type::const_iterator seq_i = sequences.begin();
94 seq_i != sequences.end();
97 boost::shared_ptr<GlSequence> gs(new GlSequence(*seq_i, cm));
98 converted_sequences.push_back(gs);
99 browser.push_sequence(gs);
101 left_sidebar.setSequences(converted_sequences);
102 right_sidebar.setSequences(converted_sequences);
104 // connect the text change signals to each other
105 SequenceBrowserSidebar::collection left = left_sidebar.descriptions;
106 SequenceBrowserSidebar::collection right = right_sidebar.descriptions;
107 for(size_t i = 0; i != sequences.size() and i != right.size(); ++i)
109 connect(left[i], SIGNAL(nameChanged(const QString &)),
110 right[i], SLOT(setName(const QString &)));
111 connect(right[i], SIGNAL(nameChanged(const QString &)),
112 left[i], SLOT(setName(const QString &)));
118 void SequenceBrowserWidget::setSequences(
119 std::vector<boost::shared_ptr<GlSequence> >& sequences
122 SequenceBrowser& browser = scrollable_browser.browser();
124 for(vector<boost::shared_ptr<GlSequence> >::iterator seq_i = sequences.begin();
125 seq_i != sequences.end();
128 browser.push_sequence(*seq_i);
130 left_sidebar.setSequences(sequences);
131 right_sidebar.setSequences(sequences);
135 const vector<boost::shared_ptr<GlSequence> >& SequenceBrowserWidget::sequences() const
137 return scrollable_browser.browser().sequences();
140 void SequenceBrowserWidget::clear_links()
142 scrollable_browser.browser().clear_links();
145 void SequenceBrowserWidget::link(const std::vector<int>& path,
146 const std::vector<bool>& isRC,
149 scrollable_browser.browser().link(path, isRC, length);
150 scrollable_browser.browser().update();
153 const std::set<int> SequenceBrowserWidget::selectedPaths() const
155 return scrollable_browser.browser().selectedPaths();
158 void SequenceBrowserWidget::centerOnPath(const vector<int>& paths)
160 scrollable_browser.browser().centerOnPath(paths);
164 /* This could theoretically be pushed down to some set
165 * of signals and slots connecting SequenceDescriptions and
166 * some signal emitted by the browser's viewportChanged code
167 * but evertime I tried to figure it out, I got confused about
168 * how the descriptions in one of the sidebars was supposed to know
169 * if it was mapping the rightbase or the leftbase.
170 * And so though this could be better the typical use cases
171 * can just talk to the SequenceBrowserWidget for rendering
174 void SequenceBrowserWidget::updatePosition()
176 const SequenceBrowser& browser = scrollable_browser.browser();
177 const vector<boost::shared_ptr<GlSequence> > &sequences = browser.sequences();
178 SequenceBrowserSidebar::collection left = left_sidebar.descriptions;
179 SequenceBrowserSidebar::collection right = right_sidebar.descriptions;
180 for(size_t i = 0; i != sequences.size() and i != right.size(); ++i)
182 left[i]->setPosition(sequences[i]->leftbase(browser.viewportLeft()));
183 right[i]->setPosition(sequences[i]->rightbase(browser.viewportRight()));
185 scrollable_browser.browser().update();
186 scrollable_browser.updateScrollBar();
189 void SequenceBrowserWidget::promptSaveBrowserPixmap()
192 size = scrollable_browser.browser().size();
194 ImageSaveDialog imageSaveDialog(default_dir, &scrollable_browser, this);
195 imageSaveDialog.setSize(size.width(), size.height());
196 imageSaveDialog.exec();
199 double SequenceBrowserWidget::zoom()
201 return scrollable_browser.browser().zoom();
204 double SequenceBrowserWidget::zoomOut()
206 double zoom_level = scrollable_browser.browser().zoomOut();
207 scrollable_browser.updateScrollBar();
211 double SequenceBrowserWidget::zoomToSequence()
213 double zoom_level = scrollable_browser.browser().zoomToSequence();
214 scrollable_browser.updateScrollBar();
218 void SequenceBrowserWidget::setZoom(double z)
220 scrollable_browser.browser().setZoom(z);
223 void SequenceBrowserWidget::update()
226 scrollable_browser.browser().update();