qwt_symbol.cpp

00001 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
00002  * Qwt Widget Library
00003  * Copyright (C) 1997   Josef Wilgen
00004  * Copyright (C) 2002   Uwe Rathmann
00005  * 
00006  * This library is free software; you can redistribute it and/or
00007  * modify it under the terms of the Qwt License, Version 1.0
00008  *****************************************************************************/
00009 
00010 #include <qpainter.h>
00011 #include <qapplication.h>
00012 #include "qwt_painter.h"
00013 #include "qwt_polygon.h"
00014 #include "qwt_symbol.h"
00015 
00022 QwtSymbol::QwtSymbol(): 
00023     d_brush(Qt::gray), 
00024     d_pen(Qt::black), 
00025     d_size(0,0),
00026     d_style(QwtSymbol::NoSymbol)
00027 {
00028 }
00029 
00037 QwtSymbol::QwtSymbol(QwtSymbol::Style style, const QBrush &brush, 
00038         const QPen &pen, const QSize &size): 
00039     d_brush(brush), 
00040     d_pen(pen), 
00041     d_size(size),
00042     d_style(style)
00043 {
00044 }
00045 
00047 QwtSymbol::~QwtSymbol()
00048 {
00049 }
00050 
00060 void QwtSymbol::setSize(int w, int h)
00061 {
00062     if ((w >= 0) && (h < 0)) 
00063         h = w;
00064     d_size = QSize(w,h);
00065 }
00066 
00068 void QwtSymbol::setSize(const QSize &s)
00069 {
00070     if (s.isValid()) 
00071         d_size = s;
00072 }
00073 
00080 void QwtSymbol::setBrush(const QBrush &br)
00081 {
00082     d_brush = br;
00083 }
00084 
00092 void QwtSymbol::setPen(const QPen &pn)
00093 {
00094     d_pen = pn;
00095 }
00096 
00100 void QwtSymbol::draw(QPainter *painter, int x, int y) const
00101 {
00102     draw(painter, QPoint(x, y));
00103 }
00104 
00105 
00116 void QwtSymbol::draw(QPainter *painter, const QRect& r) const
00117 {
00118     switch(d_style)
00119     {
00120         case QwtSymbol::Ellipse:
00121             QwtPainter::drawEllipse(painter, r);
00122             break;
00123         case QwtSymbol::Rect:
00124             QwtPainter::drawRect(painter, r);
00125             break;
00126         case QwtSymbol::Diamond:
00127         {
00128             const int w2 = r.width() / 2;
00129             const int h2 = r.height() / 2;
00130 
00131             QwtPolygon pa(4);
00132             pa.setPoint(0, r.x() + w2, r.y());
00133             pa.setPoint(1, r.right(), r.y() + h2);
00134             pa.setPoint(2, r.x() + w2, r.bottom());
00135             pa.setPoint(3, r.x(), r.y() + h2);
00136             QwtPainter::drawPolygon(painter, pa);
00137             break;
00138         }
00139         case QwtSymbol::Cross:
00140         {
00141             const int w2 = r.width() / 2;
00142             const int h2 = r.height() / 2;
00143 
00144             QwtPainter::drawLine(painter, r.x() + w2, r.y(), 
00145                 r.x() + w2, r.bottom());
00146             QwtPainter::drawLine(painter, r.x(), r.y() + h2, 
00147                 r.right(), r.y() + h2);
00148             break;
00149         }
00150         case QwtSymbol::XCross:
00151         {
00152             QwtPainter::drawLine(painter, r.left(), r.top(), 
00153                 r.right(), r.bottom());
00154             QwtPainter::drawLine(painter, r.left(), r.bottom(), 
00155                 r.right(), r.top());
00156             break;
00157         }
00158         case QwtSymbol::Triangle:
00159         case QwtSymbol::UTriangle:
00160         {
00161             const int w2 = r.width() / 2;
00162 
00163             QwtPolygon pa(3);
00164             pa.setPoint(0, r.x() + w2, r.y());
00165             pa.setPoint(1, r.right(), r.bottom());
00166             pa.setPoint(2, r.x(), r.bottom());
00167             QwtPainter::drawPolygon(painter, pa);
00168             break;
00169         }
00170         case QwtSymbol::DTriangle:
00171         {
00172             const int w2 = r.width() / 2;
00173 
00174             QwtPolygon pa(3);
00175             pa.setPoint(0, r.x(), r.y());
00176             pa.setPoint(1, r.right(), r.y());
00177             pa.setPoint(2, r.x() + w2, r.bottom());
00178             QwtPainter::drawPolygon(painter, pa);
00179             break;
00180         }
00181         case QwtSymbol::RTriangle:
00182         {
00183             const int h2 = r.height() / 2;
00184 
00185             QwtPolygon pa(3);
00186             pa.setPoint(0, r.x(), r.y());
00187             pa.setPoint(1, r.right(), r.y() + h2);
00188             pa.setPoint(2, r.x(), r.bottom());
00189             QwtPainter::drawPolygon(painter, pa);
00190             break;
00191         }
00192         case QwtSymbol::LTriangle:
00193         {
00194             const int h2 = r.height() / 2;
00195 
00196             QwtPolygon pa(3);
00197             pa.setPoint(0, r.right(), r.y());
00198             pa.setPoint(1, r.x(), r.y() + h2);
00199             pa.setPoint(2, r.right(), r.bottom());
00200             QwtPainter::drawPolygon(painter, pa);
00201             break;
00202         }
00203         case QwtSymbol::HLine:
00204         {
00205             const int h2 = r.height() / 2;
00206             QwtPainter::drawLine(painter, r.left(), r.top() + h2,
00207                     r.right(), r.top() + h2);
00208             break;
00209         }
00210         case QwtSymbol::VLine:
00211         {
00212             const int w2 = r.width() / 2;
00213             QwtPainter::drawLine(painter, r.left() + w2, r.top(),
00214                     r.left() + w2, r.bottom());
00215             break;
00216         }
00217         case QwtSymbol::Star1:
00218         {
00219             const double sqrt1_2 = 0.70710678118654752440; /* 1/sqrt(2) */
00220 
00221             const int w2 = r.width() / 2;
00222             const int h2 = r.height() / 2;
00223             const int d1  = (int)( (double)w2 * (1.0 - sqrt1_2) );
00224 
00225             QwtPainter::drawLine(painter, r.left() + d1, r.top() + d1,
00226                     r.right() - d1, r.bottom() - d1);
00227             QwtPainter::drawLine(painter, r.left() + d1, r.bottom() - d1,
00228                     r.right() - d1, r.top() + d1);
00229             QwtPainter::drawLine(painter, r.left() + w2, r.top(),
00230                     r.left() + w2, r.bottom());
00231             QwtPainter::drawLine(painter, r.left(), r.top() + h2,
00232                     r.right(), r.top() + h2);
00233             break;
00234         }
00235         case QwtSymbol::Star2:
00236         {
00237             const int w = r.width();
00238             const int side = (int)(((double)r.width() * (1.0 - 0.866025)) /
00239                 2.0);  // 0.866025 = cos(30°)
00240             const int h4 = r.height() / 4;
00241             const int h2 = r.height() / 2;
00242             const int h34 = (r.height() * 3) / 4;
00243 
00244             QwtPolygon pa(12);
00245             pa.setPoint(0, r.left() + (w / 2), r.top());
00246             pa.setPoint(1, r.right() - (side + (w - 2 * side) / 3),
00247                 r.top() + h4 );
00248             pa.setPoint(2, r.right() - side, r.top() + h4);
00249             pa.setPoint(3, r.right() - (side + (w / 2 - side) / 3),
00250                 r.top() + h2 );
00251             pa.setPoint(4, r.right() - side, r.top() + h34);
00252             pa.setPoint(5, r.right() - (side + (w - 2 * side) / 3),
00253                 r.top() + h34 );
00254             pa.setPoint(6, r.left() + (w / 2), r.bottom());
00255             pa.setPoint(7, r.left() + (side + (w - 2 * side) / 3),
00256                 r.top() + h34 );
00257             pa.setPoint(8, r.left() + side, r.top() + h34);
00258             pa.setPoint(9, r.left() + (side + (w / 2 - side) / 3),
00259                 r.top() + h2 );
00260             pa.setPoint(10, r.left() + side, r.top() + h4);
00261             pa.setPoint(11, r.left() + (side + (w - 2 * side) / 3),
00262                 r.top() + h4 );
00263             QwtPainter::drawPolygon(painter, pa);
00264             break;
00265         }
00266         case QwtSymbol::Hexagon:
00267         {
00268             const int w2 = r.width() / 2;
00269             const int side = (int)(((double)r.width() * (1.0 - 0.866025)) /
00270                 2.0);  // 0.866025 = cos(30°)
00271             const int h4 = r.height() / 4;
00272             const int h34 = (r.height() * 3) / 4;
00273 
00274             QwtPolygon pa(6);
00275             pa.setPoint(0, r.left() + w2, r.top());
00276             pa.setPoint(1, r.right() - side, r.top() + h4);
00277             pa.setPoint(2, r.right() - side, r.top() + h34);
00278             pa.setPoint(3, r.left() + w2, r.bottom());
00279             pa.setPoint(4, r.left() + side, r.top() + h34);
00280             pa.setPoint(5, r.left() + side, r.top() + h4);
00281             QwtPainter::drawPolygon(painter, pa);
00282             break;
00283         }
00284         default:;
00285     }
00286 }
00287 
00294 void QwtSymbol::draw(QPainter *painter, const QPoint &pos) const
00295 {
00296     QRect rect;
00297     rect.setSize(QwtPainter::metricsMap().screenToLayout(d_size));
00298     rect.moveCenter(pos);
00299 
00300     painter->setBrush(d_brush);
00301     painter->setPen(d_pen);
00302     
00303     draw(painter, rect);
00304 }
00305 
00329 void QwtSymbol::setStyle(QwtSymbol::Style s)
00330 {
00331     d_style = s;
00332 }
00333 
00335 bool QwtSymbol::operator==(const QwtSymbol &other) const
00336 {
00337     return brush() == other.brush() && pen() == other.pen()
00338             && style() == other.style() && size() == other.size();
00339 }
00340 
00342 bool QwtSymbol::operator!=(const QwtSymbol &other) const
00343 {
00344     return !(*this == other);
00345 }

Generated on Mon Feb 26 21:22:38 2007 for Qwt User's Guide by  doxygen 1.4.6