set annotation draw function by type
[mussa.git] / alg / glsequence.cpp
index c77c29b5369a4acf5ab72d2981c16e3f2d403d08..2e5bb756b03979448291da6c56982439a3281549 100644 (file)
@@ -68,18 +68,21 @@ DrawableRef GlSequence::copy_drawable(DrawableRef old_d)
   return d;
 }
 
-SeqSpanRef GlSequence::make_undefined_sequence_annotation(
+SeqSpanRef GlSequence::make_drawable_annotation(
   Drawable::draw_func_ptr draw,
+  std::string name, 
   size_type start,
-  size_type count)
+  size_type count,
+  ColorRef color)
 {
   // create all the components of our annotation
   // (should seq_i-start_i 
   SeqSpanRef empty_seq(seq->subseq(start, count)); 
-  AnnotationsRef empty_seq_annot(new Annotations("null"));
+  AnnotationsRef empty_seq_annot(new Annotations(name));
   DrawableRef drawable(default_drawable());
   // glue everything to gether
   drawable->setDrawFunction(draw);
+  drawable->setColor(color);
   empty_seq->setAnnotations(empty_seq_annot);
   empty_seq->setDrawable(drawable);
   return empty_seq;
@@ -87,6 +90,7 @@ SeqSpanRef GlSequence::make_undefined_sequence_annotation(
 
 void GlSequence::add_annotations_for_defined_sequence(Drawable::draw_func_ptr draw)
 {
+  ColorRef sequence_color(new Color(0.0, 0.0, 0.0));
   Sequence::const_iterator start_i = begin();
   Sequence::const_iterator seq_i = begin();
   Sequence::const_iterator end_i = end();
@@ -105,7 +109,10 @@ void GlSequence::add_annotations_for_defined_sequence(Drawable::draw_func_ptr dr
         size_type start = start_block_i - start_i;
         size_type count = seq_i - start_block_i;
         // add the annotation
-        add_annotation(make_undefined_sequence_annotation(draw, start, count));        
+        add_annotation(
+          make_drawable_annotation(draw, "sequence", start, count, 
+                                   sequence_color)
+        );        
         // reset our counter...
         start_block_i = end_i;
       }
@@ -115,10 +122,36 @@ void GlSequence::add_annotations_for_defined_sequence(Drawable::draw_func_ptr dr
   if( start_block_i != end_i ) {
     size_type start = start_block_i - start_i;
     size_type count = seq_i - start_block_i;
-    add_annotation(make_undefined_sequence_annotation(draw, start, count));        
+    add_annotation(make_drawable_annotation(draw, "sequence", start, count, 
+                                            sequence_color)
+                  );        
   }
 }
 
+void GlSequence::update_annotation_draw_function(
+       std::string type, 
+       Drawable::draw_func_ptr draw_func,
+       ColorRef color
+)
+{
+  for(SeqSpanRefList::iterator annot_i = annotation_list->begin();
+      annot_i != annotation_list->end();
+      ++annot_i)
+  {
+    AnnotationsRef metadata( (*annot_i)->annotations() );
+     
+    if (metadata->has_key("type") and metadata->get("type") == type) {
+      // we should update
+      DrawableRef d((*annot_i)->drawable());
+      if (!d) {
+        d = default_drawable();
+        (*annot_i)->setDrawable(d);
+      }
+      d->setDrawFunction(draw_func);
+      d->setColor(color);
+    }
+  }
+}
 
 void GlSequence::setX(float value)
 {
@@ -465,9 +498,10 @@ void draw_narrow_track(SeqSpanRef s, float left, float right)
   float y( (parent_draw) ? parent_draw->y() : 0);
   float z( (parent_draw) ? parent_draw->z() : 10 );
   float height( (parent_draw) ? parent_draw->height() : default_height ); 
-
-  glColor3f(0.0, 0.0, 0.0);
-  float hsmall = height * 0.5;
+  Color c( (s->drawable()) ? s->drawable()->color() : Color(0.0, 0.0, 0.0) );  
+  glColor3fv(c.get());
+  
+  float hsmall = height * 0.25;
   GlSequence::draw_box(left, right, x+s->start(), x+s->stop(), 
                        hsmall, y, z+10);
 }
@@ -480,8 +514,9 @@ void draw_track(SeqSpanRef s, float left, float right)
   float y( (parent_draw) ? parent_draw->y() : 0);
   float z( (parent_draw) ? parent_draw->z() : 10 );
   float height( (parent_draw) ? parent_draw->height() : default_height ); 
+  Color c( (s->drawable()) ? s->drawable()->color() : Color(0.0, 0.0, 0.0) );  
 
-  glColor3f(0.0, 0.0, 0.0);
+  glColor3fv( c.get() );
   GlSequence::draw_box(left, right, x+s->start(), x+s->stop(), 
                        height, y, z+10);
 }
\ No newline at end of file