factor out viewport to display scaling functions
[mussa.git] / alg / glseqbrowser.cpp
index 5d93c6ce6087b4f9ef2b3d54d2365da20b77b149..df9462618b119f56c704a234a059d184ef2c8a4a 100644 (file)
@@ -144,10 +144,8 @@ void GlSeqBrowser::processSelection(GLuint hits, GLuint buffer[], GLuint bufsize
 
 void GlSeqBrowser::selectRegion(int top, int left, int bottom, int right)
 {
-  GLfloat x_scale = cur_ortho.width()/((float)viewport_size.x);
-  GLfloat y_scale = cur_ortho.height()/((float)viewport_size.y);
-  GLfloat x_left = cur_ortho.left + (left*x_scale);
-  GLfloat x_right = cur_ortho.left + (right * x_scale);
+  GLfloat x_left = viewportXtoWorldX(left);
+  GLfloat x_right = viewportXtoWorldX(right);cur_ortho.left;
 
   if (top > bottom) {
     // woah, someone gave us a rectangle with the origin in the lower left
@@ -156,8 +154,8 @@ void GlSeqBrowser::selectRegion(int top, int left, int bottom, int right)
     top = temp;
   }
   // swap the orientation of canvas coordinates
-  GLfloat y_top = cur_ortho.top-(bottom*y_scale);
-  GLfloat y_bottom = cur_ortho.top - top * y_scale;
+  GLfloat y_top = viewportYtoWorldY(bottom);
+  GLfloat y_bottom = viewportYtoWorldY(top);
   selectedRegion = rect<float>(y_top, x_left, y_bottom, x_right);
 
   // hopefully this will make a buffer big enough to receive 
@@ -185,6 +183,13 @@ void GlSeqBrowser::selectRegion(int top, int left, int bottom, int right)
   processSelection(hits, selectBuf, select_buf_size, selectedRegion);
 }
 
+void GlSeqBrowser::clearSelection()
+{
+  selected_paths.clear();
+  selected_tracks.clear();
+  selectedMode = false;  
+}
+
 float GlSeqBrowser::border() const
 {
   return border_width;
@@ -308,14 +313,14 @@ double GlSeqBrowser::zoom() const
   return zoom_level;
 }
 
-void GlSeqBrowser::setColorMapper(boost::shared_ptr<AnnotationColors> cm)
+void GlSeqBrowser::setColorMapper(AnnotationColorsRef cm)
 {
   color_mapper = cm;
 }
 
-const AnnotationColors& GlSeqBrowser::colorMapper()
+const AnnotationColorsRef GlSeqBrowser::colorMapper()
 {
-  return *color_mapper;
+  return color_mapper;
 }
 
 void GlSeqBrowser::clear()
@@ -336,34 +341,38 @@ void GlSeqBrowser::clear_selection()
 
 void GlSeqBrowser::push_sequence(const Sequence& s)
 {
-  boost::shared_ptr<Sequence> seq_copy(new Sequence(s));
-  GlSequence gs(seq_copy, color_mapper);
+  GlSequenceRef gs(new GlSequence(s, color_mapper));
   push_sequence(gs);
 }
 
-
-void GlSeqBrowser::push_sequence(boost::shared_ptr<Sequence> s)
+void GlSeqBrowser::push_sequence(SequenceRef s)
 {
-  boost::shared_ptr<GlSequence> gs(new GlSequence(s, color_mapper));
+  GlSequenceRef gs(new GlSequence(*s, color_mapper));
   push_sequence(gs);
 }
 
 void GlSeqBrowser::push_sequence(GlSequence gs)
 {
-  boost::shared_ptr<GlSequence> new_gs(new GlSequence(gs));
+  GlSequenceRef new_gs(new GlSequence(gs));
   push_sequence(new_gs);
 }
 
-void GlSeqBrowser::push_sequence(boost::shared_ptr<GlSequence> gs)
+void GlSeqBrowser::push_sequence(GlSequenceRef gs)
 {
+  ColorRef default_color(GlSequence::default_gene_color());
+  GlSequenceRef new_gs(new GlSequence(gs));
+  new_gs->update_annotation_draw_function("gene", draw_narrow_track, default_color);
+  // mark where the sequence is
+  new_gs->add_annotations_for_defined_sequence(draw_summarized_track);
+  
   clear_links();
-  track_container.push_back(gs);
+  track_container.push_back(new_gs);
   update_layout();
   if (track_container.size() > 1)
     path_segments.push_back(pair_segment_map());
 }
 
-const std::vector<boost::shared_ptr<GlSequence> >& GlSeqBrowser::sequences() const
+const std::vector<GlSequenceRef >& GlSeqBrowser::sequences() const
 {
   return track_container;
 }
@@ -462,9 +471,7 @@ list<TrackRegion> GlSeqBrowser::selectedTracks() const
 //! copy sequence from selected track using formating function
 template<class Item>
 size_t GlSeqBrowser::copySelectedTracks(std::list<Item>& result, 
-             Item (*formatter)(boost::shared_ptr<Sequence> s, 
-                               int left, 
-                               int right))
+             Item (*formatter)(const Sequence& s, int left, int right))
 {
   size_t base_pairs_copied = 0;
   result.clear();
@@ -480,7 +487,7 @@ size_t GlSeqBrowser::copySelectedTracks(std::list<Item>& result,
            << endl;
     } else {
       // we should be safe
-      boost::shared_ptr<Sequence> seq = track_container[track_index]->sequence();
+      Sequence seq(*track_container[track_index]);
       result.push_back(formatter(seq, track_i->left, track_i->right));
       base_pairs_copied += max(track_i->right-track_i->left, 0);
     }
@@ -493,15 +500,13 @@ size_t GlSeqBrowser::copySelectedTracksAsFasta(std::string& copy_buffer)
 {
   std::list<std::string> result;
   struct AsFasta {
-    static string formatter(boost::shared_ptr<Sequence> seq, 
-                            int left, 
-                            int right)
+    static string formatter(const 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();
     }
   };
@@ -520,11 +525,11 @@ size_t GlSeqBrowser::copySelectedTracksAsFasta(std::string& copy_buffer)
 size_t GlSeqBrowser::copySelectedTracksAsSequences(std::list<Sequence>& result)
 {
   struct AsSequence {
-    static Sequence formatter(boost::shared_ptr<Sequence> seq, 
+    static Sequence formatter(const Sequence& seq, 
                               int left, 
                               int right)
     {
-      return seq->subseq(left, right-left+1);
+      return seq.subseq(left, right-left+1);
     }
   };
   return copySelectedTracks(result, AsSequence::formatter);
@@ -534,7 +539,7 @@ size_t GlSeqBrowser::copySelectedTracksAsSeqLocation(
     std::list<SequenceLocation>& result)
 {
   struct AsSeqLocation {
-    static SequenceLocation formatter(boost::shared_ptr<Sequence> seq, 
+    static SequenceLocation formatter(const Sequence& seq, 
                                       int left, 
                                       int right)
     {
@@ -549,12 +554,12 @@ size_t GlSeqBrowser::copySelectedTracksAsString(std::string& copy_buffer)
 {
   std::list<string> result;
   struct AsString {
-    static string formatter(boost::shared_ptr<Sequence> seq, 
+    static string formatter(const Sequence& seq, 
                             int left, 
                             int right)
     {
       stringstream s;
-      s << seq->subseq(left, right-left+1);
+      s << seq.subseq(left, right-left+1);
       return s.str();
     }
   };
@@ -704,12 +709,14 @@ void GlSeqBrowser::draw_segments() const
                        back_inserter(selected));
 
       if (not s.reversed) {
+        // forward
         if (selected_paths.size() == 0 or selected.size() > 0) {
           glColor4f(1.0, 0.0, 0.0, 1.0);
         } else {
           glColor4f(1.0, 0.7, 0.7, 0.4);
         }
       } else { 
+        // reverse
         if (selected_paths.size() == 0 or selected.size() > 0) {
           glColor4f(0.0, 0.0, 1.0, 1.0);
         } else {