void ScaleDraw::drawBreak(QPainter *painter) const { ScaleEngine *sc_engine = static_cast<ScaleEngine *>(d_plot->axisScaleEngine(axis())); /*const QwtScaleEngine * qwtsc_engine=d_plot->axisScaleEngine(axis()); const ScaleEngine *sc_engine =dynamic_cast<const ScaleEngine*>(qwtsc_engine); if(sc_engine!=NULL) {*/ if (!sc_engine->hasBreak() || !sc_engine->hasBreakDecoration()) return; painter->save(); painter->setRenderHint(QPainter::Antialiasing); int len = majTickLength(); QwtScaleMap scaleMap = map(); const QwtMetricsMap metricsMap = QwtPainter::metricsMap(); QPoint pos = this->pos(); if (!metricsMap.isIdentity()) { QwtPainter::resetMetricsMap(); pos = metricsMap.layoutToDevice(pos); if (orientation() == Qt::Vertical) { scaleMap.setPaintInterval(metricsMap.layoutToDeviceY((int)scaleMap.p1()), metricsMap.layoutToDeviceY((int)scaleMap.p2())); len = metricsMap.layoutToDeviceX(len); } else { scaleMap.setPaintInterval(metricsMap.layoutToDeviceX((int)scaleMap.p1()), metricsMap.layoutToDeviceX((int)scaleMap.p2())); len = metricsMap.layoutToDeviceY(len); } } int lval = scaleMap.transform(sc_engine->axisBreakLeft()); int rval = scaleMap.transform(sc_engine->axisBreakRight()); switch (alignment()) { case LeftScale: QwtPainter::drawLine(painter, pos.x(), lval, pos.x() - len, lval + len); QwtPainter::drawLine(painter, pos.x(), rval, pos.x() - len, rval + len); break; case RightScale: QwtPainter::drawLine(painter, pos.x(), lval, pos.x() + len, lval - len); QwtPainter::drawLine(painter, pos.x(), rval, pos.x() + len, rval - len); break; case BottomScale: QwtPainter::drawLine(painter, lval, pos.y(), lval - len, pos.y() + len); QwtPainter::drawLine(painter, rval, pos.y(), rval - len, pos.y() + len); break; case TopScale: QwtPainter::drawLine(painter, lval, pos.y(), lval + len, pos.y() - len); QwtPainter::drawLine(painter, rval, pos.y(), rval + len, pos.y() - len); break; } QwtPainter::setMetricsMap(metricsMap); // restore metrics map painter->restore(); //} }
void QwtScaleWidget::drawTitle(QPainter *painter, QwtScaleDraw::Alignment align, const QRect &rect) const { QRect r; double angle; int flags = d_data->title.renderFlags() & ~(Qt::AlignTop | Qt::AlignBottom | Qt::AlignVCenter); switch(align) { case QwtScaleDraw::LeftScale: flags |= Qt::AlignTop; angle = -90.0; r.setRect(rect.left(), rect.bottom(), rect.height(), rect.width()); break; case QwtScaleDraw::RightScale: flags |= Qt::AlignTop; angle = 90.0; r.setRect(rect.right(), rect.top(), rect.height(), rect.width()); break; case QwtScaleDraw::TopScale: flags |= Qt::AlignTop; angle = 0.0; r = rect; break; case QwtScaleDraw::BottomScale: default: flags |= Qt::AlignBottom; angle = 0.0; r = rect; break; } painter->save(); painter->setFont(font()); #if QT_VERSION < 0x040000 painter->setPen(colorGroup().color(QColorGroup::Text)); #else painter->setPen(palette().color(QPalette::Text)); #endif const QwtMetricsMap metricsMap = QwtPainter::metricsMap(); QwtPainter::resetMetricsMap(); r = metricsMap.layoutToDevice(r); painter->translate(r.x(), r.y()); if (angle != 0.0) painter->rotate(angle); QwtText title = d_data->title; title.setRenderFlags(flags); title.draw(painter, QRect(0, 0, r.width(), r.height())); QwtPainter::setMetricsMap(metricsMap); // restore metrics map painter->restore(); }
void ScaleDraw::drawBreak(QPainter *painter) const { ScaleEngine *sc_engine = (ScaleEngine *)d_plot->axisScaleEngine(axis()); if (!sc_engine->hasBreak() || !sc_engine->hasBreakDecoration()) return; painter->save(); painter->setRenderHint(QPainter::Antialiasing); QPen pen = painter->pen(); pen.setColor(d_plot->axisWidget(axis())->palette().color(QPalette::Active, QColorGroup::Foreground)); painter->setPen(pen); int len = d_plot->majorTickLength(); QwtScaleMap scaleMap = map(); const QwtMetricsMap metricsMap = QwtPainter::metricsMap(); QPoint pos = this->pos(); if (!d_plot->isPrinting()){ QwtPainter::resetMetricsMap(); pos = metricsMap.layoutToDevice(pos); if ( orientation() == Qt::Vertical ){ scaleMap.setPaintInterval( metricsMap.layoutToDeviceY((int)scaleMap.p1()), metricsMap.layoutToDeviceY((int)scaleMap.p2())); len = metricsMap.layoutToDeviceX(len); } else { scaleMap.setPaintInterval( metricsMap.layoutToDeviceX((int)scaleMap.p1()), metricsMap.layoutToDeviceX((int)scaleMap.p2())); len = metricsMap.layoutToDeviceY(len); } } int lval = scaleMap.transform(sc_engine->axisBreakLeft()); int rval = scaleMap.transform(sc_engine->axisBreakRight()); switch(alignment()){ case LeftScale: case RightScale: QwtPainter::drawLine(painter, pos.x() + len, lval - len, pos.x() - len, lval + len); QwtPainter::drawLine(painter, pos.x() + len, rval - len, pos.x() - len, rval + len); break; case TopScale: case BottomScale: QwtPainter::drawLine(painter, lval + len, pos.y() - len, lval - len, pos.y() + len); QwtPainter::drawLine(painter, rval + len, pos.y() - len, rval - len, pos.y() + len); break; } if (!d_plot->isPrinting()) QwtPainter::setMetricsMap(metricsMap); // restore metrics map painter->restore(); }
/*! Draw a tick \param painter Painter \param value Value of the tick \param len Lenght of the tick \sa drawBackbone(), drawLabel() */ void QwtScaleDraw::drawTick(QPainter *painter, double value, int len) const { if ( len <= 0 ) return; int pw2 = qwtMin((int)painter->pen().width(), len) / 2; QwtScaleMap scaleMap = map(); const QwtMetricsMap metricsMap = QwtPainter::metricsMap(); QPoint pos = d_data->pos; if ( !metricsMap.isIdentity() ) { /* The perfect position of the ticks is important. To avoid rounding errors we have to use device coordinates. */ QwtPainter::resetMetricsMap(); pos = metricsMap.layoutToDevice(pos); if ( orientation() == Qt::Vertical ) { scaleMap.setPaintInterval( metricsMap.layoutToDeviceY((int)scaleMap.p1()), metricsMap.layoutToDeviceY((int)scaleMap.p2()) ); len = metricsMap.layoutToDeviceX(len); } else { scaleMap.setPaintInterval( metricsMap.layoutToDeviceX((int)scaleMap.p1()), metricsMap.layoutToDeviceX((int)scaleMap.p2()) ); len = metricsMap.layoutToDeviceY(len); } } const int tval = scaleMap.transform(value); switch(alignment()) { case LeftScale: { #if QT_VERSION < 0x040000 QwtPainter::drawLine(painter, pos.x() + pw2, tval, pos.x() - len - 2 * pw2, tval); #else QwtPainter::drawLine(painter, pos.x() - pw2, tval, pos.x() - len, tval); #endif break; } case RightScale: { #if QT_VERSION < 0x040000 QwtPainter::drawLine(painter, pos.x(), tval, pos.x() + len + pw2, tval); #else QwtPainter::drawLine(painter, pos.x() + pw2, tval, pos.x() + len, tval); #endif break; } case BottomScale: { #if QT_VERSION < 0x040000 QwtPainter::drawLine(painter, tval, pos.y(), tval, pos.y() + len + 2 * pw2); #else QwtPainter::drawLine(painter, tval, pos.y() + pw2, tval, pos.y() + len); #endif break; } case TopScale: { #if QT_VERSION < 0x040000 QwtPainter::drawLine(painter, tval, pos.y() + pw2, tval, pos.y() - len - 2 * pw2); #else QwtPainter::drawLine(painter, tval, pos.y() - pw2, tval, pos.y() - len); #endif break; } } QwtPainter::setMetricsMap(metricsMap); // restore metrics map }
void ScaleDraw::drawBackbone(QPainter *painter) const { ScaleEngine *sc_engine = (ScaleEngine *)d_plot->axisScaleEngine(axis()); /*QwtScaleEngine *qwtsc_engine=d_plot->axisScaleEngine(axis()); ScaleEngine *sc_engine =dynamic_cast<ScaleEngine*>(qwtsc_engine); if(sc_engine!=NULL) {*/ if (!sc_engine->hasBreak()){ const int len = length(); const int bw = painter->pen().width(); const int bw2 = bw / 2; QPoint pos = this->pos(); switch(alignment()){ case LeftScale: QwtPainter::drawLine(painter, pos.x() - bw2, pos.y(), pos.x() - bw2, pos.y() + len ); break; case RightScale: QwtPainter::drawLine(painter, pos.x() + bw2, pos.y(), pos.x() + bw2, pos.y() + len); break; case TopScale: QwtPainter::drawLine(painter, pos.x(), pos.y() - bw2, pos.x() + len, pos.y() - bw2); break; case BottomScale: QwtPainter::drawLine(painter, pos.x(), pos.y() + bw2, pos.x() + len, pos.y() + bw2); break; } return; } QwtScaleMap scaleMap = map(); const QwtMetricsMap metricsMap = QwtPainter::metricsMap(); QPoint pos = this->pos(); if ( !metricsMap.isIdentity() ){ QwtPainter::resetMetricsMap(); pos = metricsMap.layoutToDevice(pos); if ( orientation() == Qt::Vertical ){ scaleMap.setPaintInterval( metricsMap.layoutToDeviceY((int)scaleMap.p1()), metricsMap.layoutToDeviceY((int)scaleMap.p2())); } else { scaleMap.setPaintInterval( metricsMap.layoutToDeviceX((int)scaleMap.p1()), metricsMap.layoutToDeviceX((int)scaleMap.p2())); } } const int start = scaleMap.transform(sc_engine->axisBreakLeft()); const int end = scaleMap.transform(sc_engine->axisBreakRight()); int lb = start, rb = end; if (sc_engine->testAttribute(QwtScaleEngine::Inverted)){ lb = end; rb = start; } const int bw = painter->pen().width(); const int bw2 = bw / 2; const int len = length() - 1; int aux; switch(alignment()) { case LeftScale: aux = pos.x() - bw2; QwtPainter::drawLine(painter, aux, pos.y(), aux, rb); QwtPainter::drawLine(painter, aux, lb + bw, aux, pos.y() + len); break; case RightScale: aux = pos.x() + bw2; QwtPainter::drawLine(painter, aux, pos.y(), aux, rb - bw - 1); QwtPainter::drawLine(painter, aux, lb - bw2, aux, pos.y() + len); break; case TopScale: aux = pos.y() - bw2; QwtPainter::drawLine(painter, pos.x(), aux, lb - bw2, aux); QwtPainter::drawLine(painter, rb + bw, aux, pos.x() + len, aux); break; case BottomScale: aux = pos.y() + bw2; QwtPainter::drawLine(painter, pos.x(), aux, lb - bw, aux); QwtPainter::drawLine(painter, rb, aux, pos.x() + len, aux); break; } //} }
void ScaleDraw::drawInwardTick(QPainter *painter, double value, int len) const { ScaleEngine *sc_engine = (ScaleEngine *)d_plot->axisScaleEngine(axis()); if (sc_engine->hasBreak() && (sc_engine->axisBreakLeft() <= value && sc_engine->axisBreakRight() >= value)) return; int pw2 = qwtMin((int)painter->pen().width(), len) / 2; QwtScaleMap scaleMap = map(); const QwtMetricsMap metricsMap = QwtPainter::metricsMap(); QPoint pos = this->pos(); int majLen = tickLength(QwtScaleDiv::MajorTick); if ( !metricsMap.isIdentity() ){ /* The perfect position of the ticks is important. To avoid rounding errors we have to use device coordinates. */ QwtPainter::resetMetricsMap(); pos = metricsMap.layoutToDevice(pos); if ( orientation() == Qt::Vertical ){ scaleMap.setPaintInterval( metricsMap.layoutToDeviceY((int)scaleMap.p1()), metricsMap.layoutToDeviceY((int)scaleMap.p2()) ); len = metricsMap.layoutToDeviceX(len); majLen = metricsMap.layoutToDeviceX(majLen); } else { scaleMap.setPaintInterval( metricsMap.layoutToDeviceX((int)scaleMap.p1()), metricsMap.layoutToDeviceX((int)scaleMap.p2()) ); len = metricsMap.layoutToDeviceY(len); majLen = metricsMap.layoutToDeviceY(majLen); } } const int clw = d_plot->canvasLineWidth(); const int tval = scaleMap.transform(value); bool draw = false; if ( orientation() == Qt::Vertical ){ int low = (int)scaleMap.p2() + majLen; int high = (int)scaleMap.p1() - majLen; if ((tval > low && tval < high) || (tval > high && !d_plot->axisEnabled (QwtPlot::xBottom) && !clw) || (tval < low && !d_plot->axisEnabled(QwtPlot::xTop) && !clw)) draw = true; } else { int low = (int)scaleMap.p1() + majLen; int high = (int)scaleMap.p2() - majLen; if ((tval > low && tval < high) || (tval > high && !d_plot->axisEnabled(QwtPlot::yRight) && !clw) || (tval < low && !d_plot->axisEnabled(QwtPlot::yLeft) && !clw)) draw = true; } if (draw){ switch(alignment()){ case LeftScale: { QwtPainter::drawLine(painter, pos.x() + pw2, tval, pos.x() + len, tval); break; } case RightScale: { QwtPainter::drawLine(painter, pos.x() - pw2, tval, pos.x() - len, tval); break; } case BottomScale: { QwtPainter::drawLine(painter, tval, pos.y() - pw2, tval, pos.y() - len); break; } case TopScale: { QwtPainter::drawLine(painter, tval, pos.y() + pw2, tval, pos.y() + len); break; } } } QwtPainter::setMetricsMap(metricsMap); // restore metrics map }
void ScaleDraw::drawLabel(QPainter *painter, double value) const { if (!d_plot) return; ScaleEngine *sc_engine = (ScaleEngine *)d_plot->axisScaleEngine(axis()); if (sc_engine->hasBreak() && sc_engine->axisBreakLeft() <= value && sc_engine->axisBreakRight() > value) return; QwtValueList majTicks = scaleDiv().ticks(QwtScaleDiv::MajorTick); if (majTicks.contains(value)){ switch (d_show_ticks_policy){ case ShowAll: break; case HideBegin: if (majTicks.first() == value) return; break; case HideEnd: if (majTicks.last() == value) return; break; case HideBeginEnd: if (majTicks.first() == value || majTicks.last() == value) return; break; } } QwtText lbl = tickLabel(painter->font(), value); if ( lbl.isEmpty() ) return; QPoint pos = labelPosition(value); QSize labelSize = lbl.textSize(painter->font()); if ( labelSize.height() % 2 ) labelSize.setHeight(labelSize.height() + 1); const QwtMetricsMap metricsMap = QwtPainter::metricsMap(); QwtPainter::resetMetricsMap(); labelSize = metricsMap.layoutToDevice(labelSize); pos = metricsMap.layoutToDevice(pos); painter->save(); painter->setMatrix(labelMatrix( pos, labelSize), true); if (d_selected) lbl.setBackgroundPen(QPen(Qt::blue)); else lbl.setBackgroundPen(QPen(Qt::NoPen)); lbl.setRenderFlags(labelAlignment()); lbl.draw (painter, QRect(QPoint(0, 0), labelSize) ); QwtPainter::setMetricsMap(metricsMap); // restore metrics map painter->restore(); }