summaryrefslogtreecommitdiff
authordrw <drw>2004-03-30 17:49:34 (UTC)
committer drw <drw>2004-03-30 17:49:34 (UTC)
commitc74a24cbd04cb74d832908eb2b373aed7b3cea71 (patch) (side-by-side diff)
tree3ea474f4c8fa64495b8e0604f34ae5a1bd55ac56
parent2e5d236b647b1747dca61486ecdd85c8f3869487 (diff)
downloadopie-c74a24cbd04cb74d832908eb2b373aed7b3cea71.zip
opie-c74a24cbd04cb74d832908eb2b373aed7b3cea71.tar.gz
opie-c74a24cbd04cb74d832908eb2b373aed7b3cea71.tar.bz2
Fix drawing of account balance graph when balance < 0.0
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--noncore/apps/checkbook/graph.cpp17
-rw-r--r--noncore/apps/checkbook/graph.h2
-rw-r--r--noncore/apps/checkbook/graphinfo.cpp13
-rw-r--r--noncore/apps/checkbook/graphinfo.h1
4 files changed, 25 insertions, 8 deletions
diff --git a/noncore/apps/checkbook/graph.cpp b/noncore/apps/checkbook/graph.cpp
index 389972e..72da738 100644
--- a/noncore/apps/checkbook/graph.cpp
+++ b/noncore/apps/checkbook/graph.cpp
@@ -21,150 +21,153 @@
 -.   .:....=;==+<; General Public License along with this file;
  -_. . .   )=.  = see the file COPYING. If not, write to the
    --        :-=` Free Software Foundation, Inc.,
59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#include "graph.h"
#include "graphinfo.h"
#include <qpainter.h>
#include <math.h>
Graph::Graph( QWidget *parent, GraphInfo *d, const QString &name, int flags )
: QWidget( parent, name, flags )
{
data = d;
graph.setOptimization( QPixmap::BestOptim );
}
void Graph::setGraphInfo( GraphInfo *d )
{
data = d;
}
void Graph::drawGraph( bool regen )
{
if ( regen )
{
initGraph();
}
QPainter p( this );
p.drawPixmap( 0, 0, graph );
}
void Graph::paintEvent( QPaintEvent * )
{
drawGraph( FALSE );
}
void Graph::resizeEvent( QResizeEvent * )
{
drawGraph( TRUE );
}
void Graph::initGraph()
{
graph.resize( width(), height() );
graph.fill( QColor( 255, 255, 255 ) );
if ( !data )
{
return;
}
// Any common stuff here (titles, ???)
switch ( data->graphType() )
{
case GraphInfo::BarChart :
{
- drawBarChart( width(), height(), data->maxValue() );
+ drawBarChart( width(), height(), data->maxValue(), data->minValue() );
}
break;
case GraphInfo::PieChart :
{
drawPieChart( width(), height(), data->totalValue() );
}
};
}
-void Graph::drawBarChart( int width, int height, float max )
+void Graph::drawBarChart( int width, int height, float max, float min )
{
QPainter p( &graph );
// Try to set the font size smaller for text
QFont f = font();
f.setPointSize( 8 );
p.setFont( f );
int x = 0;
int i = 0;
int n = data->numberDataPoints();
QFontMetrics fm=fontMetrics();
int fh = fm.height();
int fw;
QColor c( 0, 0, 255);
p.setBrush( c );
+ if ( min > 0 )
+ min = 0.0;
+
+ int bw = ( width - width / 4 ) / n;
+ int hoffset = int( ( height - height / 4 - 1 ) * ( min * -1 ) / ( max - min ) );
for (DataPointInfo *dp = data->firstDataPoint(); dp; dp = data->nextDataPoint() )
{
- int bw = ( width - width / 4 - x ) / ( n - i );
- int bh = int( ( height - height / 4 - 1 ) * dp->value() / max );
- p.drawRect( width / 8 + x, height - height / 8 - 1 - bh, bw, bh );
+ int bh = int( ( height - height / 4 - 1 ) * dp->value() / ( max - min ) );
+ p.drawRect( width / 8 + x, height - height / 8 - 1 - hoffset - bh, bw, bh );
fw = fm.width( dp->label() );
- p.drawText( width / 8 + x - fw / 2 + bw / 2, height - height / 8, fw,
+ p.drawText( width / 8 + x - fw / 2 + bw / 2, height - height / 8 - hoffset, fw,
fh + height / 8, AlignTop | AlignHCenter, dp->label() );
-// WordBreak | AlignTop | AlignHCenter, dp->label() );
i++;
x += bw;
}
}
void Graph::drawPieChart( int width, int height, float sum )
{
QPainter p( &graph );
// Try to set the font size smaller for text
QFont f = font();
f.setPointSize( 8 );
p.setFont( f );
int n = data->numberDataPoints();
int apos = -90 * 16;
int xd = width - width / 5;
int yd = height - height / 5;
int i = 0;
QColor c;
for (DataPointInfo *dp = data->firstDataPoint(); dp; dp = data->nextDataPoint() )
{
c.setHsv( ( i *255) / n, 255, 255 );
p.setBrush( c );
int a = int( ( dp->value() * 360.0 ) / sum * 16.0 + 0.5 );
p.drawPie( width/10, height/10, xd, yd, -apos, -a );
apos += a;
i++;
}
double apos2 = -90 * 3.14159 / 180;
for (DataPointInfo *dp = data->firstDataPoint(); dp; dp = data->nextDataPoint() )
{
double a = dp->value() *360 / sum * 3.14159 / 180;
int x = int( cos( apos2 + a/2 ) * width * 5/16 + width/2 + 0.5 );
int y = int( sin( apos2 + a/2 ) * height * 5/16 + height/2 + 0.5 );
p.drawText( x - width/8, y - height/8, width/4, height/4, WordBreak | AlignCenter,
dp->label() );
apos2 += a;
}
}
diff --git a/noncore/apps/checkbook/graph.h b/noncore/apps/checkbook/graph.h
index 340e910..616cbb6 100644
--- a/noncore/apps/checkbook/graph.h
+++ b/noncore/apps/checkbook/graph.h
@@ -1,63 +1,63 @@
/*
                This file is part of the OPIE Project
=.
             .=l. Copyright (c) 2002 Dan Williams <drw@handhelds.org>
           .>+-=
 _;:,     .>    :=|. This file is free software; you can
.> <`_,   >  .   <= redistribute it and/or modify it under
:`=1 )Y*s>-.--   : the terms of the GNU General Public
.="- .-=="i,     .._ License as published by the Free Software
 - .   .-<_>     .<> Foundation; either version 2 of the License,
     ._= =}       : or (at your option) any later version.
    .%`+i>       _;_.
    .i_,=:_.      -<s. This file 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 file;
  -_. . .   )=.  = see the file COPYING. If not, write to the
    --        :-=` Free Software Foundation, Inc.,
59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#ifndef GRAPH_H
#define GRAPH_H
#include <qpixmap.h>
#include <qwidget.h>
class GraphInfo;
class QPainter;
class Graph : public QWidget
{
Q_OBJECT
public:
Graph( QWidget * = 0x0, GraphInfo * = 0x0, const QString & = 0x0, int = 0 );
void setGraphInfo( GraphInfo * );
void drawGraph( bool = FALSE );
protected:
void paintEvent( QPaintEvent * );
void resizeEvent( QResizeEvent * );
private:
GraphInfo *data;
QPixmap graph;
void initGraph();
- void drawBarChart( int, int, float );
+ void drawBarChart( int, int, float, float );
void drawPieChart( int, int, float );
};
#endif
diff --git a/noncore/apps/checkbook/graphinfo.cpp b/noncore/apps/checkbook/graphinfo.cpp
index fec6896..5b72c80 100644
--- a/noncore/apps/checkbook/graphinfo.cpp
+++ b/noncore/apps/checkbook/graphinfo.cpp
@@ -36,88 +36,101 @@ GraphInfo::GraphInfo( GraphType type, DataPointList *data, const QString &title,
gt = title;
xt = xtitle;
yt = ytitle;
}
GraphInfo::~GraphInfo()
{
if ( d )
{
for ( DataPointInfo *data = d->first(); data; data = d->next() )
{
delete data;
}
}
}
GraphInfo::GraphType GraphInfo::graphType()
{
return t;
}
void GraphInfo::setGraphType( GraphType type )
{
t = type;
}
DataPointList *GraphInfo::dataPoints()
{
return d;
}
void GraphInfo::setDataPoints( DataPointList *data )
{
d = data;
}
DataPointInfo *GraphInfo::firstDataPoint()
{
return( d->first() );
}
DataPointInfo *GraphInfo::nextDataPoint()
{
return( d->next() );
}
int GraphInfo::numberDataPoints()
{
return( d->count() );
}
float GraphInfo::maxValue()
{
float max = 0.0;
for ( DataPointInfo *data = d->first(); data; data = d->next() )
{
if ( data->value() > max )
{
max = data->value();
}
}
return max;
}
+float GraphInfo::minValue()
+{
+ float min = 0.0;
+ for ( DataPointInfo *data = d->first(); data; data = d->next() )
+ {
+ if ( data->value() < min )
+ {
+ min = data->value();
+ }
+ }
+ return min;
+}
+
float GraphInfo::totalValue()
{
float sum = 0.0;
for ( DataPointInfo *data = d->first(); data; data = d->next() )
{
sum += data->value();
}
return sum;
}
void GraphInfo::setGraphTitle( const QString &title )
{
gt = title;
}
void GraphInfo::setXAxisTitle( const QString &xtitle )
{
xt = xtitle;
}
void GraphInfo::setYAxisTitle( const QString &ytitle )
{
yt = ytitle;
}
diff --git a/noncore/apps/checkbook/graphinfo.h b/noncore/apps/checkbook/graphinfo.h
index 41927b4..f7842c6 100644
--- a/noncore/apps/checkbook/graphinfo.h
+++ b/noncore/apps/checkbook/graphinfo.h
@@ -10,79 +10,80 @@
 - .   .-<_>     .<> Foundation; either version 2 of the License,
     ._= =}       : or (at your option) any later version.
    .%`+i>       _;_.
    .i_,=:_.      -<s. This file 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 file;
  -_. . .   )=.  = see the file COPYING. If not, write to the
    --        :-=` Free Software Foundation, Inc.,
59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#ifndef GRAPHINFO_H
#define GRAPHINFO_H
#include <qlist.h>
#include <qstringlist.h>
class DataPointInfo
{
public:
DataPointInfo()
: l( 0x0 ), v( 0.0 ) {}
DataPointInfo( const QString &label, float value )
: l( label ), v( value ) {}
const QString &label() { return l; }
float value() { return v; }
void addToValue( float value ) { v += value; }
private:
QString l;
float v;
};
typedef QList<DataPointInfo> DataPointList;
class GraphInfo
{
public:
enum GraphType { BarChart, PieChart };
GraphInfo( GraphType = BarChart, DataPointList * = 0x0,
const QString & = 0x0, const QString & = 0x0, const QString & = 0x0 );
~GraphInfo();
GraphInfo::GraphType graphType();
void setGraphType( GraphType );
DataPointList *dataPoints();
void setDataPoints( DataPointList * );
DataPointInfo *firstDataPoint();
DataPointInfo *nextDataPoint();
int numberDataPoints();
float maxValue();
+ float minValue();
float totalValue();
void setGraphTitle( const QString & );
void setXAxisTitle( const QString & );
void setYAxisTitle( const QString & );
private:
GraphType t;
DataPointList *d;
QString gt;
QString xt;
QString yt;
};
#endif