##// END OF EJS Templates
New data sources system switch complete...
jeandet -
r99:46467fb43b8d
parent child
Show More
@@ -0,0 +1,91
1 #ifndef SCIQLOP_MIMETYPESDEF_H
2 #define SCIQLOP_MIMETYPESDEF_H
3
4 #include "CoreGlobal.h"
5
6 #include <QByteArray>
7 #include <QDataStream>
8 #include <QMimeData>
9 #include <QString>
10 #include <QVariant>
11
12 // ////////////////// //
13 // SciQlop Mime Types //
14 // ////////////////// //
15
16 namespace MIME
17 {
18 inline QString const MIME_TYPE_GRAPH =
19 QStringLiteral("application/x.sciqlop.graph");
20 inline QString const MIME_TYPE_ZONE =
21 QStringLiteral("application/x.sciqlop.zone");
22 inline QString const MIME_TYPE_VARIABLE_LIST =
23 QStringLiteral("application/x.sciqlop.var-list");
24 inline QString const MIME_TYPE_PRODUCT_LIST =
25 QStringLiteral("application/x.sciqlop.product-list");
26 inline QString const MIME_TYPE_TIME_RANGE =
27 QStringLiteral("application/x.sciqlop.time-range");
28 inline QString const MIME_TYPE_SELECTION_ZONE =
29 QStringLiteral("application/x.sciqlop.selection-zone");
30 inline QString const MIME_TYPE_EVENT_LIST =
31 QStringLiteral("application/x.sciqlop.event-list");
32 inline QString const MIME_TYPE_SOURCE_CATALOGUE_LIST =
33 QStringLiteral("application/x.sciqlop.source-catalogue-list");
34
35 enum class IDS
36 {
37 GRAPH,
38 ZONE,
39 VARIABLE_LIST,
40 PRODUCT_LIST,
41 TIME_RANGE,
42 SELECTION_ZONE,
43 EVENT_LIST,
44 SOURCE_CATALOGUE_LIST
45 };
46
47 inline std::unordered_map<IDS, QString> const MIME_TYPES = {
48 {IDS::GRAPH, MIME_TYPE_GRAPH},
49 {IDS::ZONE, MIME_TYPE_ZONE},
50 {IDS::VARIABLE_LIST, MIME_TYPE_VARIABLE_LIST},
51 {IDS::PRODUCT_LIST, MIME_TYPE_PRODUCT_LIST},
52 {IDS::TIME_RANGE, MIME_TYPE_TIME_RANGE},
53 {IDS::SELECTION_ZONE, MIME_TYPE_SELECTION_ZONE},
54 {IDS::EVENT_LIST, MIME_TYPE_EVENT_LIST},
55 {IDS::SOURCE_CATALOGUE_LIST, MIME_TYPE_SOURCE_CATALOGUE_LIST}};
56
57 inline QVariantList decode(const QByteArray& mimeData)
58 {
59 QDataStream stream{mimeData};
60 QVariantList productList;
61 stream >> productList;
62 return productList;
63 }
64
65 inline QByteArray encode(const QVariantList& data)
66 {
67 QByteArray encodedData;
68 QDataStream stream{&encodedData, QIODevice::WriteOnly};
69 stream << data;
70 return encodedData;
71 }
72
73 inline QByteArray encode(const QString& data)
74 {
75 QByteArray encodedData;
76 QDataStream stream{&encodedData, QIODevice::WriteOnly};
77 stream << (QVariantList{} << QVariant{data});
78 return encodedData;
79 }
80
81 // override mimeData in corresponding object source code
82 template<typename T> QMimeData* mimeData(const T& object) = delete;
83
84 template<IDS id> QVariantList fromMimeData(const QMimeData* mime)
85 {
86 return decode(mime->data(MIME_TYPES.at(id)));
87 }
88
89 } // namespace MIME
90
91 #endif // SCIQLOP_MIMETYPESDEF_H
@@ -0,0 +1,3
1 #include "MimeTypes/MimeTypes.h"
2
3
@@ -4,11 +4,15
4 #include "CoreGlobal.h"
4 #include "CoreGlobal.h"
5
5
6 #include <Common/spimpl.h>
6 #include <Common/spimpl.h>
7 #include <MimeTypes/MimeTypes.h>
8 #include <QMimeData>
7 #include <QUuid>
9 #include <QUuid>
8 #include <QVariant>
10 #include <QVariant>
9 #include <QVector>
11 #include <QVector>
12 #include <algorithm>
10 #include <iomanip>
13 #include <iomanip>
11 #include <iostream>
14 #include <iostream>
15 #include <iterator>
12 #include <optional>
16 #include <optional>
13 #include <trees/algorithms.hpp>
17 #include <trees/algorithms.hpp>
14
18
@@ -46,7 +50,8 public:
46 static const QString ID_DATA_KEY;
50 static const QString ID_DATA_KEY;
47
51
48 //explicit DataSourceItem(DataSourceItemType type, const QString& name);
52 // explicit DataSourceItem(DataSourceItemType type, const QString& name);
49 explicit DataSourceItem(DataSourceItemType type, const QString& name, QVariantHash data = {},
53 explicit DataSourceItem(DataSourceItemType type, const QString& name,
54 QVariantHash data = {},
50 std::optional<QUuid> sourceUUID = std::nullopt);
55 std::optional<QUuid> sourceUUID = std::nullopt);
51
56
52 std::unique_ptr<DataSourceItem> clone() const;
57 std::unique_ptr<DataSourceItem> clone() const;
@@ -140,6 +145,7 public:
140 QString name() const noexcept;
145 QString name() const noexcept;
141 QString icon() const noexcept;
146 QString icon() const noexcept;
142 void setIcon(const QString& iconName);
147 void setIcon(const QString& iconName);
148 QString path() const noexcept;
143
149
144 /**
150 /**
145 * Get the item's parent
151 * Get the item's parent
@@ -201,4 +207,18 private:
201 spimpl::unique_impl_ptr<DataSourceItemPrivate> impl;
207 spimpl::unique_impl_ptr<DataSourceItemPrivate> impl;
202 };
208 };
203
209
210 namespace MIME
211 {
212 inline QMimeData* mimeData(const std::vector<DataSourceItem*>& items)
213 {
214 QVariantList path_list;
215 std::transform(std::cbegin(items), std::cend(items),
216 std::back_inserter(path_list),
217 [](const auto& item) { return item->path(); });
218 QMimeData* m = new QMimeData;
219 m->setData(MIME::MIME_TYPE_PRODUCT_LIST, MIME::encode(path_list));
220 return m;
221 }
222 } // namespace MIME
223
204 #endif // SCIQLOP_DATASOURCEITEMMODEL_H
224 #endif // SCIQLOP_DATASOURCEITEMMODEL_H
@@ -28,8 +28,8
28 #include "DataSourceItem.h"
28 #include "DataSourceItem.h"
29
29
30 #include <QAbstractItemModel>
30 #include <QAbstractItemModel>
31 #include <QObject>
32 #include <QMimeData>
31 #include <QMimeData>
32 #include <QObject>
33
33
34 class DataSources : public QAbstractItemModel
34 class DataSources : public QAbstractItemModel
35 {
35 {
@@ -42,7 +42,7 public:
42 };
42 };
43
43
44 public:
44 public:
45 DataSources() : _root(new DataSourceItem(DataSourceItemType::NODE, "root")) {}
45 DataSources() : _root(new DataSourceItem(DataSourceItemType::NODE, "")) {}
46 ~DataSources() { delete _root; }
46 ~DataSources() { delete _root; }
47
47
48 virtual QVariant data(const QModelIndex& index, int role) const final;
48 virtual QVariant data(const QModelIndex& index, int role) const final;
@@ -67,8 +67,6 public:
67 void updateNodeMetaData(const QString& path,
67 void updateNodeMetaData(const QString& path,
68 const QMap<QString, QString>& metaData) noexcept;
68 const QMap<QString, QString>& metaData) noexcept;
69
69
70 void createVariable(const DataSourceItem& item);
71
72 void addIcon(const QString& name, QVariant icon)
70 void addIcon(const QString& name, QVariant icon)
73 {
71 {
74 _icons[name] = std::move(icon);
72 _icons[name] = std::move(icon);
@@ -76,6 +74,10 public:
76
74
77 void setIcon(const QString& path, const QString& iconName);
75 void setIcon(const QString& path, const QString& iconName);
78
76
77 public Q_SLOTS:
78 void createVariable(const DataSourceItem& item);
79 void createVariable(const QString& path);
80
79 Q_SIGNALS:
81 Q_SIGNALS:
80 void createVariable(const QString& variableName,
82 void createVariable(const QString& variableName,
81 const QVariantHash& variableMetadata,
83 const QVariantHash& variableMetadata,
@@ -66,7 +66,7 public:
66 }
66 }
67
67
68 signals:
68 signals:
69 void createVariable(const QVariantHash& productData);
69 void createVariable(const QString& productPath);
70 void asyncChangeRange(const std::shared_ptr<Variable2>& variable,
70 void asyncChangeRange(const std::shared_ptr<Variable2>& variable,
71 const DateTimeRange& r);
71 const DateTimeRange& r);
72 public slots:
72 public slots:
@@ -7,11 +7,11 cpp_utils_dep = dependency('cpp_utils', fallback:['cpp_utils','cpp_utils_dep'])
7 core_moc_headers = [
7 core_moc_headers = [
8 './include/Common/spimpl.h',
8 './include/Common/spimpl.h',
9 './include/Common/DateUtils.h',
9 './include/Common/DateUtils.h',
10 './include/Common/MimeTypesDef.h',
11 './include/Common/SignalWaiter.h',
10 './include/Common/SignalWaiter.h',
12 './include/Common/debug.h',
11 './include/Common/debug.h',
13 './include/Common/MetaTypes.h',
12 './include/Common/MetaTypes.h',
14 './include/Common/SortUtils.h',
13 './include/Common/SortUtils.h',
14 './include/MimeTypes/MimeTypes.h',
15 './include/Data/DateTimeRangeHelper.h',
15 './include/Data/DateTimeRangeHelper.h',
16 './include/Data/ScalarTimeSerie.h',
16 './include/Data/ScalarTimeSerie.h',
17 './include/Data/DateTimeRange.h',
17 './include/Data/DateTimeRange.h',
@@ -29,9 +29,7 core_moc_headers = [
29 './include/Network/Downloader.h',
29 './include/Network/Downloader.h',
30 './include/Settings/SqpSettingsDefs.h',
30 './include/Settings/SqpSettingsDefs.h',
31 './include/Settings/ISqpSettingsBindable.h',
31 './include/Settings/ISqpSettingsBindable.h',
32 './include/DataSource/DataSourceController.h',
33 './include/DataSource/datasources.h',
32 './include/DataSource/datasources.h',
34 './include/DataSource/DataSourcesFilter.h',
35 './include/DataSource/DataSourceItem.h',
33 './include/DataSource/DataSourceItem.h',
36 './include/DataSource/DataSourceItemAction.h',
34 './include/DataSource/DataSourceItemAction.h',
37 './include/DataSource/DataSourceItemMergeHelper.h',
35 './include/DataSource/DataSourceItemMergeHelper.h',
@@ -53,7 +51,7 core_moc_sources = ['src/Network/Downloader.cpp']
53
51
54 core_moc_files = qt5.preprocess(moc_headers : core_moc_headers, moc_sources: core_moc_sources)
52 core_moc_files = qt5.preprocess(moc_headers : core_moc_headers, moc_sources: core_moc_sources)
55
53
56 core_sources = ['./src/Common/MimeTypesDef.cpp',
54 core_sources = ['./src/MimeTypes/MimeTypes.cpp',
57 './src/Common/SignalWaiter.cpp',
55 './src/Common/SignalWaiter.cpp',
58 './src/Common/DateUtils.cpp',
56 './src/Common/DateUtils.cpp',
59 './src/Network/Downloader.cpp',
57 './src/Network/Downloader.cpp',
@@ -62,9 +60,7 core_sources = ['./src/Common/MimeTypesDef.cpp',
62 './src/DataSource/DataSourceItemAction.cpp',
60 './src/DataSource/DataSourceItemAction.cpp',
63 './src/DataSource/DataSourceItemMergeHelper.cpp',
61 './src/DataSource/DataSourceItemMergeHelper.cpp',
64 './src/DataSource/DataSourceItem.cpp',
62 './src/DataSource/DataSourceItem.cpp',
65 './src/DataSource/DataSourceController.cpp',
66 './src/DataSource/datasources.cpp',
63 './src/DataSource/datasources.cpp',
67 './src/DataSource/DataSourcesFilter.cpp',
68 './src/Time/TimeController.cpp',
64 './src/Time/TimeController.cpp',
69 './src/PluginManager/PluginManager.cpp',
65 './src/PluginManager/PluginManager.cpp',
70 './src/Version.cpp',
66 './src/Version.cpp',
@@ -149,6 +149,21 void DataSourceItem::setIcon(const QString& iconName)
149 impl->setIcon(iconName);
149 impl->setIcon(iconName);
150 }
150 }
151
151
152 QString DataSourceItem::path() const noexcept
153 {
154 std::vector<QString> path_list;
155 path_list.push_back(name());
156 auto node= parentItem();
157 while( node!=nullptr)
158 {
159 path_list.push_back(node->name());
160 node = node->parentItem();
161 }
162 QString path;
163 std::for_each(path_list.crbegin(),path_list.crend(),[&path](const auto& name){path.append('/'); path.append(name);});
164 return path;
165 }
166
152 DataSourceItem* DataSourceItem::parentItem() const noexcept
167 DataSourceItem* DataSourceItem::parentItem() const noexcept
153 {
168 {
154 return impl->m_Parent;
169 return impl->m_Parent;
@@ -24,8 +24,8
24
24
25 #include "DataSource/datasources.h"
25 #include "DataSource/datasources.h"
26
26
27 #include "Common/MimeTypesDef.h"
28 #include "DataSource/DataSourceItemAction.h"
27 #include "DataSource/DataSourceItemAction.h"
28 #include "MimeTypes/MimeTypes.h"
29 #include "containers/algorithms.hpp"
29 #include "containers/algorithms.hpp"
30
30
31 #include <QDataStream>
31 #include <QDataStream>
@@ -118,8 +118,6 make_product_item(const QString& name, QVariantHash& metaData,
118 // Adds plugin name to product metadata
118 // Adds plugin name to product metadata
119 // TODO re-consider adding a name attribute to DataSourceItem class
119 // TODO re-consider adding a name attribute to DataSourceItem class
120 result->setData(DataSourceItem::PLUGIN_DATA_KEY, DATA_SOURCE_NAME);
120 result->setData(DataSourceItem::PLUGIN_DATA_KEY, DATA_SOURCE_NAME);
121 // result->setData(DataSourceItem::ID_DATA_KEY,
122 // metaData.value(DataSourceItem::NAME_DATA_KEY));
123
121
124 // Add action to load product from DataSources
122 // Add action to load product from DataSources
125 result->addAction(std::make_unique<DataSourceItemAction>(
123 result->addAction(std::make_unique<DataSourceItemAction>(
@@ -154,25 +152,17 QVariant DataSources::data(const QModelIndex& index, int role) const
154
152
155 QMimeData* DataSources::mimeData(const QModelIndexList& indexes) const
153 QMimeData* DataSources::mimeData(const QModelIndexList& indexes) const
156 {
154 {
157 QVariantList productData;
155 std::vector<DataSourceItem*> items;
158 std::for_each(std::cbegin(indexes), std::cend(indexes),
156 std::for_each(std::cbegin(indexes), std::cend(indexes),
159 [&productData](const auto& index) {
157 [&items](const auto& index) {
160 if(index.isValid())
158 if(index.isValid())
161 {
159 {
162 DataSourceItem* item =
160 DataSourceItem* item =
163 static_cast<DataSourceItem*>(index.internalPointer());
161 static_cast<DataSourceItem*>(index.internalPointer());
164 if(item->isProductOrComponent())
162 if(item->isProductOrComponent()) { items.push_back(item); }
165 { productData.append(item->data()); }
166 }
163 }
167 });
164 });
168 // TODO refactor this later
165 return MIME::mimeData(items);
169 // maybe just an encode function
170 QByteArray encodedData;
171 QDataStream stream{&encodedData, QIODevice::WriteOnly};
172 stream << productData;
173 auto mimeData = new QMimeData;
174 mimeData->setData(MIME_TYPE_PRODUCT_LIST, encodedData);
175 return mimeData;
176 }
166 }
177
167
178 int DataSources::columnCount(const QModelIndex& parent) const
168 int DataSources::columnCount(const QModelIndex& parent) const
@@ -281,6 +271,12 void DataSources::createVariable(const DataSourceItem& item)
281 }
271 }
282 }
272 }
283
273
274 void DataSources::createVariable(const QString& path)
275 {
276 auto node = walk_tree(path, _root);
277 if(node != nullptr) { createVariable(*node); }
278 }
279
284 void DataSources::setIcon(const QString& path, const QString& iconName)
280 void DataSources::setIcon(const QString& path, const QString& iconName)
285 {
281 {
286 auto node = walk_tree(path, _root);
282 auto node = walk_tree(path, _root);
@@ -1,9 +1,8
1 #include <Common/DateUtils.h>
1 #include <Common/DateUtils.h>
2 #include <Common/MimeTypesDef.h>
2 #include <MimeTypes/MimeTypes.h>
3 #include <cpp_utils_qt/cpp_utils_qt.hpp>
3 #include <cpp_utils_qt/cpp_utils_qt.hpp>
4 #include <strings/algorithms.hpp>
4 #include <strings/algorithms.hpp>
5 #include <containers/algorithms.hpp>
5 #include <containers/algorithms.hpp>
6 #include <DataSource/DataSourceController.h>
7 #include <QMimeData>
6 #include <QMimeData>
8 #include <QSize>
7 #include <QSize>
9 #include <QTimer>
8 #include <QTimer>
@@ -166,7 +165,7 Qt::DropActions VariableModel2::supportedDragActions() const
166
165
167 QStringList VariableModel2::mimeTypes() const
166 QStringList VariableModel2::mimeTypes() const
168 {
167 {
169 return {MIME_TYPE_VARIABLE_LIST, MIME_TYPE_TIME_RANGE};
168 return {MIME::MIME_TYPE_VARIABLE_LIST, MIME::MIME_TYPE_TIME_RANGE};
170 }
169 }
171
170
172 QMimeData* VariableModel2::mimeData(const QModelIndexList& indexes) const
171 QMimeData* VariableModel2::mimeData(const QModelIndexList& indexes) const
@@ -193,13 +192,13 QMimeData* VariableModel2::mimeData(const QModelIndexList& indexes) const
193 }
192 }
194
193
195 auto variablesEncodedData = Variable2::mimeData(variables);
194 auto variablesEncodedData = Variable2::mimeData(variables);
196 mimeData->setData(MIME_TYPE_VARIABLE_LIST, variablesEncodedData);
195 mimeData->setData(MIME::MIME_TYPE_VARIABLE_LIST, variablesEncodedData);
197
196
198 if(variables.size() == 1)
197 if(variables.size() == 1)
199 {
198 {
200 // No time range MIME data if multiple variables are dragged
199 // No time range MIME data if multiple variables are dragged
201 auto timeEncodedData = TimeController::mimeDataForTimeRange(firstTimeRange);
200 auto timeEncodedData = TimeController::mimeDataForTimeRange(firstTimeRange);
202 mimeData->setData(MIME_TYPE_TIME_RANGE, timeEncodedData);
201 mimeData->setData(MIME::MIME_TYPE_TIME_RANGE, timeEncodedData);
203 }
202 }
204
203
205 return mimeData;
204 return mimeData;
@@ -211,9 +210,9 bool VariableModel2::canDropMimeData(const QMimeData* data,
211 {
210 {
212 Q_UNUSED(column);
211 Q_UNUSED(column);
213 // drop of a product
212 // drop of a product
214 return data->hasFormat(MIME_TYPE_PRODUCT_LIST) ||
213 return data->hasFormat(MIME::MIME_TYPE_PRODUCT_LIST) ||
215 (data->hasFormat(MIME_TYPE_TIME_RANGE) && parent.isValid() &&
214 (data->hasFormat(MIME::MIME_TYPE_TIME_RANGE) && parent.isValid() &&
216 !data->hasFormat(MIME_TYPE_VARIABLE_LIST));
215 !data->hasFormat(MIME::MIME_TYPE_VARIABLE_LIST));
217 }
216 }
218
217
219 bool VariableModel2::dropMimeData(const QMimeData* data, Qt::DropAction action,
218 bool VariableModel2::dropMimeData(const QMimeData* data, Qt::DropAction action,
@@ -222,23 +221,20 bool VariableModel2::dropMimeData(const QMimeData* data, Qt::DropAction action,
222 {
221 {
223 auto dropDone = false;
222 auto dropDone = false;
224
223
225 if(data->hasFormat(MIME_TYPE_PRODUCT_LIST))
224 if(data->hasFormat(MIME::MIME_TYPE_PRODUCT_LIST))
226 {
225 {
227 auto productList = DataSourceController::productsDataForMimeData(
226 auto productList = MIME::fromMimeData<MIME::IDS::PRODUCT_LIST>(data);
228 data->data(MIME_TYPE_PRODUCT_LIST));
227 for(auto product : productList)
229
230 for(auto metaData : productList)
231 {
228 {
232 emit createVariable(metaData.toHash());
229 emit createVariable(product.toString());
233 }
230 }
234
235 dropDone = true;
231 dropDone = true;
236 }
232 }
237 else if(data->hasFormat(MIME_TYPE_TIME_RANGE) && parent.isValid())
233 else if(data->hasFormat(MIME::MIME_TYPE_TIME_RANGE) && parent.isValid())
238 {
234 {
239 auto variable = _variables[parent.row()];
235 auto variable = _variables[parent.row()];
240 auto range =
236 auto range =
241 TimeController::timeRangeForMimeData(data->data(MIME_TYPE_TIME_RANGE));
237 TimeController::timeRangeForMimeData(data->data(MIME::MIME_TYPE_TIME_RANGE));
242
238
243 emit asyncChangeRange(variable, range);
239 emit asyncChangeRange(variable, range);
244
240
@@ -1,4 +1,3
1 #include "DataSource/DataSourcesFilter.h"
2 #include "DataSource/datasources.h"
1 #include "DataSource/datasources.h"
3 #include "TestProviders.h"
2 #include "TestProviders.h"
4
3
@@ -19,14 +19,6 tests = [
19 'deps': [sciqlop_core, qt5test]
19 'deps': [sciqlop_core, qt5test]
20 },
20 },
21 {
21 {
22 'name':'TestDataSourceController',
23 'sources': [
24 'DataSource/TestDataSourceController.cpp',
25 'DataSource/DataSourceItemBuilder.cpp'
26 ],
27 'deps': [sciqlop_core, qt5test]
28 },
29 {
30 'name':'TestDataSources',
22 'name':'TestDataSources',
31 'sources': [
23 'sources': [
32 'DataSource/TestDataSources.cpp'
24 'DataSource/TestDataSources.cpp'
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now