##// END OF EJS Templates
Emit hover leave signal from PieSliceItem when it gets destroyed....
Emit hover leave signal from PieSliceItem when it gets destroyed. This fixes the problem with the drilldown demo highlight getting stuck when switching series.

File last commit:

r1082:4c0668542a54
r1083:b264b1ddc4c8
Show More
xychartitem.cpp
252 lines | 8.5 KiB | text/x-c | CppLexer
Jani Honkonen
Add license headers
r794 /****************************************************************************
**
** Copyright (C) 2012 Digia Plc
** All rights reserved.
** For any questions to Digia, please use contact form at http://qt.digia.com
**
** This file is part of the Qt Commercial Charts Add-on.
**
** $QT_BEGIN_LICENSE$
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia.
**
** If you have questions regarding the use of this file, please use
** contact form at http://qt.digia.com
** $QT_END_LICENSE$
**
****************************************************************************/
Michal Klocek
Add missing files from previous commit
r466 #include "xychartitem_p.h"
#include "qxyseries.h"
Michal Klocek
Adds big fat pimpl to series classes...
r938 #include "qxyseries_p.h"
Michal Klocek
Add missing files from previous commit
r466 #include "chartpresenter_p.h"
Michal Klocek
Animation refactor...
r530 #include "chartanimator_p.h"
Michal Klocek
Add missing files from previous commit
r466 #include <QPainter>
Michal Klocek
Refactors click signal to line,area,spline,scatter charts
r571 #include <QGraphicsSceneMouseEvent>
Marek Rosa
QXYSeries: support for removing data from model when using custom mapping
r1055 #include <QAbstractItemModel>
Michal Klocek
Add missing files from previous commit
r466
QTCOMMERCIALCHART_BEGIN_NAMESPACE
//TODO: optimize : remove points which are not visible
sauimone
minor code review issues. indent, spaces, brackets etc.
r743 XYChartItem::XYChartItem(QXYSeries *series, ChartPresenter *presenter):ChartItem(presenter),
m_minX(0),
m_maxX(0),
m_minY(0),
m_maxY(0),
m_series(series)
Michal Klocek
Add missing files from previous commit
r466 {
Michal Klocek
Adds big fat pimpl to series classes...
r938 connect(series->d_func(),SIGNAL(pointReplaced(int)),this,SLOT(handlePointReplaced(int)));
connect(series->d_func(),SIGNAL(pointAdded(int)),this,SLOT(handlePointAdded(int)));
Marek Rosa
QXYSeries: support for adding data to model when using custom mapping
r1054 connect(series->d_func(),SIGNAL(pointsAdded(int, int)),this,SLOT(handlePointsAdded(int, int)));
Michal Klocek
Adds big fat pimpl to series classes...
r938 connect(series->d_func(),SIGNAL(pointRemoved(int)),this,SLOT(handlePointRemoved(int)));
Marek Rosa
QXYSeries: support for adding data to model when using custom mapping
r1054 connect(series->d_func(),SIGNAL(pointsRemoved(int, int)),this,SLOT(handlePointsRemoved(int, int)));
Michal Klocek
Normalizes signal slots connections
r967 connect(this,SIGNAL(clicked(QPointF)),series,SIGNAL(clicked(QPointF)));
Michal Klocek
Add missing files from previous commit
r466 }
sauimone
minor code review issues. indent, spaces, brackets etc.
r743 QPointF XYChartItem::calculateGeometryPoint(const QPointF &point) const
Michal Klocek
Add missing files from previous commit
r466 {
const qreal deltaX = m_size.width()/(m_maxX-m_minX);
const qreal deltaY = m_size.height()/(m_maxY-m_minY);
qreal x = (point.x() - m_minX)* deltaX;
qreal y = (point.y() - m_minY)*-deltaY + m_size.height();
return QPointF(x,y);
}
QPointF XYChartItem::calculateGeometryPoint(int index) const
{
const qreal deltaX = m_size.width()/(m_maxX-m_minX);
const qreal deltaY = m_size.height()/(m_maxY-m_minY);
Michal Klocek
Fixes and improvments to series API...
r1057 const QList<QPointF>& vector = m_series->points();
qreal x = (vector[index].x() - m_minX)* deltaX;
qreal y = (vector[index].y() - m_minY)*-deltaY + m_size.height();
Michal Klocek
Add missing files from previous commit
r466 return QPointF(x,y);
}
QVector<QPointF> XYChartItem::calculateGeometryPoints() const
{
const qreal deltaX = m_size.width()/(m_maxX-m_minX);
const qreal deltaY = m_size.height()/(m_maxY-m_minY);
Michal Klocek
Fixes and improvments to series API...
r1057 QVector<QPointF> result;
result.resize(m_series->count());
const QList<QPointF>& vector = m_series->points();
Michal Klocek
Add missing files from previous commit
r466 for (int i = 0; i < m_series->count(); ++i) {
Michal Klocek
Fixes and improvments to series API...
r1057 qreal x = (vector[i].x() - m_minX)* deltaX;
qreal y = (vector[i].y() - m_minY)*-deltaY + m_size.height();
result[i].setX(x);
result[i].setY(y);
Michal Klocek
Add missing files from previous commit
r466 }
Michal Klocek
Fixes and improvments to series API...
r1057 return result;
Michal Klocek
Add missing files from previous commit
r466 }
sauimone
minor code review issues. indent, spaces, brackets etc.
r743 QPointF XYChartItem::calculateDomainPoint(const QPointF &point) const
Michal Klocek
Adds clicked(Point) to lineSeries, changes visible points handling
r544 {
const qreal deltaX = m_size.width()/(m_maxX-m_minX);
const qreal deltaY = m_size.height()/(m_maxY-m_minY);
qreal x = point.x()/deltaX +m_minX;
qreal y = (point.y()-m_size.height())/(-deltaY)+ m_minY;
return QPointF(x,y);
}
sauimone
minor code review issues. indent, spaces, brackets etc.
r743 void XYChartItem::updateLayout(QVector<QPointF> &oldPoints, QVector<QPointF> &newPoints,int index)
Michal Klocek
Add missing files from previous commit
r466 {
sauimone
minor code review issues. indent, spaces, brackets etc.
r743 if (animator()) {
animator()->updateLayout(this,oldPoints,newPoints,index);
} else {
Michal Klocek
Improves spline interpolation...
r622 setLayout(newPoints);
Michal Klocek
Animation refactor...
r530 }
Michal Klocek
Add missing files from previous commit
r466 }
sauimone
minor code review issues. indent, spaces, brackets etc.
r743 void XYChartItem::setLayout(QVector<QPointF> &points)
Michal Klocek
Add missing files from previous commit
r466 {
m_points = points;
Michal Klocek
Improves spline interpolation...
r622 update();
Michal Klocek
Add missing files from previous commit
r466 }
//handlers
void XYChartItem::handlePointAdded(int index)
{
Marek Rosa
QXYSeries: support for adding data to model when using custom mapping
r1054 if (m_series->model() == 0) {
Q_ASSERT(index<m_series->count());
Q_ASSERT(index>=0);
}
Marek Rosa
Removed unfinished model related methods from PieSeries
r1018 QVector<QPointF> points = m_points;
QPointF point;
Marek Rosa
Removed all the unfinished model functionality from XYSeries and BarSeries
r990 point = calculateGeometryPoint(index);
points.insert(index, point);
updateLayout(m_points, points, index);
Michal Klocek
Add missing files from previous commit
r466 update();
}
Marek Rosa
QXYSeries: support for adding data to model when using custom mapping
r1054
void XYChartItem::handlePointsAdded(int start, int end)
{
if (m_series->model() == 0) {
for (int i = start; i <= end; i++)
handlePointAdded(i);
Marek Rosa
Fixes to model support
r1060 } else if (m_series->mapCount() != -1 && start >= m_series->mapFirst() + m_series->mapCount()) {
return;
Marek Rosa
QXYSeries: support for adding data to model when using custom mapping
r1054 } else {
int addedCount = end - start + 1;
Marek Rosa
Fixes to model support
r1060 if (m_series->mapCount() != -1 && addedCount > m_series->mapCount())
addedCount = m_series->mapCount();
Marek Rosa
PieSeries model support - further refactoring
r1081 int first = qMax(start, m_series->mapFirst()); // get the index of the first item that will be added
int last = qMin(first + addedCount - 1, m_series->count() + m_series->mapFirst() - 1); // get the index of the last item that will be added
Marek Rosa
Fixes to model support
r1060 for (int i = first; i <= last; i++) {
Marek Rosa
PieSeries model support - further refactoring
r1081 handlePointAdded(i - m_series->mapFirst());
Marek Rosa
QXYSeries: support for adding data to model when using custom mapping
r1054 }
Marek Rosa
PieSeries model support - further refactoring
r1081 // the map is limited therefore the items that are now outside the map
// need to be removed from the drawn points
Marek Rosa
Fixes to model support
r1060 if (m_series->mapCount() != -1 && m_points.size() > m_series->mapCount())
for (int i = m_points.size() - 1; i >= m_series->mapCount(); i--)
handlePointRemoved(i);
Marek Rosa
QXYSeries: support for adding data to model when using custom mapping
r1054 }
}
Michal Klocek
Add missing files from previous commit
r466 void XYChartItem::handlePointRemoved(int index)
Michal Klocek
Adds big fat pimpl to series classes...
r938 {
Marek Rosa
QXYSeries: support for adding data to model when using custom mapping
r1054 if (m_series->model() == 0) {
Q_ASSERT(index<m_series->count() + 1);
Q_ASSERT(index>=0);
}
Marek Rosa
Removed unfinished model related methods from PieSeries
r1018 QVector<QPointF> points = m_points;
Marek Rosa
Removed all the unfinished model functionality from XYSeries and BarSeries
r990 points.remove(index);
updateLayout(m_points, points, index);
Michal Klocek
Add missing files from previous commit
r466 update();
}
Marek Rosa
QXYSeries: support for adding data to model when using custom mapping
r1054 void XYChartItem::handlePointsRemoved(int start, int end)
{
Q_UNUSED(start)
Q_UNUSED(end)
Marek Rosa
QXYSeries: support for removing data from model when using custom mapping
r1055 if (m_series->model() == 0) {
for (int i = end; i >= start; i--)
handlePointRemoved(i);
} else {
// series uses model as a data source
Marek Rosa
Refactored model related methods in XYSeries
r1065 int mapFirst = m_series->mapFirst();
int mapCount = m_series->mapCount();
Marek Rosa
QXYSeries: support for removing data from model when using custom mapping
r1055 int removedCount = end - start + 1;
Marek Rosa
Refactored model related methods in XYSeries
r1065 if (mapCount != -1 && start >= mapFirst + mapCount) {
Marek Rosa
QXYSeries: support for removing data from model when using custom mapping
r1055 return;
} else {
Marek Rosa
Refactored model related methods in XYSeries
r1065 int toRemove = qMin(m_points.size(), removedCount); // first find how many items can actually be removed
int first = qMax(start, mapFirst); // get the index of the first item that will be removed.
int last = qMin(first + toRemove - 1, m_points.size() + mapFirst - 1); // get the index of the last item that will be removed.
Marek Rosa
Spline series now recalcutes control points on adding/removing data to/from model
r1072 for (int i = last; i >= first; i--) {
Marek Rosa
Refactored model related methods in XYSeries
r1065 handlePointRemoved(i - mapFirst);
Marek Rosa
Spline series now recalcutes control points on adding/removing data to/from model
r1072 }
Marek Rosa
Refactored model related methods in XYSeries
r1065 if (mapCount != -1) {
int itemsAvailable; // check how many are available to be added
if (m_series->mapOrientation() == Qt::Vertical)
itemsAvailable = m_series->model()->rowCount() - mapFirst - m_points.size();
else
itemsAvailable = m_series->model()->columnCount() - mapFirst - m_points.size();
int toBeAdded = qMin(itemsAvailable, mapCount - m_points.size()); // add not more items than there is space left to be filled.
int currentSize = m_points.size();
if (toBeAdded > 0)
for (int i = m_points.size(); i < currentSize + toBeAdded; i++) {
handlePointAdded(i);
}
}
Marek Rosa
QXYSeries: support for removing data from model when using custom mapping
r1055 }
}
Marek Rosa
QXYSeries: support for adding data to model when using custom mapping
r1054 }
Michal Klocek
Add missing files from previous commit
r466 void XYChartItem::handlePointReplaced(int index)
{
Q_ASSERT(index<m_series->count());
Q_ASSERT(index>=0);
QPointF point = calculateGeometryPoint(index);
Michal Klocek
Refactor animation to fit line,spline,scatter...
r476 QVector<QPointF> points = m_points;
Marek Rosa
QXYSeries: model data orientation added. QBarSeries: some model data function placeholders
r527 points.replace(index,point);
Michal Klocek
Improves spline interpolation...
r622 updateLayout(m_points,points,index);
Michal Klocek
Add missing files from previous commit
r466 update();
}
void XYChartItem::handleDomainChanged(qreal minX, qreal maxX, qreal minY, qreal maxY)
{
m_minX=minX;
m_maxX=maxX;
m_minY=minY;
m_maxY=maxY;
sauimone
minor code review issues. indent, spaces, brackets etc.
r743 if (isEmpty()) return;
Michal Klocek
Add missing files from previous commit
r466 QVector<QPointF> points = calculateGeometryPoints();
Michal Klocek
Improves spline interpolation...
r622 updateLayout(m_points,points);
Michal Klocek
Add missing files from previous commit
r466 update();
}
sauimone
minor code review issues. indent, spaces, brackets etc.
r743 void XYChartItem::handleGeometryChanged(const QRectF &rect)
Michal Klocek
Add missing files from previous commit
r466 {
Marek Rosa
XYSeries model with limits working.
r833 Q_ASSERT(rect.isValid());
m_size=rect.size();
m_clipRect=rect.translated(-rect.topLeft());
setPos(rect.topLeft());
Michal Klocek
Add missing files from previous commit
r466
sauimone
minor code review issues. indent, spaces, brackets etc.
r743 if (isEmpty()) return;
Marek Rosa
XYSeries model with limits working.
r833 QVector<QPointF> points = calculateGeometryPoints();
updateLayout(m_points,points);
update();
Michal Klocek
Add missing files from previous commit
r466 }
bool XYChartItem::isEmpty()
{
Michal Klocek
Bugfixes for spline vector allocation issues
r1082 return !m_clipRect.isValid() || qFuzzyIsNull(m_maxX - m_minX) || qFuzzyIsNull(m_maxY - m_minY) || m_series->points().isEmpty();
Michal Klocek
Add missing files from previous commit
r466 }
sauimone
minor code review issues. indent, spaces, brackets etc.
r743 void XYChartItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
Michal Klocek
Refactors click signal to line,area,spline,scatter charts
r571 {
emit clicked(calculateDomainPoint(event->pos()));
}
Michal Klocek
Add missing files from previous commit
r466 #include "moc_xychartitem_p.cpp"
QTCOMMERCIALCHART_END_NAMESPACE