blob: ee4ff4114f5a71c3235cf7b9fb5f2339aaee293e [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Charts module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL$
** 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
** 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.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QtCharts/QScatterSeries>
#include <private/qscatterseries_p.h>
#include <private/scatterchartitem_p.h>
#include <private/chartdataset_p.h>
#include <private/charttheme_p.h>
#include <private/scatteranimation_p.h>
#include <private/qchart_p.h>
/*!
\class QScatterSeries
\inmodule QtCharts
\brief The QScatterSeries class presents data in scatter charts.
The scatter data is displayed as a collection of points on the chart. For
each point, two values are specified that determine its position on the
horizontal axis and the vertical axis.
\image examples_scatterchart.png
The following code snippet illustrates how to create a basic scatter chart:
\code
QScatterSeries* series = new QScatterSeries();
series->append(0, 6);
series->append(2, 4);
...
chart->addSeries(series);
\endcode
For more information, see \l{ScatterChart Example} and
\l {Scatter Interactions Example}.
*/
/*!
\qmltype ScatterSeries
\instantiates QScatterSeries
\inqmlmodule QtCharts
\inherits XYSeries
\brief The ScatterSeries type presents data in scatter charts.
The scatter data is displayed as a collection of points on the chart. For
each point, two values are specified that determine its position on the
horizontal axis and the vertical axis.
\image examples_qmlchart5.png
The following QML code shows how to create a chart with two simple scatter
series:
\snippet qmlchart/qml/qmlchart/View5.qml 1
For more information, see \l{Qml Charts Example}.
*/
/*!
\enum QScatterSeries::MarkerShape
This enum value describes the shape used when rendering marker items.
\value MarkerShapeCircle
The marker is a circle. This is the default value.
\value MarkerShapeRectangle
The marker is a rectangle.
*/
/*!
\property QScatterSeries::brush
\brief The brush used to draw the scatter series markers.
The brush can be an image that can be created using QPainterPath,
for example.
*/
/*!
\qmlproperty brush ScatterSeries::brush
The brush used to draw the scatter series markers.
*/
/*!
\property QScatterSeries::color
\brief The color used to fill the series markers.
This is a convenience property for modifying the color of the brush.
\sa QScatterSeries::brush()
*/
/*!
\property QScatterSeries::borderColor
\brief The color used to draw the marker borders.
This is a convenience property for modifying the color of the pen.
\sa QScatterSeries::pen()
*/
/*!
\qmlproperty int ScatterSeries::count
The number of data points in the series.
*/
/*!
\qmlproperty color ScatterSeries::borderColor
The color used to draw the marker borders.
*/
/*!
\qmlproperty real ScatterSeries::borderWidth
The width of the border line. By default, the width is 2.0.
*/
/*!
\property QScatterSeries::markerShape
\brief The shape of the marker used to render the points in the series.
The default shape is MarkerShapeCircle.
\sa MarkerShape
*/
/*!
\qmlproperty enumeration ScatterSeries::markerShape
The shape used when rendering marker items:
\value ScatterSeries.MarkerShapeCircle
The marker is a circle. This is the default value.
\value ScatterSeries.MarkerShapeRectangle
The marker is a rectangle.
*/
/*!
\property QScatterSeries::markerSize
\brief The size of the marker used to render the points in the series.
The default size is 15.0.
*/
/*!
\qmlproperty real ScatterSeries::markerSize
The size of the marker used to render the points in the series.
The default size is 15.0.
*/
/*!
\qmlproperty string ScatterSeries::brushFilename
The name of the file used as a brush for the series.
*/
/*!
\fn void QScatterSeries::colorChanged(QColor color)
This signal is emitted when the fill (brush) color changes to \a color.
*/
/*!
\fn void QScatterSeries::borderColorChanged(QColor color)
This signal is emitted when the line (pen) color changes to \a color.
*/
/*!
\fn void QScatterSeries::markerShapeChanged(MarkerShape shape)
This signal is emitted when the marker shape changes to \a shape.
*/
/*!
\fn void QScatterSeries::markerSizeChanged(qreal size)
This signal is emitted when the marker size changes to \a size.
*/
QT_CHARTS_BEGIN_NAMESPACE
/*!
Constructs a series object that is a child of \a parent.
*/
QScatterSeries::QScatterSeries(QObject *parent)
: QXYSeries(*new QScatterSeriesPrivate(this), parent)
{
}
/*!
Deletes the scatter series.
\note Adding the series to QChart transfers the ownership to the chart.
*/
QScatterSeries::~QScatterSeries()
{
Q_D(QScatterSeries);
if (d->m_chart)
d->m_chart->removeSeries(this);
}
/*!
\reimp
*/
QAbstractSeries::SeriesType QScatterSeries::type() const
{
return QAbstractSeries::SeriesTypeScatter;
}
/*!
\reimp
*/
void QScatterSeries::setPen(const QPen &pen)
{
Q_D(QXYSeries);
if (d->m_pen != pen) {
bool emitColorChanged = d->m_pen.color() != pen.color();
d->m_pen = pen;
emit d->updated();
if (emitColorChanged)
emit borderColorChanged(pen.color());
}
}
/*!
\reimp
*/
void QScatterSeries::setBrush(const QBrush &brush)
{
Q_D(QScatterSeries);
if (d->m_brush != brush) {
bool emitColorChanged = d->m_brush.color() != brush.color();
d->m_brush = brush;
emit d->updated();
if (emitColorChanged)
emit colorChanged(brush.color());
}
}
QBrush QScatterSeries::brush() const
{
Q_D(const QScatterSeries);
if (d->m_brush == QChartPrivate::defaultBrush())
return QBrush();
else
return d->m_brush;
}
void QScatterSeries::setColor(const QColor &color)
{
QBrush b = brush();
if (b == QChartPrivate::defaultBrush())
b = QBrush();
if (b == QBrush())
b.setStyle(Qt::SolidPattern);
b.setColor(color);
setBrush(b);
}
QColor QScatterSeries::color() const
{
return brush().color();
}
void QScatterSeries::setBorderColor(const QColor &color)
{
QPen p = pen();
if (p == QChartPrivate::defaultPen())
p = QPen();
p.setColor(color);
setPen(p);
}
QColor QScatterSeries::borderColor() const
{
return pen().color();
}
QScatterSeries::MarkerShape QScatterSeries::markerShape() const
{
Q_D(const QScatterSeries);
return d->m_shape;
}
void QScatterSeries::setMarkerShape(MarkerShape shape)
{
Q_D(QScatterSeries);
if (d->m_shape != shape) {
d->m_shape = shape;
emit d->updated();
emit markerShapeChanged(shape);
}
}
qreal QScatterSeries::markerSize() const
{
Q_D(const QScatterSeries);
return d->m_size;
}
void QScatterSeries::setMarkerSize(qreal size)
{
Q_D(QScatterSeries);
if (!qFuzzyCompare(d->m_size, size)) {
d->m_size = size;
emit d->updated();
emit markerSizeChanged(size);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
QScatterSeriesPrivate::QScatterSeriesPrivate(QScatterSeries *q)
: QXYSeriesPrivate(q),
m_shape(QScatterSeries::MarkerShapeCircle),
m_size(15.0)
{
}
void QScatterSeriesPrivate::initializeGraphics(QGraphicsItem* parent)
{
Q_Q(QScatterSeries);
ScatterChartItem *scatter = new ScatterChartItem(q,parent);
m_item.reset(scatter);
QAbstractSeriesPrivate::initializeGraphics(parent);
}
void QScatterSeriesPrivate::initializeTheme(int index, ChartTheme* theme, bool forced)
{
Q_Q(QScatterSeries);
const QList<QColor> colors = theme->seriesColors();
const QList<QGradient> gradients = theme->seriesGradients();
if (forced || QChartPrivate::defaultPen() == m_pen) {
QPen pen;
pen.setColor(ChartThemeManager::colorAt(gradients.at(index % gradients.size()), 0.0));
pen.setWidthF(2);
q->setPen(pen);
}
if (forced || QChartPrivate::defaultBrush() == m_brush) {
QBrush brush(colors.at(index % colors.size()));
q->setBrush(brush);
}
if (forced || QChartPrivate::defaultPen().color() == m_pointLabelsColor) {
QColor color = theme->labelBrush().color();
q->setPointLabelsColor(color);
}
}
void QScatterSeriesPrivate::initializeAnimations(QChart::AnimationOptions options, int duration,
QEasingCurve &curve)
{
ScatterChartItem *item = static_cast<ScatterChartItem *>(m_item.data());
Q_ASSERT(item);
if (item->animation())
item->animation()->stopAndDestroyLater();
if (options.testFlag(QChart::SeriesAnimations))
item->setAnimation(new ScatterAnimation(item, duration, curve));
else
item->setAnimation(0);
QAbstractSeriesPrivate::initializeAnimations(options, duration, curve);
}
QT_CHARTS_END_NAMESPACE
#include "moc_qscatterseries.cpp"