##// END OF EJS Templates
Fix zooming in crash...
Fix zooming in crash The bounding rect has to fit inside int limits when zooming in, meaning that the height and width both have to be within the int limits (INT_MAX). QWidget::update() uses a region (based on bounding rect) that has to be compatible with QRect. The geometry change is only done if the bounding rect fulfills this requirement. Task-number: QTRD-1907 Change-Id: I4e874de355390c5fc983ac1e0976bf0d21e2d10c Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>

File last commit:

r2603:1e4c29e111d4
r2603:1e4c29e111d4
Show More
areachartitem.cpp
198 lines | 6.5 KiB | text/x-c | CppLexer
Jani Honkonen
Add license headers
r794 /****************************************************************************
**
Miikka Heikkinen
Fixed the copyright year 2012 -> 2013
r2432 ** Copyright (C) 2013 Digia Plc
Jani Honkonen
Add license headers
r794 ** All rights reserved.
** For any questions to Digia, please use contact form at http://qt.digia.com
**
Miikka Heikkinen
Qt Commercial -> Qt Enterprise...
r2574 ** This file is part of the Qt Enterprise Charts Add-on.
Jani Honkonen
Add license headers
r794 **
** $QT_BEGIN_LICENSE$
Miikka Heikkinen
Qt Commercial -> Qt Enterprise...
r2574 ** Licensees holding valid Qt Enterprise licenses may use this file in
** accordance with the Qt Enterprise License Agreement provided with the
Jani Honkonen
Add license headers
r794 ** 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$
**
****************************************************************************/
Michal Klocek
Adds area chart...
r421 #include "areachartitem_p.h"
#include "qareaseries.h"
Michal Klocek
Adds big fat pimpl to series classes...
r938 #include "qareaseries_p.h"
Michal Klocek
Adds area chart...
r421 #include "qlineseries.h"
Michal Klocek
Fixes missing chart area z value intialization
r564 #include "chartpresenter_p.h"
Marek Rosa
Domains added
r2275 #include "abstractdomain_p.h"
Michal Klocek
Adds area chart...
r421 #include <QPainter>
Michal Klocek
Refactors click signal to line,area,spline,scatter charts
r571 #include <QGraphicsSceneMouseEvent>
Michal Klocek
Refactors axis animation, line animations
r1241 #include <QDebug>
Michal Klocek
Adds area chart...
r421
QTCOMMERCIALCHART_BEGIN_NAMESPACE
Michal Klocek
Refactors internals...
r2273 AreaChartItem::AreaChartItem(QAreaSeries *areaSeries, QGraphicsItem* item)
Miikka Heikkinen
Remove cryptic/obsolete TODOs
r2439 : ChartItem(areaSeries->d_func(),item),
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 m_series(areaSeries),
m_upper(0),
m_lower(0),
m_pointsVisible(false)
Michal Klocek
Adds area chart...
r421 {
Marek Rosa
Added hovered support to areachart. Might need to be re-thought
r2264 setAcceptHoverEvents(true);
Michal Klocek
Fixes missing chart area z value intialization
r564 setZValue(ChartPresenter::LineChartZValue);
Titta Heikkala
Fix empty QAreaSeries crash...
r2601 if (m_series->upperSeries())
m_upper = new AreaBoundItem(this, m_series->upperSeries());
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (m_series->lowerSeries())
Michal Klocek
Refactors internals...
r2273 m_lower = new AreaBoundItem(this, m_series->lowerSeries());
Michal Klocek
Adds area chart...
r421
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
Visible property to abstract series
r1342 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()));
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 QObject::connect(this, SIGNAL(clicked(QPointF)), areaSeries, SIGNAL(clicked(QPointF)));
Marek Rosa
Added hovered support to areachart. Might need to be re-thought
r2264 QObject::connect(this, SIGNAL(hovered(QPointF,bool)), areaSeries, SIGNAL(hovered(QPointF,bool)));
Michal Klocek
Adds area chart...
r421
handleUpdated();
}
AreaChartItem::~AreaChartItem()
{
delete m_upper;
delete m_lower;
Tero Ahola
Internal review: fixed minor issues in Area and XySeries
r761 }
Michal Klocek
Adds area chart...
r421
Michal Klocek
Refactors internals...
r2273 void AreaChartItem::setPresenter(ChartPresenter *presenter)
{
Titta Heikkala
Fix empty QAreaSeries crash...
r2601 if (m_upper)
m_upper->setPresenter(presenter);
Michal Klocek
Refactors internals...
r2273 if (m_lower) {
m_lower->setPresenter(presenter);
}
ChartItem::setPresenter(presenter);
}
Michal Klocek
Adds area chart...
r421 QRectF AreaChartItem::boundingRect() const
{
return m_rect;
}
QPainterPath AreaChartItem::shape() const
{
return m_path;
}
void AreaChartItem::updatePath()
{
QPainterPath path;
Michal Klocek
Refactors internals...
r2273 QRectF rect(QPointF(0,0),domain()->size());
Michal Klocek
Adds area chart...
r421
Tero Ahola
Fixed area series paint bug caused by mouse event fix on line series
r1792 path = m_upper->path();
Michal Klocek
Bugfix : black line drawn during areachart paint
r690
sauimone
minor code review issues. indent, spaces, brackets etc.
r743 if (m_lower) {
Miikka Heikkinen
Add Polar chart support...
r2483 // Note: Polarcharts always draw area correctly only when both series have equal width or are
// fully displayed. If one series is partally off-chart, the connecting line between
// the series does not attach to the end of the partially hidden series but to the point
// where it intersects the axis line. The problem is especially noticeable when one of the series
// is entirely off-chart, in which case the connecting line connects two ends of the
// visible series.
// This happens because we get the paths from linechart, which omits off-chart segments.
// To properly fix, linechart would need to provide true full path, in right, left, and the rest
// portions to enable proper clipping. However, combining those to single visually unified area
// would be a nightmare, since they would have to be painted separately.
Tero Ahola
Fixed area series paint bug caused by mouse event fix on line series
r1792 path.connectPath(m_lower->path().toReversed());
sauimone
minor code review issues. indent, spaces, brackets etc.
r743 } else {
Michal Klocek
Adds area chart...
r421 QPointF first = path.pointAtPercent(0);
QPointF last = path.pointAtPercent(1);
Miikka Heikkinen
Add Polar chart support...
r2483 if (presenter()->chartType() == QChart::ChartTypeCartesian) {
path.lineTo(last.x(), rect.bottom());
path.lineTo(first.x(), rect.bottom());
} else { // polar
path.lineTo(rect.center());
}
Michal Klocek
Adds area chart...
r421 }
path.closeSubpath();
Titta Heikkala
Fix zooming in crash...
r2603
// Only zoom in if the bounding rect of the path fits inside int limits. QWidget::update() uses
// a region that has to be compatible with QRect.
if (path.boundingRect().height() <= INT_MAX
&& path.boundingRect().width() <= INT_MAX) {
prepareGeometryChange();
m_path = path;
m_rect = path.boundingRect();
update();
}
Michal Klocek
Adds area chart...
r421 }
void AreaChartItem::handleUpdated()
{
Tero Ahola
Fixed isVisible implementation in XY series
r1346 setVisible(m_series->isVisible());
Michal Klocek
Adds visiblePoints handling to area chart
r563 m_pointsVisible = m_series->pointsVisible();
m_linePen = m_series->pen();
Michal Klocek
Unify naming setGeometry -> setLayout
r557 m_brush = m_series->brush();
Michal Klocek
Adds visiblePoints handling to area chart
r563 m_pointPen = m_series->pen();
Tero Ahola
Internal review: fixed minor issues in Area and XySeries
r761 m_pointPen.setWidthF(2 * m_pointPen.width());
Tero Ahola
Added opacity property to QAbstractSeries
r2067 setOpacity(m_series->opacity());
Michal Klocek
Adds area chart...
r421 update();
}
Michal Klocek
Refactors Domain and Axis...
r1698 void AreaChartItem::handleDomainUpdated()
Michal Klocek
Adds area chart...
r421 {
Titta Heikkala
Fix empty QAreaSeries crash...
r2601 if (m_upper) {
AbstractDomain* d = m_upper->domain();
d->setSize(domain()->size());
d->setRange(domain()->minX(),domain()->maxX(),domain()->minY(),domain()->maxY());
m_upper->handleDomainUpdated();
}
Michal Klocek
Refactors internals...
r2273
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (m_lower) {
Michal Klocek
Domain not sharable again
r2285 AbstractDomain* d = m_lower->domain();
Michal Klocek
Refactors internals...
r2273 d->setSize(domain()->size());
d->setRange(domain()->minX(),domain()->maxX(),domain()->minY(),domain()->maxY());
m_lower->handleDomainUpdated();
Michal Klocek
Refactors Domain and Axis...
r1698 }
Michal Klocek
Adds area chart...
r421 }
void AreaChartItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
Tero Ahola
Squashed bunch of warnings
r611 Q_UNUSED(widget)
Q_UNUSED(option)
Tero Ahola
Fixed isVisible implementation in XY series
r1346 painter->save();
painter->setPen(m_linePen);
painter->setBrush(m_brush);
Miikka Heikkinen
Add Polar chart support...
r2483 QRectF clipRect = QRectF(QPointF(0, 0), domain()->size());
if (presenter()->chartType() == QChart::ChartTypePolar)
painter->setClipRegion(QRegion(clipRect.toRect(), QRegion::Ellipse));
else
painter->setClipRect(clipRect);
Tero Ahola
Fixed isVisible implementation in XY series
r1346 painter->drawPath(m_path);
if (m_pointsVisible) {
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 painter->setPen(m_pointPen);
painter->drawPoints(m_upper->geometryPoints());
if (m_lower)
painter->drawPoints(m_lower->geometryPoints());
Michal Klocek
Adds visiblePoints handling to area chart
r563 }
Tero Ahola
Fixed isVisible implementation in XY series
r1346 painter->restore();
Michal Klocek
Adds area chart...
r421 }
sauimone
minor code review issues. indent, spaces, brackets etc.
r743 void AreaChartItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
Michal Klocek
Refactors click signal to line,area,spline,scatter charts
r571 {
Michal Klocek
Refactors internals...
r2273 emit clicked(m_upper->domain()->calculateDomainPoint(event->pos()));
Michal Klocek
Fixes mouse handling in base class of chartseries
r1747 ChartItem::mousePressEvent(event);
Michal Klocek
Refactors click signal to line,area,spline,scatter charts
r571 }
Marek Rosa
Added hovered support to areachart. Might need to be re-thought
r2264 void AreaChartItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{
Michal Klocek
Refactors internals...
r2273 emit hovered(domain()->calculateDomainPoint(event->pos()), true);
Marek Rosa
Added hovered support to areachart. Might need to be re-thought
r2264 event->accept();
// QGraphicsItem::hoverEnterEvent(event);
}
void AreaChartItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
{
Michal Klocek
Refactors internals...
r2273 emit hovered(domain()->calculateDomainPoint(event->pos()), false);
Marek Rosa
Added hovered support to areachart. Might need to be re-thought
r2264 event->accept();
// QGraphicsItem::hoverEnterEvent(event);
}
Michal Klocek
Adds area chart...
r421 #include "moc_areachartitem_p.cpp"
QTCOMMERCIALCHART_END_NAMESPACE