File indexing completed on 2024-12-01 09:55:17
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 #ifndef CHART_H 0009 #define CHART_H 0010 0011 #include "datasource/ChartDataSource.h" 0012 #include <QQuickItem> 0013 0014 /** 0015 * Abstract base class for all charts. 0016 */ 0017 class Chart : public QQuickItem 0018 { 0019 Q_OBJECT 0020 /** 0021 * The data source to use for names of chart items. 0022 */ 0023 Q_PROPERTY(ChartDataSource *nameSource READ nameSource WRITE setNameSource NOTIFY nameSourceChanged) 0024 /** 0025 * The data source to use for short names of chart items. 0026 */ 0027 Q_PROPERTY(ChartDataSource *shortNameSource READ shortNameSource WRITE setShortNameSource NOTIFY shortNameSourceChanged) 0028 /** 0029 * The data source to use for colors of chart items. 0030 */ 0031 Q_PROPERTY(ChartDataSource *colorSource READ colorSource WRITE setColorSource NOTIFY colorSourceChanged) 0032 /** 0033 * The data sources providing the data this chart needs to render. 0034 */ 0035 Q_PROPERTY(QQmlListProperty<ChartDataSource> valueSources READ valueSourcesProperty NOTIFY valueSourcesChanged) 0036 /** 0037 * The indexing mode used for indexing colors and names. 0038 */ 0039 Q_PROPERTY(IndexingMode indexingMode READ indexingMode WRITE setIndexingMode NOTIFY indexingModeChanged) 0040 0041 public: 0042 using DataSourcesProperty = QQmlListProperty<ChartDataSource>; 0043 0044 /** 0045 * How to index color and name sources relative to the different value sources. 0046 */ 0047 enum IndexingMode { 0048 IndexSourceValues = 1, ///< Index each value, restart indexing for each value source. 0049 IndexEachSource, ///< Index each value source, never index individual values. 0050 IndexAllValues ///< Index each value, continuing with the index for each value source. 0051 }; 0052 Q_ENUM(IndexingMode) 0053 0054 explicit Chart(QQuickItem *parent = nullptr); 0055 ~Chart() override = default; 0056 0057 ChartDataSource *nameSource() const; 0058 void setNameSource(ChartDataSource *nameSource); 0059 Q_SIGNAL void nameSourceChanged(); 0060 0061 ChartDataSource *shortNameSource() const; 0062 void setShortNameSource(ChartDataSource *shortNameSource); 0063 Q_SIGNAL void shortNameSourceChanged(); 0064 0065 ChartDataSource *colorSource() const; 0066 void setColorSource(ChartDataSource *colorSource); 0067 Q_SIGNAL void colorSourceChanged(); 0068 0069 DataSourcesProperty valueSourcesProperty(); 0070 QVector<ChartDataSource *> valueSources() const; 0071 Q_SIGNAL void valueSourcesChanged(); 0072 Q_INVOKABLE void insertValueSource(int index, ChartDataSource *source); 0073 Q_INVOKABLE void removeValueSource(int index); 0074 Q_INVOKABLE void removeValueSource(QObject *source); 0075 0076 IndexingMode indexingMode() const; 0077 void setIndexingMode(IndexingMode newIndexingMode); 0078 Q_SIGNAL void indexingModeChanged(); 0079 0080 Q_SIGNAL void dataChanged(); 0081 0082 protected: 0083 /** 0084 * Called when the data of a value source changes. 0085 * 0086 * This method should be reimplemented by subclasses. It is called whenever 0087 * the data of one of the value sources changes. Subclasses should use this 0088 * to make sure that they update whatever internal state they use for 0089 * rendering, then call update() to schedule rendering the item. 0090 */ 0091 virtual void onDataChanged() = 0; 0092 void componentComplete() override; 0093 0094 private: 0095 static void appendSource(DataSourcesProperty *list, ChartDataSource *source); 0096 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) 0097 static int sourceCount(DataSourcesProperty *list); 0098 static ChartDataSource *source(DataSourcesProperty *list, int index); 0099 #else 0100 static qsizetype sourceCount(DataSourcesProperty *list); 0101 static ChartDataSource *source(DataSourcesProperty *list, qsizetype index); 0102 #endif 0103 static void clearSources(DataSourcesProperty *list); 0104 0105 ChartDataSource *m_nameSource = nullptr; 0106 ChartDataSource *m_shortNameSource = nullptr; 0107 ChartDataSource *m_colorSource = nullptr; 0108 QVector<ChartDataSource *> m_valueSources; 0109 IndexingMode m_indexingMode = IndexEachSource; 0110 }; 0111 0112 #endif // CHART_H