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