File indexing completed on 2024-05-12 11:41:16
0001 /* 0002 File : DatasetModel.cpp 0003 Project : LabPlot 0004 Description : Wrapper class for the collections of datasets 0005 -------------------------------------------------------------------- 0006 SPDX-FileCopyrightText: 2019 Kovacs Ferencz <kferike98@gmail.com> 0007 SPDX-FileCopyrightText: 2019 Alexander Semke <alexander.semke@web.de> 0008 0009 SPDX-License-Identifier: GPL-2.0-or-later 0010 */ 0011 0012 #include "DatasetModel.h" 0013 #include <QVector> 0014 0015 /*! 0016 \class DatasetModel 0017 \brief Wrapper class for datasets, and also for their categories and subcategories 0018 0019 \ingroup kdefrontend 0020 */ 0021 DatasetModel::DatasetModel(const QMap<QString, QMap<QString, QMap<QString, QVector<QString>>>>& datasetsMap) { 0022 initCollections(datasetsMap); 0023 initCategories(datasetsMap); 0024 initSubcategories(datasetsMap); 0025 initDatasets(datasetsMap); 0026 } 0027 0028 DatasetModel::~DatasetModel() = default; 0029 0030 /** 0031 * @brief Initializes the list of collections. 0032 */ 0033 void DatasetModel::initCollections(const QMap<QString, QMap<QString, QMap<QString, QVector<QString>>>>& datasetMap) { 0034 m_collectionList = datasetMap.keys(); 0035 } 0036 0037 /** 0038 * @brief Initializes the list of categories. 0039 */ 0040 void DatasetModel::initCategories(const QMap<QString, QMap<QString, QMap<QString, QVector<QString>>>>& datasetMap) { 0041 for (auto i = datasetMap.begin(); i != datasetMap.end(); ++i) { 0042 m_categories[i.key()] = i.value().keys(); 0043 0044 for (auto it = i.value().constBegin(); it != i.value().constEnd(); ++it) { 0045 const QString& category = it.key(); 0046 if (!m_allCategories.contains(category)) 0047 m_allCategories.append(category); 0048 } 0049 } 0050 } 0051 0052 /** 0053 * @brief Initializes the list of subcategories. 0054 */ 0055 void DatasetModel::initSubcategories(const QMap<QString, QMap<QString, QMap<QString, QVector<QString>>>>& datasetMap) { 0056 for (auto collection = datasetMap.begin(); collection != datasetMap.end(); ++collection) { 0057 const QMap<QString, QMap<QString, QVector<QString>>> collection_ = collection.value(); 0058 0059 for (auto category = collection_.begin(); category != collection_.end(); ++category) { 0060 m_subcategories[collection.key()][category.key()] = category.value().keys(); 0061 0062 for (auto it = category.value().constBegin(); it != category.value().constEnd(); ++it) { 0063 const QString& subcategory = it.key(); 0064 if (!m_allSubcategories[category.key()].contains(subcategory)) 0065 m_allSubcategories[category.key()].append(subcategory); 0066 } 0067 } 0068 } 0069 } 0070 0071 /** 0072 * @brief Initializes the list of datasets. 0073 */ 0074 void DatasetModel::initDatasets(const QMap<QString, QMap<QString, QMap<QString, QVector<QString>>>>& datasetMap) { 0075 for (auto collection = datasetMap.begin(); collection != datasetMap.end(); ++collection) { 0076 const QMap<QString, QMap<QString, QVector<QString>>> collection_ = collection.value(); 0077 0078 for (auto category = collection_.begin(); category != collection_.end(); ++category) { 0079 const QMap<QString, QVector<QString>> category_ = category.value(); 0080 0081 for (auto subcategory = category_.begin(); subcategory != category_.end(); ++subcategory) { 0082 m_datasets[collection.key()][category.key()][subcategory.key()] = subcategory.value().toList(); 0083 m_allDatasets[category.key()][subcategory.key()].append(subcategory.value().toList()); 0084 m_datasetList.append(subcategory.value().toList()); 0085 } 0086 } 0087 } 0088 } 0089 0090 /** 0091 * @brief Returns the list of categories. 0092 */ 0093 QStringList DatasetModel::allCategories() { 0094 return QVariant(m_allCategories).toStringList(); 0095 } 0096 0097 /** 0098 * @brief Returns the list of subcategories of a given category. 0099 * @param category the category the subcategories of which will be returned 0100 */ 0101 QStringList DatasetModel::allSubcategories(const QString& category) { 0102 return QVariant(m_allSubcategories[category]).toStringList(); 0103 } 0104 0105 /** 0106 * @brief Returns the list of datasets of a given category and subcategory. 0107 */ 0108 QVariant DatasetModel::allDatasets(const QString& category, const QString& subcategory) { 0109 return {m_allDatasets[category][subcategory]}; 0110 } 0111 0112 /** 0113 * @brief Returns the list of every dataset. 0114 */ 0115 QVariant DatasetModel::allDatasetsList() { 0116 return {m_datasetList}; 0117 } 0118 0119 /** 0120 * @brief Returns the list of categories for a given collection 0121 */ 0122 QStringList DatasetModel::categories(const QString& collection) { 0123 if (!collection.isEmpty()) 0124 return m_categories[collection]; 0125 else 0126 return allCategories(); 0127 } 0128 0129 /** 0130 * @brief Returns the list of subcategories of a given collection and category. 0131 */ 0132 QStringList DatasetModel::subcategories(const QString& collection, const QString& category) { 0133 if (!collection.isEmpty()) 0134 return m_subcategories[collection][category]; 0135 else 0136 return allSubcategories(category); 0137 } 0138 0139 /** 0140 * @brief Returns the list of datasets of a given collection, category and subcategory. 0141 */ 0142 QStringList DatasetModel::datasets(const QString& collection, const QString& category, const QString& subcategory) { 0143 if (!collection.isEmpty()) 0144 return m_datasets[collection][category][subcategory]; 0145 else 0146 return allDatasets(category, subcategory).toStringList(); 0147 } 0148 0149 /** 0150 * @brief Returns the number of datasets belonging to the given collection 0151 */ 0152 int DatasetModel::datasetCount(const QString& collection) { 0153 int count = 0; 0154 for (const QString& category : categories(collection)) { 0155 for (const QString& subcategory : subcategories(collection, category)) { 0156 count += datasets(collection, category, subcategory).size(); 0157 } 0158 } 0159 return count; 0160 } 0161 0162 /** 0163 * @brief Returns the number of datasets belonging to the given collection and category 0164 */ 0165 int DatasetModel::datasetCount(const QString& collection, const QString& category) { 0166 int count = 0; 0167 for (const QString& subcategory : subcategories(collection, category)) 0168 count += datasets(collection, category, subcategory).size(); 0169 0170 return count; 0171 } 0172 0173 /** 0174 * @brief Returns the number of datasets belonging to the given collection, category and subcategory 0175 */ 0176 int DatasetModel::datasetCount(const QString& collection, const QString& category, const QString& subcategory) { 0177 return datasets(collection, category, subcategory).size(); 0178 } 0179 0180 /** 0181 * @brief Returns the list of every collection. 0182 */ 0183 QStringList DatasetModel::collections() { 0184 return m_collectionList; 0185 }