184 lines
3.7 KiB
Perl
184 lines
3.7 KiB
Perl
package WebGUI::Image::Graph::XYGraph::Line;
|
|
|
|
use strict;
|
|
use WebGUI::Image::Graph::XYGraph;
|
|
use List::Util;
|
|
use POSIX;
|
|
|
|
our @ISA = qw(WebGUI::Image::Graph::XYGraph);
|
|
|
|
=head1 NAME
|
|
|
|
Package WebGUI::Image::Graph::XYGraph::Line
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
Package for creating line graphs.
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
This package privides the logic for drawing 2d line graphs, 3d lines are in the
|
|
pipeline but not yet ready for prime time.
|
|
|
|
The possibilities are quite limited for now but will be enhanced upon in the future.
|
|
|
|
=head1 METHODS
|
|
|
|
These methods are available from this class:
|
|
|
|
=cut
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
=head2 drawGraph
|
|
|
|
Draws all the lines.
|
|
|
|
=cut
|
|
|
|
sub drawGraph {
|
|
my ($currentBar, %location);
|
|
my $self = shift;
|
|
|
|
$self->processDataSet;
|
|
|
|
my $numberOfGroups = List::Util::max(map {scalar @$_} @{$self->{_datasets}});
|
|
my $interval = $self->getChartWidth / ($numberOfGroups - 1);
|
|
|
|
%location = %{$self->getChartOffset};
|
|
$location{y} += $self->getChartHeight;
|
|
|
|
foreach (@{$self->{_lines}}) {
|
|
$self->drawLine($_, \%location, $interval);
|
|
}
|
|
}
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
=head2 drawLine ( line, location, interval )
|
|
|
|
Draws a bar defined by bar and with width barWidth at location.
|
|
|
|
=head3 line
|
|
|
|
A hashref defining the line. Must contain keys 'strokeColor' and
|
|
'dataset', the latter one being an arrayref containing all points of the line.
|
|
|
|
=head3 location
|
|
|
|
A hashref containing the location of the bottom-left corner of the line's
|
|
origin. Keys 'x' and 'y' must specify the x- and y-coordinates respectively.
|
|
|
|
=head3 interval
|
|
|
|
The distance between x-axis anchors in pixels.
|
|
|
|
=cut
|
|
|
|
|
|
|
|
sub drawLine {
|
|
my $self = shift;
|
|
my $line = shift;
|
|
my $location = shift;
|
|
my $interval = shift;
|
|
|
|
my %currentLocation = %$location;
|
|
|
|
|
|
my $dataCounter;
|
|
my $path;# = " M ".$currentLocation{x}.",".$currentLocation{y};
|
|
foreach (@{$line->{dataset}}) {
|
|
$path .= ($dataCounter++) ? " L " : " M ";
|
|
$path .= $currentLocation{x}.",".($currentLocation{y} - $_*$self->getPixelsPerUnit);
|
|
|
|
$currentLocation{x} += $interval;
|
|
}
|
|
|
|
$self->image->Draw(
|
|
primitive => 'Path',
|
|
stroke => $line->{strokeColor},
|
|
points => $path,
|
|
fill => 'none',
|
|
);
|
|
}
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
=head2 formNamespace
|
|
|
|
Returns the form namespace of this plugin. See WegBUI::Image::Graph for
|
|
more elaborate information.
|
|
|
|
=cut
|
|
|
|
sub formNamespace {
|
|
my $self = shift;
|
|
|
|
return $self->SUPER::formNamespace.'_Line';
|
|
}
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
=head2 getAnchorSpacing
|
|
|
|
Returns the distance in pixels between two anchors on the x axis that define teh
|
|
placement of bars and labels.
|
|
|
|
=cut
|
|
|
|
sub getAnchorSpacing {
|
|
my $self = shift;
|
|
|
|
my $numberOfGroups = List::Util::max(map {scalar @$_} @{$self->getDataset});
|
|
|
|
my $spacing = $self->getChartWidth / ($numberOfGroups - 1);
|
|
|
|
return {
|
|
x => $spacing,
|
|
y => 0,
|
|
};
|
|
}
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
=head2 getFirstAnchorLocation
|
|
|
|
Returns a hashref containing the location of the leftmost x-axis anchor.
|
|
Location coordinates are encoded in keys 'x' and 'y'.
|
|
|
|
=cut
|
|
|
|
sub getFirstAnchorLocation {
|
|
my $self = shift;
|
|
|
|
return {
|
|
x => $self->getChartOffset->{x},
|
|
y => $self->getChartOffset->{y} + $self->getChartHeight
|
|
}
|
|
}
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
=head2 processDataset
|
|
|
|
Processes the dataset. Used by drawGraph.
|
|
|
|
=cut
|
|
|
|
sub processDataSet {
|
|
my ($barProperties);
|
|
my $self = shift;
|
|
|
|
my $palette = $self->getPalette;
|
|
foreach (@{$self->{_datasets}}) {
|
|
push (@{$self->{_lines}}, {
|
|
dataset => $_,
|
|
strokeColor => $palette->getColor->getStrokeColor,
|
|
});
|
|
$palette->getNextColor;
|
|
}
|
|
}
|
|
|
|
1;
|
|
|