Bio-Graphics

 view release on metacpan or  search on metacpan

lib/Bio/Graphics/Glyph/track.pm  view on Meta::CPAN

package Bio::Graphics::Glyph::track;

use strict;
use base qw(Bio::Graphics::Glyph);

# track sets connector to empty
sub connector {
  my $self = shift;
  return $self->SUPER::connector(@_) if $self->all_callbacks;
  return 'none';
}

sub draw {
  my $self = shift;
  my ($gd,$left,$top,$partno,$total_parts) = @_;

  # the clipping code here prevents poorly-behaving glyphs from
  # drawing outside the track
  my @clip;
  if ($gd->can('clip')) {
    @clip = $gd->clip();
    # glyphs are allowed a slop area of ~3 on either side and 6 on the top and bottom
    # in order to spill out over their boundaries.  Beyond this they start overlapping
    # with other glyphs in an ugly way.
    my @cliprect = ($left-$self->panel->pad_left,
		    $top-6,
		    $self->panel->right+$self->panel->pad_right,
		    $top+$self->layout_height+6);
    $gd->clip(@cliprect);
  }

  my @parts = $self->parts;

  # give the glyph a chance to do track-wide normalization if it supports it
  $self->normalize_track(@parts);

  # dynamic assignment of colors
  if ($self->option('color_series') || $self->option('color_cycle')) {
      my $series = $self->option('color_cycle');
      $series ||= 'red blue green yellow orange brown aqua black fuchsia green lime maroon navy olive purple silver teal magenta';
      my @color_series    = ref($series) eq 'ARRAY' ? @$series : split /\s+/,$series;
      my $index           = 0;
      my %color_cache;
      my $closure = sub {
	  my $glyph = pop;
	  return $color_cache{$glyph} ||= $color_series[$index++ % @color_series];
      };
      $self->configure(bgcolor   => $closure);
  }

  local $Bio::Graphics::Panel::GlyphScratch;  # set $GlyphScratch to undef
  for (my $i=0; $i<@parts; $i++) {
    $parts[$i]->draw_highlight($gd,$left,$top);
    $parts[$i]->draw_it($gd,$left,$top,0,1);
  }

  $gd->clip(@clip) if @clip;
}

# do nothing for components
# sub draw_component { }

sub normalize_track {
    my $self  = shift;
    my @parts = @_;
    @parts    = map {$_->isa('Bio::Graphics::Glyph::group') ? $_->parts : $_} @parts;
    $parts[0]->normalize_track(@parts) if $parts[0] && $parts[0]->can('normalize_track');
}



( run in 1.941 second using v1.01-cache-2.11-cpan-39bf76dae61 )