00001
00002
00003
00004
00005
00006
00007
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
00055 QwtSymbol *QwtSymbol::clone() const
00056 {
00057 QwtSymbol *other = new QwtSymbol;
00058 *other = *this;
00059
00060 return other;
00061 }
00062
00072 void QwtSymbol::setSize(int width, int height)
00073 {
00074 if ((width >= 0) && (height < 0))
00075 height = width;
00076 d_size = QSize(width, height);
00077 }
00078
00083 void QwtSymbol::setSize(const QSize &size)
00084 {
00085 if (size.isValid())
00086 d_size = size;
00087 }
00088
00095 void QwtSymbol::setBrush(const QBrush &brush)
00096 {
00097 d_brush = brush;
00098 }
00099
00111 void QwtSymbol::setPen(const QPen &pen)
00112 {
00113 d_pen = pen;
00114 }
00115
00119 void QwtSymbol::draw(QPainter *painter, int x, int y) const
00120 {
00121 draw(painter, QPoint(x, y));
00122 }
00123
00124
00135 void QwtSymbol::draw(QPainter *painter, const QRect& r) const
00136 {
00137 switch(d_style)
00138 {
00139 case QwtSymbol::Ellipse:
00140 QwtPainter::drawEllipse(painter, r);
00141 break;
00142 case QwtSymbol::Rect:
00143 QwtPainter::drawRect(painter, r);
00144 break;
00145 case QwtSymbol::Diamond:
00146 {
00147 const int w2 = r.width() / 2;
00148 const int h2 = r.height() / 2;
00149
00150 QwtPolygon pa(4);
00151 pa.setPoint(0, r.x() + w2, r.y());
00152 pa.setPoint(1, r.right(), r.y() + h2);
00153 pa.setPoint(2, r.x() + w2, r.bottom());
00154 pa.setPoint(3, r.x(), r.y() + h2);
00155 QwtPainter::drawPolygon(painter, pa);
00156 break;
00157 }
00158 case QwtSymbol::Cross:
00159 {
00160 const int w2 = r.width() / 2;
00161 const int h2 = r.height() / 2;
00162
00163 QwtPainter::drawLine(painter, r.x() + w2, r.y(),
00164 r.x() + w2, r.bottom());
00165 QwtPainter::drawLine(painter, r.x(), r.y() + h2,
00166 r.right(), r.y() + h2);
00167 break;
00168 }
00169 case QwtSymbol::XCross:
00170 {
00171 QwtPainter::drawLine(painter, r.left(), r.top(),
00172 r.right(), r.bottom());
00173 QwtPainter::drawLine(painter, r.left(), r.bottom(),
00174 r.right(), r.top());
00175 break;
00176 }
00177 case QwtSymbol::Triangle:
00178 case QwtSymbol::UTriangle:
00179 {
00180 const int w2 = r.width() / 2;
00181
00182 QwtPolygon pa(3);
00183 pa.setPoint(0, r.x() + w2, r.y());
00184 pa.setPoint(1, r.right(), r.bottom());
00185 pa.setPoint(2, r.x(), r.bottom());
00186 QwtPainter::drawPolygon(painter, pa);
00187 break;
00188 }
00189 case QwtSymbol::DTriangle:
00190 {
00191 const int w2 = r.width() / 2;
00192
00193 QwtPolygon pa(3);
00194 pa.setPoint(0, r.x(), r.y());
00195 pa.setPoint(1, r.right(), r.y());
00196 pa.setPoint(2, r.x() + w2, r.bottom());
00197 QwtPainter::drawPolygon(painter, pa);
00198 break;
00199 }
00200 case QwtSymbol::RTriangle:
00201 {
00202 const int h2 = r.height() / 2;
00203
00204 QwtPolygon pa(3);
00205 pa.setPoint(0, r.x(), r.y());
00206 pa.setPoint(1, r.right(), r.y() + h2);
00207 pa.setPoint(2, r.x(), r.bottom());
00208 QwtPainter::drawPolygon(painter, pa);
00209 break;
00210 }
00211 case QwtSymbol::LTriangle:
00212 {
00213 const int h2 = r.height() / 2;
00214
00215 QwtPolygon pa(3);
00216 pa.setPoint(0, r.right(), r.y());
00217 pa.setPoint(1, r.x(), r.y() + h2);
00218 pa.setPoint(2, r.right(), r.bottom());
00219 QwtPainter::drawPolygon(painter, pa);
00220 break;
00221 }
00222 case QwtSymbol::HLine:
00223 {
00224 const int h2 = r.height() / 2;
00225 QwtPainter::drawLine(painter, r.left(), r.top() + h2,
00226 r.right(), r.top() + h2);
00227 break;
00228 }
00229 case QwtSymbol::VLine:
00230 {
00231 const int w2 = r.width() / 2;
00232 QwtPainter::drawLine(painter, r.left() + w2, r.top(),
00233 r.left() + w2, r.bottom());
00234 break;
00235 }
00236 case QwtSymbol::Star1:
00237 {
00238 const double sqrt1_2 = 0.70710678118654752440;
00239
00240 const int w2 = r.width() / 2;
00241 const int h2 = r.height() / 2;
00242 const int d1 = (int)( (double)w2 * (1.0 - sqrt1_2) );
00243
00244 QwtPainter::drawLine(painter, r.left() + d1, r.top() + d1,
00245 r.right() - d1, r.bottom() - d1);
00246 QwtPainter::drawLine(painter, r.left() + d1, r.bottom() - d1,
00247 r.right() - d1, r.top() + d1);
00248 QwtPainter::drawLine(painter, r.left() + w2, r.top(),
00249 r.left() + w2, r.bottom());
00250 QwtPainter::drawLine(painter, r.left(), r.top() + h2,
00251 r.right(), r.top() + h2);
00252 break;
00253 }
00254 case QwtSymbol::Star2:
00255 {
00256 const int w = r.width();
00257 const int side = (int)(((double)r.width() * (1.0 - 0.866025)) /
00258 2.0);
00259 const int h4 = r.height() / 4;
00260 const int h2 = r.height() / 2;
00261 const int h34 = (r.height() * 3) / 4;
00262
00263 QwtPolygon pa(12);
00264 pa.setPoint(0, r.left() + (w / 2), r.top());
00265 pa.setPoint(1, r.right() - (side + (w - 2 * side) / 3),
00266 r.top() + h4 );
00267 pa.setPoint(2, r.right() - side, r.top() + h4);
00268 pa.setPoint(3, r.right() - (side + (w / 2 - side) / 3),
00269 r.top() + h2 );
00270 pa.setPoint(4, r.right() - side, r.top() + h34);
00271 pa.setPoint(5, r.right() - (side + (w - 2 * side) / 3),
00272 r.top() + h34 );
00273 pa.setPoint(6, r.left() + (w / 2), r.bottom());
00274 pa.setPoint(7, r.left() + (side + (w - 2 * side) / 3),
00275 r.top() + h34 );
00276 pa.setPoint(8, r.left() + side, r.top() + h34);
00277 pa.setPoint(9, r.left() + (side + (w / 2 - side) / 3),
00278 r.top() + h2 );
00279 pa.setPoint(10, r.left() + side, r.top() + h4);
00280 pa.setPoint(11, r.left() + (side + (w - 2 * side) / 3),
00281 r.top() + h4 );
00282 QwtPainter::drawPolygon(painter, pa);
00283 break;
00284 }
00285 case QwtSymbol::Hexagon:
00286 {
00287 const int w2 = r.width() / 2;
00288 const int side = (int)(((double)r.width() * (1.0 - 0.866025)) /
00289 2.0);
00290 const int h4 = r.height() / 4;
00291 const int h34 = (r.height() * 3) / 4;
00292
00293 QwtPolygon pa(6);
00294 pa.setPoint(0, r.left() + w2, r.top());
00295 pa.setPoint(1, r.right() - side, r.top() + h4);
00296 pa.setPoint(2, r.right() - side, r.top() + h34);
00297 pa.setPoint(3, r.left() + w2, r.bottom());
00298 pa.setPoint(4, r.left() + side, r.top() + h34);
00299 pa.setPoint(5, r.left() + side, r.top() + h4);
00300 QwtPainter::drawPolygon(painter, pa);
00301 break;
00302 }
00303 default:;
00304 }
00305 }
00306
00313 void QwtSymbol::draw(QPainter *painter, const QPoint &pos) const
00314 {
00315 QRect rect;
00316 rect.setSize(QwtPainter::metricsMap().screenToLayout(d_size));
00317 rect.moveCenter(pos);
00318
00319 painter->setBrush(d_brush);
00320 painter->setPen(QwtPainter::scaledPen(d_pen));
00321
00322 draw(painter, rect);
00323 }
00324
00348 void QwtSymbol::setStyle(QwtSymbol::Style s)
00349 {
00350 d_style = s;
00351 }
00352
00354 bool QwtSymbol::operator==(const QwtSymbol &other) const
00355 {
00356 return brush() == other.brush() && pen() == other.pen()
00357 && style() == other.style() && size() == other.size();
00358 }
00359
00361 bool QwtSymbol::operator!=(const QwtSymbol &other) const
00362 {
00363 return !(*this == other);
00364 }