areachartitem.cpp
113 lines
| 2.7 KiB
| text/x-c
|
CppLexer
|
r421 | #include "areachartitem_p.h" | ||
#include "qareaseries.h" | ||||
#include "qlineseries.h" | ||||
|
r564 | #include "chartpresenter_p.h" | ||
|
r421 | #include <QPainter> | ||
QTCOMMERCIALCHART_BEGIN_NAMESPACE | ||||
//TODO: optimize : remove points which are not visible | ||||
|
r439 | AreaChartItem::AreaChartItem(QAreaSeries* areaSeries,QGraphicsItem *parent):ChartItem(parent), | ||
|
r421 | m_series(areaSeries), | ||
m_upper(0), | ||||
|
r563 | m_lower(0), | ||
m_pointsVisible(false) | ||||
|
r421 | { | ||
|
r564 | setZValue(ChartPresenter::LineChartZValue); | ||
|
r439 | m_upper = new AreaBoundItem(this,m_series->upperSeries()); | ||
|
r421 | if(m_series->lowerSeries()){ | ||
|
r439 | m_lower = new AreaBoundItem(this,m_series->lowerSeries()); | ||
|
r421 | } | ||
QObject::connect(areaSeries,SIGNAL(updated()),this,SLOT(handleUpdated())); | ||||
handleUpdated(); | ||||
} | ||||
AreaChartItem::~AreaChartItem() | ||||
{ | ||||
delete m_upper; | ||||
delete m_lower; | ||||
}; | ||||
QRectF AreaChartItem::boundingRect() const | ||||
{ | ||||
return m_rect; | ||||
} | ||||
QPainterPath AreaChartItem::shape() const | ||||
{ | ||||
return m_path; | ||||
} | ||||
void AreaChartItem::updatePath() | ||||
{ | ||||
QPainterPath path; | ||||
path.connectPath(m_upper->shape()); | ||||
if(m_lower){ | ||||
path.connectPath(m_lower->shape().toReversed()); | ||||
} | ||||
else{ | ||||
QPointF first = path.pointAtPercent(0); | ||||
QPointF last = path.pointAtPercent(1); | ||||
path.lineTo(last.x(),m_clipRect.bottom()); | ||||
path.lineTo(first.x(),m_clipRect.bottom()); | ||||
} | ||||
path.closeSubpath(); | ||||
prepareGeometryChange(); | ||||
m_path=path; | ||||
m_rect=path.boundingRect(); | ||||
update(); | ||||
} | ||||
void AreaChartItem::handleUpdated() | ||||
{ | ||||
|
r563 | m_pointsVisible = m_series->pointsVisible(); | ||
m_linePen = m_series->pen(); | ||||
|
r557 | m_brush = m_series->brush(); | ||
|
r563 | m_pointPen = m_series->pen(); | ||
m_pointPen.setWidthF(2*m_pointPen.width()); | ||||
|
r421 | update(); | ||
} | ||||
|
r439 | void AreaChartItem::handleDomainChanged(qreal minX, qreal maxX, qreal minY, qreal maxY) | ||
|
r421 | { | ||
|
r439 | m_upper->handleDomainChanged(minX,maxX,minY,maxY); | ||
|
r421 | if(m_lower) | ||
|
r439 | m_lower->handleDomainChanged(minX,maxX,minY,maxY); | ||
|
r421 | } | ||
void AreaChartItem::handleGeometryChanged(const QRectF& rect) | ||||
{ | ||||
m_clipRect=rect.translated(-rect.topLeft()); | ||||
setPos(rect.topLeft()); | ||||
m_upper->handleGeometryChanged(rect); | ||||
if(m_lower) | ||||
m_lower->handleGeometryChanged(rect); | ||||
} | ||||
//painter | ||||
void AreaChartItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) | ||||
{ | ||||
Q_UNUSED(widget); | ||||
Q_UNUSED(option); | ||||
painter->save(); | ||||
|
r563 | painter->setPen(m_linePen); | ||
|
r421 | painter->setBrush(m_brush); | ||
painter->setClipRect(m_clipRect); | ||||
painter->drawPath(m_path); | ||||
|
r563 | if(m_pointsVisible){ | ||
painter->setPen(m_pointPen); | ||||
painter->drawPoints(m_upper->points()); | ||||
if(m_lower) painter->drawPoints(m_lower->points()); | ||||
} | ||||
|
r421 | painter->restore(); | ||
} | ||||
#include "moc_areachartitem_p.cpp" | ||||
QTCOMMERCIALCHART_END_NAMESPACE | ||||