File indexing completed on 2024-04-21 15:02:55

0001 /*
0002  * This file is part of KQuickCharts
0003  * SPDX-FileCopyrightText: 2019 Arjen Hiemstra <ahiemstra@heimr.nl>
0004  *
0005  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0006  */
0007 
0008 #include "Chart.h"
0009 #include "datasource/ChartDataSource.h"
0010 
0011 Chart::Chart(QQuickItem *parent)
0012     : QQuickItem(parent)
0013 {
0014     setFlag(ItemHasContents, true);
0015     connect(this, &Chart::dataChanged, this, &Chart::onDataChanged);
0016 }
0017 
0018 ChartDataSource *Chart::nameSource() const
0019 {
0020     return m_nameSource;
0021 }
0022 
0023 void Chart::setNameSource(ChartDataSource *nameSource)
0024 {
0025     if (m_nameSource == nameSource) {
0026         return;
0027     }
0028 
0029     m_nameSource = nameSource;
0030     Q_EMIT dataChanged();
0031     Q_EMIT nameSourceChanged();
0032 }
0033 
0034 ChartDataSource *Chart::shortNameSource() const
0035 {
0036     return m_shortNameSource;
0037 }
0038 
0039 void Chart::setShortNameSource(ChartDataSource *shortNameSource)
0040 {
0041     if (m_shortNameSource == shortNameSource) {
0042         return;
0043     }
0044 
0045     m_shortNameSource = shortNameSource;
0046     Q_EMIT dataChanged();
0047     Q_EMIT shortNameSourceChanged();
0048 }
0049 
0050 ChartDataSource *Chart::colorSource() const
0051 {
0052     return m_colorSource;
0053 }
0054 
0055 void Chart::setColorSource(ChartDataSource *colorSource)
0056 {
0057     if (m_colorSource == colorSource) {
0058         return;
0059     }
0060 
0061     if (m_colorSource) {
0062         disconnect(m_colorSource, &ChartDataSource::dataChanged, this, &Chart::dataChanged);
0063     }
0064 
0065     m_colorSource = colorSource;
0066 
0067     if (m_colorSource) {
0068         connect(m_colorSource, &ChartDataSource::dataChanged, this, &Chart::dataChanged);
0069     }
0070 
0071     Q_EMIT dataChanged();
0072     Q_EMIT colorSourceChanged();
0073 }
0074 
0075 Chart::DataSourcesProperty Chart::valueSourcesProperty()
0076 {
0077     return DataSourcesProperty{this, this, &Chart::appendSource, &Chart::sourceCount, &Chart::source, &Chart::clearSources};
0078 }
0079 
0080 QVector<ChartDataSource *> Chart::valueSources() const
0081 {
0082     return m_valueSources;
0083 }
0084 
0085 void Chart::insertValueSource(int index, ChartDataSource *source)
0086 {
0087     if (index < 0) {
0088         return;
0089     }
0090 
0091     m_valueSources.insert(index, source);
0092     connect(source, &QObject::destroyed, this, qOverload<QObject *>(&Chart::removeValueSource));
0093     connect(source, &ChartDataSource::dataChanged, this, &Chart::dataChanged);
0094 
0095     Q_EMIT dataChanged();
0096     Q_EMIT valueSourcesChanged();
0097 }
0098 
0099 void Chart::removeValueSource(int index)
0100 {
0101     if (index < 0 || index >= m_valueSources.count()) {
0102         return;
0103     }
0104 
0105     m_valueSources.at(index)->disconnect(this);
0106     m_valueSources.remove(index);
0107 
0108     Q_EMIT dataChanged();
0109     Q_EMIT valueSourcesChanged();
0110 }
0111 
0112 void Chart::removeValueSource(QObject *source)
0113 {
0114     auto itr = std::find_if(m_valueSources.begin(), m_valueSources.end(), [source](QObject *dataSource) {
0115         return dataSource == source;
0116     });
0117 
0118     if (itr != m_valueSources.end()) {
0119         (*itr)->disconnect(this);
0120         m_valueSources.erase(itr);
0121     }
0122 
0123     Q_EMIT dataChanged();
0124     Q_EMIT valueSourcesChanged();
0125 }
0126 
0127 Chart::IndexingMode Chart::indexingMode() const
0128 {
0129     return m_indexingMode;
0130 }
0131 
0132 void Chart::setIndexingMode(IndexingMode newIndexingMode)
0133 {
0134     if (newIndexingMode == m_indexingMode) {
0135         return;
0136     }
0137 
0138     m_indexingMode = newIndexingMode;
0139     Q_EMIT dataChanged();
0140     Q_EMIT indexingModeChanged();
0141 }
0142 
0143 void Chart::componentComplete()
0144 {
0145     QQuickItem::componentComplete();
0146     Q_EMIT dataChanged();
0147 }
0148 
0149 void Chart::appendSource(Chart::DataSourcesProperty *list, ChartDataSource *source)
0150 {
0151     auto chart = reinterpret_cast<Chart *>(list->data);
0152     chart->insertValueSource(chart->valueSources().size(), source);
0153 }
0154 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
0155 int Chart::sourceCount(Chart::DataSourcesProperty *list)
0156 #else
0157 qsizetype Chart::sourceCount(Chart::DataSourcesProperty *list)
0158 #endif
0159 {
0160     return reinterpret_cast<Chart *>(list->data)->m_valueSources.count();
0161 }
0162 
0163 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
0164 ChartDataSource *Chart::source(Chart::DataSourcesProperty *list, int index)
0165 #else
0166 ChartDataSource *Chart::source(Chart::DataSourcesProperty *list, qsizetype index)
0167 #endif
0168 {
0169     return reinterpret_cast<Chart *>(list->data)->m_valueSources.at(index);
0170 }
0171 
0172 void Chart::clearSources(Chart::DataSourcesProperty *list)
0173 {
0174     auto chart = reinterpret_cast<Chart *>(list->data);
0175     std::for_each(chart->m_valueSources.cbegin(), chart->m_valueSources.cend(), [chart](ChartDataSource *source) {
0176         source->disconnect(chart);
0177     });
0178     chart->m_valueSources.clear();
0179     Q_EMIT chart->dataChanged();
0180 }
0181 
0182 #include "moc_Chart.cpp"