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;
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();
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;
}
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)
{
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);
}
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
//! search through sequence and add an annotation highlighting all the non AGCT characters
void add_annotations_for_defined_sequence(Drawable::draw_func_ptr draw=0);
+ /**!search through our annotations and set the draw function for a particular "type"
+ * this is really a temporary solution to configuring annotation display styles
+ */
+ void update_annotation_draw_function(
+ std::string type,
+ Drawable::draw_func_ptr draw,
+ ColorRef color
+ );
//! set our starting x (horizontal) coordinate
void setX(float x);
//! get our starting x (horizontal) coordinate
const GLfloat char_pix_per_world_unit;
//! initalize a SeqSpanRef covering start, count
- SeqSpanRef make_undefined_sequence_annotation(
+ SeqSpanRef make_drawable_annotation(
Drawable::draw_func_ptr draw,
+ std::string name,
size_type start,
- size_type count);
+ size_type count,
+ ColorRef color);
//! draw sequence as a bar
void draw_track(GLfloat, GLfloat) const;
BOOST_CHECK_EQUAL(annot[2]->size(), 1);
}
+void dummy_draw_func(SeqSpanRef ref, float l, float r)
+{
+}
+
+BOOST_AUTO_TEST_CASE( glsequence_set_annotation_drawfunc_by_type )
+{
+ ColorRef default_color(new Color(1.0, 0.0, 0.0));
+ boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);
+ GlSequence s("AAAAGGGGNNNNTTTTCCC", cm);
+ // 0123456789012345678
+ s.add_annotation("Aname", "value", 0, 4);
+ s.add_annotation("Gname", "value", 4, 4);
+ s.add_annotation("Tname", "gene", 12, 4);
+ s.update_annotation_draw_function("gene", dummy_draw_func, default_color);
+
+ BOOST_CHECK_EQUAL(s.annotations().size(), 3);
+ std::vector<SeqSpanRef> annot(s.annotations().begin(), s.annotations().end());
+ // the two not updated annotations shouldn't have a drawable attached to them yet
+ BOOST_CHECK( not annot[0]->drawable());
+ BOOST_CHECK( not annot[1]->drawable());
+ // the annotation updated must be drawable
+ BOOST_REQUIRE(annot[2]->drawable());
+ // and it must have the right draw function
+ BOOST_CHECK_EQUAL(annot[2]->drawable()->drawFunction(), dummy_draw_func);
+ BOOST_CHECK_EQUAL(annot[2]->drawable()->color(), default_color);
+}
+
BOOST_AUTO_TEST_CASE( glsequence_renderable )
{
boost::shared_ptr<AnnotationColors> cm(new AnnotationColors);