00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <qpainter.h>
00013 #include "qwt_painter.h"
00014 #include "qwt_marker.h"
00015 #include "qwt_math.h"
00016
00017 static const int LabelDist = 2;
00018
00020 QwtMarker::QwtMarker()
00021 {
00022
00023 d_label = QwtText::makeText(QString::null, Qt::AlignCenter, QFont());
00024 d_align = Qt::AlignCenter;
00025 d_style = NoLine;
00026 }
00027
00029 QwtMarker::~QwtMarker()
00030 {
00031 delete d_label;
00032 }
00033
00038 QwtMarker::QwtMarker(const QwtMarker &m)
00039 {
00040 d_label = m.d_label->clone();
00041 d_align = m.d_align;
00042 d_pen = m.d_pen;
00043 d_sym = m.d_sym;
00044 d_style = m.d_style;
00045 }
00046
00051 QwtMarker& QwtMarker::operator=(const QwtMarker &m)
00052 {
00053 if (this != &m)
00054 {
00055 d_label = m.d_label->clone();
00056 d_align = m.d_align;
00057 d_pen = m.d_pen;
00058 d_sym = m.d_sym;
00059 d_style = m.d_style;
00060 }
00061
00062 return *this;
00063 }
00064
00072 void QwtMarker::draw(QPainter *p, int x, int y, const QRect &r)
00073 {
00074
00075
00076
00077 if (d_style != NoLine)
00078 {
00079 p->setPen(d_pen);
00080 if ((d_style == HLine) || (d_style == Cross))
00081 QwtPainter::drawLine(p, r.left(), y, r.right(), y);
00082 if ((d_style == VLine)||(d_style == Cross))
00083 QwtPainter::drawLine(p, x, r.top(), x, r.bottom());
00084 }
00085
00086
00087 QSize sSym(0, 0);
00088 if (d_sym.style() != QwtSymbol::None)
00089 {
00090 sSym = d_sym.size();
00091 d_sym.draw(p, x, y);
00092 }
00093
00094
00095 if (!d_label->text().isEmpty())
00096 {
00097 int xlw = qwtMax(int(d_pen.width()), 1);
00098 int ylw = xlw;
00099 int xlw1;
00100 int ylw1;
00101
00102 const int xLabelDist =
00103 QwtPainter::metricsMap().screenToLayoutX(LabelDist);
00104 const int yLabelDist =
00105 QwtPainter::metricsMap().screenToLayoutY(LabelDist);
00106
00107 if ((d_style == VLine) || (d_style == HLine))
00108 {
00109 xlw1 = (xlw + 1) / 2 + xLabelDist;
00110 xlw = xlw / 2 + xLabelDist;
00111 ylw1 = (ylw + 1) / 2 + yLabelDist;
00112 ylw = ylw / 2 + yLabelDist;
00113 }
00114 else
00115 {
00116 xlw1 = qwtMax((xlw + 1) / 2, (sSym.width() + 1) / 2) + xLabelDist;
00117 xlw = qwtMax(xlw / 2, (sSym.width() + 1) / 2) + xLabelDist;
00118 ylw1 = qwtMax((ylw + 1) / 2, (sSym.height() + 1) / 2) + yLabelDist;
00119 ylw = qwtMax(ylw / 2, (sSym. height() + 1) / 2) + yLabelDist;
00120 }
00121
00122
00123
00124
00125
00126 QRect tr = d_label->boundingRect(p);
00127
00128 int dx = x;
00129 int dy = y;
00130
00131 if (d_style == VLine)
00132 {
00133 if (d_align & (int) Qt::AlignTop)
00134 dy = r.top() + yLabelDist - tr.y();
00135 else if (d_align & (int) Qt::AlignBottom)
00136 dy = r.bottom() - yLabelDist + tr.y();
00137 else
00138 dy = r.top() + r.height() / 2;
00139 }
00140 else
00141 {
00142 if (d_align & (int) Qt::AlignTop)
00143 dy += tr.y() - ylw1;
00144 else if (d_align & (int) Qt::AlignBottom)
00145 dy -= tr.y() - ylw1;
00146 }
00147
00148
00149 if (d_style == HLine)
00150 {
00151 if (d_align & (int) Qt::AlignLeft)
00152 dx = r.left() + xLabelDist - tr.x();
00153 else if (d_align & (int) Qt::AlignRight)
00154 dx = r.right() - xLabelDist + tr.x();
00155 else
00156 dx = r.left() + r.width() / 2;
00157 }
00158 else
00159 {
00160 if (d_align & (int) Qt::AlignLeft)
00161 dx += tr.x() - xlw1;
00162 else if (d_align & (int) Qt::AlignRight)
00163 dx -= tr.x() - xlw1;
00164 }
00165
00166 tr.moveBy(dx, dy);
00167 d_label->draw(p, tr);
00168 }
00169 }
00170
00176 void QwtMarker::setFont(const QFont &f)
00177 {
00178 if ( f == d_label->font() )
00179 return;
00180
00181 d_label->setFont(f);
00182 markerChanged();
00183 }
00184
00189 const QFont QwtMarker::font() const
00190 {
00191 return d_label->font();
00192 }
00193
00194
00201 void QwtMarker::setLineStyle(QwtMarker::LineStyle st)
00202 {
00203 if ( st != d_style )
00204 {
00205 d_style = st;
00206 markerChanged();
00207 }
00208 }
00209
00214 QwtMarker::LineStyle QwtMarker::lineStyle() const
00215 {
00216 return d_style;
00217 }
00218
00224 void QwtMarker::setSymbol(const QwtSymbol &s)
00225 {
00226 d_sym = s;
00227 markerChanged();
00228 }
00229
00234 const QwtSymbol &QwtMarker::symbol() const
00235 {
00236 return d_sym;
00237 }
00238
00244 void QwtMarker::setLabelText(const QString &text)
00245 {
00246 setLabel(text, d_label->font(), d_label->color(),
00247 d_label->rectPen(), d_label->rectBrush());
00248 }
00249
00259 void QwtMarker::setLabel(const QString &text, const QFont &font,
00260 const QColor &color, const QPen &pen, const QBrush &brush)
00261 {
00262 if ( text == d_label->text()
00263 && font == d_label->font()
00264 && color == d_label->color()
00265 && pen == d_label->rectPen()
00266 && brush == d_label->rectBrush() )
00267 return;
00268
00269 QwtText *label = QwtText::makeText(
00270 text, d_label->alignment(), font, color, pen, brush);
00271
00272 delete d_label;
00273 d_label = label;
00274
00275 markerChanged();
00276 }
00277
00282 const QString QwtMarker::label() const
00283 {
00284 return d_label->text();
00285 }
00286
00298 void QwtMarker::setLabelAlignment(int align)
00299 {
00300 if ( align == d_align )
00301 return;
00302
00303 d_align = align;
00304 markerChanged();
00305 }
00306
00311 int QwtMarker::labelAlignment() const
00312 {
00313 return d_align;
00314 }
00315
00321 void QwtMarker::setLinePen(const QPen &p)
00322 {
00323 if ( p != d_pen )
00324 {
00325 d_pen = p;
00326 markerChanged();
00327 }
00328 }
00329
00334 const QPen &QwtMarker::linePen() const
00335 {
00336 return d_pen;
00337 }
00338
00344 void QwtMarker::setLabelColor(const QColor &color)
00345 {
00346 if ( color == d_label->color() )
00347 return;
00348
00349 d_label->setColor(color);
00350 markerChanged();
00351 }
00352
00357 const QColor QwtMarker::labelColor() const
00358 {
00359 return d_label->color();
00360 }
00361
00368 void QwtMarker::setLabelPen(const QPen &p)
00369 {
00370 if ( p == QPen(d_label->color()) )
00371 return;
00372
00373 d_label->setColor(p.color());
00374 markerChanged();
00375 }
00376
00382 const QPen QwtMarker::labelPen() const
00383 {
00384 return QPen(d_label->color());
00385 }
00386
00395 void QwtMarker::markerChanged()
00396 {
00397 }
00398
00399
00400
00401
00402
00403
00404