##// END OF EJS Templates
Theme change now affects also XY series
Theme change now affects also XY series

File last commit:

r612:bc455d9d24c8
r615:91322882c9fd
Show More
scatterchartitem.cpp
179 lines | 4.3 KiB | text/x-c | CppLexer
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 #include "scatterchartitem_p.h"
#include "qscatterseries.h"
#include "chartpresenter_p.h"
#include <QPainter>
#include <QGraphicsScene>
QTCOMMERCIALCHART_BEGIN_NAMESPACE
Michal Klocek
Fix sctter series wrong points offset issue
r536
Michal Klocek
Refactor animation to fit line,spline,scatter...
r476 ScatterChartItem::ScatterChartItem(QScatterSeries *series, QGraphicsItem *parent) :
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 XYChartItem(series,parent),
m_series(series),
m_items(this),
m_shape(QScatterSeries::MarkerShapeRectangle),
m_size(10)
{
Q_ASSERT(parent);
Q_ASSERT(series);
Michal Klocek
Adds missing scatter intercation implementation...
r541 QObject::connect(m_series,SIGNAL(updated()), this, SLOT(handleUpdated()));
Michal Klocek
Refactor scatter chart to fit the other classes...
r470
setZValue(ChartPresenter::ScatterSeriesZValue);
setFlags(QGraphicsItem::ItemHasNoContents);
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) {
QGraphicsItem *item;
switch (m_shape) {
Michal Klocek
Adds missing scatter intercation implementation...
r541 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);
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 break;
Michal Klocek
Adds missing scatter intercation implementation...
r541 }
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);
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 break;
Michal Klocek
Adds missing scatter intercation implementation...
r541 }
default:
qWarning()<<"Unsupported marker type";
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 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());
}
}
Michal Klocek
Adds missing scatter intercation implementation...
r541 void ScatterChartItem::markerSelected(Marker* marker)
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 {
Michal Klocek
Refactors click signal to line,area,spline,scatter charts
r571 emit XYChartItem::clicked(QPointF(m_series->x(marker->index()), m_series->y(marker->index())));
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 }
Michal Klocek
Unify naming setGeometry -> setLayout
r557 void ScatterChartItem::setLayout(QVector<QPointF>& points)
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 {
Marek Rosa
Added support for adding and removing data with model. Updated the example
r545 if(points.size()==0)
{
Michal Klocek
Unify naming setGeometry -> setLayout
r557 XYChartItem::setLayout(points);
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
int diff = XYChartItem::points().size() - points.size();
if(diff>0) {
deletePoints(diff);
}
else if(diff<0) {
createPoints(-diff);
}
if(diff!=0) handleUpdated();
QList<QGraphicsItem*> items = m_items.childItems();
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
Adds missing scatter intercation implementation...
r541 item->setIndex(i);
Michal Klocek
Fix sctter series wrong points offset issue
r536 item->setPos(point.x()-rect.width()/2,point.y()-rect.height()/2);
Michal Klocek
Refactor scatter chart to fit the other classes...
r470 if(!clipRect().contains(point)) {
item->setVisible(false);
}
else {
item->setVisible(true);
}
}
prepareGeometryChange();
m_rect = clipRect();
Michal Klocek
Unify naming setGeometry -> setLayout
r557 XYChartItem::setLayout(points);
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
Adds missing scatter intercation implementation...
r541 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
Adds missing scatter intercation implementation...
r541 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;
bool recreate = m_size != m_series->size() || m_shape != m_series->shape();
//TODO: only rewrite on size change
m_size = m_series->size();
m_shape = m_series->shape();
if(recreate){
deletePoints(count);
createPoints(count);
}
setPen(m_series->pen());
setBrush(m_series->brush());
}
#include "moc_scatterchartitem_p.cpp"
QTCOMMERCIALCHART_END_NAMESPACE