##// END OF EJS Templates
functionnal colorbar
functionnal colorbar

File last commit:

r4:6986421aea60 default
r4:6986421aea60 default
Show More
colormapchart.cpp
250 lines | 7.5 KiB | text/x-c | CppLexer
winter
first init : ColorMapChart added to QtCharts
r0 #include <private/colormapchart_p.h>
#include <QtCharts/QColorMapSeries>
#include <private/qcolormapseries_p.h>
#include <private/chartpresenter_p.h>
#include <private/abstractdomain_p.h>
#include <private/chartdataset_p.h>
#include <private/qabstractaxis_p.h>
#include <QtGui/QPainter>
winter
work on color bar axis
r1 #include <QRgb>
#define nbOfColors 65000
winter
first init : ColorMapChart added to QtCharts
r0
QT_CHARTS_BEGIN_NAMESPACE
ColorMapChart::ColorMapChart(QColorMapSeries *series, QGraphicsItem *item)
: ChartItem(series->d_func(), item),
m_series(series),
winter
work on color bar axis
r1 m_dirty(true),
winter
more work on colorbar axis, stuck with qtchart mecanism
r2 m_gradientType(Rainbow),
winter
functionnal colorbar
r4 m_colorbar(Q_NULLPTR),
m_isColorBarDrawn(false),
m_currentplotArea(QRectF()),
m_grid(Q_NULLPTR)
winter
first init : ColorMapChart added to QtCharts
r0 {
// QObject::connect(series, SIGNAL(pointReplaced(int)), this, SLOT(handlePointReplaced(int)));
// QObject::connect(series, SIGNAL(pointsReplaced()), this, SLOT(handlePointsReplaced()));
// QObject::connect(series, SIGNAL(pointAdded(int)), this, SLOT(handlePointAdded(int)));
// QObject::connect(series, SIGNAL(pointRemoved(int)), this, SLOT(handlePointRemoved(int)));
// QObject::connect(series, SIGNAL(pointsRemoved(int, int)), this, SLOT(handlePointsRemoved(int, int)));
// QObject::connect(this, SIGNAL(clicked(Point3D)), series, SIGNAL(clicked(Point3D)));
// QObject::connect(this, SIGNAL(hovered(Point3D,bool)), series, SIGNAL(hovered(Point3D,bool)));
// QObject::connect(this, SIGNAL(pressed(Point3D)), series, SIGNAL(pressed(Point3D)));
// QObject::connect(this, SIGNAL(released(Point3D)), series, SIGNAL(released(Point3D)));
// QObject::connect(this, SIGNAL(doubleClicked(Point3D)), series, SIGNAL(doubleClicked(Point3D)));
winter
work on color bar axis
r1 connect(this,SIGNAL(gradientTypeChanged()), this, SLOT(populateColorTable()));
m_colorTable = new QVector<QRgb>();
m_colorTable->reserve(nbOfColors);
populateColorTable();
winter
first init : ColorMapChart added to QtCharts
r0 }
winter
functionnal colorbar
r4 ColorMapChart::~ColorMapChart()
{
delete m_colorTable;
delete m_colorbar;
}
winter
first init : ColorMapChart added to QtCharts
r0 void ColorMapChart::setDirty(bool dirty)
{
m_dirty = dirty;
}
QRectF ColorMapChart::boundingRect() const
{
return m_rect;
}
void ColorMapChart::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
Q_UNUSED(widget)
Q_UNUSED(option)
winter
improvements in execution time, colorbar ok, more work to do on axes,
r3 m_series->setUseOpenGL();
painter->save();
winter
first init : ColorMapChart added to QtCharts
r0 QRectF clipRect = QRectF(QPointF(0, 0), domain()->size());
painter->setClipRect(clipRect);
QRectF plotAreaRect = m_series->chart()->plotArea();
winter
functionnal colorbar
r4 if(m_currentplotArea !=plotAreaRect)
{
m_currentplotArea = plotAreaRect;
m_grid = m_series->getUniformGrid(0,0,plotAreaRect.width(),plotAreaRect.height(),QColorMapSeries::LastPixel);
addColorBar(plotAreaRect);
}
winter
first init : ColorMapChart added to QtCharts
r0 QImage colorMapImage(plotAreaRect.width(),plotAreaRect.height(),QImage::Format_RGB32);
//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());
double maxZ = m_series->maxZ();
double minZ = m_series->minZ();
double rangeZ = maxZ - minZ;
winter
improvements in execution time, colorbar ok, more work to do on axes,
r3 int imageWidth = colorMapImage.width();
int imageHeight = colorMapImage.height();
for(int i=0;i<imageWidth;i++)
winter
first init : ColorMapChart added to QtCharts
r0 {
winter
improvements in execution time, colorbar ok, more work to do on axes,
r3 for(int j=0;j<imageHeight;j++)
winter
first init : ColorMapChart added to QtCharts
r0 {
winter
functionnal colorbar
r4 double value = m_grid->at(i+j*(imageWidth));
winter
first init : ColorMapChart added to QtCharts
r0 double pix=((value-minZ)/rangeZ);
winter
work on color bar axis
r1 int indexInColorTable = pix*(nbOfColors-1);
colorMapImage.setPixel(i,j,m_colorTable->at(indexInColorTable));
winter
first init : ColorMapChart added to QtCharts
r0 }
}
winter
more work on colorbar axis, stuck with qtchart mecanism
r2
winter
first init : ColorMapChart added to QtCharts
r0 painter->drawImage(clipRect,colorMapImage);
winter
functionnal colorbar
r4 //This line was causing re-painting loop
//update();//Qt docs: Warning: If you call repaint() in a function which may itself be called from paintEvent(), you may get infinite recursion. The update() function never causes recursion
winter
improvements in execution time, colorbar ok, more work to do on axes,
r3
painter->restore();
winter
more work on colorbar axis, stuck with qtchart mecanism
r2 }
winter
first init : ColorMapChart added to QtCharts
r0
winter
improvements in execution time, colorbar ok, more work to do on axes,
r3 void ColorMapChart::addColorBar(QRectF plotAreaRect)
winter
more work on colorbar axis, stuck with qtchart mecanism
r2 {
double maxZ = m_series->maxZ();
double minZ = m_series->minZ();
winter
improvements in execution time, colorbar ok, more work to do on axes,
r3
if(m_isColorBarDrawn)
m_series->chart()->removeAxis(m_colorbar);
m_colorbar = new QColorBarAxis(plotAreaRect,createColorMapGradient(m_gradientType),minZ, maxZ,this);
m_series->chart()->addAxis(m_colorbar, Qt::AlignRight);
m_isColorBarDrawn = true;
winter
first init : ColorMapChart added to QtCharts
r0 }
/*!
Returns the predefined QLinearGradient corresponding to the \a gradientType passed as argument.
*/
QLinearGradient ColorMapChart::createColorMapGradient(GradientType gradientType)
{
QLinearGradient gradient(0,0,1,100);
switch(gradientType)
{
case Rainbow :
gradient.setColorAt(1.0,Qt::darkRed);
gradient.setColorAt(0.8,Qt::red);
gradient.setColorAt(0.6,Qt::yellow);
gradient.setColorAt(0.4,Qt::green);
gradient.setColorAt(0.2,Qt::cyan);
gradient.setColorAt(0.0,Qt::blue);
break;
case CyclingRainbow :
gradient.setColorAt(1.0,Qt::red);
gradient.setColorAt(0.8,Qt::yellow);
gradient.setColorAt(0.6,Qt::green);
gradient.setColorAt(0.4,Qt::cyan);
gradient.setColorAt(0.2,Qt::blue);
gradient.setColorAt(0.0,Qt::magenta);
break;
winter
work on color bar axis
r1 case BlackAndWhite :
winter
first init : ColorMapChart added to QtCharts
r0 gradient.setColorAt(1.0, Qt::black);
gradient.setColorAt(0.0, Qt::white);
break;
winter
work on color bar axis
r1 case ReverseBlackAndWhite :
gradient.setColorAt(1.0, Qt::white);
gradient.setColorAt(0.0, Qt::black);
break;
winter
first init : ColorMapChart added to QtCharts
r0 default:
break;
}
winter
work on color bar axis
r1 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();
winter
first init : ColorMapChart added to QtCharts
r0 }
winter
work on color bar axis
r1 /*!
Creates a color table corresponding to the gradient type currently selected.
*/
void ColorMapChart::populateColorTable()
{
QLinearGradient gradient = createColorMapGradient(m_gradientType);
QGradientStops colorStops = gradient.stops();
winter
first init : ColorMapChart added to QtCharts
r0
winter
work on color bar axis
r1 for(int i=0;i<nbOfColors;i++)
{
double colorIndex = (double)i/nbOfColors;
for(int k =0;k<colorStops.size()-1;k++)
{
QGradientStop lowerBound = colorStops.at(k);
QGradientStop upperBound = colorStops.at(k+1);
if(colorIndex >= 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()));
}
}
}
}
}
winter
first init : ColorMapChart added to QtCharts
r0
//handlers
void ColorMapChart::handlePointAdded(int index)
{
}
void ColorMapChart::handlePointRemoved(int index)
{
}
void ColorMapChart::handlePointsRemoved(int index, int count)
{
}
void ColorMapChart::handlePointReplaced(int index)
{
}
void ColorMapChart::handlePointsReplaced()
{
}
void ColorMapChart::handleDomainUpdated()
{
}
bool ColorMapChart::isEmpty()
{
}
#include "moc_colormapchart_p.cpp"
QT_CHARTS_END_NAMESPACE