00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "omggraph.h"
00019 #include "omgui.h"
00020 #include <QListIterator>
00021 #include <QPainter>
00022 #include <QPainterPath>
00023 #include <QPen>
00024 #include <QFontMetrics>
00025 #include <QTime>
00026 #include <cmath>
00027
00028 OmgGraph::OmgGraph(QPainter * thepPainter)
00029 {
00030 mpPainter = thepPainter;
00031 initialise();
00032 }
00033
00034 OmgGraph::OmgGraph()
00035 {
00036 }
00037 OmgGraph::~OmgGraph()
00038 {
00039 }
00040
00041 void OmgGraph::initialise()
00042 {
00043 mYAxisMax=0.0;
00044 mYAxisMin=0.0;
00045 mXAxisMin=0.0;
00046 mXAxisMax=0.0;
00047 mImageWidth = mpPainter->device()->width();
00048 mImageHeight = mpPainter->device()->height();
00049 mXGutterWidth=0;
00050 mYGutterWidth=0;
00051 mGradientWidth=mImageWidth;
00052 mGradientHeight=mImageHeight;
00053 mGridLinesFlag=true;
00054 mDrawDiagonal=false;
00055 mShowVerticesFlag=false;
00056 mShowVertexLabelsFlag=false;
00057 mSplinePointsFlag=false;
00058 mAreaFillFlag=false;
00059 mLegendHeight=0;
00060 QFont myFont("arial", 10, QFont::Normal);
00061 mAxisFont = myFont;
00062 mLegendFont = myFont;
00063 mVertexLabelFont = myFont;
00064 }
00065
00066 void OmgGraph::setAxisFont(QFont theFont)
00067 {
00068 mAxisFont=theFont;
00069 }
00070 void OmgGraph::setLegendFont(QFont theFont)
00071 {
00072 mLegendFont=theFont;
00073 }
00074 void OmgGraph::setVertexLabelFont(QFont theFont)
00075 {
00076 mVertexLabelFont=theFont;
00077 }
00078 void OmgGraph::setGridLinesEnabled(bool theFlag)
00079 {
00080 mGridLinesFlag=theFlag;
00081 }
00082 bool OmgGraph::hasGridLinesEnabled()
00083 {
00084 return mGridLinesFlag;
00085 }
00086
00087 void OmgGraph::setDiagonalEnabled(bool theFlag)
00088 {
00089 mDrawDiagonal=theFlag;
00090 }
00091 bool OmgGraph::hasDiagonalEnabled()
00092 {
00093 return mDrawDiagonal;
00094 }
00095
00096 void OmgGraph::setVerticesEnabled(bool theFlag)
00097 {
00098 mShowVerticesFlag=theFlag;
00099 }
00100 bool OmgGraph::hasVerticesEnabled()
00101 {
00102 return mShowVerticesFlag;
00103 }
00104 void OmgGraph::setVertexLabelsEnabled(bool theFlag)
00105 {
00106 mShowVertexLabelsFlag=theFlag;
00107 }
00108 bool OmgGraph::hasVertexLabelsEnabled()
00109 {
00110 return mShowVertexLabelsFlag;
00111 }
00112 void OmgGraph::setSpliningEnabled(bool theFlag)
00113 {
00114 mSplinePointsFlag=theFlag;
00115 }
00116 bool OmgGraph::hasSpliningEnabled()
00117 {
00118 return mSplinePointsFlag;
00119 }
00120 void OmgGraph::setAreaFillEnabled(bool theFlag)
00121 {
00122 mAreaFillFlag=theFlag;
00123 }
00124 bool OmgGraph::hasAreaFillEnabled()
00125 {
00126 return mAreaFillFlag;
00127 }
00128
00129 void OmgGraph::clear(QColor theColour)
00130 {
00131 mpPainter->fillRect( QRect(0,0,mImageWidth,mImageHeight), theColour );
00132 }
00133
00134 void OmgGraph::addSeries(OmgDataSeries theSeries)
00135 {
00136 mSeriesList.append(theSeries);
00137 }
00138 bool OmgGraph::removeSeriesAt(int theSeriesNo)
00139 {
00140 if ((theSeriesNo < mSeriesList.count()) && (theSeriesNo >= 0))
00141 {
00142 mSeriesList.removeAt(theSeriesNo);
00143 return true;
00144 }
00145 else
00146 {
00147 return false;
00148 }
00149 }
00150 int OmgGraph::seriesCount() const
00151 {
00152 return mSeriesList.count();
00153 }
00154
00155 void OmgGraph::render( )
00156 {
00157 if (mSeriesList.size() < 1)
00158 {
00159 qDebug("No graph drawn as no data series added");
00160 return;
00161 }
00162
00163
00164
00165 bool myFirstItemFlag=true;
00166 QListIterator< OmgDataSeries > mySeriesIterator( mSeriesList );
00167 while (mySeriesIterator.hasNext())
00168 {
00169 OmgDataSeries mySeries = mySeriesIterator.next();
00170
00171
00172
00173
00174 if (mXAxisMax < mySeries.xMax() || myFirstItemFlag)
00175 {
00176 mXAxisMax = mySeries.xMax();
00177 }
00178 if (mXAxisMin > mySeries.xMin() || myFirstItemFlag)
00179 {
00180 mXAxisMin = mySeries.xMin();
00181 }
00182 if (mYAxisMax < mySeries.yMax() || myFirstItemFlag)
00183 {
00184 mYAxisMax = mySeries.yMax();
00185 }
00186 if (mYAxisMin > mySeries.yMin() || myFirstItemFlag)
00187 {
00188 mYAxisMin = mySeries.yMin();
00189 }
00190 myFirstItemFlag=false;
00191 }
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205 calculateLegendHeight();
00206 calculateGutters();
00207 mGraphImageWidth = mImageWidth-mYGutterWidth;
00208 mGraphImageHeight = mImageHeight-(mXGutterHeight+mLegendHeight);
00209 QImage myImage(mGraphImageWidth,mGraphImageHeight,
00210 QImage::Format_ARGB32);
00211 QPainter myPainter(&myImage);
00212 myPainter.fillRect(QRectF(0,0,mGraphImageWidth,mGraphImageHeight),Qt::white);
00213 myPainter.setRenderHint(QPainter::Antialiasing);
00214
00215
00216
00217
00218
00219
00220
00221
00222 float myXScaleFactor = mGraphImageWidth / (mXAxisMax-mXAxisMin) ;
00223 float myYScaleFactor = mGraphImageHeight / (mYAxisMax-mYAxisMin) ;
00224
00225 QString myString = "\nX Scale Factor graph width / (xmax-xmin): "
00226 + QString::number(mGraphImageWidth) + "/"
00227 + QString::number(mXAxisMax-mXAxisMin) + " = "
00228 + QString::number(myXScaleFactor);
00229 myString += "\nY Scale Factor graph height / (ymax - ymin): "
00230 + QString::number(mGraphImageHeight) + "/"
00231 + QString::number(mYAxisMax-mYAxisMin) + " = "
00232 + QString::number(myYScaleFactor);
00233
00234
00235
00236
00237
00238
00239
00240 float myX=0.0;
00241 float myY=0.0;
00242 mySeriesIterator.toFront();
00243 while (mySeriesIterator.hasNext())
00244 {
00245 OmgDataSeries mySeries = mySeriesIterator.next();
00246 QPainterPath myPath;
00247
00248 myX = 0;
00249 myY = 0;
00250 myY = mGraphImageHeight - myY;
00251 QPointF myLastPoint ( myX, myY );
00252
00253 myPath.moveTo( myLastPoint );
00254
00255 QPen myPen;
00256 myPen.setWidth(3);
00257 myPen.setStyle(Qt::SolidLine);
00258 myPainter.setPen( myPen );
00259
00260
00261 int myXCounter = 0;
00262 for (int myCounter = 0; myCounter < mySeries.size(); ++ myCounter)
00263 {
00264
00265 myX = mySeries.xAt(myCounter);
00266 myY = mySeries.yAt(myCounter);
00267
00268 if (myX==mXAxisMin)
00269 {
00270 myX=0;
00271 }
00272 else
00273 {
00274 myX = ( myXScaleFactor * (myX - mXAxisMin) ) ;
00275 }
00276 if (myY==mYAxisMin)
00277 {
00278 myY=mGraphImageHeight;
00279 }
00280 else
00281 {
00282 myY = ( myYScaleFactor * (myY - mYAxisMin) ) ;
00283 myY = mGraphImageHeight - myY;
00284 }
00285
00286 QPointF myPoint ( myX, myY );
00287 if (mSplinePointsFlag && myXCounter != 0)
00288 {
00289
00290 float myControl1X=0.0;
00291 float myControl1Y=0.0;
00292 float myControl2X=0.0;
00293 float myControl2Y=0.0;
00294 const int XSTEEPNESS=2;
00295 const int YSTEEPNESS=2;
00296 if (myPoint.x() > myLastPoint.x())
00297 {
00298 myControl1X = myLastPoint.x();
00299 myControl2X = myLastPoint.x()+(fabs(myPoint.x()-myLastPoint.x())/XSTEEPNESS);
00300 }
00301 else
00302 {
00303 myControl1X = myLastPoint.x()-(fabs(myLastPoint.x()-myPoint.x())/XSTEEPNESS);
00304 myControl2X = myLastPoint.x();
00305 }
00306 if (myPoint.y() > myLastPoint.y())
00307 {
00308 myControl1Y = myPoint.y();
00309 myControl2Y = myLastPoint.y()+(fabs(myPoint.y()-myLastPoint.y())/YSTEEPNESS);
00310 }
00311 else
00312 {
00313 myControl1Y = myLastPoint.y()-(fabs(myLastPoint.y()-myPoint.y())/YSTEEPNESS);
00314 myControl2Y = myPoint.y();
00315 }
00316 if (myControl1Y < 0 ) myControl1Y=0;
00317 if (myControl2Y < 0 ) myControl2Y=0;
00318 if (myControl1Y > mGraphImageHeight) myControl1Y=mGraphImageHeight;
00319 if (myControl2Y > mGraphImageHeight) myControl2Y=mGraphImageHeight;
00320
00321 if (myControl1X < 0) myControl1X=0;
00322 if (myControl2X < 0) myControl2X=0;
00323 if (myControl1X > mGraphImageWidth) myControl1X=mGraphImageWidth;
00324 if (myControl2X > mGraphImageWidth) myControl2X=mGraphImageWidth;
00325
00326 QPointF myControlPoint1(myControl1X,myControl1Y);
00327 QPointF myControlPoint2(myControl2X,myControl2Y);
00328 myPainter.drawEllipse(static_cast<int>(myControl1X),static_cast<int>(myControl1Y),5,5);
00329 myPainter.drawText(static_cast<int>(myControl1X),static_cast<int>(myControl1Y),QString::number(myXCounter));
00330 myPainter.drawEllipse(static_cast<int>(myControl2X),static_cast<int>(myControl2Y),5,5);
00331 myPainter.drawText(static_cast<int>(myControl2X),static_cast<int>(myControl2Y),QString::number(myXCounter));
00332
00333 myPath.cubicTo(myControlPoint1, myControlPoint2, myPoint);
00334
00335 }
00336 else
00337 {
00338 if (myXCounter==0)
00339 {
00340
00341 myPath.moveTo(myPoint);
00342 }
00343 else
00344 {
00345 myPath.lineTo(myPoint);
00346 }
00347 }
00348 myLastPoint = myPoint;
00349 ++myXCounter;
00350 }
00351 if (mAreaFillFlag)
00352 {
00353
00354
00355 myPath.lineTo( QPointF(
00356 myLastPoint.x() ,
00357 mImageHeight));
00358
00359 myPath.lineTo( QPointF(
00360 0,
00361 mImageHeight));
00362
00363 QLinearGradient myGradient = customGradient(mySeries.fillColor());
00364 myPainter.setBrush(myGradient);
00365 }
00366 myPen.setColor(mySeries.lineColor());
00367 myPainter.setPen( myPen );
00368
00369 myPainter.drawPath(myPath);
00370
00371 }
00372
00373
00374
00375
00376 mySeriesIterator.toFront();
00377 while (mySeriesIterator.hasNext())
00378 {
00379 OmgDataSeries mySeries = mySeriesIterator.next();
00380 QPen myPen;
00381 myPen.setWidth(5);
00382 myPen.setColor(mySeries.lineColor());
00383 myPainter.setPen( myPen );
00384 QFont myQFont("arial", 10, QFont::Normal);
00385 myPainter.setFont(myQFont);
00386 for (int myCounter = 0; myCounter < mySeries.size(); ++ myCounter)
00387 {
00388 myX = mySeries.xAt(myCounter);
00389 myY = mySeries.yAt(myCounter);
00390 QString myString = QString::number( myX ) +
00391 " , " + QString::number( myY );
00392
00393
00394
00395 if (myX!=mXAxisMin)
00396 {
00397 myX = ( myXScaleFactor * (myX - mXAxisMin) );
00398 }
00399 if (myY!=mYAxisMin)
00400 {
00401 myY = ( myYScaleFactor * (myY - mYAxisMin) ) ;
00402 myY = mGraphImageHeight - myY;
00403 }
00404
00405
00406
00407
00408
00409
00410
00411 if (mShowVerticesFlag)
00412 {
00413 myPen.setWidth(1);
00414 myPainter.drawEllipse(static_cast<int>(myX-2),static_cast<int>(myY-2),4,4);
00415 }
00416 if (mShowVertexLabelsFlag)
00417 {
00418 myPainter.setFont(mVertexLabelFont);
00419 QFontMetrics myFontMetrics( mVertexLabelFont );
00420 int myWidth = myFontMetrics.width(myString);
00421 int myHeight = myFontMetrics.height();
00422 myPen.setWidth(1);
00423 myPen.setColor(mySeries.lineColor());
00424 myPainter.setPen(myPen);
00425 myPainter.setBrush(mySeries.fillColor());
00426
00427
00428
00429 QPointF myTopLeftPoint =QPointF( myX + 3 , myY-(myHeight/2)-2);
00430 QPointF myBottomRightPoint = QPointF( myX+myWidth+10 , myY+(myHeight/2)+2 );
00431 myPainter.drawRoundRect ( QRectF(myTopLeftPoint,myBottomRightPoint),80,60 );
00432
00433 myPen.setColor(Qt::black);
00434 myPainter.setPen(myPen);
00435 myPainter.drawText(QRectF(myTopLeftPoint,myBottomRightPoint),
00436 Qt::AlignCenter || Qt::AlignVCenter,myString);
00437 }
00438 }
00439 }
00440
00441
00442
00443
00444
00445
00446
00447 drawAxes();
00448 if (mDrawDiagonal)
00449 {
00450 drawDiagonal();
00451 }
00452
00453 myPainter.end();
00454 mpPainter->drawImage(
00455 QPointF(mYGutterWidth,
00456 0
00457 ),myImage);
00458 makeLegend();
00459 }
00460
00461 QLinearGradient OmgGraph::redGradient()
00462 {
00463
00464 QLinearGradient myGradient = QLinearGradient(mGradientWidth,0,mGradientWidth,mGradientHeight);
00465 myGradient.setColorAt(0.0,QColor(242, 14, 25, 190));
00466 myGradient.setColorAt(0.7,QColor(175, 29, 37, 190));
00467 myGradient.setColorAt(1.0,QColor(114, 17, 22, 190));
00468 return myGradient;
00469 }
00470 QLinearGradient OmgGraph::greenGradient()
00471 {
00472
00473 QLinearGradient myGradient = QLinearGradient(mGradientWidth,0,mGradientWidth,mGradientHeight);
00474 myGradient.setColorAt(0.0,QColor(48, 168, 5, 190));
00475 myGradient.setColorAt(0.7,QColor(36, 122, 4, 190));
00476 myGradient.setColorAt(1.0,QColor(21, 71, 2, 190));
00477 return myGradient;
00478 }
00479 QLinearGradient OmgGraph::blueGradient()
00480 {
00481
00482 QLinearGradient myGradient = QLinearGradient(mGradientWidth,0,mGradientWidth,mGradientHeight);
00483 myGradient.setColorAt(0.0,QColor(30, 0, 106, 190));
00484 myGradient.setColorAt(0.7,QColor(30, 72, 128, 190));
00485 myGradient.setColorAt(1.0,QColor(30, 223, 196, 190));
00486 return myGradient;
00487 }
00488 QLinearGradient OmgGraph::grayGradient()
00489 {
00490
00491 QLinearGradient myGradient = QLinearGradient(mGradientWidth,0,mGradientWidth,mGradientHeight);
00492 myGradient.setColorAt(0.0,QColor(5, 5, 5, 190));
00493 myGradient.setColorAt(0.7,QColor(122, 122, 122, 190));
00494 myGradient.setColorAt(1.0,QColor(220, 220, 220, 190));
00495 return myGradient;
00496 }
00497 QLinearGradient OmgGraph::randomGradient()
00498 {
00499
00500 QLinearGradient myGradient = QLinearGradient(mGradientWidth,0,mGradientWidth,mGradientHeight);
00501 QColor myColour = Omgui::randomColour();
00502 myGradient.setColorAt(0.0,myColour.lighter());
00503 myGradient.setColorAt(0.7,myColour);
00504 myGradient.setColorAt(1.0,myColour.darker());
00505 return myGradient;
00506 }
00507 QLinearGradient OmgGraph::customGradient(QColor theColour)
00508 {
00509
00510 if (theColour.alphaF()==1)
00511 {
00512 theColour.setAlphaF(0.6);
00513 }
00514
00515 QLinearGradient myGradient = QLinearGradient(mGradientWidth,0,mGradientWidth,mGradientHeight);
00516 myGradient.setColorAt(0.0,theColour.lighter());
00517 myGradient.setColorAt(0.7,theColour);
00518 myGradient.setColorAt(1.0,theColour.darker());
00519 return myGradient;
00520 }
00521 QLinearGradient OmgGraph::highlightGradient()
00522 {
00523
00524 QLinearGradient myGradient = QLinearGradient(mGradientWidth,0,mGradientWidth,mGradientHeight);
00525 myGradient.setColorAt(1.0,QColor(255, 255, 255, 50));
00526 myGradient.setColorAt(0.5,QColor(255, 255, 255, 100));
00527 myGradient.setColorAt(0.0,QColor(255, 255, 255, 150));
00528 return myGradient;
00529 }
00530
00531 void OmgGraph::drawAxes( )
00532 {
00533
00534 mpPainter->setRenderHint(QPainter::Antialiasing);
00535
00536 mpPainter->setFont(mAxisFont);
00537 QString myYMaxLabel = QString::number(static_cast < unsigned int >(mYAxisMax));
00538 QString myXMinLabel = QString::number(mXAxisMin);
00539 QString myXMaxLabel = QString::number(mXAxisMax);
00540
00541
00542
00543
00544 int myXDivisions = mGraphImageWidth/10;
00545 mpPainter->setPen( Qt::gray );
00546 for (int i=0;i<myXDivisions;++i)
00547 {
00548 QPolygon myPolygon;
00549 QPoint myPosition((i*myXDivisions)+mYGutterWidth , mImageHeight-(mXGutterHeight+mLegendHeight));
00550 myPolygon << myPosition;
00551 myPolygon << QPoint((i*myXDivisions)+mYGutterWidth , mImageHeight-((mXGutterHeight+mLegendHeight)-5));
00552 myPolygon << myPosition;
00553 myPolygon << QPoint(((i+1)*myXDivisions)+mYGutterWidth , mImageHeight-(mXGutterHeight+mLegendHeight));
00554 mpPainter->drawPolyline(myPolygon);
00555 if (mGridLinesFlag)
00556 {
00557 QPoint myTopPosition((i*myXDivisions)+mYGutterWidth , 0 );
00558 mpPainter->drawLine(myPosition,myTopPosition);
00559 }
00560 }
00561
00562
00563
00564 int myYDivisions = mGraphImageHeight/10;
00565 mpPainter->setPen( Qt::gray );
00566 int myYOrigin = mImageHeight-(mXGutterHeight+mLegendHeight);
00567 for (int i=myYDivisions;i>0;--i)
00568 {
00569 QPolygon myPolygon;
00570 QPoint myPosition(mYGutterWidth,myYOrigin-(i*myYDivisions ));
00571 myPolygon << myPosition;
00572 myPolygon << QPoint(mYGutterWidth-5,myYOrigin-(i*myYDivisions ));
00573 myPolygon << myPosition;
00574 myPolygon << QPoint(mYGutterWidth,myYOrigin-((i-1)*myYDivisions ));
00575 mpPainter->drawPolyline(myPolygon);
00576 if (mGridLinesFlag)
00577 {
00578 QPoint myRightPosition(mImageWidth,myYOrigin-(i*myYDivisions ));
00579 mpPainter->drawLine(myPosition,myRightPosition);
00580 }
00581 }
00582
00583
00584
00585 QFontMetrics myMetrics(mAxisFont);
00586 mpPainter->setPen(Qt::black);
00587 mpPainter->drawText(1, myMetrics.height(), myYMaxLabel);
00588 mpPainter->drawText(1, mImageHeight-(mXGutterHeight+mLegendHeight), QString::number(static_cast < unsigned int >(mYAxisMin)));
00589 mpPainter->drawText(mYGutterWidth,mImageHeight-(mXGutterHeight+mLegendHeight-myMetrics.height()) , myXMinLabel);
00590 mpPainter->drawText(mImageWidth-mXGutterWidth,mImageHeight-(mXGutterHeight+mLegendHeight-myMetrics.height()), myXMaxLabel );
00591 }
00592
00593 void OmgGraph::drawDiagonal()
00594 {
00595 mpPainter->setPen( Qt::gray );
00596 QPoint myPoint1 (mYGutterWidth , mImageHeight-(mXGutterHeight+mLegendHeight));
00597 QPoint myPoint2 (mImageWidth , 0);
00598 mpPainter->drawLine (myPoint1 , myPoint2);
00599 }
00600
00601 void OmgGraph::calculateGutters()
00602 {
00603
00604
00605
00606
00607 QFont myFont("arial", 10, QFont::Normal);
00608 QFontMetrics myFontMetrics( myFont );
00609 QString myYMaxLabel = QString::number(static_cast < unsigned int >(mYAxisMax));
00610 QString myXMinLabel = QString::number(mXAxisMin);
00611 QString myXMaxLabel = QString::number(mXAxisMax);
00612
00613 if (myFontMetrics.width(myXMinLabel) < myFontMetrics.width(myYMaxLabel))
00614 {
00615
00616 mYGutterWidth = myFontMetrics.width(myYMaxLabel )+2;
00617 }
00618 else
00619 {
00620
00621 mYGutterWidth = myFontMetrics.width(myXMinLabel )+2;
00622 }
00623 mXGutterHeight = myFontMetrics.height()+2;
00624
00625 mXGutterWidth = myFontMetrics.width(myXMaxLabel)+1;
00626 }
00627
00628 void OmgGraph::makeLegend()
00629 {
00630 QPen myPen;
00631 myPen.setWidth(1);
00632 myPen.setStyle(Qt::SolidLine);
00633 mpPainter->setPen( myPen );
00634
00635
00636
00637
00638
00639
00640 myPen.setWidth(1);
00641 int myLastXPos=20;
00642 mpPainter->setFont(mLegendFont);
00643 const int myLeftSpace=20;
00644 const int myBoxWidth=20;
00645 const int myBoxToTextSpace=10;
00646 const int mySpaceAfterText=10;
00647 const int myYSpace=10;
00648 int myLastYPos=mImageHeight-(mLegendHeight-myYSpace);
00649 QFontMetrics myFontMetrics( mLegendFont );
00650 QListIterator< OmgDataSeries > mySeriesIterator( mSeriesList );
00651 while (mySeriesIterator.hasNext())
00652 {
00653 OmgDataSeries mySeries = mySeriesIterator.next();
00654 QString myLabel = mySeries.label();
00655 int myLabelAndMarkerWidth=0;
00656 myLabelAndMarkerWidth += myBoxWidth;
00657 myLabelAndMarkerWidth += myBoxToTextSpace;
00658 myLabelAndMarkerWidth += myFontMetrics.width(myLabel);
00659 myLabelAndMarkerWidth += mySpaceAfterText;
00660
00661
00662
00663
00664 int myDistanceToEnd = mImageWidth - (myLastXPos % mImageWidth);
00665 if (myDistanceToEnd < myLabelAndMarkerWidth)
00666 {
00667 myLastXPos = myLeftSpace;
00668 myLastYPos += myFontMetrics.height() + myYSpace;;
00669 }
00670
00671 QPointF myTopLeftPoint ( myLastXPos , myLastYPos);
00672 myLastXPos += myBoxWidth;
00673 QPointF myBottomRightPoint ( myLastXPos , myLastYPos-myFontMetrics.height() );
00674
00675 myPen.setColor(mySeries.lineColor());
00676 mpPainter->setBrush(mySeries.fillColor());
00677 mpPainter->drawRoundRect ( QRectF(myTopLeftPoint,myBottomRightPoint),80,60 );
00678 myLastXPos += myBoxToTextSpace;
00679 myTopLeftPoint =QPointF( myLastXPos , myLastYPos);
00680 myLastXPos += myFontMetrics.width(myLabel);
00681 myBottomRightPoint = QPointF( myLastXPos , myLastYPos-myFontMetrics.height() );
00682 myPen.setColor(Qt::black);
00683 mpPainter->drawText(QRectF(myTopLeftPoint,myBottomRightPoint),Qt::AlignVCenter,myLabel);
00684 myLastXPos += mySpaceAfterText;
00685
00686 if (myLastXPos > mImageWidth)
00687 {
00688 myLastXPos = myLeftSpace;
00689 myLastYPos += myFontMetrics.height() + myYSpace;;
00690 }
00691 }
00692
00693
00694
00695
00696
00697
00698
00699 }
00700
00701 void OmgGraph::calculateLegendHeight()
00702 {
00703 const int myLeftSpace=20;
00704 const int myBoxWidth=20;
00705 const int myBoxToTextSpace=10;
00706 const int mySpaceAfterText=10;
00707 const int myYSpace=10;
00708 int myTotalWidth = myLeftSpace;
00709 QFontMetrics myFontMetrics( mLegendFont );
00710 QListIterator< OmgDataSeries > mySeriesIterator( mSeriesList );
00711 while (mySeriesIterator.hasNext())
00712 {
00713 OmgDataSeries mySeries = mySeriesIterator.next();
00714 QString myLabel = mySeries.label();
00715 int myLabelAndMarkerWidth=0;
00716 myLabelAndMarkerWidth += myBoxWidth;
00717 myLabelAndMarkerWidth += myBoxToTextSpace;
00718 myLabelAndMarkerWidth += myFontMetrics.width(myLabel);
00719 myLabelAndMarkerWidth += mySpaceAfterText;
00720
00721
00722
00723
00724 int myDistanceToEnd = mImageWidth - (myTotalWidth % mImageWidth);
00725 if (myDistanceToEnd < myLabelAndMarkerWidth)
00726 {
00727 myTotalWidth += myDistanceToEnd;
00728 }
00729 myTotalWidth += myLabelAndMarkerWidth;
00730 }
00731
00732
00733 int myTotalHeight = 0;
00734 if ( myTotalWidth > mImageWidth )
00735 {
00736 if (myTotalWidth % mImageWidth)
00737 {
00738 myTotalHeight = (( myTotalWidth / mImageWidth )+1) * ( myFontMetrics.xHeight() + myYSpace );
00739 }
00740 else
00741 {
00742 myTotalHeight = ( myTotalWidth / mImageWidth ) * ( myFontMetrics.xHeight() + myYSpace );
00743 }
00744 }
00745 else
00746 {
00747 myTotalHeight = myFontMetrics.xHeight() + myYSpace ;
00748 }
00749 myTotalHeight += ( myYSpace * 2 );
00750 mLegendHeight = myTotalHeight;
00751
00752 }
00753
00754 void OmgGraph::drawHighlight( QPointF theTopLeftPoint, QPointF theBottomRightPoint )
00755 {
00756
00757 const float SWEEPANGLE=90.0;
00758 float myAngle=0.0;
00759 const float WIDTH=5.0;
00760 const float HEIGHT=5.0;
00761 QPainterPath myHighlightPath;
00762 myHighlightPath.moveTo(theBottomRightPoint.x(),theTopLeftPoint.y());
00763
00764 myHighlightPath.arcTo(theBottomRightPoint.x()-WIDTH,theTopLeftPoint.y()-HEIGHT, WIDTH, HEIGHT, myAngle , SWEEPANGLE);
00765 myAngle+=90;
00766
00767 myHighlightPath.lineTo(theTopLeftPoint.x()+WIDTH, theTopLeftPoint.y()-HEIGHT);
00768
00769 myHighlightPath.arcTo(theTopLeftPoint.x(), theTopLeftPoint.y()-HEIGHT, WIDTH, HEIGHT, myAngle , SWEEPANGLE);
00770 myAngle+=90;
00771
00772 myHighlightPath.lineTo(theTopLeftPoint.x(),theTopLeftPoint.y() +
00773 ((theBottomRightPoint.y()-theTopLeftPoint.y())/3));
00774
00775 qreal myLowerMidPointX = theTopLeftPoint.x()+((theBottomRightPoint.x()-theTopLeftPoint.x())/2);
00776 qreal myLowerMidPointY = theTopLeftPoint.y()+((theBottomRightPoint.y()-theTopLeftPoint.y())/2);
00777 QPointF myLowerMidPoint(myLowerMidPointX,myLowerMidPointY);
00778
00779 qreal myUpperMidPointX = theTopLeftPoint.x()+((theBottomRightPoint.x()-theTopLeftPoint.x())/2);
00780 qreal myUpperMidPointY = theTopLeftPoint.y();
00781 QPointF myUpperMidPoint(myUpperMidPointX,myUpperMidPointY);
00782
00783 QPointF myEndPoint(theBottomRightPoint.x(),theTopLeftPoint.y() +
00784 ((theBottomRightPoint.y()-theTopLeftPoint.y())/3));
00785
00786 myHighlightPath.cubicTo(myUpperMidPoint,myLowerMidPoint,myEndPoint);
00787
00788 myHighlightPath.closeSubpath();
00789 mpPainter->drawPath(myHighlightPath);
00790 }