+ return base_pairs_copied;
+}
+
+//! copy sequence from selected tracks as new sequences
+size_t GlSeqBrowser::copySelectedTracksAsSequences(std::list<Sequence>& result)
+{
+ struct AsSequence {
+ static Sequence formatter(boost::shared_ptr<Sequence> seq,
+ int left,
+ int right)
+ {
+ return seq->subseq(left, right-left+1);
+ }
+ };
+ return copySelectedTracks(result, AsSequence::formatter);
+}
+
+size_t GlSeqBrowser::copySelectedTracksAsSeqLocation(
+ std::list<SequenceLocation>& result)
+{
+ struct AsSeqLocation {
+ static SequenceLocation formatter(boost::shared_ptr<Sequence> seq,
+ int left,
+ int right)
+ {
+ return SequenceLocation(seq, left, right);
+ }
+ };
+ return copySelectedTracks(result, AsSeqLocation::formatter);
+}
+
+//! copy sequence from selected tracks as plain sequences
+size_t GlSeqBrowser::copySelectedTracksAsString(std::string& copy_buffer)
+{
+ std::list<string> result;
+ struct AsString {
+ static string formatter(boost::shared_ptr<Sequence> seq,
+ int left,
+ int right)
+ {
+ stringstream s;
+ s << seq->subseq(left, right-left+1);
+ return s.str();
+ }
+ };
+
+ size_t base_pairs_copied = copySelectedTracks(result, AsString::formatter);
+ // I wish there was some way to use for_each and bind here
+ for (list<string>::iterator result_i = result.begin();
+ result_i != result.end();
+ ++result_i)
+ {
+ copy_buffer.append(*result_i);
+ }
+ return base_pairs_copied;
+}
+
+void GlSeqBrowser::centerOnPath(const vector<int>& paths)
+{
+ if (paths.size() != track_container.size()) {
+ throw mussa_error("Path length didn't match the number of sequences");
+ }
+
+ for(size_t track_i = 0; track_i != track_container.size(); ++track_i)
+ {
+ // -15 = shift more to the left
+ track_container[track_i]->setX((viewport_center-15) - paths[track_i]);
+ }
+}
+
+void GlSeqBrowser::update_viewport(float center, double new_zoom)
+{
+ // limit how close we can get
+ if (new_zoom < 0.01) {
+ new_zoom = 0.01;
+ }
+ double new_width = (new_zoom * (float)viewport_size.x);
+ cur_ortho.left = center-new_width/2.0;
+ cur_ortho.right = center+new_width/2.0;