declarativechart.cpp
733 lines
| 25.0 KiB
| text/x-c
|
CppLexer
Jani Honkonen
|
r830 | /**************************************************************************** | ||
** | ||||
** Copyright (C) 2012 Digia Plc | ||||
** All rights reserved. | ||||
** For any questions to Digia, please use contact form at http://qt.digia.com | ||||
** | ||||
** This file is part of the Qt Commercial Charts Add-on. | ||||
** | ||||
** $QT_BEGIN_LICENSE$ | ||||
** Licensees holding valid Qt Commercial licenses may use this file in | ||||
** accordance with the Qt Commercial License Agreement provided with the | ||||
** 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$ | ||||
** | ||||
****************************************************************************/ | ||||
Jani Honkonen
|
r1 | #include "declarativechart.h" | ||
Jani Honkonen
|
r660 | #include <QPainter> | ||
Tero Ahola
|
r1813 | #include <QDeclarativeEngine> | ||
Tero Ahola
|
r1240 | #include "declarativelineseries.h" | ||
#include "declarativeareaseries.h" | ||||
#include "declarativebarseries.h" | ||||
#include "declarativepieseries.h" | ||||
#include "declarativesplineseries.h" | ||||
#include "declarativescatterseries.h" | ||||
Marek Rosa
|
r1810 | #include "qbarcategoryaxis.h" | ||
Tero Ahola
|
r1813 | #include "qvalueaxis.h" | ||
Marek Rosa
|
r1818 | #include "qcategoryaxis.h" | ||
Tero Ahola
|
r1813 | #include "qabstractseries_p.h" | ||
Tero Ahola
|
r1928 | #include "declarativemargins.h" | ||
Tero Ahola
|
r2068 | #include "qchart_p.h" | ||
Jani Honkonen
|
r1 | |||
Marek Rosa
|
r1867 | #ifndef QT_ON_ARM | ||
#include "qdatetimeaxis.h" | ||||
#endif | ||||
Tero Ahola
|
r120 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | ||
Tero Ahola
|
r1443 | /*! | ||
\qmlclass ChartView DeclarativeChart | ||||
ChartView element is the parent that is responsible for showing different chart series types. | ||||
Tero Ahola
|
r1491 | The following QML shows how to create a simple chart with one pie series: | ||
\snippet ../examples/qmlpiechart/qml/qmlpiechart/main.qml 1 | ||||
\snippet ../examples/qmlpiechart/qml/qmlpiechart/main.qml 2 | ||||
\snippet ../examples/qmlpiechart/qml/qmlpiechart/main.qml 3 | ||||
Tero Ahola
|
r1443 | |||
\beginfloatleft | ||||
Tero Ahola
|
r1491 | \image examples_qmlpiechart.png | ||
Tero Ahola
|
r1443 | \endfloat | ||
\clearfloat | ||||
*/ | ||||
Tero Ahola
|
r1462 | /*! | ||
\qmlproperty Theme ChartView::theme | ||||
Theme defines the visual appearance of the chart, including for example colors, fonts, line | ||||
widths and chart background. | ||||
*/ | ||||
/*! | ||||
\qmlproperty Animation ChartView::animation | ||||
Animation configuration of the chart. One of ChartView.NoAnimation, ChartView.GridAxisAnimations, | ||||
ChartView.SeriesAnimations or ChartView.AllAnimations. | ||||
*/ | ||||
Jani Honkonen
|
r1517 | /*! | ||
\qmlproperty Font ChartView::titleFont | ||||
The title font of the chart | ||||
See the \l {Font} {QML Font Element} for detailed documentation. | ||||
*/ | ||||
Tero Ahola
|
r1462 | /*! | ||
\qmlproperty string ChartView::title | ||||
The title of the chart, shown on top of the chart. | ||||
Tero Ahola
|
r1473 | \sa ChartView::titleColor | ||
Tero Ahola
|
r1462 | */ | ||
/*! | ||||
\qmlproperty string ChartView::titleColor | ||||
The color of the title text. | ||||
*/ | ||||
/*! | ||||
\qmlproperty Axis ChartView::axisX | ||||
The x-axis of the chart. | ||||
*/ | ||||
/*! | ||||
\qmlproperty Axis ChartView::axisY | ||||
The default y-axis of the chart. | ||||
*/ | ||||
Tero Ahola
|
r1473 | /*! | ||
\qmlproperty Legend ChartView::legend | ||||
The legend of the chart. Legend lists all the series, pie slices and bar sets added on the chart. | ||||
*/ | ||||
/*! | ||||
\qmlproperty int ChartView::count | ||||
The count of series added to the chart. | ||||
*/ | ||||
/*! | ||||
\qmlproperty color ChartView::backgroundColor | ||||
The color of the chart's background. By default background color is defined by chart theme. | ||||
\sa ChartView::theme | ||||
*/ | ||||
/*! | ||||
\qmlproperty bool ChartView::dropShadowEnabled | ||||
The chart's border drop shadow. Set to true to enable drop shadow. | ||||
*/ | ||||
Tero Ahola
|
r1524 | /*! | ||
\qmlproperty real ChartView::topMargin | ||||
Tero Ahola
|
r1928 | Deprecated. Use minimumMargins and plotArea instead. | ||
Tero Ahola
|
r1524 | */ | ||
/*! | ||||
\qmlproperty real ChartView::bottomMargin | ||||
Tero Ahola
|
r1928 | Deprecated. Use minimumMargins and plotArea instead. | ||
Tero Ahola
|
r1524 | */ | ||
/*! | ||||
\qmlproperty real ChartView::leftMargin | ||||
Tero Ahola
|
r1928 | Deprecated. Use minimumMargins and plotArea instead. | ||
Tero Ahola
|
r1524 | */ | ||
/*! | ||||
\qmlproperty real ChartView::rightMargin | ||||
Tero Ahola
|
r1928 | Deprecated. Use minimumMargins and plotArea instead. | ||
*/ | ||||
/*! | ||||
\qmlproperty Margins ChartView::minimumMargins | ||||
Tero Ahola
|
r1929 | The minimum margins allowed between the outer bounds and the plotArea of the ChartView. Margins | ||
area of ChartView is used for drawing title, axes and legend. Please note that setting the | ||||
properties of minimumMargins may be bigger than the defined value, depending on other ChartView | ||||
properties that affect it's layout. If you need to know the actual plotting area used at any | ||||
given time, you can check ChartView::plotArea instead. | ||||
*/ | ||||
/*! | ||||
\qmlproperty rect ChartView::plotArea | ||||
The area on the ChartView that is used for drawing series. This is the ChartView rect without the | ||||
margins. | ||||
\sa ChartView::minimumMargins | ||||
Tero Ahola
|
r1524 | */ | ||
Tero Ahola
|
r1521 | /*! | ||
\qmlmethod AbstractSeries ChartView::series(int index) | ||||
Returns the series with \a index on the chart. This allows you to loop through the series of a chart together with | ||||
the count property of the chart. | ||||
*/ | ||||
/*! | ||||
\qmlmethod AbstractSeries ChartView::series(string name) | ||||
Returns the first series on the chart with \a name. If there is no series with that name, returns null. | ||||
*/ | ||||
/*! | ||||
Tero Ahola
|
r1960 | \qmlmethod AbstractSeries ChartView::createSeries(SeriesType type, string name, AbstractAxis axisX, AbstractAxis axisY) | ||
Creates a series object of \a type to the chart with name \a name, optional axis \a axisX and | ||||
optional axis \a axisY. For example: | ||||
Tero Ahola
|
r1521 | \code | ||
Tero Ahola
|
r1960 | // lineSeries is a LineSeries object that has already been added to the ChartView; re-use it's axes | ||
var myAxisX = chartView.axisX(lineSeries); | ||||
var myAxisY = chartView.axisY(lineSeries); | ||||
var scatter = chartView.createSeries(ChartView.SeriesTypeScatter, "scatter series", myAxisX, myAxisY); | ||||
Tero Ahola
|
r1521 | \endcode | ||
*/ | ||||
Tero Ahola
|
r1948 | /*! | ||
\qmlmethod ChartView::removeSeries(AbstractSeries series) | ||||
Removes the \a series from the chart. The series object is also destroyed. | ||||
*/ | ||||
/*! | ||||
\qmlmethod ChartView::removeAllSeries() | ||||
Removes all series from the chart. All the series objects are also destroyed. | ||||
*/ | ||||
Tero Ahola
|
r1960 | /*! | ||
Tero Ahola
|
r2068 | \qmlmethod Axis ChartView::axisX(AbstractSeries series) | ||
Tero Ahola
|
r1960 | The x-axis of the series. | ||
*/ | ||||
Tero Ahola
|
r1462 | /*! | ||
Tero Ahola
|
r2068 | \qmlmethod Axis ChartView::axisY(AbstractSeries series) | ||
Tero Ahola
|
r1960 | The y-axis of the series. | ||
Tero Ahola
|
r1521 | */ | ||
/*! | ||||
\qmlmethod ChartView::zoomY(real factor) | ||||
Zooms in by \a factor on the center of the chart. | ||||
*/ | ||||
/*! | ||||
\qmlmethod ChartView::scrollLeft(real pixels) | ||||
Scrolls to left by \a pixels. This is a convenience function that suits for example for key navigation. | ||||
Tero Ahola
|
r1869 | \sa ValueAxis::min, ValueAxis::max, BarCategoryAxis::min, BarCategoryAxis::max | ||
Tero Ahola
|
r1521 | */ | ||
/*! | ||||
\qmlmethod ChartView::scrollRight(real pixels) | ||||
Scrolls to right by \a pixels. This is a convenience function that suits for example for key navigation. | ||||
Tero Ahola
|
r1869 | \sa ValueAxis::min, ValueAxis::max, BarCategoryAxis::min, BarCategoryAxis::max | ||
Tero Ahola
|
r1521 | */ | ||
/*! | ||||
\qmlmethod ChartView::scrollUp(real pixels) | ||||
Scrolls up by \a pixels. This is a convenience function that suits for example for key navigation. | ||||
Tero Ahola
|
r1869 | \sa ValueAxis::min, ValueAxis::max, BarCategoryAxis::min, BarCategoryAxis::max | ||
Tero Ahola
|
r1521 | */ | ||
/*! | ||||
\qmlmethod ChartView::scrollDown(real pixels) | ||||
Scrolls down by \a pixels. This is a convenience function that suits for example for key navigation. | ||||
Tero Ahola
|
r1869 | \sa ValueAxis::min, ValueAxis::max, BarCategoryAxis::min, BarCategoryAxis::max | ||
Tero Ahola
|
r1462 | */ | ||
Tero Ahola
|
r1531 | /*! | ||
Tero Ahola
|
r1946 | \qmlsignal ChartView::onPlotAreaChanged(rect plotArea) | ||
The plot area of the chart has changed. This may happen for example, if you modify minimumMargins | ||||
or if you resize the chart, or if you modify font size related properties of the legend or chart | ||||
title. | ||||
Tero Ahola
|
r1531 | */ | ||
Tero Ahola
|
r2068 | /*! | ||
\qmlsignal ChartView::seriesAdded(AbstractSeries series) | ||||
The \a series has been added to the chart. | ||||
*/ | ||||
/*! | ||||
\qmlsignal ChartView::seriesRemoved(AbstractSeries series) | ||||
The \a series has been removed from the chart. Please note that \a series is no longer a valid | ||||
object after the signal handler has completed. | ||||
*/ | ||||
Jani Honkonen
|
r1 | DeclarativeChart::DeclarativeChart(QDeclarativeItem *parent) | ||
Tero Ahola
|
r120 | : QDeclarativeItem(parent), | ||
Tero Ahola
|
r1357 | m_chart(new QChart(this)) | ||
Jani Honkonen
|
r1 | { | ||
setFlag(QGraphicsItem::ItemHasNoContents, false); | ||||
Tero Ahola
|
r1928 | m_minMargins = new DeclarativeMargins(this); | ||
Tero Ahola
|
r1946 | connect(m_minMargins, SIGNAL(topChanged(int, int, int, int)), this, SLOT(changeMinimumMargins(int, int, int, int))); | ||
connect(m_minMargins, SIGNAL(bottomChanged(int, int, int, int)), this, SLOT(changeMinimumMargins(int, int, int, int))); | ||||
connect(m_minMargins, SIGNAL(leftChanged(int, int, int, int)), this, SLOT(changeMinimumMargins(int, int, int, int))); | ||||
connect(m_minMargins, SIGNAL(rightChanged(int, int, int, int)), this, SLOT(changeMinimumMargins(int, int, int, int))); | ||||
Tero Ahola
|
r2068 | connect(m_chart->d_ptr->m_dataset, SIGNAL(seriesAdded(QAbstractSeries *, Domain *)), this, SLOT(handleSeriesAdded(QAbstractSeries *, Domain *))); | ||
connect(m_chart->d_ptr->m_dataset, SIGNAL(seriesRemoved(QAbstractSeries *)), this, SIGNAL(seriesRemoved(QAbstractSeries *))); | ||||
} | ||||
void DeclarativeChart::handleSeriesAdded(QAbstractSeries *series, Domain *domain) | ||||
{ | ||||
Q_UNUSED(domain) | ||||
emit seriesAdded(series); | ||||
Tero Ahola
|
r1524 | } | ||
Tero Ahola
|
r1928 | void DeclarativeChart::changeMinimumMargins(int top, int bottom, int left, int right) | ||
Tero Ahola
|
r1524 | { | ||
Michal Klocek
|
r1965 | m_chart->setMargins(QMargins(left, top, right, bottom)); | ||
Tero Ahola
|
r1946 | emit minimumMarginsChanged(); | ||
emit plotAreaChanged(m_chart->plotArea()); | ||||
Jani Honkonen
|
r1 | } | ||
Tero Ahola
|
r722 | DeclarativeChart::~DeclarativeChart() | ||
{ | ||||
delete m_chart; | ||||
} | ||||
Tero Ahola
|
r1117 | void DeclarativeChart::childEvent(QChildEvent *event) | ||
{ | ||||
if (event->type() == QEvent::ChildAdded) { | ||||
if (qobject_cast<QAbstractSeries *>(event->child())) { | ||||
m_chart->addSeries(qobject_cast<QAbstractSeries *>(event->child())); | ||||
} | ||||
} | ||||
} | ||||
void DeclarativeChart::componentComplete() | ||||
{ | ||||
foreach(QObject *child, children()) { | ||||
if (qobject_cast<QAbstractSeries *>(child)) { | ||||
Tero Ahola
|
r1903 | // Add series to the chart | ||
QAbstractSeries *series = qobject_cast<QAbstractSeries *>(child); | ||||
m_chart->addSeries(series); | ||||
Tero Ahola
|
r1947 | // Set optional user defined axes for the series and connect axis related signals | ||
Tero Ahola
|
r1813 | if (qobject_cast<DeclarativeLineSeries *>(child)) { | ||
DeclarativeLineSeries *s = qobject_cast<DeclarativeLineSeries *>(child); | ||||
Jani Honkonen
|
r1937 | connect(s, SIGNAL(axisXChanged(QAbstractAxis*)), this, SLOT(handleAxisXSet(QAbstractAxis*))); | ||
connect(s, SIGNAL(axisYChanged(QAbstractAxis*)), this, SLOT(handleAxisYSet(QAbstractAxis*))); | ||||
Tero Ahola
|
r1813 | setAxisX(s->axisX(), s); | ||
setAxisY(s->axisY(), s); | ||||
} else if (qobject_cast<DeclarativeSplineSeries *>(child)) { | ||||
DeclarativeSplineSeries *s = qobject_cast<DeclarativeSplineSeries *>(child); | ||||
Jani Honkonen
|
r1937 | connect(s, SIGNAL(axisXChanged(QAbstractAxis*)), this, SLOT(handleAxisXSet(QAbstractAxis*))); | ||
connect(s, SIGNAL(axisYChanged(QAbstractAxis*)), this, SLOT(handleAxisYSet(QAbstractAxis*))); | ||||
Tero Ahola
|
r1813 | setAxisX(s->axisX(), s); | ||
setAxisY(s->axisY(), s); | ||||
} else if (qobject_cast<DeclarativeScatterSeries *>(child)) { | ||||
DeclarativeScatterSeries *s = qobject_cast<DeclarativeScatterSeries *>(child); | ||||
Jani Honkonen
|
r1937 | connect(s, SIGNAL(axisXChanged(QAbstractAxis*)), this, SLOT(handleAxisXSet(QAbstractAxis*))); | ||
connect(s, SIGNAL(axisYChanged(QAbstractAxis*)), this, SLOT(handleAxisYSet(QAbstractAxis*))); | ||||
Tero Ahola
|
r1813 | setAxisX(s->axisX(), s); | ||
setAxisY(s->axisY(), s); | ||||
} else if (qobject_cast<DeclarativeAreaSeries *>(child)) { | ||||
DeclarativeAreaSeries *s = qobject_cast<DeclarativeAreaSeries *>(child); | ||||
Jani Honkonen
|
r1937 | connect(s, SIGNAL(axisXChanged(QAbstractAxis*)), this, SLOT(handleAxisXSet(QAbstractAxis*))); | ||
connect(s, SIGNAL(axisYChanged(QAbstractAxis*)), this, SLOT(handleAxisYSet(QAbstractAxis*))); | ||||
Tero Ahola
|
r1813 | setAxisX(s->axisX(), s); | ||
setAxisY(s->axisY(), s); | ||||
} else if (qobject_cast<DeclarativeBarSeries *>(child)) { | ||||
DeclarativeBarSeries *s = qobject_cast<DeclarativeBarSeries *>(child); | ||||
Jani Honkonen
|
r1937 | connect(s, SIGNAL(axisXChanged(QAbstractAxis*)), this, SLOT(handleAxisXSet(QAbstractAxis*))); | ||
connect(s, SIGNAL(axisYChanged(QAbstractAxis*)), this, SLOT(handleAxisYSet(QAbstractAxis*))); | ||||
Tero Ahola
|
r1813 | setAxisX(s->axisX(), s); | ||
setAxisY(s->axisY(), s); | ||||
} else if (qobject_cast<DeclarativeStackedBarSeries *>(child)) { | ||||
DeclarativeStackedBarSeries *s = qobject_cast<DeclarativeStackedBarSeries *>(child); | ||||
Jani Honkonen
|
r1937 | connect(s, SIGNAL(axisXChanged(QAbstractAxis*)), this, SLOT(handleAxisXSet(QAbstractAxis*))); | ||
connect(s, SIGNAL(axisYChanged(QAbstractAxis*)), this, SLOT(handleAxisYSet(QAbstractAxis*))); | ||||
Tero Ahola
|
r1813 | setAxisX(s->axisX(), s); | ||
setAxisY(s->axisY(), s); | ||||
} else if (qobject_cast<DeclarativePercentBarSeries *>(child)) { | ||||
DeclarativePercentBarSeries *s = qobject_cast<DeclarativePercentBarSeries *>(child); | ||||
Jani Honkonen
|
r1937 | connect(s, SIGNAL(axisXChanged(QAbstractAxis*)), this, SLOT(handleAxisXSet(QAbstractAxis*))); | ||
connect(s, SIGNAL(axisYChanged(QAbstractAxis*)), this, SLOT(handleAxisYSet(QAbstractAxis*))); | ||||
Tero Ahola
|
r1813 | setAxisX(s->axisX(), s); | ||
setAxisY(s->axisY(), s); | ||||
} else if (qobject_cast<DeclarativeHorizontalBarSeries *>(child)) { | ||||
DeclarativeHorizontalBarSeries *s = qobject_cast<DeclarativeHorizontalBarSeries *>(child); | ||||
Jani Honkonen
|
r1937 | connect(s, SIGNAL(axisXChanged(QAbstractAxis*)), this, SLOT(handleAxisXSet(QAbstractAxis*))); | ||
connect(s, SIGNAL(axisYChanged(QAbstractAxis*)), this, SLOT(handleAxisYSet(QAbstractAxis*))); | ||||
Tero Ahola
|
r1813 | setAxisX(s->axisX(), s); | ||
setAxisY(s->axisY(), s); | ||||
} else if (qobject_cast<DeclarativeHorizontalStackedBarSeries *>(child)) { | ||||
DeclarativeHorizontalStackedBarSeries *s = qobject_cast<DeclarativeHorizontalStackedBarSeries *>(child); | ||||
Jani Honkonen
|
r1937 | connect(s, SIGNAL(axisXChanged(QAbstractAxis*)), this, SLOT(handleAxisXSet(QAbstractAxis*))); | ||
connect(s, SIGNAL(axisYChanged(QAbstractAxis*)), this, SLOT(handleAxisYSet(QAbstractAxis*))); | ||||
Tero Ahola
|
r1813 | setAxisX(s->axisX(), s); | ||
setAxisY(s->axisY(), s); | ||||
} else if (qobject_cast<DeclarativeHorizontalPercentBarSeries *>(child)) { | ||||
DeclarativeHorizontalPercentBarSeries *s = qobject_cast<DeclarativeHorizontalPercentBarSeries *>(child); | ||||
Jani Honkonen
|
r1937 | connect(s, SIGNAL(axisXChanged(QAbstractAxis*)), this, SLOT(handleAxisXSet(QAbstractAxis*))); | ||
connect(s, SIGNAL(axisYChanged(QAbstractAxis*)), this, SLOT(handleAxisYSet(QAbstractAxis*))); | ||||
Tero Ahola
|
r1813 | setAxisX(s->axisX(), s); | ||
setAxisY(s->axisY(), s); | ||||
} | ||||
Tero Ahola
|
r1117 | } | ||
} | ||||
Tero Ahola
|
r1813 | |||
Tero Ahola
|
r1947 | // Create the missing axes for the series that cannot be painted without axes | ||
foreach (QAbstractSeries *chartSeries, m_chart->series()) | ||||
createDefaultAxes(chartSeries); | ||||
Tero Ahola
|
r1117 | QDeclarativeItem::componentComplete(); | ||
} | ||||
Tero Ahola
|
r1813 | void DeclarativeChart::handleAxisXSet(QAbstractAxis* axis) | ||
{ | ||||
// qDebug() << "DeclarativeChart::handleAxisXSet" << sender() << axis; | ||||
Tero Ahola
|
r1947 | if (axis && qobject_cast<QAbstractSeries *>(sender())) | ||
m_chart->setAxisX(axis, qobject_cast<QAbstractSeries *>(sender())); | ||||
else | ||||
qWarning() << "Trying to set axisX to null."; | ||||
Tero Ahola
|
r1813 | } | ||
void DeclarativeChart::handleAxisYSet(QAbstractAxis* axis) | ||||
{ | ||||
// qDebug() << "DeclarativeChart::handleAxisYSet" << sender() << axis; | ||||
Tero Ahola
|
r1947 | if (axis && qobject_cast<QAbstractSeries *>(sender())) | ||
m_chart->setAxisY(axis, qobject_cast<QAbstractSeries *>(sender())); | ||||
else | ||||
qWarning() << "Trying to set axisY to null."; | ||||
Tero Ahola
|
r1813 | } | ||
Tero Ahola
|
r120 | void DeclarativeChart::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) | ||
Jani Honkonen
|
r1 | { | ||
Tero Ahola
|
r1139 | // qDebug() << "DeclarativeChart::geometryChanged" << newGeometry.width() << newGeometry.height(); | ||
Tero Ahola
|
r200 | if (newGeometry.isValid()) { | ||
if (newGeometry.width() > 0 && newGeometry.height() > 0) { | ||||
Tero Ahola
|
r642 | m_chart->resize(newGeometry.width(), newGeometry.height()); | ||
Tero Ahola
|
r200 | } | ||
} | ||||
Tero Ahola
|
r1298 | QDeclarativeItem::geometryChanged(newGeometry, oldGeometry); | ||
Tero Ahola
|
r1946 | |||
// It would be better to trigger the plotAreaChanged signal from QChart::plotAreaChanged or | ||||
// similar. Since that kind of a signal is not clearly needed in the C++ API the work-around is | ||||
// to implement it here for the QML API purposes. | ||||
emit plotAreaChanged(m_chart->plotArea()); | ||||
Jani Honkonen
|
r1 | } | ||
Tero Ahola
|
r1240 | void DeclarativeChart::setTheme(DeclarativeChart::Theme theme) | ||
Tero Ahola
|
r1094 | { | ||
Tero Ahola
|
r1357 | QChart::ChartTheme chartTheme = (QChart::ChartTheme) theme; | ||
Tero Ahola
|
r1481 | if (chartTheme != m_chart->theme()) | ||
Tero Ahola
|
r1357 | m_chart->setTheme(chartTheme); | ||
Tero Ahola
|
r1094 | } | ||
Tero Ahola
|
r1240 | DeclarativeChart::Theme DeclarativeChart::theme() | ||
{ | ||||
return (DeclarativeChart::Theme) m_chart->theme(); | ||||
} | ||||
void DeclarativeChart::setAnimationOptions(DeclarativeChart::Animation animations) | ||||
{ | ||||
Tero Ahola
|
r1357 | QChart::AnimationOption animationOptions = (QChart::AnimationOption) animations; | ||
Tero Ahola
|
r1481 | if (animationOptions != m_chart->animationOptions()) | ||
Tero Ahola
|
r1357 | m_chart->setAnimationOptions(animationOptions); | ||
Tero Ahola
|
r1240 | } | ||
DeclarativeChart::Animation DeclarativeChart::animationOptions() | ||||
Tero Ahola
|
r1094 | { | ||
if (m_chart->animationOptions().testFlag(QChart::AllAnimations)) | ||||
Tero Ahola
|
r1240 | return DeclarativeChart::AllAnimations; | ||
Tero Ahola
|
r1094 | else if (m_chart->animationOptions().testFlag(QChart::GridAxisAnimations)) | ||
Tero Ahola
|
r1240 | return DeclarativeChart::GridAxisAnimations; | ||
Tero Ahola
|
r1094 | else if (m_chart->animationOptions().testFlag(QChart::SeriesAnimations)) | ||
Tero Ahola
|
r1240 | return DeclarativeChart::SeriesAnimations; | ||
Tero Ahola
|
r1094 | else | ||
Tero Ahola
|
r1240 | return DeclarativeChart::NoAnimation; | ||
Tero Ahola
|
r1094 | } | ||
Tero Ahola
|
r1357 | void DeclarativeChart::setTitle(QString title) | ||
{ | ||||
Tero Ahola
|
r1481 | if (title != m_chart->title()) | ||
Tero Ahola
|
r1357 | m_chart->setTitle(title); | ||
Tero Ahola
|
r1095 | } | ||
Tero Ahola
|
r1357 | QString DeclarativeChart::title() | ||
Tero Ahola
|
r1095 | { | ||
Tero Ahola
|
r1357 | return m_chart->title(); | ||
Tero Ahola
|
r1095 | } | ||
Tero Ahola
|
r1550 | QAbstractAxis *DeclarativeChart::axisX(QAbstractSeries *series) | ||
Tero Ahola
|
r1139 | { | ||
Tero Ahola
|
r1550 | return m_chart->axisX(series); | ||
Tero Ahola
|
r1139 | } | ||
Michal Klocek
|
r1541 | QAbstractAxis *DeclarativeChart::axisY(QAbstractSeries *series) | ||
Tero Ahola
|
r1139 | { | ||
Tero Ahola
|
r1462 | return m_chart->axisY(series); | ||
Tero Ahola
|
r1139 | } | ||
Tero Ahola
|
r1357 | QLegend *DeclarativeChart::legend() | ||
{ | ||||
return m_chart->legend(); | ||||
} | ||||
void DeclarativeChart::setTitleColor(QColor color) | ||||
{ | ||||
QBrush b = m_chart->titleBrush(); | ||||
if (color != b.color()) { | ||||
b.setColor(color); | ||||
m_chart->setTitleBrush(b); | ||||
Tero Ahola
|
r1524 | emit titleColorChanged(color); | ||
Tero Ahola
|
r1357 | } | ||
} | ||||
Jani Honkonen
|
r1517 | QFont DeclarativeChart::titleFont() const | ||
{ | ||||
return m_chart->titleFont(); | ||||
} | ||||
void DeclarativeChart::setTitleFont(const QFont& font) | ||||
{ | ||||
m_chart->setTitleFont(font); | ||||
} | ||||
Tero Ahola
|
r1357 | QColor DeclarativeChart::titleColor() | ||
{ | ||||
return m_chart->titleBrush().color(); | ||||
} | ||||
void DeclarativeChart::setBackgroundColor(QColor color) | ||||
{ | ||||
QBrush b = m_chart->backgroundBrush(); | ||||
Tero Ahola
|
r1473 | if (b.style() != Qt::SolidPattern || color != b.color()) { | ||
b.setStyle(Qt::SolidPattern); | ||||
Tero Ahola
|
r1357 | b.setColor(color); | ||
m_chart->setBackgroundBrush(b); | ||||
emit backgroundColorChanged(); | ||||
} | ||||
} | ||||
QColor DeclarativeChart::backgroundColor() | ||||
{ | ||||
return m_chart->backgroundBrush().color(); | ||||
Tero Ahola
|
r1157 | } | ||
Tero Ahola
|
r1240 | int DeclarativeChart::count() | ||
{ | ||||
return m_chart->series().count(); | ||||
} | ||||
Tero Ahola
|
r1461 | void DeclarativeChart::setDropShadowEnabled(bool enabled) | ||
{ | ||||
Tero Ahola
|
r1462 | if (enabled != m_chart->isDropShadowEnabled()) { | ||
m_chart->setDropShadowEnabled(enabled); | ||||
Tero Ahola
|
r1461 | dropShadowEnabledChanged(enabled); | ||
} | ||||
} | ||||
bool DeclarativeChart::dropShadowEnabled() | ||||
{ | ||||
Tero Ahola
|
r1462 | return m_chart->isDropShadowEnabled(); | ||
Tero Ahola
|
r1461 | } | ||
Tero Ahola
|
r1524 | qreal DeclarativeChart::topMargin() | ||
{ | ||||
Tero Ahola
|
r1928 | qWarning() << "ChartView.topMargin is deprecated. Use minimumMargins and plotArea instead."; | ||
return m_chart->plotArea().top(); | ||||
Tero Ahola
|
r1524 | } | ||
qreal DeclarativeChart::bottomMargin() | ||||
{ | ||||
Michal Klocek
|
r1965 | |||
Tero Ahola
|
r1928 | qWarning() << "ChartView.bottomMargin is deprecated. Use minimumMargins and plotArea instead."; | ||
return m_chart->plotArea().bottom(); | ||||
Tero Ahola
|
r1524 | } | ||
qreal DeclarativeChart::leftMargin() | ||||
{ | ||||
Tero Ahola
|
r1928 | qWarning() << "ChartView.leftMargin is deprecated. Use minimumMargins and plotArea instead."; | ||
return m_chart->plotArea().left(); | ||||
Tero Ahola
|
r1524 | } | ||
qreal DeclarativeChart::rightMargin() | ||||
{ | ||||
Tero Ahola
|
r1928 | qWarning() << "ChartView.rightMargin is deprecated. Use minimumMargins and plotArea instead."; | ||
return m_chart->plotArea().right(); | ||||
Tero Ahola
|
r1524 | } | ||
Tero Ahola
|
r1461 | void DeclarativeChart::zoom(qreal factor) | ||
{ | ||||
m_chart->zoom(factor); | ||||
} | ||||
void DeclarativeChart::scrollLeft(qreal pixels) | ||||
{ | ||||
Tero Ahola
|
r1955 | m_chart->scroll(-pixels, 0); | ||
Tero Ahola
|
r1461 | } | ||
void DeclarativeChart::scrollRight(qreal pixels) | ||||
{ | ||||
Tero Ahola
|
r1955 | m_chart->scroll(pixels, 0); | ||
Tero Ahola
|
r1461 | } | ||
void DeclarativeChart::scrollUp(qreal pixels) | ||||
{ | ||||
Michal Klocek
|
r1553 | m_chart->scroll(0, pixels); | ||
Tero Ahola
|
r1461 | } | ||
void DeclarativeChart::scrollDown(qreal pixels) | ||||
{ | ||||
Michal Klocek
|
r1553 | m_chart->scroll(0, -pixels); | ||
Tero Ahola
|
r1461 | } | ||
Tero Ahola
|
r1240 | QAbstractSeries *DeclarativeChart::series(int index) | ||
{ | ||||
if (index < m_chart->series().count()) { | ||||
return m_chart->series().at(index); | ||||
} | ||||
return 0; | ||||
} | ||||
QAbstractSeries *DeclarativeChart::series(QString seriesName) | ||||
{ | ||||
foreach(QAbstractSeries *series, m_chart->series()) { | ||||
if (series->name() == seriesName) | ||||
return series; | ||||
} | ||||
return 0; | ||||
} | ||||
QAbstractSeries *DeclarativeChart::createSeries(DeclarativeChart::SeriesType type, QString name) | ||||
Tero Ahola
|
r1960 | { | ||
return createSeries(type, name, 0, 0); | ||||
} | ||||
QAbstractSeries *DeclarativeChart::createSeries(DeclarativeChart::SeriesType type, QString name, QAbstractAxis *axisX, QAbstractAxis *axisY) | ||||
Tero Ahola
|
r1240 | { | ||
QAbstractSeries *series = 0; | ||||
Tero Ahola
|
r1813 | |||
Tero Ahola
|
r1240 | switch (type) { | ||
case DeclarativeChart::SeriesTypeLine: | ||||
series = new DeclarativeLineSeries(); | ||||
break; | ||||
case DeclarativeChart::SeriesTypeArea: | ||||
series = new DeclarativeAreaSeries(); | ||||
break; | ||||
case DeclarativeChart::SeriesTypeStackedBar: | ||||
sauimone
|
r1690 | series = new DeclarativeStackedBarSeries(); | ||
Tero Ahola
|
r1240 | break; | ||
case DeclarativeChart::SeriesTypePercentBar: | ||||
sauimone
|
r1690 | series = new DeclarativePercentBarSeries(); | ||
Tero Ahola
|
r1240 | break; | ||
sauimone
|
r1594 | case DeclarativeChart::SeriesTypeBar: | ||
series = new DeclarativeBarSeries(); | ||||
Tero Ahola
|
r1240 | break; | ||
sauimone
|
r1811 | case DeclarativeChart::SeriesTypeHorizontalBar: | ||
series = new DeclarativeHorizontalBarSeries(); | ||||
break; | ||||
case DeclarativeChart::SeriesTypeHorizontalPercentBar: | ||||
series = new DeclarativeHorizontalPercentBarSeries(); | ||||
break; | ||||
case DeclarativeChart::SeriesTypeHorizontalStackedBar: | ||||
series = new DeclarativeHorizontalStackedBarSeries(); | ||||
break; | ||||
Tero Ahola
|
r1240 | case DeclarativeChart::SeriesTypePie: | ||
series = new DeclarativePieSeries(); | ||||
break; | ||||
case DeclarativeChart::SeriesTypeScatter: | ||||
series = new DeclarativeScatterSeries(); | ||||
break; | ||||
case DeclarativeChart::SeriesTypeSpline: | ||||
series = new DeclarativeSplineSeries(); | ||||
break; | ||||
default: | ||||
qWarning() << "Illegal series type"; | ||||
} | ||||
Tero Ahola
|
r1813 | |||
if (series) { | ||||
series->setName(name); | ||||
m_chart->addSeries(series); | ||||
Tero Ahola
|
r1960 | // Set possible user defined axes | ||
setAxisX(axisX, series); | ||||
setAxisY(axisY, series); | ||||
// Then create the missing axes | ||||
Tero Ahola
|
r1813 | createDefaultAxes(series); | ||
} | ||||
Tero Ahola
|
r1240 | return series; | ||
} | ||||
Tero Ahola
|
r2068 | void DeclarativeChart::removeSeries(QAbstractSeries *series) | ||
{ | ||||
if (series) | ||||
m_chart->removeSeries(series); | ||||
else | ||||
qWarning("removeSeries: cannot remove null"); | ||||
} | ||||
Tero Ahola
|
r1813 | void DeclarativeChart::setAxisX(QAbstractAxis *axis, QAbstractSeries *series) | ||
Michal Klocek
|
r1604 | { | ||
Tero Ahola
|
r1813 | if (axis) | ||
m_chart->setAxisX(axis, series); | ||||
Michal Klocek
|
r1604 | } | ||
Tero Ahola
|
r1813 | void DeclarativeChart::setAxisY(QAbstractAxis *axis, QAbstractSeries *series) | ||
Michal Klocek
|
r1604 | { | ||
Tero Ahola
|
r1813 | if (axis) | ||
m_chart->setAxisY(axis, series); | ||||
Michal Klocek
|
r1604 | } | ||
void DeclarativeChart::createDefaultAxes() | ||||
{ | ||||
Tero Ahola
|
r1813 | qWarning() << "ChartView.createDefaultAxes() is deprecated. Axes are created automatically."; | ||
} | ||||
void DeclarativeChart::createDefaultAxes(QAbstractSeries* series) | ||||
{ | ||||
foreach (QAbstractSeries *s, m_chart->series()) { | ||||
// If there is already an x axis of the correct type, re-use it | ||||
if (!m_chart->axisX(series) && s != series && m_chart->axisX(s) | ||||
&& m_chart->axisX(s)->type() == series->d_ptr->defaultAxisType(Qt::Horizontal)) | ||||
m_chart->setAxisX(m_chart->axisX(s), series); | ||||
// If there is already a y axis of the correct type, re-use it | ||||
if (!m_chart->axisY(series) && s != series && m_chart->axisY(s) | ||||
&& m_chart->axisY(s)->type() == series->d_ptr->defaultAxisType(Qt::Vertical)) | ||||
m_chart->setAxisY(m_chart->axisY(s), series); | ||||
} | ||||
// If no x axis of correct type was found, create a new x axis based of default axis type | ||||
if (!m_chart->axisX(series)) { | ||||
switch (series->d_ptr->defaultAxisType(Qt::Horizontal)) { | ||||
Marek Rosa
|
r1818 | case QAbstractAxis::AxisTypeValue: | ||
Tero Ahola
|
r1813 | m_chart->setAxisX(new QValueAxis(this), series); | ||
break; | ||||
Marek Rosa
|
r1818 | case QAbstractAxis::AxisTypeBarCategory: | ||
Tero Ahola
|
r1813 | m_chart->setAxisX(new QBarCategoryAxis(this), series); | ||
break; | ||||
Marek Rosa
|
r1818 | case QAbstractAxis::AxisTypeCategory: | ||
m_chart->setAxisX(new QCategoryAxis(this), series); | ||||
Tero Ahola
|
r1813 | break; | ||
Marek Rosa
|
r1867 | #ifndef QT_ON_ARM | ||
Tero Ahola
|
r1813 | case QAbstractAxis::AxisTypeDateTime: | ||
m_chart->setAxisX(new QDateTimeAxis(this), series); | ||||
break; | ||||
Marek Rosa
|
r1867 | #endif | ||
Tero Ahola
|
r1813 | default: | ||
// Do nothing, assume AxisTypeNoAxis | ||||
break; | ||||
} | ||||
} | ||||
// If no y axis of correct type was found, create a new y axis based of default axis type | ||||
if (!m_chart->axisY(series)) { | ||||
switch (series->d_ptr->defaultAxisType(Qt::Vertical)) { | ||||
Marek Rosa
|
r1818 | case QAbstractAxis::AxisTypeValue: | ||
Tero Ahola
|
r1813 | m_chart->setAxisY(new QValueAxis(this), series); | ||
break; | ||||
Marek Rosa
|
r1818 | case QAbstractAxis::AxisTypeBarCategory: | ||
Tero Ahola
|
r1813 | m_chart->setAxisY(new QBarCategoryAxis(this), series); | ||
break; | ||||
Marek Rosa
|
r1818 | case QAbstractAxis::AxisTypeCategory: | ||
m_chart->setAxisY(new QCategoryAxis(this), series); | ||||
Tero Ahola
|
r1813 | break; | ||
Marek Rosa
|
r1867 | #ifndef QT_ON_ARM | ||
Tero Ahola
|
r1813 | case QAbstractAxis::AxisTypeDateTime: | ||
m_chart->setAxisY(new QDateTimeAxis(this), series); | ||||
break; | ||||
Marek Rosa
|
r1867 | #endif | ||
Tero Ahola
|
r1813 | default: | ||
// Do nothing, assume AxisTypeNoAxis | ||||
break; | ||||
} | ||||
} | ||||
//qDebug() << "axis for series" << series << "x:" << m_chart->axisX(series) << "y:" << m_chart->axisY(series); | ||||
Michal Klocek
|
r1604 | } | ||
Tero Ahola
|
r120 | #include "moc_declarativechart.cpp" | ||
QTCOMMERCIALCHART_END_NAMESPACE | ||||