##// END OF EJS Templates
Refactors layout managment...
Refactors layout managment * adds chartlayout class * adds lagendlayout class * refactors handling to setGeometry instead of resize * implmements all TODOs from presenter and qchart * refactors layout handling in legend * adds QGraphicsLayoutItem sublcassing

File last commit:

r1481:3fafc6aab8aa
r1534:d9bcc3bd9d82
Show More
scatterchartitem.cpp
205 lines | 5.6 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"
#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 chartitem...
r677 ScatterChartItem::ScatterChartItem(QScatterSeries *series, ChartPresenter *presenter) :
Tero Ahola
Visible property to abstract series
r1342 XYChart(series,presenter),
QGraphicsItem(presenter ? presenter->rootItem() : 0),
m_series(series),
m_items(this),
Tero Ahola
Fixed isVisible implementation in XY series
r1346 m_visible(true),
Tero Ahola
Visible property to abstract series
r1342 m_shape(QScatterSeries::MarkerShapeRectangle),
m_size(15)
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 {
Michal Klocek
Adds big fat pimpl to series classes...
r938 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()));
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 // TODO: how to draw a drop shadow?
// QGraphicsDropShadowEffect *dropShadow = new QGraphicsDropShadowEffect();
// dropShadow->setOffset(2.0);
// dropShadow->setBlurRadius(2.0);
// setGraphicsEffect(dropShadow);
}
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) {
Michal Klocek
Refactor xychartitem -> xychart
r1218 case QScatterSeries::MarkerShapeCircle: {
QGraphicsEllipseItem* i = new QGraphicsEllipseItem(0,0,m_size,m_size);
const QRectF& rect = i->boundingRect();
i->setPos(-rect.width()/2,-rect.height()/2);
item = new Marker(i,this);
break;
}
case QScatterSeries::MarkerShapeRectangle: {
QGraphicsRectItem* i = new QGraphicsRectItem(0,0,m_size,m_size);
i->setPos(-m_size/2,-m_size/2);
item = new Marker(i,this);
break;
}
default:
qWarning()<<"Unsupported marker type";
break;
Michal Klocek
Adds missing scatter intercation implementation...
r541
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) {
delete(items.takeLast());
}
}
sauimone
minor code review issues. indent, spaces, brackets etc.
r743 void ScatterChartItem::markerSelected(Marker *marker)
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 {
Tero Ahola
Fixed coordinate bug with QScatterSeries::onClicked
r1410 emit XYChart::clicked(calculateDomainPoint(marker->point()));
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 }
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();
Marek Rosa
Added support for adding and removing data with model. Updated the example
r545 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
if(diff>0) {
deletePoints(diff);
}
else if(diff<0) {
createPoints(-diff);
}
if(diff!=0) handleUpdated();
QList<QGraphicsItem*> items = m_items.childItems();
Tero Ahola
Added area series to QML api
r847 for (int i = 0; i < points.size(); i++) {
Michal Klocek
Adds missing scatter intercation implementation...
r541 Marker* item = static_cast<Marker*>(items.at(i));
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 const QPointF& point = points.at(i);
Michal Klocek
Fix sctter series wrong points offset issue
r536 const QRectF& rect = item->boundingRect();
Michal Klocek
Fixes and improvments to series API...
r1057 item->setPoint(point);
Michal Klocek
Fix sctter series wrong points offset issue
r536 item->setPos(point.x()-rect.width()/2,point.y()-rect.height()/2);
Tero Ahola
Fixed isVisible implementation in XY series
r1346 if(!m_visible || !clipRect().contains(point)) {
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 item->setVisible(false);
}
else {
item->setVisible(true);
}
}
prepareGeometryChange();
m_rect = clipRect();
Michal Klocek
Refactor xychartitem -> xychart
r1218 setPos(origin());
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 }
void ScatterChartItem::setPen(const QPen& pen)
{
foreach(QGraphicsItem* item , m_items.childItems()) {
Michal Klocek
Refactor xychartitem -> xychart
r1218 static_cast<Marker*>(item)->setPen(pen);
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 }
}
void ScatterChartItem::setBrush(const QBrush& brush)
{
foreach(QGraphicsItem* item , m_items.childItems()) {
Michal Klocek
Refactor xychartitem -> xychart
r1218 static_cast<Marker*>(item)->setBrush(brush);
}
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 }
void ScatterChartItem::handleUpdated()
{
int count = m_items.childItems().count();
if(count==0) return;
Tero Ahola
Fixed isVisible implementation in XY series
r1346 bool recreate = m_visible != m_series->isVisible()
|| 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();
Michal Klocek
Refactor scatter chart to fit the other classes...
r470
Michal Klocek
Refactor xychartitem -> xychart
r1218 if(recreate) {
Tero Ahola
Scatter customization to QML api
r1276 // 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 }
Michal Klocek
Refactor xychartitem -> xychart
r1218 void ScatterChartItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
emit XYChart::clicked(calculateDomainPoint(event->pos()));
}
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 #include "moc_scatterchartitem_p.cpp"
QTCOMMERCIALCHART_END_NAMESPACE