boxplotchartitem.cpp
198 lines
| 5.9 KiB
| text/x-c
|
CppLexer
Mika Salmela
|
r2461 | /**************************************************************************** | ||
** | ||||
** 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$ | ||||
** | ||||
****************************************************************************/ | ||||
#include "boxplotchartitem_p.h" | ||||
#include "qboxplotseries_p.h" | ||||
#include "bar_p.h" | ||||
#include "qbarset_p.h" | ||||
#include "qabstractbarseries_p.h" | ||||
#include "qbarset.h" | ||||
#include "boxwhiskers_p.h" | ||||
#include <QPainter> | ||||
QTCOMMERCIALCHART_BEGIN_NAMESPACE | ||||
BoxPlotChartItem::BoxPlotChartItem(QBoxPlotSeries *series, QGraphicsItem* item) : | ||||
ChartItem(series->d_func(), item), | ||||
m_series(series), | ||||
m_animation(0), | ||||
m_animate(0) | ||||
{ | ||||
connect(series->d_func(), SIGNAL(restructuredBars()), this, SLOT(handleDataStructureChanged())); | ||||
connect(series->d_func(), SIGNAL(updatedLayout()), this, SLOT(handleLayoutChanged())); | ||||
connect(series->d_func(), SIGNAL(updatedBars()), this, SLOT(handleUpdatedBars())); | ||||
connect(series->d_func(), SIGNAL(updated()), this, SLOT(handleUpdatedBars())); | ||||
// QBoxPlotSeriesPrivate calls handleDataStructureChanged(), don't do it here | ||||
setZValue(ChartPresenter::BoxPlotSeriesZValue); | ||||
m_barSets = m_series->barSets(); | ||||
} | ||||
BoxPlotChartItem::~BoxPlotChartItem() | ||||
{ | ||||
qDebug() << "BoxPlotChartItem::~BoxPlotChartItem() " << m_seriesIndex; | ||||
} | ||||
void BoxPlotChartItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) | ||||
{ | ||||
Q_UNUSED(painter); | ||||
Q_UNUSED(option); | ||||
Q_UNUSED(widget); | ||||
//painter->setClipRect(QRectF(QPointF(0,0),domain()->size())); | ||||
//qDebug() << "ALERT EMPTY: BoxPlotChartItem::paint"; | ||||
} | ||||
void BoxPlotChartItem::setAnimation(BoxPlotAnimation *animation) | ||||
{ | ||||
//qDebug() << "BoxPlotChartItem::setAnimation :" << animation; | ||||
m_animation = animation; | ||||
if (m_animation) { | ||||
foreach (BoxWhiskers *item, m_boxTable.values()) { | ||||
m_animation->addBox(item); | ||||
} | ||||
handleDomainUpdated(); | ||||
} | ||||
} | ||||
void BoxPlotChartItem::handleDataStructureChanged() | ||||
{ | ||||
//qDebug() << "BoxPlotChartItem::handleDataStructureChanged()"; | ||||
int setCount = m_series->count(); | ||||
for (int s = 0; s < setCount; s++) { | ||||
QBarSet *set = m_series->d_func()->barsetAt(s); | ||||
BoxWhiskers *boxWhiskersItem = m_boxTable.value(set); | ||||
if (boxWhiskersItem == 0) { | ||||
// Item is not yet created, make a box and add it to hash table | ||||
boxWhiskersItem = new BoxWhiskers(domain(), this); | ||||
m_boxTable.insert(set, boxWhiskersItem); | ||||
boxWhiskersItem->setBrush(m_series->brush()); | ||||
boxWhiskersItem->setPen(m_series->pen()); | ||||
} | ||||
updateBoxGeometry(boxWhiskersItem, s); | ||||
boxWhiskersItem->updateGeometry(); | ||||
if (m_animation) | ||||
m_animation->addBox(boxWhiskersItem); | ||||
} | ||||
// | ||||
handleDomainUpdated(); | ||||
} | ||||
void BoxPlotChartItem::handleUpdatedBars() | ||||
{ | ||||
//qDebug() << "BoxPlotChartItem::handleUpdatedBars()"; | ||||
foreach (BoxWhiskers *item, m_boxTable.values()) { | ||||
item->setBrush(m_series->brush()); | ||||
item->setPen(m_series->pen()); | ||||
} | ||||
} | ||||
void BoxPlotChartItem::handleDomainUpdated() | ||||
{ | ||||
//qDebug() << "BoxPlotChartItem::handleDomainUpdated() domain()->size() = " << domain()->size(); | ||||
if ((domain()->size().width() <= 0) || (domain()->size().height() <= 0)) | ||||
return; | ||||
// Set my bounding rect to same as domain size | ||||
m_boundingRect.setRect(0.0, 0.0, domain()->size().width(), domain()->size().height()); | ||||
foreach (BoxWhiskers *item, m_boxTable.values()) { | ||||
// Update the domain size for each BoxWhisker item | ||||
item->setDomainSize(domain()->size()); | ||||
// If the animation is set, start the animation for each BoxWhisker item | ||||
if (m_animation) { | ||||
presenter()->startAnimation(m_animation->boxAnimation(item)); | ||||
} | ||||
} | ||||
} | ||||
void BoxPlotChartItem::handleLayoutChanged() | ||||
{ | ||||
Mika Salmela
|
r2480 | foreach (BoxWhiskers *item, m_boxTable.values()) { | ||
if (m_animation) | ||||
m_animation->setAnimationStart(item); | ||||
Mika Salmela
|
r2461 | |||
Mika Salmela
|
r2480 | bool dirty = updateBoxGeometry(item, item->m_data.m_index); | ||
if (dirty && m_animation) | ||||
presenter()->startAnimation(m_animation->boxChangeAnimation(item)); | ||||
else | ||||
item->updateGeometry(); | ||||
Mika Salmela
|
r2461 | } | ||
} | ||||
QRectF BoxPlotChartItem::boundingRect() const | ||||
{ | ||||
return m_boundingRect; | ||||
} | ||||
void BoxPlotChartItem::initializeLayout() | ||||
{ | ||||
qDebug() << "ALERT EMPTY: BoxPlotChartItem::initializeLayout"; | ||||
} | ||||
QVector<QRectF> BoxPlotChartItem::calculateLayout() | ||||
{ | ||||
return QVector<QRectF>(); | ||||
} | ||||
Mika Salmela
|
r2480 | bool BoxPlotChartItem::updateBoxGeometry(BoxWhiskers *box, int index) | ||
Mika Salmela
|
r2461 | { | ||
Mika Salmela
|
r2480 | bool changed = false; | ||
Mika Salmela
|
r2461 | QBarSet *set = m_series->d_func()->barsetAt(index); | ||
BoxWhiskersData &data = box->m_data; | ||||
Mika Salmela
|
r2480 | |||
if ((data.m_lowerExtreme != set->at(0)) || (data.m_lowerQuartile != set->at(1)) || | ||||
(data.m_median != set->at(2)) || (data.m_upperQuartile != set->at(3)) || (data.m_upperExtreme != set->at(4))) | ||||
changed = true; | ||||
Mika Salmela
|
r2461 | data.m_lowerExtreme = set->at(0); | ||
data.m_lowerQuartile = set->at(1); | ||||
data.m_median = set->at(2); | ||||
data.m_upperQuartile = set->at(3); | ||||
data.m_upperExtreme = set->at(4); | ||||
data.m_index = index; | ||||
data.m_boxItems = m_series->count(); | ||||
data.m_maxX = domain()->maxX(); | ||||
data.m_minX = domain()->minX(); | ||||
data.m_maxY = domain()->maxY(); | ||||
data.m_minY = domain()->minY(); | ||||
data.m_seriesIndex = m_seriesIndex; | ||||
data.m_seriesCount = m_seriesCount; | ||||
Mika Salmela
|
r2480 | |||
return changed; | ||||
Mika Salmela
|
r2461 | } | ||
#include "moc_boxplotchartitem_p.cpp" | ||||
QTCOMMERCIALCHART_END_NAMESPACE | ||||