You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tork/src/statgraph.cpp

254 lines
7.7 KiB

/***************************************************************************
* $Id: statgraph.cpp,v 1.7 2008/07/31 19:56:26 hoganrobert Exp $
* Copyright (C) 2006 - 2008 Robert Hogan *
* robert@roberthogan.net *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* 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 St, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
/***************************************************************************
* *
* KCPULoad and KNetLoad are copyright (c) 1999-2000, Markus Gustavsson *
* (c) 2002, Ben Burton *
* (c) 2004-2005, Diego Pettenò *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "statgraph.h"
#include <ntqpainter.h>
#include <ntqlabel.h>
#include <kdebug.h>
#define SOFT_STEP 3
const TQColor StatGraph::defaultBgColor = TQt::black;
const TQColor StatGraph::defaultReadingColor = TQt::yellow;
const TQColor StatGraph::defaultLabelColor = TQt::white;
const TQColor StatGraph::defaultGridColor = TQt::lightGray;
/// Color used to pass transparent colors
//const TQColor StatGraph::invalidColor = TQColor(-1, -1, -1);
StatGraph::StatGraph(TQWidget *parent, ushort pace, ushort gridPace, const TQString &label, const TQColor &bgColor, const char *name)
: TQLabel(parent, name), m_style(Shades), m_gridPace(gridPace), m_pace(pace)
{
setLabel(label);
setBgColor(bgColor);
m_numReadings = width() / pace;
m_currReading = 0;
m_readings = new uint[m_numReadings]; memset(m_readings, 0, m_numReadings*sizeof(uint));
}
StatGraph::~StatGraph()
{
delete[] m_readings;
}
void StatGraph::setBgColor(const TQColor &color)
{
m_bgColor = color;
if ( m_bgColor.isValid() )
setBackgroundColor(m_bgColor);
}
inline void StatGraph::paintGrid(TQPainter &p)
{
p.setPen(m_gridColor);
const uint gridLines = height() / m_gridPace;
static uint graphWidth = width();
for(uint i = 0; i < gridLines; i++)
{
const int lineHeight = i*m_gridPace;
p.drawLine(0, lineHeight, graphWidth-1, lineHeight);
}
}
inline void StatGraph::paintShades(TQPainter &p)
{
//kdDebug() << "StatGraph::paintShades()" << endl;
const uint graphHeight = height();
for(uint i = 0; i < m_numReadings; i++)
{
ushort tmpPos = (m_currReading + i + 1) % m_numReadings;
if ( m_readings[tmpPos] > graphHeight )
m_readings[tmpPos] = graphHeight;
for(uint j = 0; j < m_readings[tmpPos]; j++)
{
if (m_readings[tmpPos] == 0 || j == 0)
p.setPen(m_bgColor);
else
p.setPen(m_readingColor.dark((100 * m_readings[tmpPos]) / j));
p.drawPoint(i, graphHeight - 1 - j);
}
}
}
inline void StatGraph::paintBars(TQPainter &p)
{
//kdDebug() << "StatGraph::paintBars()" << endl;
const uint graphHeight = height();
// Draw the readings bars, then the lower to save on pen adjustments.
p.setPen(m_readingColor);
for(uint i = 0; i < m_numReadings; i++)
{
ushort tmpPos = (m_currReading + i + 1) % m_numReadings;
p.drawLine(i, graphHeight - 1 - m_readings[tmpPos], i, graphHeight - 1);
}
}
inline void StatGraph::paintLines(TQPainter &p)
{
//kdDebug() << "StatGraph::paintLines()" << endl;
const uint graphHeight = height();
// Draw the reading line, then the lower to save on pen adjustments.
p.setPen(m_readingColor);
for(uint i = 0; i < m_numReadings; i++)
{
ushort tmpPos = (m_currReading + i + 1) % m_numReadings;
p.drawPoint(i, graphHeight - 1 - m_readings[tmpPos]);
}
}
inline void StatGraph::paintLabel(TQPainter &p)
{
//kdDebug() << "StatGraph::paintLabel()" << endl;
p.setFont(TQFont("Helvetica", 8));
p.setPen(m_labelColor);
p.drawText(rect(), AlignLeft | AlignTop, m_label);
}
void StatGraph::clear()
{
memset(m_readings, 0, m_numReadings*sizeof(uchar));
update();
}
void StatGraph::addPercentReading(uchar reading, bool soft)
{
//kdDebug() << "StatGraph::addPercentReading(" << (uint)reading << ", " << soft << ")" << endl;
// Rescale the readings to a measure in pixels.
uint pix = ( reading * height() )/100;
if ( soft )
softenReadings(pix);
m_currReading = (m_currReading+1) % m_numReadings;
m_readings[m_currReading] = pix;
update();
update();
}
void StatGraph::softenReadings(uint &reading)
{
//kdDebug() << "StatGraph::softenReadings(" << reading << ")" << endl;
uint old = m_readings[m_currReading];
// Modify the reading.
if (reading > old + SOFT_STEP)
reading = old + SOFT_STEP;
else if (reading > SOFT_STEP && reading < old - SOFT_STEP)
reading = old - SOFT_STEP;
}
void StatGraph::resizeEvent(TQResizeEvent *e)
{
TQLabel::resizeEvent(e);
uint oldNumReadings = m_numReadings;
m_numReadings = width() / m_pace;
if ( m_numReadings != oldNumReadings )
{
uint *oldReadings = m_readings;
m_readings = new uint[m_numReadings];
memset(m_readings, 0, m_numReadings*sizeof(uint));
if ( m_numReadings < oldNumReadings )
memcpy(m_readings, oldReadings, m_numReadings*sizeof(uint));
else
memcpy(m_readings, oldReadings, oldNumReadings*sizeof(uint));
delete oldReadings;
m_currReading %= m_numReadings;
}
}
void StatGraph::paintEvent(TQPaintEvent *e)
{
TQLabel::paintEvent(e);
if ( ! m_readingColor.isValid() ) m_readingColor = defaultReadingColor;
if ( ! m_labelColor.isValid() ) m_labelColor = defaultLabelColor;
if ( ! m_gridColor.isValid() ) m_gridColor = defaultGridColor;
TQPainter p(this);
if ( m_gridPace )
paintGrid(p);
switch(m_style)
{
case Shades:
paintShades(p); break;
case Bars:
paintBars(p); break;
case Lines:
paintLines(p); break;
default:
kdDebug() << "Unknown style " << m_style << endl;
}
if ( ! m_label.isNull() )
paintLabel(p);
}
void StatGraph::mousePressEvent(TQMouseEvent *e)
{
TQLabel::mousePressEvent(e);
m_button = e->button();
}
void StatGraph::mouseReleaseEvent(TQMouseEvent *e)
{
TQLabel::mouseReleaseEvent(e);
if ( m_button == e->button() )
{
switch(m_button)
{
case LeftButton:
emit clickedLeft();
break;
case RightButton:
emit clickedRight();
break;
default:
kdDebug() << "Unknown button combination" << endl;
}
}
m_button = TQt::NoButton;
}
#include "statgraph.moc"