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 @@ -4,13 +4,15 @@ INCLUDEPATH += $$PWD \ $$PWD/valueaxis \ $$PWD/barcategoryaxis \ $$PWD/categoryaxis \ - $$PWD/logvalueaxis + $$PWD/logvalueaxis \ + $$PWD/colorbaraxis DEPENDPATH += $$PWD \ $$PWD/valueaxis \ $$PWD/barcategoryaxis \ $$PWD/categoryaxis \ - $$PWD/logvalueaxis + $$PWD/logvalueaxis \ + $$PWD/colorbaraxis SOURCES += \ $$PWD/chartaxiselement.cpp \ @@ -29,7 +31,8 @@ SOURCES += \ $$PWD/categoryaxis/qcategoryaxis.cpp \ $$PWD/logvalueaxis/chartlogvalueaxisx.cpp \ $$PWD/logvalueaxis/chartlogvalueaxisy.cpp \ - $$PWD/logvalueaxis/qlogvalueaxis.cpp + $$PWD/logvalueaxis/qlogvalueaxis.cpp \ + $$PWD/colorbaraxis/qcolorbaraxis.cpp PRIVATE_HEADERS += \ $$PWD/chartaxiselement_p.h \ @@ -49,7 +52,8 @@ PRIVATE_HEADERS += \ $$PWD/categoryaxis/qcategoryaxis_p.h \ $$PWD/logvalueaxis/chartlogvalueaxisx_p.h \ $$PWD/logvalueaxis/chartlogvalueaxisy_p.h \ - $$PWD/logvalueaxis/qlogvalueaxis_p.h + $$PWD/logvalueaxis/qlogvalueaxis_p.h \ + $$PWD/colorbaraxis/qcolorbaraxis_p.h PUBLIC_HEADERS += \ $$PWD/qabstractaxis.h \ @@ -57,6 +61,7 @@ PUBLIC_HEADERS += \ $$PWD/barcategoryaxis/qbarcategoryaxis.h \ $$PWD/categoryaxis/qcategoryaxis.h \ $$PWD/logvalueaxis/qlogvalueaxis.h \ + $$PWD/colorbaraxis/qcolorbaraxis.h # polar SOURCES += \ @@ -106,3 +111,5 @@ PUBLIC_HEADERS += \ $$PWD/datetimeaxis/qdatetimeaxis.h } + + diff --git a/src/charts/axis/colorbaraxis/qcolorbaraxis.cpp b/src/charts/axis/colorbaraxis/qcolorbaraxis.cpp new file mode 100644 --- /dev/null +++ b/src/charts/axis/colorbaraxis/qcolorbaraxis.cpp @@ -0,0 +1,173 @@ +//#include // TODO : fix this +#include "colorbaraxis/qcolorbaraxis.h" +//#include +#include "colorbaraxis/qcolorbaraxis_p.h" +#include +#include +#include +#include + +#include + +QT_CHARTS_BEGIN_NAMESPACE + + +/*! + Constructs an axis object which is a child of \a parent. +*/ +QColorBarAxis::QColorBarAxis(QLinearGradient gradient, qreal min, qreal max,QObject *parent) : + QAbstractAxis(*new QColorBarAxisPrivate(gradient, min, max, this), parent) +{ + +} + +/*! + \internal +*/ +QColorBarAxis::QColorBarAxis(QColorBarAxisPrivate &d, QObject *parent) + : QAbstractAxis(d, parent) +{ + +} + +/*! + Destroys the object +*/ +QColorBarAxis::~QColorBarAxis() +{ + Q_D(QColorBarAxis); + if (d->m_chart) + d->m_chart->removeAxis(this); +} + +qreal QColorBarAxis::min() const +{ + Q_D(const QColorBarAxis); + return d->m_min; +} + +qreal QColorBarAxis::max() const +{ + Q_D(const QColorBarAxis); + return d->m_max; +} + + +//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; +//} + +//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; +//} + +void QColorBarAxis::setLabelFormat(const QString &format) +{ + Q_D(QColorBarAxis); + d->m_format = format; + emit labelFormatChanged(format); +} + +QString QColorBarAxis::labelFormat() const +{ + Q_D(const QColorBarAxis); + return d->m_format; +} + +/*! + Returns the type of the axis +*/ +QAbstractAxis::AxisType QColorBarAxis::type() const +{ + return AxisTypeValue; + //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_format(QString::null), + // m_applying(false) + m_gradient(gradient) +{ + +} + +QColorBarAxisPrivate::~QColorBarAxisPrivate() +{ + +} + +void QColorBarAxisPrivate::initializeGraphics(QGraphicsItem *parent) +{ + Q_Q(QColorBarAxis); + ChartAxisElement *axis(0); + + setAlignment(Qt::AlignRight); //also set orientation (Vertical in this case) + + 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); + painter.fillRect(0,0,50,250,gradient); + + //m_item.reset(axis); + QAbstractAxisPrivate::initializeGraphics(parent); +} + +void QColorBarAxisPrivate::initializeDomain(AbstractDomain *domain) +{ + //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()); + // } +} + + +#include "moc_qcolorbaraxis.cpp" +#include "moc_qcolorbaraxis_p.cpp" + +QT_CHARTS_END_NAMESPACE diff --git a/src/charts/axis/colorbaraxis/qcolorbaraxis.h b/src/charts/axis/colorbaraxis/qcolorbaraxis.h new file mode 100644 --- /dev/null +++ b/src/charts/axis/colorbaraxis/qcolorbaraxis.h @@ -0,0 +1,51 @@ +#ifndef QCOLORBARAXIS_H +#define QCOLORBARAXIS_H + +#include + +QT_CHARTS_BEGIN_NAMESPACE + +class QColorBarAxisPrivate; + +class QT_CHARTS_EXPORT QColorBarAxis : public QAbstractAxis +{ + Q_OBJECT +public: + explicit QColorBarAxis(QLinearGradient gradient, qreal min, qreal max,QObject *parent = 0); + ~QColorBarAxis(); + +protected: + QColorBarAxis(QColorBarAxisPrivate &d, QObject *parent = 0); + +public: + AxisType type() const; + + //range handling + qreal min() const; + qreal max() const; + + //ticks handling +// void setTickCount(int count); +// int tickCount() const; +// void setMinorTickCount(int count); +// int minorTickCount() const; + + void setLabelFormat(const QString &format); + QString labelFormat() const; + +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 labelFormatChanged(const QString &format); + +private: + Q_DECLARE_PRIVATE(QColorBarAxis) + Q_DISABLE_COPY(QColorBarAxis) +}; + +QT_CHARTS_END_NAMESPACE + +#endif // QCOLORBARAXIS_H diff --git a/src/charts/axis/colorbaraxis/qcolorbaraxis_p.h b/src/charts/axis/colorbaraxis/qcolorbaraxis_p.h new file mode 100644 --- /dev/null +++ b/src/charts/axis/colorbaraxis/qcolorbaraxis_p.h @@ -0,0 +1,41 @@ +#ifndef QCOLORBARAXIS_P_H +#define QCOLORBARAXIS_P_H + +//#include //TODO : fix this +#include "colorbaraxis/qcolorbaraxis.h" +#include + +QT_CHARTS_BEGIN_NAMESPACE + +class QColorBarAxisPrivate : public QAbstractAxisPrivate +{ + Q_OBJECT +public: + QColorBarAxisPrivate(QLinearGradient gradient, qreal min, qreal max,QColorBarAxis *q); + ~QColorBarAxisPrivate(); + +public: + void initializeGraphics(QGraphicsItem* parent); + void initializeDomain(AbstractDomain *domain); + + qreal min() { return m_min; } + qreal max() { return m_max; } + void setRange(qreal min,qreal max); + +protected: + void setMin(const QVariant &min); + void setMax(const QVariant &max); + void setRange(const QVariant &min, const QVariant &max); + +private: + qreal m_min; + qreal m_max; +// int m_tickCount; +// int m_minorTickCount; + QString m_format; + // bool m_applying; + QLinearGradient m_gradient; + Q_DECLARE_PUBLIC(QColorBarAxis) +}; + +#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 @@ -7,13 +7,20 @@ #include #include +//#include TODO : fix this +#include "qcolorbaraxis.h" + +#include + +#define nbOfColors 65000 QT_CHARTS_BEGIN_NAMESPACE ColorMapChart::ColorMapChart(QColorMapSeries *series, QGraphicsItem *item) : ChartItem(series->d_func(), item), m_series(series), - m_dirty(true) + m_dirty(true), + m_gradientType(Rainbow) { // QObject::connect(series, SIGNAL(pointReplaced(int)), this, SLOT(handlePointReplaced(int))); // QObject::connect(series, SIGNAL(pointsReplaced()), this, SLOT(handlePointsReplaced())); @@ -26,9 +33,11 @@ ColorMapChart::ColorMapChart(QColorMapSe // QObject::connect(this, SIGNAL(released(Point3D)), series, SIGNAL(released(Point3D))); // QObject::connect(this, SIGNAL(doubleClicked(Point3D)), series, SIGNAL(doubleClicked(Point3D))); - m_abscissTable = new QMap() ; - m_ordinateTable = new QMap() ; - m_coordinateToColorTable = new QMap,uint>(); + connect(this,SIGNAL(gradientTypeChanged()), this, SLOT(populateColorTable())); + + m_colorTable = new QVector(); + m_colorTable->reserve(nbOfColors); + populateColorTable(); } void ColorMapChart::setDirty(bool dirty) @@ -45,10 +54,6 @@ void ColorMapChart::paint(QPainter *pain { Q_UNUSED(widget) Q_UNUSED(option) - static double debug=0.0; - m_coordinateToColorTable->clear(); - m_abscissTable->clear(); - m_ordinateTable->clear(); QRectF clipRect = QRectF(QPointF(0, 0), domain()->size()); painter->setClipRect(clipRect); @@ -58,52 +63,28 @@ void ColorMapChart::paint(QPainter *pain //http://doc.qt.io/qt-4.8/qimage.html#details :Warning: This will create a QImage with uninitialized data. Call fill() to fill the image with an appropriate pixel value before drawing onto it with QPainter. colorMapImage.fill(QColor(Qt::white).rgb()); - ColorMapDataPart * grid = m_series->getUniformGrid(0,0,plotAreaRect.width(),plotAreaRect.height(),QColorMapSeries::MeanPixel); - - + ColorMapDataPart * grid = m_series->getUniformGrid(0,0,plotAreaRect.width(),plotAreaRect.height(),QColorMapSeries::LastPixel); double maxZ = m_series->maxZ(); double minZ = m_series->minZ(); double rangeZ = maxZ - minZ; - QLinearGradient gradient = createColorMapGradient(Rainbow); - QGradientStops colorStops = gradient.stops(); -QVector *values = new QVector(); - for(int i=0;idataSeries().at(i+j*colorMapImage.width()); + double value = grid->dataSeries().at(i+j*(colorMapImage.width())); double pix=((value-minZ)/rangeZ); - for(int k =0;k= lowerBound.first && pix < upperBound.first) - { - double ratio = (pix-lowerBound.first)/(upperBound.first - lowerBound.first); - int red = (int)(ratio*lowerBound.second.red() + (1-ratio)*upperBound.second.red()); - int green = (int)(ratio*lowerBound.second.green() + (1-ratio)*upperBound.second.green()); - int blue = (int)(ratio*lowerBound.second.blue() + (1-ratio)*upperBound.second.blue()); - colorMapImage.setPixel(i,j,qRgb(red, green, blue)); - values->append(qRgb(red, green, blue)); - break; - } - else - { - if(k==colorStops.size()-2) - { - colorMapImage.setPixel(i,j,qRgb(colorStops.at(colorStops.size()-1).second.red(), colorStops.at(colorStops.size()-1).second.green(), colorStops.at(colorStops.size()-1).second.blue())); - values->append(qRgb(colorStops.at(colorStops.size()-1).second.red(), colorStops.at(colorStops.size()-1).second.green(), colorStops.at(colorStops.size()-1).second.blue())); - } - } - } + int indexInColorTable = pix*(nbOfColors-1); + colorMapImage.setPixel(i,j,m_colorTable->at(indexInColorTable)); } } painter->drawImage(clipRect,colorMapImage); update(); +QColorBarAxis *colorbar = new QColorBarAxis(createColorMapGradient(m_gradientType),minZ, maxZ,this); + + m_series->chart()->addAxis(colorbar, Qt::AlignRight); } /*! @@ -130,17 +111,66 @@ QLinearGradient ColorMapChart::createCol gradient.setColorAt(0.2,Qt::blue); gradient.setColorAt(0.0,Qt::magenta); break; - case Grey : + case BlackAndWhite : gradient.setColorAt(1.0, Qt::black); gradient.setColorAt(0.0, Qt::white); break; + case ReverseBlackAndWhite : + gradient.setColorAt(1.0, Qt::white); + gradient.setColorAt(0.0, Qt::black); + break; default: break; } -return gradient; + return gradient; +} + +/*! + Changes the type of gradient used to paint the ColorMap. +*/ +void ColorMapChart::changeGradient(GradientType gradientType) +{ + if(m_gradientType == gradientType) + return; + else + m_gradientType = gradientType; + emit gradientTypeChanged(); } +/*! + Creates a color table corresponding to the gradient type currently selected. +*/ +void ColorMapChart::populateColorTable() +{ + QLinearGradient gradient = createColorMapGradient(m_gradientType); + QGradientStops colorStops = gradient.stops(); + for(int i=0;i= lowerBound.first && colorIndex < upperBound.first) + { + double ratio = (colorIndex-lowerBound.first)/(upperBound.first - lowerBound.first); + int red = (int)((1-ratio)*lowerBound.second.red() + ratio*upperBound.second.red()); + int green = (int)((1-ratio)*lowerBound.second.green() + ratio*upperBound.second.green()); + int blue = (int)((1-ratio)*lowerBound.second.blue() + ratio*upperBound.second.blue()); + m_colorTable->append(qRgb(red, green, blue)); + break; + } + else + { + if(k==colorStops.size()-2) + { + m_colorTable->append(qRgb(colorStops.at(colorStops.size()-1).second.red(), colorStops.at(colorStops.size()-1).second.green(), colorStops.at(colorStops.size()-1).second.blue())); + } + } + } + } +} //handlers 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 @@ -21,7 +21,8 @@ public: { Rainbow, CyclingRainbow, - Grey + BlackAndWhite, + ReverseBlackAndWhite }; explicit ColorMapChart(QColorMapSeries *series,QGraphicsItem *item = 0); @@ -42,26 +43,29 @@ public Q_SLOTS: void handlePointsReplaced(); void handleDomainUpdated(); +private slots : + void populateColorTable(); + Q_SIGNALS: void clicked(const Point3D &point); void hovered(const Point3D &point, bool state); void pressed(const Point3D &point); void released(const Point3D &point); void doubleClicked(const Point3D &point); + void gradientTypeChanged(); private: inline bool isEmpty(); QLinearGradient createColorMapGradient(GradientType gradientType); + void changeGradient(GradientType gradientType); protected: QColorMapSeries *m_series; QVector m_points; QRectF m_rect; bool m_dirty; - QMap *m_abscissTable; - QMap *m_ordinateTable; - QMap,uint> *m_coordinateToColorTable; - + QVector *m_colorTable; + GradientType m_gradientType; }; //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 @@ -438,6 +438,7 @@ ColorMapDataPart *QColorMapSeriesPrivate timeSeries->append((double)i); } + for (auto cell= dataSeries->begin();cellend();++cell) { QVector cluster; @@ -576,48 +577,48 @@ double QColorMapSeriesPrivate::clusterSt /*! Computes which data points correspond to the given position and returns the in a \a cluster. */ - void QColorMapSeriesPrivate::buildCluster(int xpos, int ypos, double dx, double dy, QVector& cluster) +void QColorMapSeriesPrivate::buildCluster(int xpos, int ypos, double dx, double dy, QVector& cluster) +{ + foreach(ColorMapDataPart *dataPart, m_dataParts) { - foreach(ColorMapDataPart *dataPart, m_dataParts) + QPair xRange = dataPart->getRange(dataPart->timesSeries(),m_minX+xpos*dx,m_minX+(xpos+1)*dx); + QPair yRange = dataPart->getRange(dataPart->ySeries(),m_maxY-(ypos+1)*dy,m_maxY-ypos*dy); + + if(xRange.first != xRange.second && yRange.first != yRange.second) { - QPair xRange = dataPart->getRange(dataPart->timesSeries(),m_minX+xpos*dx,m_minX+(double)(xpos+1)*dx); - QPair yRange = dataPart->getRange(dataPart->ySeries(),m_minY+ypos*dy,m_minY+(double)(ypos+1)*dy); - - if(xRange.first != xRange.second && yRange.first != yRange.second) + for(int i =xRange.first+1;itimesSeries()[i]; + for(int j=yRange.first+1;jtimesSeries()[i]; - for(int j=yRange.first+1;jySeries()[j]; - qreal val=dataPart->dataSeries()[ i + (dataPart->timesSeries().size() * j)]; - cluster.append(Point3D(xval,yval,val)); - } + qreal yval=dataPart->ySeries()[j]; + qreal val=dataPart->dataSeries()[ i + (dataPart->timesSeries().size() * j)]; + cluster.append(Point3D(xval,yval,val)); } } } } +} - void QColorMapSeriesPrivate::initializeAnimations(QtCharts::QChart::AnimationOptions options, - int duration, QEasingCurve &curve) - { - // ColorMapChart *item = static_cast(m_item.data()); - // Q_ASSERT(item); - // if (item->animation()) - // item->animation()->stopAndDestroyLater(); +void QColorMapSeriesPrivate::initializeAnimations(QtCharts::QChart::AnimationOptions options, + int duration, QEasingCurve &curve) +{ + // ColorMapChart *item = static_cast(m_item.data()); + // Q_ASSERT(item); + // if (item->animation()) + // item->animation()->stopAndDestroyLater(); - // if (options.testFlag(QChart::SeriesAnimations)) - // item->setAnimation(new XYAnimation(item, duration, curve)); - // else - // item->setAnimation(0); - QAbstractSeriesPrivate::initializeAnimations(options, duration, curve); - } + // if (options.testFlag(QChart::SeriesAnimations)) + // item->setAnimation(new XYAnimation(item, duration, curve)); + // else + // item->setAnimation(0); + QAbstractSeriesPrivate::initializeAnimations(options, duration, curve); +} #include "moc_qcolormapseries.cpp" #include "moc_qcolormapseries_p.cpp" - QT_CHARTS_END_NAMESPACE +QT_CHARTS_END_NAMESPACE