00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <qpainter.h>
00013 #include "qwt_painter.h"
00014 #include "qwt_scale_map.h"
00015 #include "qwt_plot_marker.h"
00016 #include "qwt_symbol.h"
00017 #include "qwt_text.h"
00018 #include "qwt_math.h"
00019
00020 static const int LabelDist = 2;
00021
00022 class QwtPlotMarker::PrivateData
00023 {
00024 public:
00025 PrivateData():
00026 align(Qt::AlignCenter),
00027 style(NoLine),
00028 xValue(0.0),
00029 yValue(0.0)
00030 {
00031 symbol = new QwtSymbol();
00032 }
00033
00034 ~PrivateData()
00035 {
00036 delete symbol;
00037 }
00038
00039 QwtText label;
00040 #if QT_VERSION < 0x040000
00041 int align;
00042 #else
00043 Qt::Alignment align;
00044 #endif
00045 QPen pen;
00046 QwtSymbol *symbol;
00047 LineStyle style;
00048
00049 double xValue;
00050 double yValue;
00051 };
00052
00054 QwtPlotMarker::QwtPlotMarker():
00055 QwtPlotItem(QwtText("Marker"))
00056 {
00057 d_data = new PrivateData;
00058 setZ(30.0);
00059 }
00060
00062 QwtPlotMarker::~QwtPlotMarker()
00063 {
00064 delete d_data;
00065 }
00066
00068 int QwtPlotMarker::rtti() const
00069 {
00070 return QwtPlotItem::Rtti_PlotMarker;
00071 }
00072
00074 QwtDoublePoint QwtPlotMarker::value() const
00075 {
00076 return QwtDoublePoint(d_data->xValue, d_data->yValue);
00077 }
00078
00080 double QwtPlotMarker::xValue() const
00081 {
00082 return d_data->xValue;
00083 }
00084
00086 double QwtPlotMarker::yValue() const
00087 {
00088 return d_data->yValue;
00089 }
00090
00092 void QwtPlotMarker::setValue(const QwtDoublePoint& pos)
00093 {
00094 setValue(pos.x(), pos.y());
00095 }
00096
00098 void QwtPlotMarker::setValue(double x, double y)
00099 {
00100 if ( x != d_data->xValue || y != d_data->yValue )
00101 {
00102 d_data->xValue = x;
00103 d_data->yValue = y;
00104 itemChanged();
00105 }
00106 }
00107
00109 void QwtPlotMarker::setXValue(double x)
00110 {
00111 setValue(x, d_data->yValue);
00112 }
00113
00115 void QwtPlotMarker::setYValue(double y)
00116 {
00117 setValue(d_data->xValue, y);
00118 }
00119
00127 void QwtPlotMarker::draw(QPainter *p,
00128 const QwtScaleMap &xMap, const QwtScaleMap &yMap,
00129 const QRect &r) const
00130 {
00131 const int x = xMap.transform(d_data->xValue);
00132 const int y = yMap.transform(d_data->yValue);
00133
00134
00135 if (d_data->style != NoLine)
00136 {
00137 p->setPen(d_data->pen);
00138 if ((d_data->style == HLine) || (d_data->style == Cross))
00139 QwtPainter::drawLine(p, r.left(), y, r.right(), y);
00140 if ((d_data->style == VLine)||(d_data->style == Cross))
00141 QwtPainter::drawLine(p, x, r.top(), x, r.bottom());
00142 }
00143
00144
00145 QSize sSym(0, 0);
00146 if (d_data->symbol->style() != QwtSymbol::NoSymbol)
00147 {
00148 sSym = d_data->symbol->size();
00149 d_data->symbol->draw(p, x, y);
00150 }
00151
00152
00153 if (!d_data->label.isEmpty())
00154 {
00155 int xlw = qwtMax(int(d_data->pen.width()), 1);
00156 int ylw = xlw;
00157 int xlw1;
00158 int ylw1;
00159
00160 const int xLabelDist =
00161 QwtPainter::metricsMap().screenToLayoutX(LabelDist);
00162 const int yLabelDist =
00163 QwtPainter::metricsMap().screenToLayoutY(LabelDist);
00164
00165 if ((d_data->style == VLine) || (d_data->style == HLine))
00166 {
00167 xlw1 = (xlw + 1) / 2 + xLabelDist;
00168 xlw = xlw / 2 + xLabelDist;
00169 ylw1 = (ylw + 1) / 2 + yLabelDist;
00170 ylw = ylw / 2 + yLabelDist;
00171 }
00172 else
00173 {
00174 xlw1 = qwtMax((xlw + 1) / 2, (sSym.width() + 1) / 2) + xLabelDist;
00175 xlw = qwtMax(xlw / 2, (sSym.width() + 1) / 2) + xLabelDist;
00176 ylw1 = qwtMax((ylw + 1) / 2, (sSym.height() + 1) / 2) + yLabelDist;
00177 ylw = qwtMax(ylw / 2, (sSym. height() + 1) / 2) + yLabelDist;
00178 }
00179
00180 QRect tr(QPoint(0, 0), d_data->label.textSize(p->font()));
00181 tr.moveCenter(QPoint(0, 0));
00182
00183 int dx = x;
00184 int dy = y;
00185
00186 if (d_data->style == VLine)
00187 {
00188 if (d_data->align & (int) Qt::AlignTop)
00189 dy = r.top() + yLabelDist - tr.y();
00190 else if (d_data->align & (int) Qt::AlignBottom)
00191 dy = r.bottom() - yLabelDist + tr.y();
00192 else
00193 dy = r.top() + r.height() / 2;
00194 }
00195 else
00196 {
00197 if (d_data->align & (int) Qt::AlignTop)
00198 dy += tr.y() - ylw1;
00199 else if (d_data->align & (int) Qt::AlignBottom)
00200 dy -= tr.y() - ylw1;
00201 }
00202
00203
00204 if (d_data->style == HLine)
00205 {
00206 if (d_data->align & (int) Qt::AlignLeft)
00207 dx = r.left() + xLabelDist - tr.x();
00208 else if (d_data->align & (int) Qt::AlignRight)
00209 dx = r.right() - xLabelDist + tr.x();
00210 else
00211 dx = r.left() + r.width() / 2;
00212 }
00213 else
00214 {
00215 if (d_data->align & (int) Qt::AlignLeft)
00216 dx += tr.x() - xlw1;
00217 else if (d_data->align & (int) Qt::AlignRight)
00218 dx -= tr.x() - xlw1;
00219 }
00220
00221 #if QT_VERSION < 0x040000
00222 tr.moveBy(dx, dy);
00223 #else
00224 tr.translate(dx, dy);
00225 #endif
00226 d_data->label.draw(p, tr);
00227 }
00228 }
00229
00236 void QwtPlotMarker::setLineStyle(QwtPlotMarker::LineStyle st)
00237 {
00238 if ( st != d_data->style )
00239 {
00240 d_data->style = st;
00241 itemChanged();
00242 }
00243 }
00244
00249 QwtPlotMarker::LineStyle QwtPlotMarker::lineStyle() const
00250 {
00251 return d_data->style;
00252 }
00253
00259 void QwtPlotMarker::setSymbol(const QwtSymbol &s)
00260 {
00261 delete d_data->symbol;
00262 d_data->symbol = s.clone();
00263 itemChanged();
00264 }
00265
00270 const QwtSymbol &QwtPlotMarker::symbol() const
00271 {
00272 return *d_data->symbol;
00273 }
00274
00280 void QwtPlotMarker::setLabel(const QwtText& label)
00281 {
00282 if ( label != d_data->label )
00283 {
00284 d_data->label = label;
00285 itemChanged();
00286 }
00287 }
00288
00293 QwtText QwtPlotMarker::label() const
00294 {
00295 return d_data->label;
00296 }
00297
00309 #if QT_VERSION < 0x040000
00310 void QwtPlotMarker::setLabelAlignment(int align)
00311 #else
00312 void QwtPlotMarker::setLabelAlignment(Qt::Alignment align)
00313 #endif
00314 {
00315 if ( align == d_data->align )
00316 return;
00317
00318 d_data->align = align;
00319 itemChanged();
00320 }
00321
00326 #if QT_VERSION < 0x040000
00327 int QwtPlotMarker::labelAlignment() const
00328 #else
00329 Qt::Alignment QwtPlotMarker::labelAlignment() const
00330 #endif
00331 {
00332 return d_data->align;
00333 }
00334
00340 void QwtPlotMarker::setLinePen(const QPen &p)
00341 {
00342 if ( p != d_data->pen )
00343 {
00344 d_data->pen = p;
00345 itemChanged();
00346 }
00347 }
00348
00353 const QPen &QwtPlotMarker::linePen() const
00354 {
00355 return d_data->pen;
00356 }
00357
00358 QwtDoubleRect QwtPlotMarker::boundingRect() const
00359 {
00360 return QwtDoubleRect(d_data->xValue, d_data->yValue, 0.0, 0.0);
00361 }