qareaseries.cpp
751 lines
| 21.8 KiB
| text/x-c
|
CppLexer
Titta Heikkala
|
r2845 | /****************************************************************************** | ||
Jani Honkonen
|
r794 | ** | ||
Titta Heikkala
|
r2845 | ** Copyright (C) 2015 The Qt Company Ltd. | ||
** Contact: http://www.qt.io/licensing/ | ||||
Jani Honkonen
|
r794 | ** | ||
Titta Heikkala
|
r2740 | ** This file is part of the Qt Charts module. | ||
Jani Honkonen
|
r794 | ** | ||
Titta Heikkala
|
r2845 | ** $QT_BEGIN_LICENSE:COMM$ | ||
Jani Honkonen
|
r794 | ** | ||
Titta Heikkala
|
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 | ||||
** and conditions see http://www.qt.io/terms-conditions. For further | ||||
** information use the contact form at http://www.qt.io/contact-us. | ||||
Jani Honkonen
|
r794 | ** | ||
Titta Heikkala
|
r2845 | ** $QT_END_LICENSE$ | ||
** | ||||
******************************************************************************/ | ||||
Jani Honkonen
|
r794 | |||
Titta Heikkala
|
r2714 | #include <QtCharts/QAreaSeries> | ||
#include <private/qareaseries_p.h> | ||||
#include <QtCharts/QLineSeries> | ||||
#include <private/areachartitem_p.h> | ||||
#include <private/abstractdomain_p.h> | ||||
#include <private/chartdataset_p.h> | ||||
#include <private/charttheme_p.h> | ||||
#include <QtCharts/QValueAxis> | ||||
#include <QtCharts/QAreaLegendMarker> | ||||
#include <private/qchart_p.h> | ||||
sauimone
|
r2177 | |||
Titta Heikkala
|
r2712 | QT_CHARTS_BEGIN_NAMESPACE | ||
Michal Klocek
|
r421 | |||
/*! | ||||
\class QAreaSeries | ||||
Titta Heikkala
|
r2639 | \inmodule Qt Charts | ||
Michal Klocek
|
r421 | \brief The QAreaSeries class is used for making area charts. | ||
Titta Heikkala
|
r2754 | An area series is used to show quantitative data. It is based on line series, in the way that | ||
the area between the boundary lines is emphasized with color. Since the area series is based on | ||||
line series, QAreaSeries constructor needs a QLineSeries instance, which defines "upper" | ||||
boundary of the area. The area chart is drawn using the bottom of the plot area as the "lower" | ||||
boundary by default. Instead of the bottom of the plot area, the "lower" boundary can be | ||||
specified by another line. In that case QAreaSeries should be initialized with two QLineSeries | ||||
instances. Please note that the terms "upper" and "lower" boundary can be misleading in cases | ||||
where the "lower" boundary has bigger values than the "upper" one. The main point is that the | ||||
area between these two boundary lines will be filled. | ||||
Michal Klocek
|
r421 | |||
Tero Ahola
|
r995 | See the \l {AreaChart Example} {area chart example} to learn how to create a simple area chart. | ||
\image examples_areachart.png | ||||
Michal Klocek
|
r421 | */ | ||
Titta Heikkala
|
r2712 | |||
Titta Heikkala
|
r2639 | /*! | ||
\qmltype AreaSeries | ||||
\instantiates QAreaSeries | ||||
Titta Heikkala
|
r2712 | \inqmlmodule QtCharts | ||
Titta Heikkala
|
r2639 | |||
Titta Heikkala
|
r2712 | \inherits AbstractSeries | ||
\brief The AreaSeries type is used for making area charts. | ||||
Tero Ahola
|
r1491 | |||
Titta Heikkala
|
r2712 | The following QML shows how to create a simple area chart: | ||
\snippet qmlchart/qml/qmlchart/View4.qml 1 | ||||
\beginfloatleft | ||||
\image examples_qmlchart4.png | ||||
\endfloat | ||||
\clearfloat | ||||
Titta Heikkala
|
r2790 | |||
\note Adding the same line series to chart and area series is not supported. The series used as | ||||
boundary lines should be defined only for the area series. | ||||
Tero Ahola
|
r1491 | */ | ||
Michal Klocek
|
r421 | |||
/*! | ||||
Tero Ahola
|
r1462 | \property QAreaSeries::upperSeries | ||
\brief The upper one of the two line series used to define area series boundaries. | ||||
Michal Klocek
|
r421 | */ | ||
Tero Ahola
|
r1491 | /*! | ||
\qmlproperty LineSeries AreaSeries::upperSeries | ||||
The upper one of the two line series used to define area series boundaries. | ||||
*/ | ||||
Michal Klocek
|
r421 | |||
/*! | ||||
Tero Ahola
|
r1462 | \property QAreaSeries::lowerSeries | ||
The lower one of the two line series used to define are series boundaries. Note if | ||||
Miikka Heikkinen
|
r2494 | QAreaSeries was constructed without a\ lowerSeries this is null. | ||
Michal Klocek
|
r421 | */ | ||
Tero Ahola
|
r1491 | /*! | ||
\qmlproperty LineSeries AreaSeries::lowerSeries | ||||
The lower one of the two line series used to define are series boundaries. Note if | ||||
Miikka Heikkinen
|
r2494 | AreaSeries was constructed without a\ lowerSeries this is null. | ||
Tero Ahola
|
r1491 | */ | ||
Michal Klocek
|
r421 | |||
Tero Ahola
|
r1481 | /*! | ||
\property QAreaSeries::color | ||||
Fill (brush) color of the series. This is a convenience property for modifying the color of brush. | ||||
\sa QAreaSeries::brush() | ||||
*/ | ||||
Tero Ahola
|
r1491 | /*! | ||
\qmlproperty color AreaSeries::color | ||||
Fill (brush) color of the series. | ||||
*/ | ||||
Tero Ahola
|
r1481 | |||
/*! | ||||
\property QAreaSeries::borderColor | ||||
Line (pen) color of the series. This is a convenience property for modifying the color of pen. | ||||
\sa QAreaSeries::pen() | ||||
*/ | ||||
Tero Ahola
|
r1491 | /*! | ||
\qmlproperty color AreaSeries::borderColor | ||||
Line (pen) color of the series. | ||||
*/ | ||||
Tero Ahola
|
r1481 | |||
Tero Ahola
|
r1906 | /*! | ||
\qmlproperty real AreaSeries::borderWidth | ||||
The width of the border line. By default the width is 2.0. | ||||
*/ | ||||
Michal Klocek
|
r421 | /*! | ||
\fn QPen QAreaSeries::pen() const | ||||
\brief Returns the pen used to draw line for this series. | ||||
\sa setPen() | ||||
*/ | ||||
/*! | ||||
\fn QPen QAreaSeries::brush() const | ||||
\brief Returns the brush used to draw line for this series. | ||||
\sa setBrush() | ||||
*/ | ||||
Titta Heikkala
|
r2681 | /*! | ||
\qmlproperty QString AreaSeries::brushFilename | ||||
The name of the file used as a brush image for the series. | ||||
*/ | ||||
Tero Ahola
|
r1481 | /*! | ||
\fn void QAreaSeries::colorChanged(QColor color) | ||||
\brief Signal is emitted when the fill (brush) color has changed to \a color. | ||||
*/ | ||||
Tero Ahola
|
r1491 | /*! | ||
Tero Ahola
|
r1531 | \qmlsignal AreaSeries::onColorChanged(color color) | ||
Tero Ahola
|
r1491 | Signal is emitted when the fill (brush) color has changed to \a color. | ||
*/ | ||||
Tero Ahola
|
r1481 | |||
/*! | ||||
\fn void QAreaSeries::borderColorChanged(QColor color) | ||||
\brief Signal is emitted when the line (pen) color has changed to \a color. | ||||
*/ | ||||
Michal Klocek
|
r421 | /*! | ||
Tero Ahola
|
r1531 | \qmlsignal AreaSeries::onBorderColorChanged(color color) | ||
Tero Ahola
|
r1491 | Signal is emitted when the line (pen) color has changed to \a color. | ||
Michal Klocek
|
r421 | */ | ||
Michal Klocek
|
r574 | /*! | ||
\fn void QAreaSeries::clicked(const QPointF& point) | ||||
Titta Heikkala
|
r2746 | \brief Signal is emitted when user clicks the \a point on area chart. The \a point is the point | ||
where the press was triggered. | ||||
\sa pressed, released, doubleClicked | ||||
Michal Klocek
|
r574 | */ | ||
Tero Ahola
|
r1491 | /*! | ||
Tero Ahola
|
r1531 | \qmlsignal AreaSeries::onClicked(QPointF point) | ||
Titta Heikkala
|
r2746 | Signal is emitted when user clicks the \a point on area chart. The \a point is the point where | ||
the press was triggered. | ||||
\sa onPressed, onReleased, onDoubleClicked | ||||
Tero Ahola
|
r1491 | */ | ||
Michal Klocek
|
r574 | |||
Tero Ahola
|
r2362 | /*! | ||
\fn void QAreaSeries::hovered(const QPointF &point, bool state) | ||||
This signal is emitted when user has hovered over or away from the series. \a point shows the origin (coordinate) | ||||
of the hover event. \a state is true when user has hovered over the series and false when hover has moved away from | ||||
the series. | ||||
*/ | ||||
/*! | ||||
\qmlsignal AreaSeries::onHovered(point point, bool state) | ||||
This signal is emitted when user has hovered over or away from the series. \a point shows the origin (coordinate) | ||||
of the hover event. \a state is true when user has hovered over the series and false when hover has moved away from | ||||
the series. | ||||
*/ | ||||
Titta Heikkala
|
r2739 | /*! | ||
\fn void QAreaSeries::pressed(const QPointF& point) | ||||
\brief Signal is emitted when user presses the \a point on area chart. | ||||
Titta Heikkala
|
r2746 | \sa clicked, released, doubleClicked | ||
Titta Heikkala
|
r2739 | */ | ||
/*! | ||||
\qmlsignal AreaSeries::onPressed(QPointF point) | ||||
Signal is emitted when user presses the \a point on area chart. | ||||
Titta Heikkala
|
r2746 | \sa onClicked, onReleased, onDoubleClicked | ||
Titta Heikkala
|
r2739 | */ | ||
/*! | ||||
\fn void QAreaSeries::released(const QPointF& point) | ||||
Titta Heikkala
|
r2746 | \brief Signal is emitted when user releases a press that was triggered on a \a point on area | ||
chart. | ||||
\sa pressed, clicked, doubleClicked | ||||
Titta Heikkala
|
r2739 | */ | ||
/*! | ||||
\qmlsignal AreaSeries::onReleased(QPointF point) | ||||
Titta Heikkala
|
r2746 | Signal is emitted when user releases a press that was triggered on a \a point on area chart. | ||
\sa onPressed, onClicked, onDoubleClicked | ||||
Titta Heikkala
|
r2739 | */ | ||
/*! | ||||
\fn void QAreaSeries::doubleClicked(const QPointF& point) | ||||
Titta Heikkala
|
r2746 | \brief Signal is emitted when user doubleclicks the \a point on area chart. The \a point is the | ||
point where the first press was triggered. | ||||
\sa pressed, released, clicked | ||||
Titta Heikkala
|
r2739 | */ | ||
/*! | ||||
\qmlsignal AreaSeries::onDoubleClicked(QPointF point) | ||||
Titta Heikkala
|
r2746 | Signal is emitted when user doubleclicks the \a point on area chart. The \a point is the point | ||
where the first press was triggered. | ||||
\sa onPressed, onReleased, onClicked | ||||
Titta Heikkala
|
r2739 | */ | ||
Tero Ahola
|
r973 | /*! | ||
\fn void QAreaSeries::selected() | ||||
The signal is emitted if the user selects/deselects the XY series. The logic for maintaining selections should be | ||||
implemented by the user of QAreaSeries API. | ||||
*/ | ||||
Tero Ahola
|
r1491 | /*! | ||
Tero Ahola
|
r1531 | \qmlsignal AreaSeries::onSelected() | ||
Tero Ahola
|
r1491 | The signal is emitted if the user selects/deselects the XY series. The logic for maintaining selections should be | ||
implemented by the user of AreaSeries API. | ||||
*/ | ||||
Tero Ahola
|
r973 | |||
Michal Klocek
|
r421 | /*! | ||
Marek Rosa
|
r940 | \fn void QAreaSeriesPrivate::updated() | ||
Michal Klocek
|
r421 | \brief \internal | ||
*/ | ||||
Titta Heikkala
|
r2689 | /*! | ||
\property QAreaSeries::pointLabelsFormat | ||||
The \a format used for showing labels with series points. | ||||
QAreaSeries supports the following format tags: | ||||
\table | ||||
\row | ||||
\li @xPoint \li The x value of the data point | ||||
\row | ||||
\li @yPoint \li The y value of the data point | ||||
\endtable | ||||
For example, the following usage of the format tags would produce labels that have the data | ||||
point (x, y) shown inside brackets separated by a comma: | ||||
\code | ||||
series->setPointLabelsFormat("(@xPoint, @yPoint)"); | ||||
\endcode | ||||
By default, the labels format is set to '@xPoint, @yPoint'. The labels are shown on the plot | ||||
area, labels on the edge of the plot area are cut. If the points are close to each other the | ||||
labels may overlap. | ||||
\sa QAreaSeries::pointLabelsVisible, QAreaSeries::pointLabelsFont, QAreaSeries::pointLabelsColor | ||||
*/ | ||||
/*! | ||||
\qmlproperty string AreaSeries::pointLabelsFormat | ||||
The \a format used for showing labels with series points. | ||||
\sa QAreaSeries::pointLabelsFormat, pointLabelsVisible, pointLabelsFont, pointLabelsColor | ||||
*/ | ||||
/*! | ||||
\fn void QAreaSeries::pointLabelsFormatChanged(const QString &format) | ||||
Signal is emitted when the \a format of data point labels is changed. | ||||
*/ | ||||
/*! | ||||
\qmlsignal AreaSeries::onPointLabelsFormatChanged(string format) | ||||
Signal is emitted when the \a format of data point labels is changed. | ||||
*/ | ||||
/*! | ||||
\property QAreaSeries::pointLabelsVisible | ||||
Defines the visibility for data point labels. False by default. | ||||
Titta Heikkala
|
r2815 | \sa QAreaSeries::pointLabelsFormat, QAreaSeries::pointLabelsClipping | ||
Titta Heikkala
|
r2689 | */ | ||
/*! | ||||
\qmlproperty bool AreaSeries::pointLabelsVisible | ||||
Defines the visibility for data point labels. | ||||
Titta Heikkala
|
r2815 | \sa pointLabelsFormat, pointLabelsClipping | ||
Titta Heikkala
|
r2689 | */ | ||
/*! | ||||
\fn void QAreaSeries::pointLabelsVisibilityChanged(bool visible) | ||||
The visibility of the data point labels is changed to \a visible. | ||||
*/ | ||||
/*! | ||||
\qmlsignal AreaSeries::onPointLabelsVisibilityChanged(bool visible) | ||||
The visibility of the data point labels is changed to \a visible. | ||||
*/ | ||||
/*! | ||||
\property QAreaSeries::pointLabelsFont | ||||
Defines the font used for data point labels. | ||||
\sa QAreaSeries::pointLabelsFormat | ||||
*/ | ||||
/*! | ||||
\qmlproperty font AreaSeries::pointLabelsFont | ||||
Defines the font used for data point labels. | ||||
\sa pointLabelsFormat | ||||
*/ | ||||
/*! | ||||
\fn void QAreaSeries::pointLabelsFontChanged(const QFont &font); | ||||
The font used for data point labels is changed to \a font. | ||||
*/ | ||||
/*! | ||||
\qmlsignal AreaSeries::onPointLabelsFontChanged(Font font) | ||||
The font used for data point labels is changed to \a font. | ||||
*/ | ||||
/*! | ||||
\property QAreaSeries::pointLabelsColor | ||||
Defines the color used for data point labels. By default, the color is the color of the brush | ||||
defined in theme for labels. | ||||
\sa QAreaSeries::pointLabelsFormat | ||||
*/ | ||||
/*! | ||||
\qmlproperty font AreaSeries::pointLabelsColor | ||||
Defines the color used for data point labels. By default, the color is the color of the brush | ||||
defined in theme for labels. | ||||
\sa pointLabelsFormat | ||||
*/ | ||||
/*! | ||||
\fn void QAreaSeries::pointLabelsColorChanged(const QColor &color); | ||||
The color used for data point labels is changed to \a color. | ||||
*/ | ||||
/*! | ||||
\qmlsignal AreaSeries::onPointLabelsColorChanged(Color color) | ||||
The color used for data point labels is changed to \a color. | ||||
*/ | ||||
Titta Heikkala
|
r2815 | /*! | ||
\property QAreaSeries::pointLabelsClipping | ||||
Defines the clipping for data point labels. True by default. The labels on the edge of the plot | ||||
area are cut when clipping is enabled. | ||||
\sa pointLabelsVisible | ||||
*/ | ||||
/*! | ||||
\qmlproperty bool AreaSeries::pointLabelsClipping | ||||
Defines the clipping for data point labels. True by default. The labels on the edge of the plot | ||||
area are cut when clipping is enabled. | ||||
\sa pointLabelsVisible | ||||
*/ | ||||
/*! | ||||
Miikka Heikkinen
|
r2820 | \fn void QAreaSeries::pointLabelsClippingChanged(bool clipping) | ||
Titta Heikkala
|
r2815 | The clipping of the data point labels is changed to \a clipping. | ||
*/ | ||||
/*! | ||||
\qmlsignal AreaSeries::onPointLabelsClippingChanged(bool clipping) | ||||
The clipping of the data point labels is changed to \a clipping. | ||||
*/ | ||||
Michal Klocek
|
r421 | /*! | ||
Constructs area series object which is a child of \a upperSeries. Area will be spanned between \a | ||||
upperSeries line and \a lowerSeries line. If no \a lowerSeries is passed to constructor, area is specified by axis x (y=0) instead. | ||||
Michal Klocek
|
r974 | When series object is added to QChartView or QChart instance ownerships is transferred. | ||
Michal Klocek
|
r421 | */ | ||
Tero Ahola
|
r761 | QAreaSeries::QAreaSeries(QLineSeries *upperSeries, QLineSeries *lowerSeries) | ||
Jani Honkonen
|
r2097 | : QAbstractSeries(*new QAreaSeriesPrivate(upperSeries, lowerSeries, this), upperSeries) | ||
Michal Klocek
|
r421 | { | ||
Miikka Heikkinen
|
r2840 | if (upperSeries) | ||
upperSeries->d_ptr->setBlockOpenGL(true); | ||||
if (lowerSeries) | ||||
lowerSeries->d_ptr->setBlockOpenGL(true); | ||||
Michal Klocek
|
r421 | } | ||
Tero Ahola
|
r761 | |||
Tero Ahola
|
r1202 | /*! | ||
Jani Honkonen
|
r1351 | Constructs area series object without upper or lower series with \a parent object. | ||
Tero Ahola
|
r1202 | */ | ||
QAreaSeries::QAreaSeries(QObject *parent) | ||||
: QAbstractSeries(*new QAreaSeriesPrivate(0, 0, this), parent) | ||||
{ | ||||
} | ||||
Michal Klocek
|
r421 | /*! | ||
Marek Rosa
|
r1515 | Destroys the object. | ||
Michal Klocek
|
r421 | */ | ||
QAreaSeries::~QAreaSeries() | ||||
{ | ||||
Michal Klocek
|
r1727 | Q_D(QAreaSeries); | ||
Michal Klocek
|
r2273 | if (d->m_chart) | ||
d->m_chart->removeSeries(this); | ||||
Michal Klocek
|
r421 | } | ||
Jani Honkonen
|
r1345 | /*! | ||
Miikka Heikkinen
|
r2520 | Returns QAbstractSeries::SeriesTypeArea. | ||
Jani Honkonen
|
r1345 | */ | ||
Michal Klocek
|
r1107 | QAbstractSeries::SeriesType QAreaSeries::type() const | ||
Michal Klocek
|
r938 | { | ||
Tero Ahola
|
r988 | return QAbstractSeries::SeriesTypeArea; | ||
Michal Klocek
|
r938 | } | ||
Marek Rosa
|
r1369 | /*! | ||
Sets the \a series that is to be used as the area chart upper series. | ||||
*/ | ||||
Jani Honkonen
|
r2104 | void QAreaSeries::setUpperSeries(QLineSeries *series) | ||
Tero Ahola
|
r1202 | { | ||
Q_D(QAreaSeries); | ||||
Miikka Heikkinen
|
r2820 | if (d->m_upperSeries != series) { | ||
series->d_ptr->setBlockOpenGL(true); | ||||
Titta Heikkala
|
r2712 | d->m_upperSeries = series; | ||
Miikka Heikkinen
|
r2820 | } | ||
Tero Ahola
|
r1202 | } | ||
Jani Honkonen
|
r2104 | QLineSeries *QAreaSeries::upperSeries() const | ||
Michal Klocek
|
r938 | { | ||
Q_D(const QAreaSeries); | ||||
return d->m_upperSeries; | ||||
} | ||||
Marek Rosa
|
r1369 | /*! | ||
Sets the \a series that is to be used as the area chart lower series. | ||||
*/ | ||||
Jani Honkonen
|
r2104 | void QAreaSeries::setLowerSeries(QLineSeries *series) | ||
Tero Ahola
|
r1202 | { | ||
Q_D(QAreaSeries); | ||||
Miikka Heikkinen
|
r2820 | series->d_ptr->setBlockOpenGL(true); | ||
Tero Ahola
|
r1202 | d->m_lowerSeries = series; | ||
} | ||||
Jani Honkonen
|
r2104 | QLineSeries *QAreaSeries::lowerSeries() const | ||
Michal Klocek
|
r938 | { | ||
Q_D(const QAreaSeries); | ||||
return d->m_lowerSeries; | ||||
} | ||||
Michal Klocek
|
r421 | /*! | ||
Sets \a pen used for drawing area outline. | ||||
*/ | ||||
Tero Ahola
|
r761 | void QAreaSeries::setPen(const QPen &pen) | ||
Michal Klocek
|
r421 | { | ||
Michal Klocek
|
r938 | Q_D(QAreaSeries); | ||
if (d->m_pen != pen) { | ||||
d->m_pen = pen; | ||||
emit d->updated(); | ||||
Michal Klocek
|
r571 | } | ||
Michal Klocek
|
r421 | } | ||
Miikka Heikkinen
|
r2519 | QPen QAreaSeries::pen() const | ||
Michal Klocek
|
r938 | { | ||
Q_D(const QAreaSeries); | ||||
Miikka Heikkinen
|
r2519 | if (d->m_pen == QChartPrivate::defaultPen()) | ||
return QPen(); | ||||
else | ||||
return d->m_pen; | ||||
Michal Klocek
|
r938 | } | ||
Michal Klocek
|
r421 | /*! | ||
Sets \a brush used for filling the area. | ||||
*/ | ||||
sauimone
|
r743 | void QAreaSeries::setBrush(const QBrush &brush) | ||
Michal Klocek
|
r421 | { | ||
Michal Klocek
|
r938 | Q_D(QAreaSeries); | ||
if (d->m_brush != brush) { | ||||
Tero Ahola
|
r1933 | bool emitColorChanged = brush.color() != d->m_brush.color(); | ||
Michal Klocek
|
r938 | d->m_brush = brush; | ||
emit d->updated(); | ||||
Tero Ahola
|
r1933 | if (emitColorChanged) | ||
emit colorChanged(brush.color()); | ||||
Michal Klocek
|
r571 | } | ||
Michal Klocek
|
r421 | } | ||
Michal Klocek
|
r938 | |||
QBrush QAreaSeries::brush() const | ||||
{ | ||||
Q_D(const QAreaSeries); | ||||
Miikka Heikkinen
|
r2519 | if (d->m_brush == QChartPrivate::defaultBrush()) | ||
return QBrush(); | ||||
else | ||||
return d->m_brush; | ||||
Michal Klocek
|
r938 | } | ||
Tero Ahola
|
r1481 | |||
void QAreaSeries::setColor(const QColor &color) | ||||
{ | ||||
QBrush b = brush(); | ||||
Tero Ahola
|
r1933 | if (b == QBrush()) | ||
b.setStyle(Qt::SolidPattern); | ||||
b.setColor(color); | ||||
setBrush(b); | ||||
Tero Ahola
|
r1481 | } | ||
QColor QAreaSeries::color() const | ||||
{ | ||||
return brush().color(); | ||||
} | ||||
void QAreaSeries::setBorderColor(const QColor &color) | ||||
{ | ||||
QPen p = pen(); | ||||
if (p.color() != color) { | ||||
p.setColor(color); | ||||
setPen(p); | ||||
emit borderColorChanged(color); | ||||
} | ||||
} | ||||
QColor QAreaSeries::borderColor() const | ||||
{ | ||||
return pen().color(); | ||||
} | ||||
Michal Klocek
|
r421 | /*! | ||
Sets if data points are \a visible and should be drawn on line. | ||||
*/ | ||||
void QAreaSeries::setPointsVisible(bool visible) | ||||
{ | ||||
Michal Klocek
|
r938 | Q_D(QAreaSeries); | ||
if (d->m_pointsVisible != visible) { | ||||
d->m_pointsVisible = visible; | ||||
emit d->updated(); | ||||
Michal Klocek
|
r571 | } | ||
Michal Klocek
|
r421 | } | ||
Tero Ahola
|
r1491 | /*! | ||
Returns if the points are drawn for this series. | ||||
\sa setPointsVisible() | ||||
*/ | ||||
Michal Klocek
|
r938 | bool QAreaSeries::pointsVisible() const | ||
{ | ||||
Q_D(const QAreaSeries); | ||||
return d->m_pointsVisible; | ||||
} | ||||
Titta Heikkala
|
r2689 | void QAreaSeries::setPointLabelsFormat(const QString &format) | ||
{ | ||||
Q_D(QAreaSeries); | ||||
if (d->m_pointLabelsFormat != format) { | ||||
d->m_pointLabelsFormat = format; | ||||
emit pointLabelsFormatChanged(format); | ||||
} | ||||
} | ||||
QString QAreaSeries::pointLabelsFormat() const | ||||
{ | ||||
Q_D(const QAreaSeries); | ||||
return d->m_pointLabelsFormat; | ||||
} | ||||
void QAreaSeries::setPointLabelsVisible(bool visible) | ||||
{ | ||||
Q_D(QAreaSeries); | ||||
if (d->m_pointLabelsVisible != visible) { | ||||
d->m_pointLabelsVisible = visible; | ||||
emit pointLabelsVisibilityChanged(visible); | ||||
} | ||||
} | ||||
bool QAreaSeries::pointLabelsVisible() const | ||||
{ | ||||
Q_D(const QAreaSeries); | ||||
return d->m_pointLabelsVisible; | ||||
} | ||||
void QAreaSeries::setPointLabelsFont(const QFont &font) | ||||
{ | ||||
Q_D(QAreaSeries); | ||||
if (d->m_pointLabelsFont != font) { | ||||
d->m_pointLabelsFont = font; | ||||
emit pointLabelsFontChanged(font); | ||||
} | ||||
} | ||||
QFont QAreaSeries::pointLabelsFont() const | ||||
{ | ||||
Q_D(const QAreaSeries); | ||||
return d->m_pointLabelsFont; | ||||
} | ||||
void QAreaSeries::setPointLabelsColor(const QColor &color) | ||||
{ | ||||
Q_D(QAreaSeries); | ||||
if (d->m_pointLabelsColor != color) { | ||||
d->m_pointLabelsColor = color; | ||||
emit pointLabelsColorChanged(color); | ||||
} | ||||
} | ||||
QColor QAreaSeries::pointLabelsColor() const | ||||
{ | ||||
Q_D(const QAreaSeries); | ||||
if (d->m_pointLabelsColor == QChartPrivate::defaultPen().color()) | ||||
return QPen().color(); | ||||
else | ||||
return d->m_pointLabelsColor; | ||||
} | ||||
Titta Heikkala
|
r2815 | void QAreaSeries::setPointLabelsClipping(bool enabled) | ||
{ | ||||
Q_D(QAreaSeries); | ||||
if (d->m_pointLabelsClipping != enabled) { | ||||
d->m_pointLabelsClipping = enabled; | ||||
emit pointLabelsClippingChanged(enabled); | ||||
} | ||||
} | ||||
bool QAreaSeries::pointLabelsClipping() const | ||||
{ | ||||
Q_D(const QAreaSeries); | ||||
return d->m_pointLabelsClipping; | ||||
} | ||||
Michal Klocek
|
r938 | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
Jani Honkonen
|
r2104 | QAreaSeriesPrivate::QAreaSeriesPrivate(QLineSeries *upperSeries, QLineSeries *lowerSeries, QAreaSeries *q) | ||
Jani Honkonen
|
r2097 | : QAbstractSeriesPrivate(q), | ||
Miikka Heikkinen
|
r2516 | m_brush(QChartPrivate::defaultBrush()), | ||
m_pen(QChartPrivate::defaultPen()), | ||||
Jani Honkonen
|
r2097 | m_upperSeries(upperSeries), | ||
m_lowerSeries(lowerSeries), | ||||
Titta Heikkala
|
r2689 | m_pointsVisible(false), | ||
m_pointLabelsFormat(QLatin1String("@xPoint, @yPoint")), | ||||
m_pointLabelsVisible(false), | ||||
m_pointLabelsFont(QChartPrivate::defaultFont()), | ||||
Titta Heikkala
|
r2815 | m_pointLabelsColor(QChartPrivate::defaultPen().color()), | ||
m_pointLabelsClipping(true) | ||||
Michal Klocek
|
r938 | { | ||
Tero Ahola
|
r973 | } | ||
Michal Klocek
|
r938 | |||
Michal Klocek
|
r2273 | void QAreaSeriesPrivate::initializeDomain() | ||
Michal Klocek
|
r943 | { | ||
Q_Q(QAreaSeries); | ||||
Michal Klocek
|
r2273 | qreal minX(domain()->minX()); | ||
qreal minY(domain()->minY()); | ||||
qreal maxX(domain()->maxX()); | ||||
qreal maxY(domain()->maxY()); | ||||
Michal Klocek
|
r943 | |||
Jani Honkonen
|
r2104 | QLineSeries *upperSeries = q->upperSeries(); | ||
QLineSeries *lowerSeries = q->lowerSeries(); | ||||
Michal Klocek
|
r943 | |||
Titta Heikkala
|
r2601 | if (upperSeries) { | ||
Miikka Heikkinen
|
r2820 | const QVector<QPointF> &points = upperSeries->pointsVector(); | ||
Titta Heikkala
|
r2601 | |||
for (int i = 0; i < points.count(); i++) { | ||||
qreal x = points[i].x(); | ||||
qreal y = points[i].y(); | ||||
minX = qMin(minX, x); | ||||
minY = qMin(minY, y); | ||||
maxX = qMax(maxX, x); | ||||
maxY = qMax(maxY, y); | ||||
} | ||||
Michal Klocek
|
r943 | } | ||
Jani Honkonen
|
r2097 | if (lowerSeries) { | ||
Miikka Heikkinen
|
r2820 | const QVector<QPointF> &points = lowerSeries->pointsVector(); | ||
Michal Klocek
|
r1057 | |||
Jani Honkonen
|
r2097 | for (int i = 0; i < points.count(); i++) { | ||
Michal Klocek
|
r1057 | qreal x = points[i].x(); | ||
qreal y = points[i].y(); | ||||
Michal Klocek
|
r943 | minX = qMin(minX, x); | ||
minY = qMin(minY, y); | ||||
maxX = qMax(maxX, x); | ||||
maxY = qMax(maxY, y); | ||||
Jani Honkonen
|
r2097 | } | ||
} | ||||
Michal Klocek
|
r943 | |||
Michal Klocek
|
r2273 | domain()->setRange(minX, maxX, minY, maxY); | ||
Michal Klocek
|
r943 | } | ||
Michal Klocek
|
r2273 | void QAreaSeriesPrivate::initializeGraphics(QGraphicsItem* parent) | ||
Michal Klocek
|
r943 | { | ||
Q_Q(QAreaSeries); | ||||
Michal Klocek
|
r2273 | AreaChartItem *area = new AreaChartItem(q,parent); | ||
m_item.reset(area); | ||||
QAbstractSeriesPrivate::initializeGraphics(parent); | ||||
} | ||||
Titta Heikkala
|
r2804 | void QAreaSeriesPrivate::initializeAnimations(QChart::AnimationOptions options, int duration, | ||
QEasingCurve &curve) | ||||
Michal Klocek
|
r2273 | { | ||
Q_Q(QAreaSeries); | ||||
AreaChartItem *area = static_cast<AreaChartItem *>(m_item.data()); | ||||
Miikka Heikkinen
|
r2555 | |||
Titta Heikkala
|
r2601 | if (q->upperSeries() && area->upperLineItem()->animation()) | ||
Miikka Heikkinen
|
r2555 | area->upperLineItem()->animation()->stopAndDestroyLater(); | ||
if (q->lowerSeries() && area->lowerLineItem()->animation()) | ||||
area->lowerLineItem()->animation()->stopAndDestroyLater(); | ||||
Michal Klocek
|
r2273 | if (options.testFlag(QChart::SeriesAnimations)) { | ||
Titta Heikkala
|
r2804 | area->upperLineItem()->setAnimation(new XYAnimation(area->upperLineItem(), duration, | ||
curve)); | ||||
Jani Honkonen
|
r2097 | if (q->lowerSeries()) | ||
Titta Heikkala
|
r2804 | area->lowerLineItem()->setAnimation(new XYAnimation(area->lowerLineItem(), duration, | ||
curve)); | ||||
Miikka Heikkinen
|
r2555 | } else { | ||
Titta Heikkala
|
r2601 | if (q->upperSeries()) | ||
area->upperLineItem()->setAnimation(0); | ||||
Michal Klocek
|
r2273 | if (q->lowerSeries()) | ||
area->lowerLineItem()->setAnimation(0); | ||||
Michal Klocek
|
r943 | } | ||
Titta Heikkala
|
r2804 | QAbstractSeriesPrivate::initializeAnimations(options, duration, curve); | ||
Michal Klocek
|
r943 | } | ||
sauimone
|
r2163 | QList<QLegendMarker*> QAreaSeriesPrivate::createLegendMarkers(QLegend* legend) | ||
{ | ||||
sauimone
|
r2177 | Q_Q(QAreaSeries); | ||
sauimone
|
r2163 | QList<QLegendMarker*> list; | ||
sauimone
|
r2177 | return list << new QAreaLegendMarker(q,legend); | ||
sauimone
|
r2163 | } | ||
sauimone
|
r1545 | |||
Michal Klocek
|
r2273 | |||
void QAreaSeriesPrivate::initializeAxes() | ||||
sauimone
|
r1545 | { | ||
Michal Klocek
|
r2273 | |||
sauimone
|
r1545 | } | ||
Michal Klocek
|
r1695 | QAbstractAxis::AxisType QAreaSeriesPrivate::defaultAxisType(Qt::Orientation orientation) const | ||
Michal Klocek
|
r1588 | { | ||
Michal Klocek
|
r1695 | Q_UNUSED(orientation); | ||
Marek Rosa
|
r1818 | return QAbstractAxis::AxisTypeValue; | ||
sauimone
|
r1545 | } | ||
Michal Klocek
|
r2273 | QAbstractAxis* QAreaSeriesPrivate::createDefaultAxis(Qt::Orientation orientation) const | ||
{ | ||||
Q_UNUSED(orientation); | ||||
Titta Heikkala
|
r2614 | return new QValueAxis; | ||
Michal Klocek
|
r2273 | } | ||
void QAreaSeriesPrivate::initializeTheme(int index, ChartTheme* theme, bool forced) | ||||
{ | ||||
Q_Q(QAreaSeries); | ||||
const QList<QGradient> gradients = theme->seriesGradients(); | ||||
const QList<QColor> colors = theme->seriesColors(); | ||||
Miikka Heikkinen
|
r2516 | if (forced || QChartPrivate::defaultPen() == m_pen) { | ||
QPen pen; | ||||
Michal Klocek
|
r2273 | pen.setColor(ChartThemeManager::colorAt(gradients.at(index % gradients.size()), 0.0)); | ||
pen.setWidthF(2); | ||||
q->setPen(pen); | ||||
} | ||||
Miikka Heikkinen
|
r2516 | if (forced || QChartPrivate::defaultBrush() == m_brush) { | ||
Michal Klocek
|
r2273 | QBrush brush(colors.at(index % colors.size())); | ||
q->setBrush(brush); | ||||
} | ||||
Titta Heikkala
|
r2689 | |||
if (forced || QChartPrivate::defaultPen().color() == m_pointLabelsColor) { | ||||
QColor color = theme->labelBrush().color(); | ||||
q->setPointLabelsColor(color); | ||||
} | ||||
Michal Klocek
|
r2273 | } | ||
Michal Klocek
|
r421 | #include "moc_qareaseries.cpp" | ||
Michal Klocek
|
r938 | #include "moc_qareaseries_p.cpp" | ||
Michal Klocek
|
r421 | |||
Titta Heikkala
|
r2712 | QT_CHARTS_END_NAMESPACE | ||