##// END OF EJS Templates
Drop of events on a catalogue
trabillard -
r1261:829045cd6b75
parent child
Show More
@@ -62,6 +62,12 public:
62
62
63 void saveAll();
63 void saveAll();
64
64
65 /// Returns the MIME data associated to a list of variables
66 QByteArray mimeDataForEvents(const QVector<std::shared_ptr<DBEvent> > &events) const;
67
68 /// Returns the list of variables contained in a MIME data
69 QVector<std::shared_ptr<DBEvent> > eventsForMimeData(const QByteArray &mimeData) const;
70
65 public slots:
71 public slots:
66 /// Manage init/end of the controller
72 /// Manage init/end of the controller
67 void initialize();
73 void initialize();
@@ -12,6 +12,7
12 #include <DBTag.h>
12 #include <DBTag.h>
13 #include <IRequestPredicate.h>
13 #include <IRequestPredicate.h>
14
14
15 #include <QDataStream>
15 #include <QMutex>
16 #include <QMutex>
16 #include <QThread>
17 #include <QThread>
17
18
@@ -236,6 +237,46 void CatalogueController::saveAll()
236 impl->savAllDB();
237 impl->savAllDB();
237 }
238 }
238
239
240 QByteArray
241 CatalogueController::mimeDataForEvents(const QVector<std::shared_ptr<DBEvent> > &events) const
242 {
243 auto encodedData = QByteArray{};
244
245 QMap<QString, QVariantList> idsPerRepository;
246 for (auto event : events) {
247 idsPerRepository[event->getRepository()] << event->getUniqId();
248 }
249
250 QDataStream stream{&encodedData, QIODevice::WriteOnly};
251 stream << idsPerRepository;
252
253 return encodedData;
254 }
255
256 QVector<std::shared_ptr<DBEvent> >
257 CatalogueController::eventsForMimeData(const QByteArray &mimeData) const
258 {
259 auto events = QVector<std::shared_ptr<DBEvent> >{};
260 QDataStream stream{mimeData};
261
262 QMap<QString, QVariantList> idsPerRepository;
263 stream >> idsPerRepository;
264
265 for (auto it = idsPerRepository.cbegin(); it != idsPerRepository.cend(); ++it) {
266 auto repository = it.key();
267 auto allRepositoryEvent = retrieveEvents(repository);
268 for (auto uuid : it.value()) {
269 for (auto repositoryEvent : allRepositoryEvent) {
270 if (uuid.toUuid() == repositoryEvent->getUniqId()) {
271 events << repositoryEvent;
272 }
273 }
274 }
275 }
276
277 return events;
278 }
279
239 void CatalogueController::initialize()
280 void CatalogueController::initialize()
240 {
281 {
241 qCDebug(LOG_CatalogueController()) << tr("CatalogueController init")
282 qCDebug(LOG_CatalogueController()) << tr("CatalogueController init")
@@ -25,6 +25,7 public:
25 virtual Qt::ItemFlags flags(int column) const;
25 virtual Qt::ItemFlags flags(int column) const;
26 virtual bool setData(int column, int role, const QVariant &value);
26 virtual bool setData(int column, int role, const QVariant &value);
27 virtual bool canDropMimeData(const QMimeData *data, Qt::DropAction action);
27 virtual bool canDropMimeData(const QMimeData *data, Qt::DropAction action);
28 virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action);
28
29
29 private:
30 private:
30 class CatalogueAbstractTreeItemPrivate;
31 class CatalogueAbstractTreeItemPrivate;
@@ -15,6 +15,7 public:
15 bool setData(int column, int role, const QVariant &value) override;
15 bool setData(int column, int role, const QVariant &value) override;
16 Qt::ItemFlags flags(int column) const override;
16 Qt::ItemFlags flags(int column) const override;
17 bool canDropMimeData(const QMimeData *data, Qt::DropAction action) override;
17 bool canDropMimeData(const QMimeData *data, Qt::DropAction action) override;
18 bool dropMimeData(const QMimeData *data, Qt::DropAction action) override;
18
19
19 /// Returns the catalogue represented by the item
20 /// Returns the catalogue represented by the item
20 std::shared_ptr<DBCatalogue> catalogue() const;
21 std::shared_ptr<DBCatalogue> catalogue() const;
@@ -16,6 +16,7 class CatalogueTreeModel : public QAbstractItemModel {
16
16
17 signals:
17 signals:
18 void itemRenamed(const QModelIndex &index);
18 void itemRenamed(const QModelIndex &index);
19 void itemDropped(const QModelIndex &parentIndex);
19
20
20 public:
21 public:
21 CatalogueTreeModel(QObject *parent = nullptr);
22 CatalogueTreeModel(QObject *parent = nullptr);
@@ -1,5 +1,6
1 #include "Catalogue/CatalogueEventsModel.h"
1 #include "Catalogue/CatalogueEventsModel.h"
2
2
3 #include <Catalogue/CatalogueController.h>
3 #include <Common/DateUtils.h>
4 #include <Common/DateUtils.h>
4 #include <Common/MimeTypesDef.h>
5 #include <Common/MimeTypesDef.h>
5 #include <DBEvent.h>
6 #include <DBEvent.h>
@@ -370,7 +371,7 void CatalogueEventsModel::sort(int column, Qt::SortOrder order)
370
371
371 Qt::DropActions CatalogueEventsModel::supportedDragActions() const
372 Qt::DropActions CatalogueEventsModel::supportedDragActions() const
372 {
373 {
373 return Qt::CopyAction | Qt::MoveAction;
374 return Qt::CopyAction;
374 }
375 }
375
376
376 QStringList CatalogueEventsModel::mimeTypes() const
377 QStringList CatalogueEventsModel::mimeTypes() const
@@ -415,9 +416,10 QMimeData *CatalogueEventsModel::mimeData(const QModelIndexList &indexes) const
415 }
416 }
416 }
417 }
417
418
418 auto eventsEncodedData
419 if (!eventList.isEmpty() && eventProductList.isEmpty()) {
419 = QByteArray{}; // sqpApp->catalogueController().->mimeDataForEvents(eventList); //TODO
420 auto eventsEncodedData = sqpApp->catalogueController().mimeDataForEvents(eventList);
420 mimeData->setData(MIME_TYPE_EVENT_LIST, eventsEncodedData);
421 mimeData->setData(MIME_TYPE_EVENT_LIST, eventsEncodedData);
422 }
421
423
422 if (eventList.count() + eventProductList.count() == 1) {
424 if (eventList.count() + eventProductList.count() == 1) {
423 // No time range MIME data if multiple events are dragged
425 // No time range MIME data if multiple events are dragged
@@ -35,6 +35,62 struct CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate {
35 CatalogueTreeItem *getCatalogueItem(const std::shared_ptr<DBCatalogue> &catalogue) const;
35 CatalogueTreeItem *getCatalogueItem(const std::shared_ptr<DBCatalogue> &catalogue) const;
36 void setHasChanges(bool value, const QModelIndex &index, QTreeView *treeView);
36 void setHasChanges(bool value, const QModelIndex &index, QTreeView *treeView);
37 bool hasChanges(const QModelIndex &index, QTreeView *treeView);
37 bool hasChanges(const QModelIndex &index, QTreeView *treeView);
38
39 int selectionType(QTreeView *treeView) const
40 {
41 auto selectedItems = treeView->selectionModel()->selectedRows();
42 if (selectedItems.isEmpty()) {
43 return CatalogueAbstractTreeItem::DEFAULT_TYPE;
44 }
45 else {
46 auto firstIndex = selectedItems.first();
47 auto firstItem = m_TreeModel->item(firstIndex);
48 if (!firstItem) {
49 Q_ASSERT(false);
50 return CatalogueAbstractTreeItem::DEFAULT_TYPE;
51 }
52 auto selectionType = firstItem->type();
53
54 for (auto itemIndex : selectedItems) {
55 auto item = m_TreeModel->item(itemIndex);
56 if (!item || item->type() != selectionType) {
57 // Incoherent multi selection
58 selectionType = CatalogueAbstractTreeItem::DEFAULT_TYPE;
59 break;
60 }
61 }
62
63 return selectionType;
64 }
65 }
66
67 QVector<std::shared_ptr<DBCatalogue> > selectedCatalogues(QTreeView *treeView) const
68 {
69 QVector<std::shared_ptr<DBCatalogue> > catalogues;
70 auto selectedItems = treeView->selectionModel()->selectedRows();
71 for (auto itemIndex : selectedItems) {
72 auto item = m_TreeModel->item(itemIndex);
73 if (item && item->type() == CATALOGUE_ITEM_TYPE) {
74 catalogues.append(static_cast<CatalogueTreeItem *>(item)->catalogue());
75 }
76 }
77
78 return catalogues;
79 }
80
81 QStringList selectedRepositories(QTreeView *treeView) const
82 {
83 QStringList repositories;
84 auto selectedItems = treeView->selectionModel()->selectedRows();
85 for (auto itemIndex : selectedItems) {
86 auto item = m_TreeModel->item(itemIndex);
87 if (item && item->type() == DATABASE_ITEM_TYPE) {
88 repositories.append(item->text());
89 }
90 }
91
92 return repositories;
93 }
38 };
94 };
39
95
40 CatalogueSideBarWidget::CatalogueSideBarWidget(QWidget *parent)
96 CatalogueSideBarWidget::CatalogueSideBarWidget(QWidget *parent)
@@ -55,63 +111,25 CatalogueSideBarWidget::CatalogueSideBarWidget(QWidget *parent)
55
111
56 auto emitSelection = [this]() {
112 auto emitSelection = [this]() {
57
113
58 auto selectedItems = ui->treeView->selectionModel()->selectedRows();
114 auto selectionType = impl->selectionType(ui->treeView);
59 if (selectedItems.isEmpty()) {
115
60 emit this->selectionCleared();
116 switch (selectionType) {
117 case CATALOGUE_ITEM_TYPE:
118 emit this->catalogueSelected(impl->selectedCatalogues(ui->treeView));
119 break;
120 case DATABASE_ITEM_TYPE:
121 emit this->databaseSelected(impl->selectedRepositories(ui->treeView));
122 break;
123 case ALL_EVENT_ITEM_TYPE:
124 emit this->allEventsSelected();
125 break;
126 case TRASH_ITEM_TYPE:
127 emit this->trashSelected();
128 break;
129 default:
130 emit this->selectionCleared();
131 break;
61 }
132 }
62 else {
63 QVector<std::shared_ptr<DBCatalogue> > catalogues;
64 QStringList databases;
65 auto firstIndex = selectedItems.first();
66 auto firstItem = impl->m_TreeModel->item(firstIndex);
67 if (!firstItem) {
68 Q_ASSERT(false);
69 return;
70 }
71 auto selectionType = firstItem->type();
72
73 for (auto itemIndex : selectedItems) {
74 auto item = impl->m_TreeModel->item(itemIndex);
75 if (item && item->type() == selectionType) {
76 switch (selectionType) {
77 case CATALOGUE_ITEM_TYPE:
78 catalogues.append(static_cast<CatalogueTreeItem *>(item)->catalogue());
79 break;
80 case DATABASE_ITEM_TYPE:
81 databases.append(item->text());
82 case ALL_EVENT_ITEM_TYPE: // fallthrough
83 case TRASH_ITEM_TYPE: // fallthrough
84 default:
85 break;
86 }
87 }
88 else {
89 // Incoherent multi selection
90 selectionType = -1;
91 break;
92 }
93 }
94
95 switch (selectionType) {
96 case CATALOGUE_ITEM_TYPE:
97 emit this->catalogueSelected(catalogues);
98 break;
99 case DATABASE_ITEM_TYPE:
100 emit this->databaseSelected(databases);
101 break;
102 case ALL_EVENT_ITEM_TYPE:
103 emit this->allEventsSelected();
104 break;
105 case TRASH_ITEM_TYPE:
106 emit this->trashSelected();
107 break;
108 default:
109 emit this->selectionCleared();
110 break;
111 }
112 }
113
114
115 };
133 };
116
134
117 connect(ui->treeView, &QTreeView::clicked, emitSelection);
135 connect(ui->treeView, &QTreeView::clicked, emitSelection);
@@ -72,3 +72,10 bool CatalogueAbstractTreeItem::canDropMimeData(const QMimeData *data, Qt::DropA
72 Q_UNUSED(action);
72 Q_UNUSED(action);
73 return false;
73 return false;
74 }
74 }
75
76 bool CatalogueAbstractTreeItem::dropMimeData(const QMimeData *data, Qt::DropAction action)
77 {
78 Q_UNUSED(data);
79 Q_UNUSED(action);
80 return false;
81 }
@@ -79,6 +79,16 bool CatalogueTreeItem::canDropMimeData(const QMimeData *data, Qt::DropAction ac
79 return data->hasFormat(MIME_TYPE_EVENT_LIST);
79 return data->hasFormat(MIME_TYPE_EVENT_LIST);
80 }
80 }
81
81
82 bool CatalogueTreeItem::dropMimeData(const QMimeData *data, Qt::DropAction action)
83 {
84 Q_ASSERT(canDropMimeData(data, action));
85
86 auto events = sqpApp->catalogueController().eventsForMimeData(data->data(MIME_TYPE_EVENT_LIST));
87 // impl->m_Catalogue->addEvents(events); TODO: move events in the new catalogue
88 // Warning: Check that the events aren't already in the catalogue
89 // Also check for the repository !!!
90 }
91
82 std::shared_ptr<DBCatalogue> CatalogueTreeItem::catalogue() const
92 std::shared_ptr<DBCatalogue> CatalogueTreeItem::catalogue() const
83 {
93 {
84 return impl->m_Catalogue;
94 return impl->m_Catalogue;
@@ -43,7 +43,7 void CatalogueTreeModel::addChildItem(CatalogueAbstractTreeItem *child,
43 parentItem->addChild(child);
43 parentItem->addChild(child);
44 endInsertRows();
44 endInsertRows();
45
45
46 emit dataChanged(QModelIndex(), QModelIndex());
46 emit dataChanged(parentIndex, parentIndex);
47 }
47 }
48
48
49 CatalogueAbstractTreeItem *CatalogueTreeModel::item(const QModelIndex &index) const
49 CatalogueAbstractTreeItem *CatalogueTreeModel::item(const QModelIndex &index) const
@@ -176,7 +176,18 bool CatalogueTreeModel::canDropMimeData(const QMimeData *data, Qt::DropAction a
176 bool CatalogueTreeModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row,
176 bool CatalogueTreeModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row,
177 int column, const QModelIndex &parent)
177 int column, const QModelIndex &parent)
178 {
178 {
179 return false;
179 bool result = false;
180
181 auto draggedIndex = parent;
182 auto draggedItem = item(draggedIndex);
183 if (draggedItem) {
184 result = draggedItem->dropMimeData(data, action);
185 if (result) {
186 emit itemDropped(draggedIndex);
187 }
188 }
189
190 return result;
180 }
191 }
181
192
182 Qt::DropActions CatalogueTreeModel::supportedDropActions() const
193 Qt::DropActions CatalogueTreeModel::supportedDropActions() const
@@ -79,6 +79,9
79 <property name="dragDropMode">
79 <property name="dragDropMode">
80 <enum>QAbstractItemView::DragDrop</enum>
80 <enum>QAbstractItemView::DragDrop</enum>
81 </property>
81 </property>
82 <property name="selectionMode">
83 <enum>QAbstractItemView::ExtendedSelection</enum>
84 </property>
82 <attribute name="headerVisible">
85 <attribute name="headerVisible">
83 <bool>false</bool>
86 <bool>false</bool>
84 </attribute>
87 </attribute>
General Comments 0
You need to be logged in to leave comments. Login now