X-Git-Url: http://woldlab.caltech.edu/gitweb/?p=mussa.git;a=blobdiff_plain;f=alg%2Fglsequence.cpp;h=2e5bb756b03979448291da6c56982439a3281549;hp=c77c29b5369a4acf5ab72d2981c16e3f2d403d08;hb=3c5e9d09704b35421555398fe79bb50b4218d615;hpb=55f0a3e9612b3e1df2c588682d7f605203eab421 diff --git a/alg/glsequence.cpp b/alg/glsequence.cpp index c77c29b..2e5bb75 100644 --- a/alg/glsequence.cpp +++ b/alg/glsequence.cpp @@ -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