Allow changing the name for a sequence in the sequence browser.
[mussa.git] / alg / glseqbrowser.cpp
index 470c7c437cf1cdac1adc6c4900857e36f63dfac1..254b845915233d48e2734e59ce6a88aef4d49128 100644 (file)
@@ -117,8 +117,8 @@ void GlSeqBrowser::processSelection(GLuint hits, GLuint buffer[], GLuint bufsize
         {
           objid = *ptr++; ++consumed_names;
 
-          int left = track_container[objid].leftbase(r.left);
-          int right = track_container[objid].rightbase(r.right);
+          int left = track_container[objid]->leftbase(r.left);
+          int right = track_container[objid]->rightbase(r.right);
           // the static_cast should be ok, since basepairs line up on 
           // integral values
           //TrackRegion track(objid, left, right); 
@@ -193,12 +193,12 @@ float GlSeqBrowser::left() const
   {
     return cur_ortho.left;
   } else {
-    vector<GlSequence>::const_iterator track_i = track_container.begin();    
-    left = track_i->x();
+    vector<boost::shared_ptr<GlSequence> >::const_iterator track_i = track_container.begin();    
+    left = (*track_i)->x();
     for( ; track_i != track_container.end(); ++track_i)
     {
-      if (track_i->x() < left) {
-        left = track_i->x();
+      if ((*track_i)->x() < left) {
+        left = (*track_i)->x();
       }
     }
     return left-border_width;
@@ -211,11 +211,11 @@ float GlSeqBrowser::right() const
   if (track_container.size() == 0) {
     return cur_ortho.right;
   } else {
-    vector<GlSequence>::const_iterator track_i = track_container.begin();
-    right = track_i->right();
+    vector<boost::shared_ptr<GlSequence> >::const_iterator track_i = track_container.begin();
+    right = (*track_i)->right();
     for( ; track_i != track_container.end(); ++track_i) {
-      if (track_i->right() > right)
-        right = track_i->right();
+      if ((*track_i)->right() > right)
+        right = (*track_i)->right();
     }
     return right+border_width;
   }
@@ -321,11 +321,17 @@ void GlSeqBrowser::push_sequence(const Sequence& s)
 
 void GlSeqBrowser::push_sequence(boost::shared_ptr<Sequence> s)
 {
-  GlSequence gs(s, color_mapper);
+  boost::shared_ptr<GlSequence> gs(new GlSequence(s, color_mapper));
   push_sequence(gs);
 }
 
 void GlSeqBrowser::push_sequence(GlSequence gs)
+{
+  boost::shared_ptr<GlSequence> new_gs(new GlSequence(gs));
+  push_sequence(new_gs);
+}
+
+void GlSeqBrowser::push_sequence(boost::shared_ptr<GlSequence> gs)
 {
   clear_links();
   track_container.push_back(gs);
@@ -334,7 +340,7 @@ void GlSeqBrowser::push_sequence(GlSequence gs)
     path_segments.push_back(pair_segment_map());
 }
 
-const std::vector<GlSequence>& GlSeqBrowser::sequences() const
+const std::vector<boost::shared_ptr<GlSequence> >& GlSeqBrowser::sequences() const
 {
   return track_container;
 }
@@ -376,10 +382,10 @@ GlSeqBrowser::link(const vector<int>& path, const vector<bool>& rc, int )
     pair_segment_map::iterator found_segment = path_segments[track_i].find(p);
     if (found_segment == path_segments[track_i].end()) {
       // not already found
-      float y1 = track_container[track_i].y();
-            y1 -= track_container[track_i].height()/2;
-      float y2 = track_container[track_i+1].y();
-            y2 += track_container[track_i+1].height()/2;
+      float y1 = track_container[track_i]->y();
+            y1 -= track_container[track_i]->height()/2;
+      float y2 = track_container[track_i+1]->y();
+            y2 += track_container[track_i+1]->height()/2;
       
       bool rcFlag = (prev_rc or *rc_i) and !(prev_rc and *rc_i);
       Segment s(prev_x, y1, *path_i, y2, rcFlag);
@@ -428,7 +434,9 @@ list<TrackRegion> GlSeqBrowser::selectedTracks() const
 //! copy sequence from selected track using formating function
 template<class Item>
 void GlSeqBrowser::copySelectedTracks(std::list<Item>& result, 
-             Item (*formatter)(const Sequence& s, int left, int right))
+             Item (*formatter)(boost::shared_ptr<Sequence> s, 
+                               int left, 
+                               int right))
 {
   result.clear();
 
@@ -443,7 +451,7 @@ void GlSeqBrowser::copySelectedTracks(std::list<Item>& result,
            << endl;
     } else {
       // we should be safe
-      const Sequence& seq = track_container[track_index].sequence();
+      boost::shared_ptr<Sequence> seq = track_container[track_index]->sequence();
       result.push_back(formatter(seq, track_i->left, track_i->right));
     }
   }
@@ -454,13 +462,15 @@ void GlSeqBrowser::copySelectedTracksAsFasta(std::string& copy_buffer)
 {
   std::list<std::string> result;
   struct AsFasta {
-    static string formatter(const Sequence& seq, int left, int right)
+    static string formatter(boost::shared_ptr<Sequence> seq, 
+                            int left, 
+                            int right)
     {
       stringstream s;
-      s << ">" << seq.get_fasta_header() 
+      s << ">" << seq->get_fasta_header() 
         << "|" << "subregion=" << left << "-" << right+1
         << std::endl
-        << seq.subseq(left, right-left+1) << std::endl;
+        << seq->subseq(left, right-left+1) << std::endl;
       return s.str();
     }
   };
@@ -478,9 +488,11 @@ void GlSeqBrowser::copySelectedTracksAsFasta(std::string& copy_buffer)
 void GlSeqBrowser::copySelectedTracksAsSequences(std::list<Sequence>& result)
 {
   struct AsSequence {
-    static Sequence formatter(const Sequence& seq, int left, int right)
+    static Sequence formatter(boost::shared_ptr<Sequence> seq, 
+                              int left, 
+                              int right)
     {
-      return seq.subseq(left, right-left+1);
+      return seq->subseq(left, right-left+1);
     }
   };
   copySelectedTracks(result, AsSequence::formatter);
@@ -490,7 +502,9 @@ void GlSeqBrowser::copySelectedTracksAsSeqLocation(
     std::list<SequenceLocation>& result)
 {
   struct AsSeqLocation {
-    static SequenceLocation formatter(const Sequence& seq, int left, int right)
+    static SequenceLocation formatter(boost::shared_ptr<Sequence> seq, 
+                                      int left, 
+                                      int right)
     {
       return SequenceLocation(seq, left, right);
     }
@@ -503,10 +517,12 @@ void GlSeqBrowser::copySelectedTracksAsString(std::string& copy_buffer)
 {
   std::list<string> result;
   struct AsString {
-    static string formatter(const Sequence& seq, int left, int right)
+    static string formatter(boost::shared_ptr<Sequence> seq, 
+                            int left, 
+                            int right)
     {
       stringstream s;
-      s << seq.subseq(left, right-left+1) << std::endl;
+      s << seq->subseq(left, right-left+1) << std::endl;
       return s.str();
     }
   };
@@ -531,7 +547,7 @@ void GlSeqBrowser::centerOnPath(const vector<int>& paths)
   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]);
+    track_container[track_i]->setX((viewport_center-15) - paths[track_i]);
   }
 }
 
@@ -548,7 +564,7 @@ void GlSeqBrowser::update_viewport(float center, double new_zoom)
 
 void GlSeqBrowser::update_layout()
 {
-  typedef std::vector<GlSequence>::iterator glseq_itor_type;
+  typedef std::vector<boost::shared_ptr<GlSequence> >::iterator glseq_itor_type;
   float available_height = (float)cur_ortho.top - 2 * (float)border_width;
   float max_base_pairs = 0;
   size_t track_count = track_container.size();
@@ -561,17 +577,17 @@ void GlSeqBrowser::update_layout()
         seq_i != track_container.end();
         ++seq_i, y-=track_spacing)
     {
-      seq_i->setX(0);
-      seq_i->setY(y);
-      if (seq_i->size() > max_base_pairs)
-        max_base_pairs = seq_i->size();
+      (*seq_i)->setX(0);
+      (*seq_i)->setY(y);
+      if ((*seq_i)->size() > max_base_pairs)
+        max_base_pairs = (*seq_i)->size();
     }
   } else if (track_count == 1) {
     // center the single track
     glseq_itor_type seq_i = track_container.begin();
-    seq_i->setX(0);
-    seq_i->setY(viewport_size.x /2);
-    max_base_pairs = seq_i->size();
+    (*seq_i)->setX(0);
+    (*seq_i)->setY(viewport_size.x /2);
+    max_base_pairs = (*seq_i)->size();
   } else {
     // nothing to do as we're empty
     return;
@@ -616,7 +632,7 @@ void GlSeqBrowser::draw_tracks() const
   for(size_t track_i = 0; track_i != track_container.size(); ++track_i)
   {
     glPushName(track_i);
-    track_container[track_i].draw(cur_ortho.left, cur_ortho.right);
+    track_container[track_i]->draw(cur_ortho.left, cur_ortho.right);
     glPopName();
   }
 }
@@ -675,8 +691,8 @@ void GlSeqBrowser::draw_segments() const
       // save the multipart name for our segment
       glPushName(path_index); glPushName(key.first); glPushName(key.second);
       glBegin(GL_LINES);
-      float seq_start_x = track_container[path_index].x();
-      float seq_end_x = track_container[path_index+1].x();
+      float seq_start_x = track_container[path_index]->x();
+      float seq_end_x = track_container[path_index+1]->x();
       glVertex3f(s.start.x + seq_start_x, s.start.y, -1);
       glVertex3f(s.end.x   + seq_end_x  , s.end.y, -1);
       glEnd();