/usr/local/CPAN/Qt/KALedMeter.pm
package KALedMeter;
#/*
#* KDE::Asteroids - Copyright (c) Martin R. Jones 1997
#*
#* Part of the KDE::DE project
#*/
use strict;
use warnings;
use QtCore4;
use QtGui4;
use Qt3Support4;
use QtCore4::isa qw( Qt3::Frame );
use QtCore4::slots
setValue => ['int'];
#struct ColorRange
#{
#int mPc;
#int mValue;
#Qt::Color mColor;
#};
sub mRange() {
return this->{mRange};
}
sub mCount() {
return this->{mCount};
}
sub mCurrentCount() {
return this->{mCurrentCount};
}
sub mValue() {
return this->{mValue};
}
sub mCRanges() {
return this->{mCRanges};
}
sub NEW
{
my ($class, $parent) = @_;
$class->SUPER::NEW($parent);
this->{mRange} = 100;
this->{mCount} = 20;
this->{mCurrentCount} = 0;
this->{mValue} = 0;
this->{mCRanges} = [];
setMinimumWidth( mCount * 2 + frameWidth() );
}
sub setRange
{
my ( $r ) = @_;
this->{mRange} = $r;
if ( mRange < 1 ) {
this->{mRange} = 1;
}
setValue( mValue );
update();
}
sub setCount
{
my ( $c ) = @_;
this->{mCount} = $c;
if ( mCount < 1 ) {
this->{mCount} = 1;
}
setMinimumWidth( mCount * 2 + frameWidth() );
calcColorRanges();
setValue( mValue );
update();
}
sub setValue
{
my ( $v ) = @_;
this->{mValue} = $v;
if ( mValue > mRange ) {
this->{mValue} = mRange;
}
elsif ( mValue < 0 ) {
this->{mValue} = 0;
}
my $c = ( mValue + mRange / mCount - 1 ) * mCount / mRange;
if ( $c != mCurrentCount )
{
this->{mCurrentCount} = $c;
update();
}
}
sub addColorRange
{
my ( $pc, $c ) = @_;
my $cr = {
mPc => $pc,
mValue => undef,
mColor => $c,
};
push @{mCRanges()}, $cr;
calcColorRanges();
}
sub resizeEvent
{
my ( $e ) = @_;
this->SUPER::resizeEvent( $e );
my $w = ( width() - frameWidth() - 2 ) / mCount * mCount;
$w += frameWidth() + 2;
setFrameRect( Qt::Rect( 0, 0, $w, height() ) );
}
sub drawContents
{
my ( $p ) = @_;
my $b = contentsRect();
my $cidx = 0;
my $ncol = mCount;
my $col = colorGroup()->foreground();
if ( scalar @{mCRanges()} )
{
$col = mCRanges()->[$cidx]->{mColor};
$ncol = mCRanges()->[$cidx]->{mValue};
}
$p->setBrush( Qt::Brush(Qt::Color($col)) );
$p->setPen( Qt::Pen(Qt::Color($col)) );
my $lw = $b->width() / mCount;
my $lx = $b->left() + 1;
for ( my $i = 0; $i < mCurrentCount; $i++, $lx += $lw )
{
if ( $i > $ncol )
{
if ( ++$cidx < scalar @{mCRanges()} )
{
$col = mCRanges()->[$cidx]->{mColor};
$ncol = mCRanges()->[$cidx]->{mValue};
$p->setBrush( Qt::Brush(Qt::Color($col)) );
$p->setPen( Qt::Pen(Qt::Color($col)) );
}
}
$p->drawRect( int($lx), int($b->top() + 1), int($lw - 1), int($b->height() - 2) );
}
}
sub calcColorRanges
{
my $prev = 0;
foreach my $cr ( @{mCRanges()} )
{
$cr->{mValue} = $prev + $cr->{mPc} * mCount / 100;
$prev = $cr->{mValue};
}
}
1;