##// END OF EJS Templates
Fix crash when signals connected to deleted PieChartItem are emitted...
Fix crash when signals connected to deleted PieChartItem are emitted Disconnect all signals connected to the PieChartItem when it is destroyed. Reviewed-by: Mika Salmela

File last commit:

r2407:d108889b4c99
r2423:5eb5ce9ed083
Show More
scatterchartitem.cpp
195 lines | 5.5 KiB | text/x-c | CppLexer
Jani Honkonen
Add license headers
r794 /****************************************************************************
Michal Klocek
Refactor xychartitem -> xychart
r1218 **
** 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$
**
****************************************************************************/
Jani Honkonen
Add license headers
r794
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 #include "scatterchartitem_p.h"
#include "qscatterseries.h"
Michal Klocek
Adds big fat pimpl to series classes...
r938 #include "qscatterseries_p.h"
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 #include "chartpresenter_p.h"
Marek Rosa
Domains added
r2275 #include "abstractdomain_p.h"
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 #include <QPainter>
#include <QGraphicsScene>
Michal Klocek
Improves build configuration...
r996 #include <QDebug>
Michal Klocek
Refactor xychartitem -> xychart
r1218 #include <QGraphicsSceneMouseEvent>
Michal Klocek
Refactor scatter chart to fit the other classes...
r470
QTCOMMERCIALCHART_BEGIN_NAMESPACE
Michal Klocek
Refactors internals...
r2273 ScatterChartItem::ScatterChartItem(QScatterSeries *series, QGraphicsItem* item)
: XYChart(series,item),
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 m_series(series),
m_items(this),
m_visible(true),
m_shape(QScatterSeries::MarkerShapeRectangle),
m_size(15)
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 {
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 QObject::connect(m_series->d_func(), SIGNAL(updated()), this, SLOT(handleUpdated()));
Tero Ahola
Added notifiers for scatter properties
r1349 QObject::connect(m_series, SIGNAL(visibleChanged()), this, SLOT(handleUpdated()));
Tero Ahola
Added opacity property to QAbstractSeries
r2067 QObject::connect(m_series, SIGNAL(opacityChanged()), this, SLOT(handleUpdated()));
Michal Klocek
Refactor scatter chart to fit the other classes...
r470
setZValue(ChartPresenter::ScatterSeriesZValue);
setFlags(QGraphicsItem::ItemClipsChildrenToShape);
handleUpdated();
Michal Klocek
Adds missing scatter intercation implementation...
r541 m_items.setHandlesChildEvents(false);
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 }
QRectF ScatterChartItem::boundingRect() const
{
return m_rect;
}
void ScatterChartItem::createPoints(int count)
{
for (int i = 0; i < count; ++i) {
Michal Klocek
Release compilation fixes
r689 QGraphicsItem *item = 0;
Michal Klocek
Refactor scatter chart to fit the other classes...
r470
switch (m_shape) {
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 case QScatterSeries::MarkerShapeCircle: {
item = new CircleMarker(0, 0, m_size, m_size, this);
Jani Honkonen
more coding style fixes for src-folder...
r2104 const QRectF &rect = item->boundingRect();
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 item->setPos(-rect.width() / 2, -rect.height() / 2);
break;
Jani Honkonen
src folder: another massive victory for coding style police
r2131 }
Jani Honkonen
more coding style fixes for src-folder...
r2104 case QScatterSeries::MarkerShapeRectangle:
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 item = new RectangleMarker(0, 0, m_size, m_size, this);
item->setPos(-m_size / 2, -m_size / 2);
break;
default:
qWarning() << "Unsupported marker type";
Michal Klocek
Refactor xychartitem -> xychart
r1218 break;
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 }
m_items.addToGroup(item);
}
}
void ScatterChartItem::deletePoints(int count)
{
QList<QGraphicsItem *> items = m_items.childItems();
for (int i = 0; i < count; ++i) {
Jani Honkonen
more coding style fixes for src-folder...
r2104 QGraphicsItem *item = items.takeLast();
Michal Klocek
Bugfixes for scatter series...
r1763 m_markerMap.remove(item);
delete(item);
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 }
}
Michal Klocek
Bugfixes for scatter series...
r1763 void ScatterChartItem::markerSelected(QGraphicsItem *marker)
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 {
Michal Klocek
Refactors internals...
r2273 emit XYChart::clicked(domain()->calculateDomainPoint(m_markerMap[marker]));
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 }
Marek Rosa
Added hovered support to scatter series
r2261 void ScatterChartItem::markerHovered(QGraphicsItem *marker, bool state)
{
Michal Klocek
Refactors internals...
r2273 emit XYChart::hovered(domain()->calculateDomainPoint(m_markerMap[marker]), state);
Marek Rosa
Added hovered support to scatter series
r2261 }
Michal Klocek
Refactors animation handling for xyseries
r1217 void ScatterChartItem::updateGeometry()
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 {
Michal Klocek
Refactors animation handling for xyseries
r1217
const QVector<QPointF>& points = geometryPoints();
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (points.size() == 0) {
Marek Rosa
XYSeries model support refactored
r1085 deletePoints(m_items.childItems().count());
Marek Rosa
Added support for adding and removing data with model. Updated the example
r545 return;
}
Michal Klocek
Refactor scatter chart to fit the other classes...
r470
Michal Klocek
Bugfixes for unnesery geometry changes
r869 int diff = m_items.childItems().size() - points.size();
Michal Klocek
Refactor scatter chart to fit the other classes...
r470
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (diff > 0)
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 deletePoints(diff);
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 else if (diff < 0)
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 createPoints(-diff);
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (diff != 0)
handleUpdated();
Michal Klocek
Refactor scatter chart to fit the other classes...
r470
Jani Honkonen
more coding style fixes for src-folder...
r2104 QList<QGraphicsItem *> items = m_items.childItems();
Michal Klocek
Refactor scatter chart to fit the other classes...
r470
Michal Klocek
Refactors internals...
r2273 QRectF clipRect(QPointF(0,0),domain()->size());
Tero Ahola
Added area series to QML api
r847 for (int i = 0; i < points.size(); i++) {
Jani Honkonen
more coding style fixes for src-folder...
r2104 QGraphicsItem *item = items.at(i);
const QPointF &point = points.at(i);
const QRectF &rect = item->boundingRect();
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 m_markerMap[item] = point;
item->setPos(point.x() - rect.width() / 2, point.y() - rect.height() / 2);
Michal Klocek
Refactors internals...
r2273 if (!m_visible || !clipRect.contains(point))
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 item->setVisible(false);
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 else
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 item->setVisible(true);
}
prepareGeometryChange();
Michal Klocek
Refactors internals...
r2273 m_rect = clipRect;
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 }
void ScatterChartItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
Tero Ahola
Squashed bunch of warnings
r611 Q_UNUSED(painter)
Q_UNUSED(option)
Q_UNUSED(widget)
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 }
Jani Honkonen
more coding style fixes for src-folder...
r2104 void ScatterChartItem::setPen(const QPen &pen)
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 {
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 foreach (QGraphicsItem *item , m_items.childItems())
Michal Klocek
Bugfixes for scatter series...
r1763 static_cast<QAbstractGraphicsShapeItem*>(item)->setPen(pen);
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 }
Jani Honkonen
more coding style fixes for src-folder...
r2104 void ScatterChartItem::setBrush(const QBrush &brush)
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 {
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 foreach (QGraphicsItem *item , m_items.childItems())
Michal Klocek
Bugfixes for scatter series...
r1763 static_cast<QAbstractGraphicsShapeItem*>(item)->setBrush(brush);
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 }
void ScatterChartItem::handleUpdated()
{
int count = m_items.childItems().count();
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (count == 0)
return;
Michal Klocek
Refactor scatter chart to fit the other classes...
r470
Tero Ahola
Fixed isVisible implementation in XY series
r1346 bool recreate = m_visible != m_series->isVisible()
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 || m_size != m_series->markerSize()
|| m_shape != m_series->markerShape();
Michal Klocek
Refactor scatter chart to fit the other classes...
r470
Tero Ahola
Fixed isVisible implementation in XY series
r1346 m_visible = m_series->isVisible();
Tero Ahola
Scatter customization to QML api
r1276 m_size = m_series->markerSize();
m_shape = m_series->markerShape();
Tero Ahola
Added opacity property to QAbstractSeries
r2067 setOpacity(m_series->opacity());
Michal Klocek
Refactor scatter chart to fit the other classes...
r470
Michal Klocek
Revert "TODOs removed from code. Undo me after release"...
r2407 if (recreate) {
// TODO: optimize handleUpdate to recreate points only in case shape changed
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 deletePoints(count);
createPoints(count);
Tero Ahola
Scatter customization to QML api
r1276
// Updating geometry is now safe, because it won't call handleUpdated unless it creates/deletes points
updateGeometry();
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 }
setPen(m_series->pen());
setBrush(m_series->brush());
Tero Ahola
Fixed scatter not updating on setBrush/setPen
r1305 update();
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 }
#include "moc_scatterchartitem_p.cpp"
QTCOMMERCIALCHART_END_NAMESPACE