declarativechart.cpp
249 lines
| 7.2 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
|
r1240 | #include "declarativelineseries.h" | ||
#include "declarativeareaseries.h" | ||||
#include "declarativebarseries.h" | ||||
#include "declarativepieseries.h" | ||||
#include "declarativesplineseries.h" | ||||
#include "declarativescatterseries.h" | ||||
Jani Honkonen
|
r1 | |||
Tero Ahola
|
r120 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | ||
Jani Honkonen
|
r1 | DeclarativeChart::DeclarativeChart(QDeclarativeItem *parent) | ||
Tero Ahola
|
r120 | : QDeclarativeItem(parent), | ||
Tero Ahola
|
r1095 | m_chart(new QChart(this)), | ||
Tero Ahola
|
r1189 | m_legend(LegendTop) | ||
Jani Honkonen
|
r1 | { | ||
setFlag(QGraphicsItem::ItemHasNoContents, false); | ||||
Tero Ahola
|
r1139 | m_chart->axisX()->setNiceNumbersEnabled(false); | ||
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() | ||||
{ | ||||
Tero Ahola
|
r1139 | // qDebug() << "DeclarativeChart::componentComplete(), maxX: " << axisX()->max(); | ||
Tero Ahola
|
r1117 | foreach(QObject *child, children()) { | ||
if (qobject_cast<QAbstractSeries *>(child)) { | ||||
m_chart->addSeries(qobject_cast<QAbstractSeries *>(child)); | ||||
} | ||||
} | ||||
Tero Ahola
|
r1139 | // qDebug() << "DeclarativeChart::componentComplete(), maxX: " << axisX()->max(); | ||
Tero Ahola
|
r1117 | |||
QDeclarativeItem::componentComplete(); | ||||
} | ||||
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
|
r646 | Q_UNUSED(oldGeometry) | ||
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 | } | ||
} | ||||
Jani Honkonen
|
r1 | } | ||
Tero Ahola
|
r646 | void DeclarativeChart::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) | ||
{ | ||||
Q_UNUSED(option) | ||||
Q_UNUSED(widget) | ||||
// TODO: optimized? | ||||
painter->setRenderHint(QPainter::Antialiasing, true); | ||||
} | ||||
Tero Ahola
|
r1240 | void DeclarativeChart::setTheme(DeclarativeChart::Theme theme) | ||
Tero Ahola
|
r1094 | { | ||
Tero Ahola
|
r1240 | m_chart->setTheme((QChart::ChartTheme) theme); | ||
Tero Ahola
|
r1094 | } | ||
Tero Ahola
|
r1240 | DeclarativeChart::Theme DeclarativeChart::theme() | ||
{ | ||||
return (DeclarativeChart::Theme) m_chart->theme(); | ||||
} | ||||
void DeclarativeChart::setAnimationOptions(DeclarativeChart::Animation animations) | ||||
{ | ||||
m_chart->setAnimationOptions((QChart::AnimationOption) animations); | ||||
} | ||||
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
|
r1240 | void DeclarativeChart::setLegend(DeclarativeChart::Legend legend) | ||
Tero Ahola
|
r1095 | { | ||
if (legend != m_legend) { | ||||
m_legend = legend; | ||||
switch (m_legend) { | ||||
case LegendDisabled: | ||||
m_chart->legend()->setVisible(false); | ||||
break; | ||||
case LegendTop: | ||||
m_chart->legend()->setVisible(true); | ||||
m_chart->legend()->setAlignment(QLegend::AlignmentTop); | ||||
break; | ||||
case LegendBottom: | ||||
m_chart->legend()->setVisible(true); | ||||
m_chart->legend()->setAlignment(QLegend::AlignmentBottom); | ||||
break; | ||||
case LegendLeft: | ||||
m_chart->legend()->setVisible(true); | ||||
m_chart->legend()->setAlignment(QLegend::AlignmentLeft); | ||||
break; | ||||
case LegendRight: | ||||
m_chart->legend()->setVisible(true); | ||||
m_chart->legend()->setAlignment(QLegend::AlignmentRight); | ||||
break; | ||||
default: | ||||
m_chart->legend()->setVisible(false); | ||||
break; | ||||
} | ||||
} | ||||
} | ||||
Tero Ahola
|
r1240 | DeclarativeChart::Legend DeclarativeChart::legend() | ||
Tero Ahola
|
r1095 | { | ||
return m_legend; | ||||
} | ||||
Tero Ahola
|
r1139 | QAxis *DeclarativeChart::axisX() | ||
{ | ||||
return m_chart->axisX(); | ||||
} | ||||
QAxis *DeclarativeChart::axisY() | ||||
{ | ||||
return m_chart->axisY(); | ||||
} | ||||
Tero Ahola
|
r1157 | QVariantList DeclarativeChart::axisXLabels() | ||
{ | ||||
QVariantList labels; | ||||
foreach (qreal value, m_chart->axisX()->categories()->values()) { | ||||
labels.append(value); | ||||
labels.append(m_chart->axisX()->categories()->label(value)); | ||||
} | ||||
return labels; | ||||
} | ||||
void DeclarativeChart::setAxisXLabels(QVariantList list) | ||||
{ | ||||
QVariant value(QVariant::Invalid); | ||||
foreach (QVariant element, list) { | ||||
if (value.isValid() && element.type() == QVariant::String) { | ||||
m_chart->axisX()->categories()->insert(value.toDouble(), element.toString()); | ||||
value = QVariant(QVariant::Invalid); | ||||
} else { | ||||
if (element.canConvert(QVariant::Double)) | ||||
value = element; | ||||
} | ||||
} | ||||
} | ||||
Tero Ahola
|
r1240 | int DeclarativeChart::count() | ||
{ | ||||
return m_chart->series().count(); | ||||
} | ||||
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) | ||||
{ | ||||
QAbstractSeries *series = 0; | ||||
switch (type) { | ||||
case DeclarativeChart::SeriesTypeLine: | ||||
series = new DeclarativeLineSeries(); | ||||
break; | ||||
case DeclarativeChart::SeriesTypeArea: | ||||
series = new DeclarativeAreaSeries(); | ||||
break; | ||||
case DeclarativeChart::SeriesTypeBar: | ||||
series = new DeclarativeBarSeries(); | ||||
break; | ||||
case DeclarativeChart::SeriesTypeStackedBar: | ||||
// TODO | ||||
break; | ||||
case DeclarativeChart::SeriesTypePercentBar: | ||||
// TODO | ||||
break; | ||||
case DeclarativeChart::SeriesTypeGroupedBar: | ||||
series = new DeclarativeGroupedBarSeries(); | ||||
break; | ||||
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"; | ||||
} | ||||
series->setName(name); | ||||
m_chart->addSeries(series); | ||||
return series; | ||||
} | ||||
Tero Ahola
|
r120 | #include "moc_declarativechart.cpp" | ||
QTCOMMERCIALCHART_END_NAMESPACE | ||||