/**************************************************************************** ** ** Copyright (C) 2016 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 "declarativebarseries_p.h" #include #include #include QT_CHARTS_BEGIN_NAMESPACE DeclarativeBarSet::DeclarativeBarSet(QObject *parent) : QBarSet("", parent) { connect(this, SIGNAL(valuesAdded(int,int)), this, SLOT(handleCountChanged(int,int))); connect(this, SIGNAL(valuesRemoved(int,int)), this, SLOT(handleCountChanged(int,int))); connect(this, SIGNAL(brushChanged()), this, SLOT(handleBrushChanged())); } void DeclarativeBarSet::handleCountChanged(int index, int count) { Q_UNUSED(index) Q_UNUSED(count) emit countChanged(QBarSet::count()); } qreal DeclarativeBarSet::borderWidth() const { return pen().widthF(); } void DeclarativeBarSet::setBorderWidth(qreal width) { if (width != pen().widthF()) { QPen p = pen(); p.setWidthF(width); setPen(p); emit borderWidthChanged(width); } } QVariantList DeclarativeBarSet::values() { QVariantList values; for (int i(0); i < count(); i++) values.append(QVariant(QBarSet::at(i))); return values; } void DeclarativeBarSet::setValues(QVariantList values) { while (count()) remove(count() - 1); if (values.count() > 0 && values.at(0).canConvert(QVariant::Point)) { // Create list of values for appending if the first item is Qt.point int maxValue = 0; for (int i = 0; i < values.count(); i++) { if (values.at(i).canConvert(QVariant::Point) && values.at(i).toPoint().x() > maxValue) { maxValue = values.at(i).toPoint().x(); } } QVector indexValueList; indexValueList.resize(maxValue + 1); for (int i = 0; i < values.count(); i++) { if (values.at(i).canConvert(QVariant::Point)) { indexValueList.replace(values.at(i).toPoint().x(), values.at(i).toPointF().y()); } } for (int i = 0; i < indexValueList.count(); i++) QBarSet::append(indexValueList.at(i)); } else { for (int i(0); i < values.count(); i++) { if (values.at(i).canConvert(QVariant::Double)) QBarSet::append(values[i].toDouble()); } } } QString DeclarativeBarSet::brushFilename() const { return m_brushFilename; } void DeclarativeBarSet::setBrushFilename(const QString &brushFilename) { QImage brushImage(brushFilename); if (QBarSet::brush().textureImage() != brushImage) { QBrush brush = QBarSet::brush(); brush.setTextureImage(brushImage); QBarSet::setBrush(brush); m_brushFilename = brushFilename; m_brushImage = brushImage; emit brushFilenameChanged(brushFilename); } } void DeclarativeBarSet::handleBrushChanged() { // If the texture image of the brush has changed along the brush // the brush file name needs to be cleared. if (!m_brushFilename.isEmpty() && QBarSet::brush().textureImage() != m_brushImage) { m_brushFilename.clear(); emit brushFilenameChanged(QString("")); } } // Declarative bar series ====================================================================================== DeclarativeBarSeries::DeclarativeBarSeries(QQuickItem *parent) : QBarSeries(parent), m_axes(new DeclarativeAxes(this)) { connect(m_axes, SIGNAL(axisXChanged(QAbstractAxis*)), this, SIGNAL(axisXChanged(QAbstractAxis*))); connect(m_axes, SIGNAL(axisYChanged(QAbstractAxis*)), this, SIGNAL(axisYChanged(QAbstractAxis*))); connect(m_axes, SIGNAL(axisXTopChanged(QAbstractAxis*)), this, SIGNAL(axisXTopChanged(QAbstractAxis*))); connect(m_axes, SIGNAL(axisYRightChanged(QAbstractAxis*)), this, SIGNAL(axisYRightChanged(QAbstractAxis*))); } void DeclarativeBarSeries::classBegin() { } void DeclarativeBarSeries::componentComplete() { foreach (QObject *child, children()) { if (qobject_cast(child)) { QAbstractBarSeries::append(qobject_cast(child)); } else if (qobject_cast(child)) { QVBarModelMapper *mapper = qobject_cast(child); mapper->setSeries(this); } else if (qobject_cast(child)) { QHBarModelMapper *mapper = qobject_cast(child); mapper->setSeries(this); } } } QQmlListProperty DeclarativeBarSeries::seriesChildren() { return QQmlListProperty(this, 0, &DeclarativeBarSeries::appendSeriesChildren ,0,0,0); } void DeclarativeBarSeries::appendSeriesChildren(QQmlListProperty *list, QObject *element) { // Empty implementation; the children are parsed in componentComplete instead Q_UNUSED(list); Q_UNUSED(element); } DeclarativeBarSet *DeclarativeBarSeries::at(int index) { QList setList = barSets(); if (index >= 0 && index < setList.count()) return qobject_cast(setList[index]); return 0; } DeclarativeBarSet *DeclarativeBarSeries::insert(int index, QString label, QVariantList values) { DeclarativeBarSet *barset = new DeclarativeBarSet(this); barset->setLabel(label); barset->setValues(values); if (QBarSeries::insert(index, barset)) return barset; delete barset; return 0; } // Declarative stacked bar series ============================================================================== DeclarativeStackedBarSeries::DeclarativeStackedBarSeries(QQuickItem *parent) : QStackedBarSeries(parent), m_axes(0) { m_axes = new DeclarativeAxes(this); connect(m_axes, SIGNAL(axisXChanged(QAbstractAxis*)), this, SIGNAL(axisXChanged(QAbstractAxis*))); connect(m_axes, SIGNAL(axisYChanged(QAbstractAxis*)), this, SIGNAL(axisYChanged(QAbstractAxis*))); connect(m_axes, SIGNAL(axisXTopChanged(QAbstractAxis*)), this, SIGNAL(axisXTopChanged(QAbstractAxis*))); connect(m_axes, SIGNAL(axisYRightChanged(QAbstractAxis*)), this, SIGNAL(axisYRightChanged(QAbstractAxis*))); } void DeclarativeStackedBarSeries::classBegin() { } void DeclarativeStackedBarSeries::componentComplete() { foreach (QObject *child, children()) { if (qobject_cast(child)) { QAbstractBarSeries::append(qobject_cast(child)); } else if (qobject_cast(child)) { QVBarModelMapper *mapper = qobject_cast(child); mapper->setSeries(this); } else if (qobject_cast(child)) { QHBarModelMapper *mapper = qobject_cast(child); mapper->setSeries(this); } } } QQmlListProperty DeclarativeStackedBarSeries::seriesChildren() { return QQmlListProperty(this, 0, &DeclarativeBarSeries::appendSeriesChildren ,0,0,0); } void DeclarativeStackedBarSeries::appendSeriesChildren(QQmlListProperty * list, QObject *element) { // Empty implementation; the children are parsed in componentComplete instead Q_UNUSED(list); Q_UNUSED(element); } DeclarativeBarSet *DeclarativeStackedBarSeries::at(int index) { QList setList = barSets(); if (index >= 0 && index < setList.count()) return qobject_cast(setList[index]); return 0; } DeclarativeBarSet *DeclarativeStackedBarSeries::insert(int index, QString label, QVariantList values) { DeclarativeBarSet *barset = new DeclarativeBarSet(this); barset->setLabel(label); barset->setValues(values); if (QStackedBarSeries::insert(index, barset)) return barset; delete barset; return 0; } // Declarative percent bar series ============================================================================== DeclarativePercentBarSeries::DeclarativePercentBarSeries(QQuickItem *parent) : QPercentBarSeries(parent), m_axes(0) { m_axes = new DeclarativeAxes(this); connect(m_axes, SIGNAL(axisXChanged(QAbstractAxis*)), this, SIGNAL(axisXChanged(QAbstractAxis*))); connect(m_axes, SIGNAL(axisYChanged(QAbstractAxis*)), this, SIGNAL(axisYChanged(QAbstractAxis*))); connect(m_axes, SIGNAL(axisXTopChanged(QAbstractAxis*)), this, SIGNAL(axisXTopChanged(QAbstractAxis*))); connect(m_axes, SIGNAL(axisYRightChanged(QAbstractAxis*)), this, SIGNAL(axisYRightChanged(QAbstractAxis*))); } void DeclarativePercentBarSeries::classBegin() { } void DeclarativePercentBarSeries::componentComplete() { foreach (QObject *child, children()) { if (qobject_cast(child)) { QAbstractBarSeries::append(qobject_cast(child)); } else if (qobject_cast(child)) { QVBarModelMapper *mapper = qobject_cast(child); mapper->setSeries(this); } else if (qobject_cast(child)) { QHBarModelMapper *mapper = qobject_cast(child); mapper->setSeries(this); } } } QQmlListProperty DeclarativePercentBarSeries::seriesChildren() { return QQmlListProperty(this, 0, &DeclarativeBarSeries::appendSeriesChildren ,0,0,0); } void DeclarativePercentBarSeries::appendSeriesChildren(QQmlListProperty * list, QObject *element) { // Empty implementation; the children are parsed in componentComplete instead Q_UNUSED(list); Q_UNUSED(element); } DeclarativeBarSet *DeclarativePercentBarSeries::at(int index) { QList setList = barSets(); if (index >= 0 && index < setList.count()) return qobject_cast(setList[index]); return 0; } DeclarativeBarSet *DeclarativePercentBarSeries::insert(int index, QString label, QVariantList values) { DeclarativeBarSet *barset = new DeclarativeBarSet(this); barset->setLabel(label); barset->setValues(values); if (QPercentBarSeries::insert(index, barset)) return barset; delete barset; return 0; } // Declarative horizontal bar series =========================================================================== DeclarativeHorizontalBarSeries::DeclarativeHorizontalBarSeries(QQuickItem *parent) : QHorizontalBarSeries(parent), m_axes(0) { m_axes = new DeclarativeAxes(this); connect(m_axes, SIGNAL(axisXChanged(QAbstractAxis*)), this, SIGNAL(axisXChanged(QAbstractAxis*))); connect(m_axes, SIGNAL(axisYChanged(QAbstractAxis*)), this, SIGNAL(axisYChanged(QAbstractAxis*))); connect(m_axes, SIGNAL(axisXTopChanged(QAbstractAxis*)), this, SIGNAL(axisXTopChanged(QAbstractAxis*))); connect(m_axes, SIGNAL(axisYRightChanged(QAbstractAxis*)), this, SIGNAL(axisYRightChanged(QAbstractAxis*))); } void DeclarativeHorizontalBarSeries::classBegin() { } void DeclarativeHorizontalBarSeries::componentComplete() { foreach (QObject *child, children()) { if (qobject_cast(child)) { QAbstractBarSeries::append(qobject_cast(child)); } else if (qobject_cast(child)) { QVBarModelMapper *mapper = qobject_cast(child); mapper->setSeries(this); } else if (qobject_cast(child)) { QHBarModelMapper *mapper = qobject_cast(child); mapper->setSeries(this); } } } QQmlListProperty DeclarativeHorizontalBarSeries::seriesChildren() { return QQmlListProperty(this, 0, &DeclarativeHorizontalBarSeries::appendSeriesChildren ,0,0,0); } void DeclarativeHorizontalBarSeries::appendSeriesChildren(QQmlListProperty * list, QObject *element) { // Empty implementation; the children are parsed in componentComplete instead Q_UNUSED(list); Q_UNUSED(element); } DeclarativeBarSet *DeclarativeHorizontalBarSeries::at(int index) { QList setList = barSets(); if (index >= 0 && index < setList.count()) return qobject_cast(setList[index]); return 0; } DeclarativeBarSet *DeclarativeHorizontalBarSeries::insert(int index, QString label, QVariantList values) { DeclarativeBarSet *barset = new DeclarativeBarSet(this); barset->setLabel(label); barset->setValues(values); if (QHorizontalBarSeries::insert(index, barset)) return barset; delete barset; return 0; } // Declarative horizontal stacked bar series =================================================================== DeclarativeHorizontalStackedBarSeries::DeclarativeHorizontalStackedBarSeries(QQuickItem *parent) : QHorizontalStackedBarSeries(parent), m_axes(0) { m_axes = new DeclarativeAxes(this); connect(m_axes, SIGNAL(axisXChanged(QAbstractAxis*)), this, SIGNAL(axisXChanged(QAbstractAxis*))); connect(m_axes, SIGNAL(axisYChanged(QAbstractAxis*)), this, SIGNAL(axisYChanged(QAbstractAxis*))); connect(m_axes, SIGNAL(axisXTopChanged(QAbstractAxis*)), this, SIGNAL(axisXTopChanged(QAbstractAxis*))); connect(m_axes, SIGNAL(axisYRightChanged(QAbstractAxis*)), this, SIGNAL(axisYRightChanged(QAbstractAxis*))); } void DeclarativeHorizontalStackedBarSeries::classBegin() { } void DeclarativeHorizontalStackedBarSeries::componentComplete() { foreach (QObject *child, children()) { if (qobject_cast(child)) { QAbstractBarSeries::append(qobject_cast(child)); } else if (qobject_cast(child)) { QVBarModelMapper *mapper = qobject_cast(child); mapper->setSeries(this); } else if (qobject_cast(child)) { QHBarModelMapper *mapper = qobject_cast(child); mapper->setSeries(this); } } } QQmlListProperty DeclarativeHorizontalStackedBarSeries::seriesChildren() { return QQmlListProperty(this, 0, &DeclarativeHorizontalStackedBarSeries::appendSeriesChildren ,0,0,0); } void DeclarativeHorizontalStackedBarSeries::appendSeriesChildren(QQmlListProperty * list, QObject *element) { // Empty implementation; the children are parsed in componentComplete instead Q_UNUSED(list); Q_UNUSED(element); } DeclarativeBarSet *DeclarativeHorizontalStackedBarSeries::at(int index) { QList setList = barSets(); if (index >= 0 && index < setList.count()) return qobject_cast(setList[index]); return 0; } DeclarativeBarSet *DeclarativeHorizontalStackedBarSeries::insert(int index, QString label, QVariantList values) { DeclarativeBarSet *barset = new DeclarativeBarSet(this); barset->setLabel(label); barset->setValues(values); if (QHorizontalStackedBarSeries::insert(index, barset)) return barset; delete barset; return 0; } // Declarative horizontal percent bar series =================================================================== DeclarativeHorizontalPercentBarSeries::DeclarativeHorizontalPercentBarSeries(QQuickItem *parent) : QHorizontalPercentBarSeries(parent), m_axes(0) { m_axes = new DeclarativeAxes(this); connect(m_axes, SIGNAL(axisXChanged(QAbstractAxis*)), this, SIGNAL(axisXChanged(QAbstractAxis*))); connect(m_axes, SIGNAL(axisYChanged(QAbstractAxis*)), this, SIGNAL(axisYChanged(QAbstractAxis*))); connect(m_axes, SIGNAL(axisXTopChanged(QAbstractAxis*)), this, SIGNAL(axisXTopChanged(QAbstractAxis*))); connect(m_axes, SIGNAL(axisYRightChanged(QAbstractAxis*)), this, SIGNAL(axisYRightChanged(QAbstractAxis*))); } void DeclarativeHorizontalPercentBarSeries::classBegin() { } void DeclarativeHorizontalPercentBarSeries::componentComplete() { foreach (QObject *child, children()) { if (qobject_cast(child)) { QAbstractBarSeries::append(qobject_cast(child)); } else if (qobject_cast(child)) { QVBarModelMapper *mapper = qobject_cast(child); mapper->setSeries(this); } else if (qobject_cast(child)) { QHBarModelMapper *mapper = qobject_cast(child); mapper->setSeries(this); } } } QQmlListProperty DeclarativeHorizontalPercentBarSeries::seriesChildren() { return QQmlListProperty(this, 0, &DeclarativeHorizontalPercentBarSeries::appendSeriesChildren ,0,0,0); } void DeclarativeHorizontalPercentBarSeries::appendSeriesChildren(QQmlListProperty * list, QObject *element) { // Empty implementation; the children are parsed in componentComplete instead Q_UNUSED(list); Q_UNUSED(element); } DeclarativeBarSet *DeclarativeHorizontalPercentBarSeries::at(int index) { QList setList = barSets(); if (index >= 0 && index < setList.count()) return qobject_cast(setList[index]); return 0; } DeclarativeBarSet *DeclarativeHorizontalPercentBarSeries::insert(int index, QString label, QVariantList values) { DeclarativeBarSet *barset = new DeclarativeBarSet(this); barset->setLabel(label); barset->setValues(values); if (QHorizontalPercentBarSeries::insert(index, barset)) return barset; delete barset; return 0; } #include "moc_declarativebarseries_p.cpp" QT_CHARTS_END_NAMESPACE