/* KSysGuard, the KDE System Guard Copyright (c) 1999, 2000 Chris Schlaeger This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. KSysGuard is currently maintained by Chris Schlaeger . Please do not commit any changes without consulting me first. Thanks! */ #include #include #include #include #include #include #include "BarGraph.h" BarGraph::BarGraph( TQWidget *parent, const char *name ) : TQWidget( parent, name ) { // paintEvent covers whole widget so we use no background to avoid flicker setBackgroundMode( NoBackground ); bars = 0; minValue = 0.0; maxValue = 100.0; lowerLimit = upperLimit = 0.0; lowerLimitActive = upperLimitActive = false; normalColor = KSGRD::Style->firstForegroundColor(); alarmColor = KSGRD::Style->alarmColor(); backgroundColor = KSGRD::Style->backgroundColor(); fontSize = KSGRD::Style->fontSize(); // Anything smaller than this does not make sense. setMinimumSize( 16, 16 ); tqsetSizePolicy( TQSizePolicy( TQSizePolicy::Expanding, TQSizePolicy::Expanding, false ) ); } BarGraph::~BarGraph() { } bool BarGraph::addBar( const TQString &footer ) { samples.resize( bars + 1 ); samples[ bars++ ] = 0.0; footers.append( footer ); return true; } bool BarGraph::removeBar( uint idx ) { if ( idx >= bars ) { kdDebug(1215) << "BarGraph::removeBar: idx " << idx << " out of range " << bars << endl; return false; } samples.resize( --bars ); footers.remove( footers.tqat( idx ) ); update(); return true; } void BarGraph::updateSamples( const TQMemArray &newSamples ) { samples = newSamples; update(); } void BarGraph::changeRange( double min, double max ) { minValue = min; maxValue = max; } void BarGraph::paintEvent( TQPaintEvent* ) { int w = width(); int h = height(); TQPixmap pm( w, h ); TQPainter p; p.tqbegin( &pm, this ); p.setFont( TQFont( p.font().family(), fontSize ) ); TQFontMetrics fm( p.font() ); pm.fill( backgroundColor ); /* Draw white line along the bottom and the right side of the * widget to create a 3D like look. */ p.setPen( TQColor( tqcolorGroup().light() ) ); p.drawLine( 0, h - 1, w - 1, h - 1 ); p.drawLine( w - 1, 0, w - 1, h - 1 ); p.setClipRect( 1, 1, w - 2, h - 2 ); if ( bars > 0 ) { int barWidth = ( w - 2 ) / bars; uint b; /* Labels are only printed underneath the bars if the labels * for all bars are smaller than the bar width. If a single * label does not fit no label is shown. */ bool showLabels = true; for ( b = 0; b < bars; b++ ) if ( fm.width( footers[ b ] ) > barWidth ) showLabels = false; int barHeight; if ( showLabels ) barHeight = h - 2 - ( 2 * fm.lineSpacing() ) - 2; else barHeight = h - 2; for ( uint b = 0; b < bars; b++ ) { int topVal = (int) ( (float)barHeight / maxValue * ( samples[ b ] - minValue ) ); /* TODO: This widget does not handle negative values properly. */ if ( topVal < 0 ) topVal = 0; for ( int i = 0; i < barHeight && i < topVal; i += 2 ) { if ( ( upperLimitActive && samples[ b ] > upperLimit ) || ( lowerLimitActive && samples[ b ] < lowerLimit ) ) p.setPen( alarmColor.light( static_cast( 30 + ( 70.0 / ( barHeight + 1 ) * i ) ) ) ); else p.setPen( normalColor.light( static_cast( 30 + ( 70.0 / ( barHeight + 1 ) * i ) ) ) ); p.drawLine( b * barWidth + 3, barHeight - i, ( b + 1 ) * barWidth - 3, barHeight - i ); } if ( ( upperLimitActive && samples[ b ] > upperLimit ) || ( lowerLimitActive && samples[ b ] < lowerLimit ) ) p.setPen( alarmColor ); else p.setPen( normalColor ); if ( showLabels ) { p.drawText( b * barWidth + 3, h - ( 2 * fm.lineSpacing() ) - 2, barWidth - 2 * 3, fm.lineSpacing(), Qt::AlignCenter, footers[ b ] ); p.drawText( b * barWidth + 3, h - fm.lineSpacing() - 2, barWidth - 2 * 3, fm.lineSpacing(), Qt::AlignCenter, TQString( "%1" ).arg( samples[ b ] ) ); } } } p.end(); bitBlt( this, 0, 0, &pm ); } #include "BarGraph.moc"