# HG changeset patch # User winter # Date 2016-05-10 14:15:58 # Node ID 192d35dac3636d7bcd150e58532594c73d37c5ab # Parent 35d010b068103e9d7198f17e6274f4a59debe6de more work on colorbar axis, stuck with qtchart mecanism diff --git a/examples/charts/colormap/main.cpp b/examples/charts/colormap/main.cpp --- a/examples/charts/colormap/main.cpp +++ b/examples/charts/colormap/main.cpp @@ -40,23 +40,24 @@ int main(int argc, char *argv[]) QApplication a(argc, argv); QVector *xSeries = new QVector(); - xSeries->append(5.0); - xSeries->append(15.0); - xSeries->append(20.0); + for(int i=0;i<1028;i++) + { + xSeries->append(i*5.0); + } QVector *ySeries = new QVector(); - ySeries->append(-1.0); - ySeries->append(0.0); - ySeries->append(1.0); + for(int i=0;i<768;i++) + { + ySeries->append(i*10.0); + } QVector *zSeries = new QVector(); - zSeries->append(0.0); - zSeries->append(1.0); - zSeries->append(2.0); - zSeries->append(3.0); - zSeries->append(4.0); - zSeries->append(5.0); - zSeries->append(6.0); - zSeries->append(7.0); - zSeries->append(8.0); + for(int i=0;i<1028*768;i++) + { + // if(i%2 != 1) + // zSeries->append(0); + // else + // zSeries->append(1); + zSeries->append(i); + } ColorMapDataPart * data = new ColorMapDataPart(xSeries,ySeries,zSeries); diff --git a/src/charts/axis/axis.pri b/src/charts/axis/axis.pri --- a/src/charts/axis/axis.pri +++ b/src/charts/axis/axis.pri @@ -32,7 +32,8 @@ SOURCES += \ $$PWD/logvalueaxis/chartlogvalueaxisx.cpp \ $$PWD/logvalueaxis/chartlogvalueaxisy.cpp \ $$PWD/logvalueaxis/qlogvalueaxis.cpp \ - $$PWD/colorbaraxis/qcolorbaraxis.cpp + $$PWD/colorbaraxis/qcolorbaraxis.cpp \ + $$PWD/colorbaraxis/chartcolorbaraxisy.cpp PRIVATE_HEADERS += \ $$PWD/chartaxiselement_p.h \ @@ -53,7 +54,7 @@ PRIVATE_HEADERS += \ $$PWD/logvalueaxis/chartlogvalueaxisx_p.h \ $$PWD/logvalueaxis/chartlogvalueaxisy_p.h \ $$PWD/logvalueaxis/qlogvalueaxis_p.h \ - $$PWD/colorbaraxis/qcolorbaraxis_p.h + $$PWD/colorbaraxis/qcolorbaraxis_p.h PUBLIC_HEADERS += \ $$PWD/qabstractaxis.h \ @@ -111,5 +112,5 @@ PUBLIC_HEADERS += \ $$PWD/datetimeaxis/qdatetimeaxis.h } - - +HEADERS += \ + $$PWD/colorbaraxis/chartcolorbaraxisy_p.h diff --git a/src/charts/axis/colorbaraxis/chartcolorbaraxisy.cpp b/src/charts/axis/colorbaraxis/chartcolorbaraxisy.cpp new file mode 100644 --- /dev/null +++ b/src/charts/axis/colorbaraxis/chartcolorbaraxisy.cpp @@ -0,0 +1,144 @@ +#include "chartcolorbaraxisy_p.h" +#include +#include +//#include +#include "colorbaraxis/qcolorbaraxis.h" +#include +#include +#include +#include + +QT_CHARTS_BEGIN_NAMESPACE + +ChartColorBarAxisY::ChartColorBarAxisY(QColorBarAxis *axis, QLinearGradient gradient, QGraphicsItem *item) + : VerticalAxis(axis, item), + m_axis(axis), + m_gradient(gradient) +{ + QObject::connect(m_axis, SIGNAL(tickCountChanged(int)), this, SLOT(handleTickCountChanged(int))); + QObject::connect(m_axis, SIGNAL(minorTickCountChanged(int)), + this, SLOT(handleMinorTickCountChanged(int))); + QObject::connect(m_axis, SIGNAL(labelFormatChanged(QString)), this, SLOT(handleLabelFormatChanged(QString))); + + createColorBar(); +} + +ChartColorBarAxisY::~ChartColorBarAxisY() +{ +} + +QVector ChartColorBarAxisY::calculateLayout() const +{ + int tickCount = m_axis->tickCount(); + + Q_ASSERT(tickCount >= 2); + + QVector points; + points.resize(tickCount); + + const QRectF &gridRect = gridGeometry(); + + const qreal deltaY = gridRect.height() / (qreal(tickCount) - 1.0); + for (int i = 0; i < tickCount; ++i) + points[i] = qreal(i) * -deltaY + gridRect.bottom(); + + return points; +} + +void ChartColorBarAxisY::updateGeometry() +{ + const QVector &layout = ChartAxisElement::layout(); + if (layout.isEmpty()) + return; + setLabels(createValueLabels(min(),max(),layout.size(),m_axis->labelFormat())); + VerticalAxis::updateGeometry(); +} + +void ChartColorBarAxisY::handleTickCountChanged(int tick) +{ + Q_UNUSED(tick); + QGraphicsLayoutItem::updateGeometry(); + if (presenter()) presenter()->layout()->invalidate(); +} + +void ChartColorBarAxisY::handleMinorTickCountChanged(int tick) +{ + Q_UNUSED(tick); + QGraphicsLayoutItem::updateGeometry(); + if (presenter()) + presenter()->layout()->invalidate(); +} + +void ChartColorBarAxisY::handleLabelFormatChanged(const QString &format) +{ + Q_UNUSED(format); + QGraphicsLayoutItem::updateGeometry(); + if(presenter()) presenter()->layout()->invalidate(); +} + +QSizeF ChartColorBarAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const +{ + Q_UNUSED(constraint) + + QSizeF sh; + QSizeF base = VerticalAxis::sizeHint(which, constraint); + QStringList ticksList = createValueLabels(min(),max(),m_axis->tickCount(),m_axis->labelFormat()); + qreal width = 0; + // Height of vertical axis sizeHint indicates the maximum distance labels can extend past + // first and last ticks. Base height is irrelevant. + qreal height = 0; + + switch (which) + { + case Qt::MinimumSize: { + QRectF boundingRect = ChartPresenter::textBoundingRect(axis()->labelsFont(), + QStringLiteral("..."), + axis()->labelsAngle()); + width = boundingRect.width() + labelPadding() + base.width() + 1.0; + height = boundingRect.height() / 2.0; + sh = QSizeF(width, height); + break; + } + case Qt::PreferredSize: { + qreal labelWidth = 0.0; + qreal firstHeight = -1.0; + foreach (const QString& s, ticksList) { + QRectF rect = ChartPresenter::textBoundingRect(axis()->labelsFont(), s, axis()->labelsAngle()); + labelWidth = qMax(rect.width(), labelWidth); + height = rect.height(); + if (firstHeight < 0.0) + firstHeight = height; + } + width = labelWidth + labelPadding() + base.width() + 2.0; //two pixels of tolerance + height = qMax(height, firstHeight) / 2.0; + sh = QSizeF(width, height); + break; + } + default: + break; + } + return sh; +} + +void ChartColorBarAxisY::createColorBar() +{ + QGradientStops stops = m_gradient.stops(); + + QLinearGradient gradient(0,0,1,250); + foreach(QGradientStop stop, stops) + { + gradient.setColorAt(1-stop.first,stop.second); + } + + QPixmap image = QPixmap(50,250); + QPainter painter(&image); + QRectF rect(0,0,50,250); + painter.fillRect(rect,gradient); + + QGraphicsRectItem *colorbar = new QGraphicsRectItem(rect, this); + setGraphicsItem(colorbar); +} + +#include "moc_chartcolorbaraxisy_p.cpp" + +QT_CHARTS_END_NAMESPACE diff --git a/src/charts/axis/colorbaraxis/chartcolorbaraxisy_p.h b/src/charts/axis/colorbaraxis/chartcolorbaraxisy_p.h new file mode 100644 --- /dev/null +++ b/src/charts/axis/colorbaraxis/chartcolorbaraxisy_p.h @@ -0,0 +1,39 @@ +#ifndef CHARTCOLORBARAXISY_H +#define CHARTCOLORBARAXISY_H + +#include +#include + +QT_CHARTS_BEGIN_NAMESPACE + +class QColorBarAxis; + +class ChartColorBarAxisY : public VerticalAxis +{ + Q_OBJECT +public: + ChartColorBarAxisY(QColorBarAxis *axis, QLinearGradient gradient, QGraphicsItem *item = 0); + ~ChartColorBarAxisY(); + + QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint) const; + + + +protected: + QVector calculateLayout() const; + void updateGeometry(); +private Q_SLOTS: + void handleTickCountChanged(int tick); + void handleMinorTickCountChanged(int tick); + void handleLabelFormatChanged(const QString &format); + void createColorBar(); + + +private: + QColorBarAxis *m_axis; + QLinearGradient m_gradient; +}; + +QT_CHARTS_END_NAMESPACE + +#endif // CHARTCOLORBARAXISY_H diff --git a/src/charts/axis/colorbaraxis/qcolorbaraxis.cpp b/src/charts/axis/colorbaraxis/qcolorbaraxis.cpp --- a/src/charts/axis/colorbaraxis/qcolorbaraxis.cpp +++ b/src/charts/axis/colorbaraxis/qcolorbaraxis.cpp @@ -7,6 +7,9 @@ #include #include +//#include +#include + #include QT_CHARTS_BEGIN_NAMESPACE @@ -40,48 +43,66 @@ QColorBarAxis::~QColorBarAxis() d->m_chart->removeAxis(this); } +void QColorBarAxis::setMin(qreal min) +{ + Q_D(QColorBarAxis); + setRange(min, qMax(d->m_max, min)); +} + qreal QColorBarAxis::min() const { Q_D(const QColorBarAxis); return d->m_min; } +void QColorBarAxis::setMax(qreal max) +{ + Q_D(QColorBarAxis); + setRange(qMin(d->m_min, max), max); +} + qreal QColorBarAxis::max() const { Q_D(const QColorBarAxis); return d->m_max; } +void QColorBarAxis::setRange(qreal min, qreal max) +{ + Q_D(QColorBarAxis); + d->setRange(min,max); +} -//void QColorBarAxis::setTickCount(int count) -//{ -// Q_D(QColorBarAxis); -// if (d->m_tickCount != count && count >= 2) { -// d->m_tickCount = count; -// emit tickCountChanged(count); -// } -//} + +void QColorBarAxis::setTickCount(int count) +{ + Q_D(QColorBarAxis); + if (d->m_tickCount != count && count >= 2) { + d->m_tickCount = count; + emit tickCountChanged(count); + } +} -//int QColorBarAxis::tickCount() const -//{ -// Q_D(const QColorBarAxis); -// return d->m_tickCount; -//} +int QColorBarAxis::tickCount() const +{ + Q_D(const QColorBarAxis); + return d->m_tickCount; +} -//void QColorBarAxis::setMinorTickCount(int count) -//{ -// Q_D(QColorBarAxis); -// if (d->m_minorTickCount != count && count >= 0) { -// d->m_minorTickCount = count; -// emit minorTickCountChanged(count); -// } -//} +void QColorBarAxis::setMinorTickCount(int count) +{ + Q_D(QColorBarAxis); + if (d->m_minorTickCount != count && count >= 0) { + d->m_minorTickCount = count; + emit minorTickCountChanged(count); + } +} -//int QColorBarAxis::minorTickCount() const -//{ -// Q_D(const QColorBarAxis); -// return d->m_minorTickCount; -//} +int QColorBarAxis::minorTickCount() const +{ + Q_D(const QColorBarAxis); + return d->m_minorTickCount; +} void QColorBarAxis::setLabelFormat(const QString &format) { @@ -105,14 +126,16 @@ QAbstractAxis::AxisType QColorBarAxis::t //TODO : AxisTypeColorBar } + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// QColorBarAxisPrivate::QColorBarAxisPrivate(QLinearGradient gradient, qreal min, qreal max, QColorBarAxis *q) : QAbstractAxisPrivate(q), m_min(min), m_max(max), - // m_tickCount(5), - // m_minorTickCount(0), + m_tickCount(5), + m_minorTickCount(0), m_format(QString::null), // m_applying(false) m_gradient(gradient) @@ -132,19 +155,9 @@ void QColorBarAxisPrivate::initializeGra setAlignment(Qt::AlignRight); //also set orientation (Vertical in this case) - QGradientStops stops = m_gradient.stops(); + axis = new ChartColorBarAxisY(q, m_gradient, parent); - QLinearGradient gradient(0,0,1,250); - foreach(QGradientStop stop, stops) - { - gradient.setColorAt(1-stop.first,stop.second); - } - - QPixmap image = QPixmap(50,250); - QPainter painter(&image); - painter.fillRect(0,0,50,250,gradient); - - //m_item.reset(axis); + m_item.reset(axis); QAbstractAxisPrivate::initializeGraphics(parent); } @@ -152,18 +165,79 @@ void QColorBarAxisPrivate::initializeDom { //domain is not supposed to have a rangeZ - // if (orientation() == Qt::Vertical) { - // if (!qFuzzyIsNull(m_max - m_min)) - // domain->setRangeY(m_min, m_max); - // else - // setRange(domain->minY(), domain->maxY()); - // } - // if (orientation() == Qt::Horizontal) { - // if (!qFuzzyIsNull(m_max - m_min)) - // domain->setRangeX(m_min, m_max); - // else - // setRange(domain->minX(), domain->maxX()); - // } +// if (orientation() == Qt::Vertical) { +// if (!qFuzzyIsNull(m_max - m_min)) +// domain->setRangeY(m_min, m_max); +// else +// setRange(domain->minY(), domain->maxY()); +// } +} + +void QColorBarAxisPrivate::setMin(const QVariant &min) +{ + Q_Q(QColorBarAxis); + bool ok; + qreal value = min.toReal(&ok); + if (ok) + q->setMin(value); +} + +void QColorBarAxisPrivate::setMax(const QVariant &max) +{ + Q_Q(QColorBarAxis); + bool ok; + qreal value = max.toReal(&ok); + if (ok) + q->setMax(value); +} + +void QColorBarAxisPrivate::setRange(const QVariant &min, const QVariant &max) +{ + Q_Q(QColorBarAxis); + bool ok1; + bool ok2; + qreal value1 = min.toReal(&ok1); + qreal value2 = max.toReal(&ok2); + if (ok1 && ok2) + q->setRange(value1, value2); +} + +void QColorBarAxisPrivate::setRange(qreal min,qreal max) +{ + Q_Q(QColorBarAxis); + bool changed = false; + + if (min > max) + return; + + bool changeMin = false; + if (m_min == 0 || min == 0) + changeMin = !qFuzzyCompare(1 + m_min, 1 + min); + else + changeMin = !qFuzzyCompare(m_min, min); + + bool changeMax = false; + if (m_max == 0 || max == 0) + changeMax = !qFuzzyCompare(1 + m_max, 1 + max); + else + changeMax = !qFuzzyCompare(m_max, max); + + if (changeMin) { + m_min = min; + changed = true; + emit q->minChanged(min); + } + + if (changeMax) { + m_max = max; + changed = true; + emit q->maxChanged(max); + } + + if (changed) { + emit rangeChanged(min,max); + emit q->rangeChanged(min, max); + } } diff --git a/src/charts/axis/colorbaraxis/qcolorbaraxis.h b/src/charts/axis/colorbaraxis/qcolorbaraxis.h --- a/src/charts/axis/colorbaraxis/qcolorbaraxis.h +++ b/src/charts/axis/colorbaraxis/qcolorbaraxis.h @@ -21,14 +21,17 @@ public: AxisType type() const; //range handling + void setMin(qreal min); qreal min() const; + void setMax(qreal max); qreal max() const; + void setRange(qreal min, qreal max); //ticks handling -// void setTickCount(int count); -// int tickCount() const; -// void setMinorTickCount(int count); -// int minorTickCount() const; + void setTickCount(int count); + int tickCount() const; + void setMinorTickCount(int count); + int minorTickCount() const; void setLabelFormat(const QString &format); QString labelFormat() const; @@ -37,8 +40,8 @@ Q_SIGNALS: void minChanged(qreal min); void maxChanged(qreal max); void rangeChanged(qreal min, qreal max); -// void tickCountChanged(int tickCount); -// void minorTickCountChanged(int tickCount); + void tickCountChanged(int tickCount); + void minorTickCountChanged(int tickCount); void labelFormatChanged(const QString &format); private: diff --git a/src/charts/axis/colorbaraxis/qcolorbaraxis_p.h b/src/charts/axis/colorbaraxis/qcolorbaraxis_p.h --- a/src/charts/axis/colorbaraxis/qcolorbaraxis_p.h +++ b/src/charts/axis/colorbaraxis/qcolorbaraxis_p.h @@ -30,12 +30,14 @@ protected: private: qreal m_min; qreal m_max; -// int m_tickCount; -// int m_minorTickCount; + int m_tickCount; + int m_minorTickCount; QString m_format; // bool m_applying; QLinearGradient m_gradient; Q_DECLARE_PUBLIC(QColorBarAxis) }; +QT_CHARTS_END_NAMESPACE + #endif // QCOLORBARAXIS_P_H diff --git a/src/charts/colormapchart/colormapchart.cpp b/src/charts/colormapchart/colormapchart.cpp --- a/src/charts/colormapchart/colormapchart.cpp +++ b/src/charts/colormapchart/colormapchart.cpp @@ -20,7 +20,8 @@ ColorMapChart::ColorMapChart(QColorMapSe : ChartItem(series->d_func(), item), m_series(series), m_dirty(true), - m_gradientType(Rainbow) + m_gradientType(Rainbow), + m_colorbar(false) { // QObject::connect(series, SIGNAL(pointReplaced(int)), this, SLOT(handlePointReplaced(int))); // QObject::connect(series, SIGNAL(pointsReplaced()), this, SLOT(handlePointsReplaced())); @@ -79,12 +80,21 @@ void ColorMapChart::paint(QPainter *pain colorMapImage.setPixel(i,j,m_colorTable->at(indexInColorTable)); } } + + if(!m_colorbar) + addColorBar(); + painter->drawImage(clipRect,colorMapImage); update(); +} -QColorBarAxis *colorbar = new QColorBarAxis(createColorMapGradient(m_gradientType),minZ, maxZ,this); - +void ColorMapChart::addColorBar() +{ + double maxZ = m_series->maxZ(); + double minZ = m_series->minZ(); + QColorBarAxis *colorbar = new QColorBarAxis(createColorMapGradient(m_gradientType),minZ, maxZ,this); m_series->chart()->addAxis(colorbar, Qt::AlignRight); + m_colorbar = true; } /*! diff --git a/src/charts/colormapchart/colormapchart_p.h b/src/charts/colormapchart/colormapchart_p.h --- a/src/charts/colormapchart/colormapchart_p.h +++ b/src/charts/colormapchart/colormapchart_p.h @@ -56,6 +56,7 @@ Q_SIGNALS: private: inline bool isEmpty(); + void addColorBar(); QLinearGradient createColorMapGradient(GradientType gradientType); void changeGradient(GradientType gradientType); @@ -66,6 +67,7 @@ protected: bool m_dirty; QVector *m_colorTable; GradientType m_gradientType; + bool m_colorbar; }; //class PixmapMarker: public QGraphicsRectItem diff --git a/src/charts/colormapchart/qcolormapseries.cpp b/src/charts/colormapchart/qcolormapseries.cpp --- a/src/charts/colormapchart/qcolormapseries.cpp +++ b/src/charts/colormapchart/qcolormapseries.cpp @@ -11,6 +11,8 @@ //#include #include +#include "qcolorbaraxis.h" + QT_CHARTS_BEGIN_NAMESPACE /*! @@ -124,6 +126,19 @@ ColorMapDataPart *QColorMapSeries::getUn return d->getUniformGrid(xpos, ypos,width,height, strategy); } +//void QColorMapSeries::attachAxis(QAbstractAxis *axis) +//{ +// axis = static_cast(); +// if(axis) +// { + +// } +// else +// { +// QAbstractSeries::attachAxis(axis); +// } +//} + /*! Sets \a pen used for drawing points on the chart. If the pen is not defined, the pen from chart theme is used. @@ -134,11 +149,11 @@ void QColorMapSeries::setPen(const QPen Q_D(QColorMapSeries); if (d->m_pen != pen) { - bool emitColorChanged = d->m_pen.color() != pen.color(); + //bool emitColorChanged = d->m_pen.color() != pen.color(); d->m_pen = pen; emit d->updated(); - // if (emitColorChanged) - // emit colorChanged(pen.color()); +// if (emitColorChanged) +// emit colorChanged(pen.color()); emit penChanged(pen); } } @@ -461,7 +476,6 @@ ColorMapDataPart *QColorMapSeriesPrivate } } - return grid; } diff --git a/src/charts/colormapchart/qcolormapseries.h b/src/charts/colormapchart/qcolormapseries.h --- a/src/charts/colormapchart/qcolormapseries.h +++ b/src/charts/colormapchart/qcolormapseries.h @@ -51,6 +51,8 @@ public : ColorMapDataPart* getUniformGrid(int xpos, int ypos,int width, int height, Strategy strategy); //double getUniformGrid(int width, int height, Strategy lambda); + // virtual void attachAxis(QAbstractAxis *axis); + virtual void setPen(const QPen &pen); QPen pen() const;