##// END OF EJS Templates
Merge remote-tracking branch 'origin/5.6' into 5.7...
Merge remote-tracking branch 'origin/5.6' into 5.7 Conflicts: .qmake.conf README src/charts/qchartglobal.h Change-Id: I20497b20947f589f9f73239a09ba6ea013b3597a

File last commit:

r2854:46147b040d06
r2878:97bb01ce5d85 merge
Show More
linechartitem.cpp
465 lines | 20.2 KiB | text/x-c | CppLexer
Miikka Heikkinen
Updated license...
r2854 /****************************************************************************
Jani Honkonen
Add license headers
r794 **
Miikka Heikkinen
Updated license...
r2854 ** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
Jani Honkonen
Add license headers
r794 **
Miikka Heikkinen
Updated license...
r2854 ** This file is part of the Qt Charts module of the Qt Toolkit.
Jani Honkonen
Add license headers
r794 **
Miikka Heikkinen
Updated license...
r2854 ** $QT_BEGIN_LICENSE:GPL$
Titta Heikkala
Updated license headers...
r2845 ** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
Miikka Heikkinen
Updated license...
r2854 ** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) any later version
** approved by the KDE Free Qt Foundation. The licenses are as published by
** the Free Software Foundation and appearing in the file LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
Jani Honkonen
Add license headers
r794 **
Titta Heikkala
Updated license headers...
r2845 ** $QT_END_LICENSE$
**
Miikka Heikkinen
Updated license...
r2854 ****************************************************************************/
Jani Honkonen
Add license headers
r794
Titta Heikkala
Fix include syntax...
r2714 #include <private/linechartitem_p.h>
#include <QtCharts/QLineSeries>
#include <private/qlineseries_p.h>
#include <private/chartpresenter_p.h>
#include <private/polardomain_p.h>
#include <private/chartthememanager_p.h>
#include <private/charttheme_p.h>
#include <QtGui/QPainter>
#include <QtWidgets/QGraphicsSceneMouseEvent>
Michal Klocek
Fix naming convention for lineseries...
r144
Titta Heikkala
Qt Charts project file structure change...
r2712 QT_CHARTS_BEGIN_NAMESPACE
Michal Klocek
Refactor current draft to fit int current design specs...
r21
Tero Ahola
Fixed area series paint bug caused by mouse event fix on line series
r1792 const qreal mouseEventMinWidth(12);
Michal Klocek
Adds cliping and proper zoom handling for line chart
r150
Miikka Heikkinen
Add Polar chart support...
r2483 LineChartItem::LineChartItem(QLineSeries *series, QGraphicsItem *item)
Michal Klocek
Refactors internals...
r2273 : XYChart(series,item),
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 m_series(series),
Miikka Heikkinen
Add Polar chart support...
r2483 m_pointsVisible(false),
Titta Heikkala
Added possibility to show series value...
r2689 m_chartType(QChart::ChartTypeUndefined),
m_pointLabelsVisible(false),
Titta Heikkala
Fix order of initialization...
r2695 m_pointLabelsFormat(series->pointLabelsFormat()),
Titta Heikkala
Added possibility to show series value...
r2689 m_pointLabelsFont(series->pointLabelsFont()),
Titta Heikkala
Add pressed, released and doubleClicked signals...
r2739 m_pointLabelsColor(series->pointLabelsColor()),
Titta Heikkala
Added option to set labels clipping...
r2815 m_pointLabelsClipping(true),
Titta Heikkala
Add pressed, released and doubleClicked signals...
r2739 m_mousePressed(false)
Michal Klocek
Refactor current draft to fit int current design specs...
r21 {
Marek Rosa
Added hovered signal to QLineSeries. Updated callout example
r2255 setAcceptHoverEvents(true);
Titta Heikkala
Add pressed, released and doubleClicked signals...
r2739 setFlag(QGraphicsItem::ItemIsSelectable);
Michal Klocek
Adds ZOrder enum to presenter
r262 setZValue(ChartPresenter::LineChartZValue);
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 QObject::connect(series->d_func(), SIGNAL(updated()), this, SLOT(handleUpdated()));
Tero Ahola
Visible property to abstract series
r1342 QObject::connect(series, SIGNAL(visibleChanged()), this, SLOT(handleUpdated()));
Tero Ahola
Added opacity property to QAbstractSeries
r2067 QObject::connect(series, SIGNAL(opacityChanged()), this, SLOT(handleUpdated()));
Titta Heikkala
Added possibility to show series value...
r2689 QObject::connect(series, SIGNAL(pointLabelsFormatChanged(QString)),
this, SLOT(handleUpdated()));
QObject::connect(series, SIGNAL(pointLabelsVisibilityChanged(bool)),
this, SLOT(handleUpdated()));
QObject::connect(series, SIGNAL(pointLabelsFontChanged(QFont)), this, SLOT(handleUpdated()));
QObject::connect(series, SIGNAL(pointLabelsColorChanged(QColor)), this, SLOT(handleUpdated()));
Titta Heikkala
Added option to set labels clipping...
r2815 QObject::connect(series, SIGNAL(pointLabelsClippingChanged(bool)), this, SLOT(handleUpdated()));
Michal Klocek
Refactor domain model...
r439 handleUpdated();
Michal Klocek
Refactor current draft to fit int current design specs...
r21 }
Michal Klocek
Fix naming convention for lineseries...
r144 QRectF LineChartItem::boundingRect() const
Tero Ahola
Refactored themes; now enabled for line, scatter and pies...
r103 {
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 return m_rect;
Tero Ahola
Refactored themes; now enabled for line, scatter and pies...
r103 }
Michal Klocek
Refactora axis and line chart to use graphics items insted of painter.
r85
Michal Klocek
Fix naming convention for lineseries...
r144 QPainterPath LineChartItem::shape() const
Michal Klocek
Add zoom support...
r67 {
Miikka Heikkinen
Add Polar chart support...
r2483 return m_shapePath;
Michal Klocek
Refactors qchart , adds line animation...
r131 }
Michal Klocek
Refactora axis and line chart to use graphics items insted of painter.
r85
Michal Klocek
Refactors animation handling for xyseries
r1217 void LineChartItem::updateGeometry()
Michal Klocek
Refactors qchart , adds line animation...
r131 {
Miikka Heikkinen
Accelerating lineseries with OpenGL...
r2820 if (m_series->useOpenGL()) {
Miikka Heikkinen
Use empty rect for gl series instead of small dummy rect...
r2830 if (!m_rect.isEmpty()) {
Miikka Heikkinen
Accelerating lineseries with OpenGL...
r2820 prepareGeometryChange();
Miikka Heikkinen
Use empty rect for gl series instead of small dummy rect...
r2830 // Changed signal seems to trigger even with empty region
m_rect = QRectF();
Miikka Heikkinen
Accelerating lineseries with OpenGL...
r2820 }
update();
return;
}
Titta Heikkala
Revert previous change to LineChartItem...
r2818 // Store the points to a local variable so that the old line gets properly cleared
// when animation starts.
m_linePoints = geometryPoints();
const QVector<QPointF> &points = m_linePoints;
Michal Klocek
Refactors animation handling for xyseries
r1217
Miikka Heikkinen
Add Polar chart support...
r2483 if (points.size() == 0) {
Michal Klocek
Fix last post remove in qlineseries
r1269 prepareGeometryChange();
Miikka Heikkinen
Add Polar chart support...
r2483 m_fullPath = QPainterPath();
Miikka Heikkinen
Fix lineseries points related drawing problems...
r2451 m_linePath = QPainterPath();
Michal Klocek
Fix last post remove in qlineseries
r1269 m_rect = QRect();
Marek Rosa
Added support for adding and removing data with model. Updated the example
r545 return;
}
Michal Klocek
Refactors linechart update calls
r464
Miikka Heikkinen
Add Polar chart support...
r2483 QPainterPath linePath;
QPainterPath fullPath;
// Use worst case scenario to determine required margin.
qreal margin = m_linePen.width() * 1.42;
Michal Klocek
Refactors linechart update calls
r464
Miikka Heikkinen
Add Polar chart support...
r2483 // Area series use component line series that aren't necessarily added to the chart themselves,
// so check if chart type is forced before trying to obtain it from the chart.
QChart::ChartType chartType = m_chartType;
if (chartType == QChart::ChartTypeUndefined)
chartType = m_series->chart()->chartType();
Michal Klocek
Fix line series graphic arefacts
r1819
Miikka Heikkinen
Add Polar chart support...
r2483 // For polar charts, we need special handling for angular (horizontal)
// points that are off-grid.
if (chartType == QChart::ChartTypePolar) {
QPainterPath linePathLeft;
QPainterPath linePathRight;
QPainterPath *currentSegmentPath = 0;
QPainterPath *previousSegmentPath = 0;
qreal minX = domain()->minX();
qreal maxX = domain()->maxX();
qreal minY = domain()->minY();
Miikka Heikkinen
Refactor the new QXYSeries::pointAt() -> QXYSeries::at()...
r2491 QPointF currentSeriesPoint = m_series->at(0);
Miikka Heikkinen
Add Polar chart support...
r2483 QPointF currentGeometryPoint = points.at(0);
QPointF previousGeometryPoint = points.at(0);
Michal Klocek
Fix line series graphic arefacts
r1819 int size = m_linePen.width();
Miikka Heikkinen
Add Polar chart support...
r2483 bool pointOffGrid = false;
bool previousPointWasOffGrid = (currentSeriesPoint.x() < minX || currentSeriesPoint.x() > maxX);
qreal domainRadius = domain()->size().height() / 2.0;
const QPointF centerPoint(domainRadius, domainRadius);
if (!previousPointWasOffGrid) {
fullPath.moveTo(points.at(0));
if (m_pointsVisible && currentSeriesPoint.y() >= minY) {
// Do not draw ellipses for points below minimum Y.
linePath.addEllipse(points.at(0), size, size);
fullPath.addEllipse(points.at(0), size, size);
linePath.moveTo(points.at(0));
fullPath.moveTo(points.at(0));
}
Michal Klocek
Fix line series graphic arefacts
r1819 }
Miikka Heikkinen
Add Polar chart support...
r2483 qreal leftMarginLine = centerPoint.x() - margin;
qreal rightMarginLine = centerPoint.x() + margin;
qreal horizontal = centerPoint.y();
Michal Klocek
Refactors linechart update calls
r464
Miikka Heikkinen
Fix crash when adding/removing points during animation...
r2489 // See ScatterChartItem::updateGeometry() for explanation why seriesLastIndex is needed
const int seriesLastIndex = m_series->count() - 1;
Miikka Heikkinen
Add Polar chart support...
r2483 for (int i = 1; i < points.size(); i++) {
// Interpolating line fragments would be ugly when thick pen is used,
// so we work around it by utilizing three separate
// paths for line segments and clip those with custom regions at paint time.
// "Right" path contains segments that cross the axis line with visible point on the
// right side of the axis line, as well as segments that have one point within the margin
// on the right side of the axis line and another point on the right side of the chart.
// "Left" path contains points with similarly on the left side.
// "Full" path contains rest of the points.
// This doesn't yield perfect results always. E.g. when segment covers more than 90
// degrees and both of the points are within the margin, one in the top half and one in the
// bottom half of the chart, the bottom one gets clipped incorrectly.
// However, this should be rare occurrence in any sensible chart.
Miikka Heikkinen
Refactor the new QXYSeries::pointAt() -> QXYSeries::at()...
r2491 currentSeriesPoint = m_series->at(qMin(seriesLastIndex, i));
Miikka Heikkinen
Add Polar chart support...
r2483 currentGeometryPoint = points.at(i);
pointOffGrid = (currentSeriesPoint.x() < minX || currentSeriesPoint.x() > maxX);
// Draw something unless both off-grid
if (!pointOffGrid || !previousPointWasOffGrid) {
QPointF intersectionPoint;
qreal y;
if (pointOffGrid != previousPointWasOffGrid) {
if (currentGeometryPoint.x() == previousGeometryPoint.x()) {
y = currentGeometryPoint.y() + (currentGeometryPoint.y() - previousGeometryPoint.y()) / 2.0;
} else {
qreal ratio = (centerPoint.x() - currentGeometryPoint.x()) / (currentGeometryPoint.x() - previousGeometryPoint.x());
y = currentGeometryPoint.y() + (currentGeometryPoint.y() - previousGeometryPoint.y()) * ratio;
}
intersectionPoint = QPointF(centerPoint.x(), y);
}
bool dummyOk; // We know points are ok, but this is needed
Friedemann Kleint
LineChartItem::updateGeometry(): Catch and warn about unexpected domains....
r2771 qreal currentAngle = 0;
qreal previousAngle = 0;
if (const PolarDomain *pd = qobject_cast<const PolarDomain *>(domain())) {
currentAngle = pd->toAngularCoordinate(currentSeriesPoint.x(), dummyOk);
previousAngle = pd->toAngularCoordinate(m_series->at(i - 1).x(), dummyOk);
} else {
qWarning() << Q_FUNC_INFO << "Unexpected domain: " << domain();
}
Miikka Heikkinen
Add Polar chart support...
r2483 if ((qAbs(currentAngle - previousAngle) > 180.0)) {
// If the angle between two points is over 180 degrees (half X range),
// any direct segment between them becomes meaningless.
// In this case two line segments are drawn instead, from previous
// point to the center and from center to current point.
if ((previousAngle < 0.0 || (previousAngle <= 180.0 && previousGeometryPoint.x() < rightMarginLine))
&& previousGeometryPoint.y() < horizontal) {
currentSegmentPath = &linePathRight;
} else if ((previousAngle > 360.0 || (previousAngle > 180.0 && previousGeometryPoint.x() > leftMarginLine))
&& previousGeometryPoint.y() < horizontal) {
currentSegmentPath = &linePathLeft;
} else if (previousAngle > 0.0 && previousAngle < 360.0) {
currentSegmentPath = &linePath;
} else {
currentSegmentPath = 0;
}
if (currentSegmentPath) {
if (previousSegmentPath != currentSegmentPath)
currentSegmentPath->moveTo(previousGeometryPoint);
if (previousPointWasOffGrid)
fullPath.moveTo(intersectionPoint);
currentSegmentPath->lineTo(centerPoint);
fullPath.lineTo(centerPoint);
}
previousSegmentPath = currentSegmentPath;
if ((currentAngle < 0.0 || (currentAngle <= 180.0 && currentGeometryPoint.x() < rightMarginLine))
&& currentGeometryPoint.y() < horizontal) {
currentSegmentPath = &linePathRight;
} else if ((currentAngle > 360.0 || (currentAngle > 180.0 &&currentGeometryPoint.x() > leftMarginLine))
&& currentGeometryPoint.y() < horizontal) {
currentSegmentPath = &linePathLeft;
} else if (currentAngle > 0.0 && currentAngle < 360.0) {
currentSegmentPath = &linePath;
} else {
currentSegmentPath = 0;
}
if (currentSegmentPath) {
if (previousSegmentPath != currentSegmentPath)
currentSegmentPath->moveTo(centerPoint);
if (!previousSegmentPath)
fullPath.moveTo(centerPoint);
currentSegmentPath->lineTo(currentGeometryPoint);
if (pointOffGrid)
fullPath.lineTo(intersectionPoint);
else
fullPath.lineTo(currentGeometryPoint);
}
} else {
if (previousAngle < 0.0 || currentAngle < 0.0
|| ((previousAngle <= 180.0 && currentAngle <= 180.0)
&& ((previousGeometryPoint.x() < rightMarginLine && previousGeometryPoint.y() < horizontal)
|| (currentGeometryPoint.x() < rightMarginLine && currentGeometryPoint.y() < horizontal)))) {
currentSegmentPath = &linePathRight;
} else if (previousAngle > 360.0 || currentAngle > 360.0
|| ((previousAngle > 180.0 && currentAngle > 180.0)
&& ((previousGeometryPoint.x() > leftMarginLine && previousGeometryPoint.y() < horizontal)
|| (currentGeometryPoint.x() > leftMarginLine && currentGeometryPoint.y() < horizontal)))) {
currentSegmentPath = &linePathLeft;
} else {
currentSegmentPath = &linePath;
}
if (currentSegmentPath != previousSegmentPath)
currentSegmentPath->moveTo(previousGeometryPoint);
if (previousPointWasOffGrid)
fullPath.moveTo(intersectionPoint);
if (pointOffGrid)
fullPath.lineTo(intersectionPoint);
else
fullPath.lineTo(currentGeometryPoint);
currentSegmentPath->lineTo(currentGeometryPoint);
}
} else {
currentSegmentPath = 0;
}
previousPointWasOffGrid = pointOffGrid;
if (m_pointsVisible && !pointOffGrid && currentSeriesPoint.y() >= minY) {
linePath.addEllipse(points.at(i), size, size);
fullPath.addEllipse(points.at(i), size, size);
linePath.moveTo(points.at(i));
fullPath.moveTo(points.at(i));
}
previousSegmentPath = currentSegmentPath;
previousGeometryPoint = currentGeometryPoint;
}
m_linePathPolarRight = linePathRight;
m_linePathPolarLeft = linePathLeft;
// Note: This construction of m_fullpath is not perfect. The partial segments that are
// outside left/right clip regions at axis boundary still generate hover/click events,
// because shape doesn't get clipped. It doesn't seem possible to do sensibly.
} else { // not polar
linePath.moveTo(points.at(0));
if (m_pointsVisible) {
int size = m_linePen.width();
linePath.addEllipse(points.at(0), size, size);
linePath.moveTo(points.at(0));
for (int i = 1; i < points.size(); i++) {
linePath.lineTo(points.at(i));
linePath.addEllipse(points.at(i), size, size);
linePath.moveTo(points.at(i));
}
} else {
for (int i = 1; i < points.size(); i++)
linePath.lineTo(points.at(i));
}
fullPath = linePath;
}
Tero Ahola
Finetuning shape of line chart item to remove drawing artifacts
r1823
Michal Klocek
Fix line series graphic arefacts
r1819 QPainterPathStroker stroker;
Tero Ahola
Finetuning shape of line chart item to remove drawing artifacts
r1823 // QPainter::drawLine does not respect join styles, for example BevelJoin becomes MiterJoin.
// This is why we are prepared for the "worst case" scenario, i.e. use always MiterJoin and
// multiply line width with square root of two when defining shape and bounding rectangle.
Miikka Heikkinen
Add Polar chart support...
r2483 stroker.setWidth(margin);
Tero Ahola
Finetuning shape of line chart item to remove drawing artifacts
r1823 stroker.setJoinStyle(Qt::MiterJoin);
stroker.setCapStyle(Qt::SquareCap);
Michal Klocek
Adds magic number to fix some drawLine shape inaccuracy
r1821 stroker.setMiterLimit(m_linePen.miterLimit());
Tero Ahola
Fixed paint and mouse event issues with QLineSeries...
r1791
Titta Heikkala
Fix zooming in crash...
r2603 QPainterPath checkShapePath = stroker.createStroke(fullPath);
// Only zoom in if the bounding rects of the paths fit inside int limits. QWidget::update() uses
// a region that has to be compatible with QRect.
if (checkShapePath.boundingRect().height() <= INT_MAX
&& checkShapePath.boundingRect().width() <= INT_MAX
&& linePath.boundingRect().height() <= INT_MAX
&& linePath.boundingRect().width() <= INT_MAX
&& fullPath.boundingRect().height() <= INT_MAX
&& fullPath.boundingRect().width() <= INT_MAX) {
prepareGeometryChange();
Tero Ahola
Fixed paint and mouse event issues with QLineSeries...
r1791
Titta Heikkala
Fix zooming in crash...
r2603 m_linePath = linePath;
m_fullPath = fullPath;
m_shapePath = checkShapePath;
Miikka Heikkinen
Add Polar chart support...
r2483
Titta Heikkala
Fix zooming in crash...
r2603 m_rect = m_shapePath.boundingRect();
} else {
update();
}
Michal Klocek
Refactor current draft to fit int current design specs...
r21 }
Michal Klocek
Adds updated handling for line series
r392 void LineChartItem::handleUpdated()
Michal Klocek
Rewrite animation hadnling in line series...
r389 {
Titta Heikkala
Added possibility to show series value...
r2689 // If points visibility has changed, a geometry update is needed.
Miikka Heikkinen
Fix lineseries points related drawing problems...
r2451 // Also, if pen changes when points are visible, geometry update is needed.
bool doGeometryUpdate =
(m_pointsVisible != m_series->pointsVisible())
|| (m_series->pointsVisible() && (m_linePen != m_series->pen()));
Tero Ahola
Fixed isVisible implementation in XY series
r1346 setVisible(m_series->isVisible());
Tero Ahola
Added opacity property to QAbstractSeries
r2067 setOpacity(m_series->opacity());
Michal Klocek
Adds clicked(Point) to lineSeries, changes visible points handling
r544 m_pointsVisible = m_series->pointsVisible();
m_linePen = m_series->pen();
Titta Heikkala
Added possibility to show series value...
r2689 m_pointLabelsFormat = m_series->pointLabelsFormat();
m_pointLabelsVisible = m_series->pointLabelsVisible();
m_pointLabelsFont = m_series->pointLabelsFont();
m_pointLabelsColor = m_series->pointLabelsColor();
Titta Heikkala
Added option to set labels clipping...
r2815 m_pointLabelsClipping = m_series->pointLabelsClipping();
Miikka Heikkinen
Fix lineseries points related drawing problems...
r2451 if (doGeometryUpdate)
updateGeometry();
Michal Klocek
Refactored for MVP...
r139 update();
}
Michal Klocek
Fix commit 7b90ec69ce9a3353820d295c222ef3f79537484d
r391 void LineChartItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
Tero Ahola
Squashed bunch of warnings
r611 Q_UNUSED(widget)
Q_UNUSED(option)
Miikka Heikkinen
Accelerating lineseries with OpenGL...
r2820 if (m_series->useOpenGL())
return;
Miikka Heikkinen
Add Polar chart support...
r2483 QRectF clipRect = QRectF(QPointF(0, 0), domain()->size());
Tero Ahola
Fixed clip rect bug in QLineSeries
r1828 painter->save();
Tero Ahola
Fixed isVisible implementation in XY series
r1346 painter->setPen(m_linePen);
Miikka Heikkinen
Add Polar chart support...
r2483 bool alwaysUsePath = false;
if (m_series->chart()->chartType() == QChart::ChartTypePolar) {
qreal halfWidth = domain()->size().width() / 2.0;
QRectF clipRectLeft = QRectF(0, 0, halfWidth, domain()->size().height());
QRectF clipRectRight = QRectF(halfWidth, 0, halfWidth, domain()->size().height());
QRegion fullPolarClipRegion(clipRect.toRect(), QRegion::Ellipse);
QRegion clipRegionLeft(fullPolarClipRegion.intersected(clipRectLeft.toRect()));
QRegion clipRegionRight(fullPolarClipRegion.intersected(clipRectRight.toRect()));
painter->setClipRegion(clipRegionLeft);
painter->drawPath(m_linePathPolarLeft);
painter->setClipRegion(clipRegionRight);
painter->drawPath(m_linePathPolarRight);
painter->setClipRegion(fullPolarClipRegion);
alwaysUsePath = true; // required for proper clipping
} else {
painter->setClipRect(clipRect);
}
Michal Klocek
Fix line series graphic arefacts
r1819
Titta Heikkala
Add possibility to set reverse values to axes...
r2781 reversePainter(painter, clipRect);
Michal Klocek
Fix line series graphic arefacts
r1819 if (m_pointsVisible) {
Miikka Heikkinen
Fixed pen style pattern continuity for line series...
r2457 painter->setBrush(m_linePen.color());
Michal Klocek
Fix line series graphic arefacts
r1819 painter->drawPath(m_linePath);
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 } else {
Miikka Heikkinen
Fixed pen style pattern continuity for line series...
r2457 painter->setBrush(QBrush(Qt::NoBrush));
Miikka Heikkinen
Add Polar chart support...
r2483 if (m_linePen.style() != Qt::SolidLine || alwaysUsePath) {
Miikka Heikkinen
Fixed pen style pattern continuity for line series...
r2457 // If pen style is not solid line, always fall back to path painting
// to ensure proper continuity of the pattern
painter->drawPath(m_linePath);
} else {
Titta Heikkala
Revert previous change to LineChartItem...
r2818 for (int i(1); i < m_linePoints.size(); i++)
painter->drawLine(m_linePoints.at(i - 1), m_linePoints.at(i));
Miikka Heikkinen
Fixed pen style pattern continuity for line series...
r2457 }
Michal Klocek
Adds clicked(Point) to lineSeries, changes visible points handling
r544 }
Miikka Heikkinen
Fixed pen style pattern continuity for line series...
r2457
Titta Heikkala
Add possibility to set reverse values to axes...
r2781 reversePainter(painter, clipRect);
Titta Heikkala
Added option to set labels clipping...
r2815 if (m_pointLabelsVisible) {
if (m_pointLabelsClipping)
painter->setClipping(true);
else
painter->setClipping(false);
Titta Heikkala
Revert previous change to LineChartItem...
r2818 m_series->d_func()->drawSeriesPointLabels(painter, m_linePoints, m_linePen.width() / 2);
Titta Heikkala
Added option to set labels clipping...
r2815 }
Titta Heikkala
Added possibility to show series value...
r2689
Tero Ahola
Fixed clip rect bug in QLineSeries
r1828 painter->restore();
Titta Heikkala
Added possibility to show series value...
r2689
Michal Klocek
Fix commit 7b90ec69ce9a3353820d295c222ef3f79537484d
r391 }
Michal Klocek
Refactor xychartitem -> xychart
r1218 void LineChartItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
Titta Heikkala
Add pressed, released and doubleClicked signals...
r2739 emit XYChart::pressed(domain()->calculateDomainPoint(event->pos()));
m_lastMousePos = event->pos();
m_mousePressed = true;
Michal Klocek
Fixes mouse handling in base class of chartseries
r1747 QGraphicsItem::mousePressEvent(event);
Michal Klocek
Refactor xychartitem -> xychart
r1218 }
Marek Rosa
Added hovered signal to QLineSeries. Updated callout example
r2255 void LineChartItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{
Michal Klocek
Refactors internals...
r2273 emit XYChart::hovered(domain()->calculateDomainPoint(event->pos()), true);
Marek Rosa
Negative values with log axis handled
r2356 // event->accept();
QGraphicsItem::hoverEnterEvent(event);
Marek Rosa
Added hovered signal to QLineSeries. Updated callout example
r2255 }
void LineChartItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
{
Michal Klocek
Refactors internals...
r2273 emit XYChart::hovered(domain()->calculateDomainPoint(event->pos()), false);
Marek Rosa
Negative values with log axis handled
r2356 // event->accept();
QGraphicsItem::hoverEnterEvent(event);
Marek Rosa
Added hovered signal to QLineSeries. Updated callout example
r2255 }
Titta Heikkala
Add pressed, released and doubleClicked signals...
r2739 void LineChartItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
Titta Heikkala
Fix clicked, released and doubleClicked signal points...
r2746 emit XYChart::released(domain()->calculateDomainPoint(m_lastMousePos));
if (m_mousePressed)
emit XYChart::clicked(domain()->calculateDomainPoint(m_lastMousePos));
Titta Heikkala
Add pressed, released and doubleClicked signals...
r2739 m_mousePressed = false;
QGraphicsItem::mouseReleaseEvent(event);
}
void LineChartItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
{
Titta Heikkala
Fix clicked, released and doubleClicked signal points...
r2746 emit XYChart::doubleClicked(domain()->calculateDomainPoint(m_lastMousePos));
Titta Heikkala
Add pressed, released and doubleClicked signals...
r2739 QGraphicsItem::mouseDoubleClickEvent(event);
}
Michal Klocek
Fix naming convention for lineseries...
r144 #include "moc_linechartitem_p.cpp"
Michal Klocek
Refactors qchart , adds line animation...
r131
Titta Heikkala
Qt Charts project file structure change...
r2712 QT_CHARTS_END_NAMESPACE