##// END OF EJS Templates
Merge pull request 341 from SciQLop-fork develop...
leroux -
r941:baf8c7fca294 merge
parent child
Show More
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
@@ -102,6 +102,9 public slots:
102 /// Update the temporal parameters of every selected variable to dateTime
102 /// Update the temporal parameters of every selected variable to dateTime
103 void onDateTimeOnSelection(const SqpRange &dateTime);
103 void onDateTimeOnSelection(const SqpRange &dateTime);
104
104
105 /// Update the temporal parameters of the specified variable
106 void onUpdateDateTime(std::shared_ptr<Variable> variable, const SqpRange &dateTime);
107
105
108
106 void onDataProvided(QUuid vIdentifier, const SqpRange &rangeRequested,
109 void onDataProvided(QUuid vIdentifier, const SqpRange &rangeRequested,
107 const SqpRange &cacheRangeRequested,
110 const SqpRange &cacheRangeRequested,
@@ -94,6 +94,7 public:
94 signals:
94 signals:
95 void abortProgessRequested(std::shared_ptr<Variable> variable);
95 void abortProgessRequested(std::shared_ptr<Variable> variable);
96 void requestVariable(const QVariantHash &productData);
96 void requestVariable(const QVariantHash &productData);
97 void requestVariableRangeUpdate(std::shared_ptr<Variable> variable, const SqpRange &range);
97
98
98 private:
99 private:
99 class VariableModelPrivate;
100 class VariableModelPrivate;
@@ -187,6 +187,8 VariableController::VariableController(QObject *parent)
187 connect(&impl->m_VariableAcquisitionWorkerThread, &QThread::finished,
187 connect(&impl->m_VariableAcquisitionWorkerThread, &QThread::finished,
188 impl->m_VariableAcquisitionWorker.get(), &VariableAcquisitionWorker::finalize);
188 impl->m_VariableAcquisitionWorker.get(), &VariableAcquisitionWorker::finalize);
189
189
190 connect(impl->m_VariableModel, &VariableModel::requestVariableRangeUpdate, this,
191 &VariableController::onUpdateDateTime);
190
192
191 impl->m_VariableAcquisitionWorkerThread.start();
193 impl->m_VariableAcquisitionWorkerThread.start();
192 }
194 }
@@ -385,21 +387,7 void VariableController::onDateTimeOnSelection(const SqpRange &dateTime)
385 if (auto selectedVariable
387 if (auto selectedVariable
386 = impl->m_VariableModel->variable(qAsConst(selectedRows).first().row())) {
388 = impl->m_VariableModel->variable(qAsConst(selectedRows).first().row())) {
387
389
388 auto itVar = impl->m_VariableToIdentifierMap.find(selectedVariable);
390 onUpdateDateTime(selectedVariable, dateTime);
389 if (itVar == impl->m_VariableToIdentifierMap.cend()) {
390 qCCritical(LOG_VariableController())
391 << tr("Impossible to onDateTimeOnSelection request for unknown variable");
392 return;
393 }
394
395 // notify that rescale operation has to be done
396 emit rangeChanged(selectedVariable, dateTime);
397
398 auto synchro = impl->m_VariableIdGroupIdMap.find(itVar->second)
399 != impl->m_VariableIdGroupIdMap.cend();
400
401 this->onRequestDataLoading(QVector<std::shared_ptr<Variable> >{selectedVariable},
402 dateTime, synchro);
403 }
391 }
404 }
392 }
405 else if (selectedRows.size() > 1) {
393 else if (selectedRows.size() > 1) {
@@ -412,6 +400,25 void VariableController::onDateTimeOnSelection(const SqpRange &dateTime)
412 }
400 }
413 }
401 }
414
402
403 void VariableController::onUpdateDateTime(std::shared_ptr<Variable> variable,
404 const SqpRange &dateTime)
405 {
406 auto itVar = impl->m_VariableToIdentifierMap.find(variable);
407 if (itVar == impl->m_VariableToIdentifierMap.cend()) {
408 qCCritical(LOG_VariableController())
409 << tr("Impossible to onDateTimeOnSelection request for unknown variable");
410 return;
411 }
412
413 // notify that rescale operation has to be done
414 emit rangeChanged(variable, dateTime);
415
416 auto synchro
417 = impl->m_VariableIdGroupIdMap.find(itVar->second) != impl->m_VariableIdGroupIdMap.cend();
418
419 this->onRequestDataLoading(QVector<std::shared_ptr<Variable> >{variable}, dateTime, synchro);
420 }
421
415 void VariableController::onDataProvided(QUuid vIdentifier, const SqpRange &rangeRequested,
422 void VariableController::onDataProvided(QUuid vIdentifier, const SqpRange &rangeRequested,
416 const SqpRange &cacheRangeRequested,
423 const SqpRange &cacheRangeRequested,
417 QVector<AcquisitionDataPacket> dataAcquired)
424 QVector<AcquisitionDataPacket> dataAcquired)
@@ -13,6 +13,7
13
13
14 #include <QMimeData>
14 #include <QMimeData>
15 #include <QSize>
15 #include <QSize>
16 #include <QTimer>
16 #include <unordered_map>
17 #include <unordered_map>
17
18
18 Q_LOGGING_CATEGORY(LOG_VariableModel, "VariableModel")
19 Q_LOGGING_CATEGORY(LOG_VariableModel, "VariableModel")
@@ -322,7 +323,9 bool VariableModel::canDropMimeData(const QMimeData *data, Qt::DropAction action
322 int column, const QModelIndex &parent) const
323 int column, const QModelIndex &parent) const
323 {
324 {
324 // drop of a product
325 // drop of a product
325 return data->hasFormat(MIME_TYPE_PRODUCT_LIST);
326 return data->hasFormat(MIME_TYPE_PRODUCT_LIST)
327 || (data->hasFormat(MIME_TYPE_TIME_RANGE) && parent.isValid()
328 && !data->hasFormat(MIME_TYPE_VARIABLE_LIST));
326 }
329 }
327
330
328 bool VariableModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column,
331 bool VariableModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column,
@@ -341,6 +344,14 bool VariableModel::dropMimeData(const QMimeData *data, Qt::DropAction action, i
341
344
342 dropDone = true;
345 dropDone = true;
343 }
346 }
347 else if (data->hasFormat(MIME_TYPE_TIME_RANGE) && parent.isValid()) {
348 auto variable = this->variable(parent.row());
349 auto range = TimeController::timeRangeForMimeData(data->data(MIME_TYPE_TIME_RANGE));
350
351 emit requestVariableRangeUpdate(variable, range);
352
353 dropDone = true;
354 }
344
355
345 return dropDone;
356 return dropDone;
346 }
357 }
@@ -10,7 +10,7 class MacScrollBarStyle : public QProxyStyle {
10
10
11 public:
11 public:
12 int styleHint(StyleHint hint, const QStyleOption *option, const QWidget *widget,
12 int styleHint(StyleHint hint, const QStyleOption *option, const QWidget *widget,
13 QStyleHintReturn *returnData) const;
13 QStyleHintReturn *returnData) const override;
14
14
15 void selfInstallOn(QWidget *widget, bool installOnSubWidgets);
15 void selfInstallOn(QWidget *widget, bool installOnSubWidgets);
16 };
16 };
@@ -23,7 +23,7 signals:
23 void dropOccuredOnWidget(VisualizationDragWidget *dragWidget, const QMimeData *mimeData);
23 void dropOccuredOnWidget(VisualizationDragWidget *dragWidget, const QMimeData *mimeData);
24
24
25 public:
25 public:
26 enum class DropBehavior { Inserted, Merged, InsertedAndMerged };
26 enum class DropBehavior { Inserted, Merged, InsertedAndMerged, Forbidden };
27 using AcceptMimeDataFunction = std::function<bool(const QMimeData *mimeData)>;
27 using AcceptMimeDataFunction = std::function<bool(const QMimeData *mimeData)>;
28
28
29 VisualizationDragDropContainer(QWidget *parent = nullptr);
29 VisualizationDragDropContainer(QWidget *parent = nullptr);
@@ -31,7 +31,7 public:
31 void addDragWidget(VisualizationDragWidget *dragWidget);
31 void addDragWidget(VisualizationDragWidget *dragWidget);
32 void insertDragWidget(int index, VisualizationDragWidget *dragWidget);
32 void insertDragWidget(int index, VisualizationDragWidget *dragWidget);
33
33
34 void addAcceptedMimeType(const QString &mimeType, DropBehavior behavior);
34 void setMimeType(const QString &mimeType, DropBehavior behavior);
35
35
36 int countDragWidget() const;
36 int countDragWidget() const;
37
37
@@ -12,5 +12,6
12 <file>icones/previous.png</file>
12 <file>icones/previous.png</file>
13 <file>icones/unplot.png</file>
13 <file>icones/unplot.png</file>
14 <file>icones/up.png</file>
14 <file>icones/up.png</file>
15 <file>icones/time.png</file>
15 </qresource>
16 </qresource>
16 </RCC>
17 </RCC>
@@ -94,7 +94,7 void TimeWidget::dragEnterEvent(QDragEnterEvent *event)
94
94
95 void TimeWidget::dragLeaveEvent(QDragLeaveEvent *event)
95 void TimeWidget::dragLeaveEvent(QDragLeaveEvent *event)
96 {
96 {
97 setStyleSheet(QString());
97 setStyleSheet(QString{});
98 }
98 }
99
99
100 void TimeWidget::dropEvent(QDropEvent *event)
100 void TimeWidget::dropEvent(QDropEvent *event)
@@ -109,7 +109,7 void TimeWidget::dropEvent(QDropEvent *event)
109 event->ignore();
109 event->ignore();
110 }
110 }
111
111
112 setStyleSheet(QString());
112 setStyleSheet(QString{});
113 }
113 }
114
114
115
115
@@ -142,10 +142,8 void TimeWidget::mouseMoveEvent(QMouseEvent *event)
142
142
143 drag->setMimeData(mimeData);
143 drag->setMimeData(mimeData);
144
144
145 auto pixmap = QPixmap(size());
145 auto pixmap = QPixmap{":/icones/time.png"};
146 render(&pixmap);
146 drag->setPixmap(pixmap.scaledToWidth(22));
147 drag->setPixmap(pixmap);
148 drag->setHotSpot(impl->m_DragStartPosition);
149
147
150 sqpApp->dragDropHelper().resetDragAndDrop();
148 sqpApp->dragDropHelper().resetDragAndDrop();
151
149
@@ -14,6 +14,8
14
14
15 Q_LOGGING_CATEGORY(LOG_VisualizationDragDropContainer, "VisualizationDragDropContainer")
15 Q_LOGGING_CATEGORY(LOG_VisualizationDragDropContainer, "VisualizationDragDropContainer")
16
16
17 auto DRAGGED_MINIATURE_WIDTH = 200; // in pixels
18
17 struct VisualizationDragDropContainer::VisualizationDragDropContainerPrivate {
19 struct VisualizationDragDropContainer::VisualizationDragDropContainerPrivate {
18
20
19 QVBoxLayout *m_Layout;
21 QVBoxLayout *m_Layout;
@@ -34,18 +36,33 struct VisualizationDragDropContainer::VisualizationDragDropContainerPrivate {
34
36
35 bool acceptMimeData(const QMimeData *data) const
37 bool acceptMimeData(const QMimeData *data) const
36 {
38 {
37 for (const auto &type : m_AcceptedMimeTypes.keys()) {
39 auto accepted = false;
38 if (data->hasFormat(type) && m_AcceptMimeDataFun(data)) {
40 for (auto it = m_AcceptedMimeTypes.constBegin(); it != m_AcceptedMimeTypes.constEnd();
39 return true;
41 ++it) {
42 const auto &type = it.key();
43 const auto &behavior = it.value();
44
45 if (data->hasFormat(type)) {
46 if (behavior != DropBehavior::Forbidden) {
47 accepted = true;
48 }
49 else {
50 accepted = false;
51 break;
52 }
40 }
53 }
41 }
54 }
42
55
43 return false;
56 if (accepted) {
57 accepted = m_AcceptMimeDataFun(data);
58 }
59
60 return accepted;
44 }
61 }
45
62
46 bool allowMergeForMimeData(const QMimeData *data) const
63 bool allowMergeForMimeData(const QMimeData *data) const
47 {
64 {
48 bool result = false;
65 auto result = false;
49 for (auto it = m_AcceptedMimeTypes.constBegin(); it != m_AcceptedMimeTypes.constEnd();
66 for (auto it = m_AcceptedMimeTypes.constBegin(); it != m_AcceptedMimeTypes.constEnd();
50 ++it) {
67 ++it) {
51
68
@@ -106,7 +123,9 struct VisualizationDragDropContainer::VisualizationDragDropContainerPrivate {
106
123
107 bool cursorIsInContainer(QWidget *container) const
124 bool cursorIsInContainer(QWidget *container) const
108 {
125 {
109 return container->isAncestorOf(sqpApp->widgetAt(QCursor::pos()));
126 auto widgetUnderMouse = sqpApp->widgetAt(QCursor::pos());
127 return container->isAncestorOf(widgetUnderMouse) && widgetUnderMouse != container
128 && sqpApp->dragDropHelper().placeHolder().isAncestorOf(widgetUnderMouse);
110 }
129 }
111
130
112 int countDragWidget(const QWidget *parent, bool onlyVisible = false) const
131 int countDragWidget(const QWidget *parent, bool onlyVisible = false) const
@@ -151,7 +170,7 void VisualizationDragDropContainer::insertDragWidget(int index,
151 &VisualizationDragDropContainer::startDrag);
170 &VisualizationDragDropContainer::startDrag);
152 }
171 }
153
172
154 void VisualizationDragDropContainer::addAcceptedMimeType(
173 void VisualizationDragDropContainer::setMimeType(
155 const QString &mimeType, VisualizationDragDropContainer::DropBehavior behavior)
174 const QString &mimeType, VisualizationDragDropContainer::DropBehavior behavior)
156 {
175 {
157 impl->m_AcceptedMimeTypes[mimeType] = behavior;
176 impl->m_AcceptedMimeTypes[mimeType] = behavior;
@@ -183,14 +202,14 void VisualizationDragDropContainer::startDrag(VisualizationDragWidget *dragWidg
183
202
184 // Note: The management of the drag object is done by Qt
203 // Note: The management of the drag object is done by Qt
185 auto drag = new QDrag{dragWidget};
204 auto drag = new QDrag{dragWidget};
186 drag->setHotSpot(dragPosition);
187
205
188 auto mimeData = dragWidget->mimeData();
206 auto mimeData = dragWidget->mimeData();
189 drag->setMimeData(mimeData);
207 drag->setMimeData(mimeData);
190
208
191 auto pixmap = QPixmap(dragWidget->size());
209 auto pixmap = QPixmap(dragWidget->size());
192 dragWidget->render(&pixmap);
210 dragWidget->render(&pixmap);
193 drag->setPixmap(pixmap);
211 drag->setPixmap(pixmap.scaled(DRAGGED_MINIATURE_WIDTH, DRAGGED_MINIATURE_WIDTH,
212 Qt::KeepAspectRatio, Qt::SmoothTransformation));
194
213
195 auto image = pixmap.toImage();
214 auto image = pixmap.toImage();
196 mimeData->setImageData(image);
215 mimeData->setImageData(image);
@@ -374,7 +393,7 void VisualizationDragDropContainer::VisualizationDragDropContainerPrivate::find
374 auto &helper = sqpApp->dragDropHelper();
393 auto &helper = sqpApp->dragDropHelper();
375
394
376 auto absPos = container->mapToGlobal(pos);
395 auto absPos = container->mapToGlobal(pos);
377 auto isOnPlaceHolder = sqpApp->widgetAt(absPos) == &(helper.placeHolder());
396 auto isOnPlaceHolder = helper.placeHolder().isAncestorOf(sqpApp->widgetAt(absPos));
378
397
379 if (countDragWidget(container, true) == 0) {
398 if (countDragWidget(container, true) == 0) {
380 // Drop on an empty container, just add the placeHolder at the top
399 // Drop on an empty container, just add the placeHolder at the top
@@ -79,13 +79,14 VisualizationTabWidget::VisualizationTabWidget(const QString &name, QWidget *par
79 #endif
79 #endif
80
80
81 ui->dragDropContainer->setPlaceHolderType(DragDropHelper::PlaceHolderType::Zone, "Zone");
81 ui->dragDropContainer->setPlaceHolderType(DragDropHelper::PlaceHolderType::Zone, "Zone");
82 ui->dragDropContainer->layout()->setContentsMargins(0, 0, 0, 5);
82 ui->dragDropContainer->layout()->setContentsMargins(0, 0, 0, 12);
83 ui->dragDropContainer->addAcceptedMimeType(
83 ui->dragDropContainer->layout()->setSpacing(0);
84 MIME_TYPE_GRAPH, VisualizationDragDropContainer::DropBehavior::Inserted);
84 ui->dragDropContainer->setMimeType(MIME_TYPE_GRAPH,
85 ui->dragDropContainer->addAcceptedMimeType(
85 VisualizationDragDropContainer::DropBehavior::Inserted);
86 MIME_TYPE_ZONE, VisualizationDragDropContainer::DropBehavior::Inserted);
86 ui->dragDropContainer->setMimeType(MIME_TYPE_ZONE,
87 ui->dragDropContainer->addAcceptedMimeType(
87 VisualizationDragDropContainer::DropBehavior::Inserted);
88 MIME_TYPE_VARIABLE_LIST, VisualizationDragDropContainer::DropBehavior::Inserted);
88 ui->dragDropContainer->setMimeType(MIME_TYPE_VARIABLE_LIST,
89 VisualizationDragDropContainer::DropBehavior::Inserted);
89
90
90 ui->dragDropContainer->setAcceptMimeDataFunction([this](auto mimeData) {
91 ui->dragDropContainer->setAcceptMimeDataFunction([this](auto mimeData) {
91 return sqpApp->dragDropHelper().checkMimeDataForVisualization(mimeData,
92 return sqpApp->dragDropHelper().checkMimeDataForVisualization(mimeData,
@@ -102,12 +102,14 VisualizationZoneWidget::VisualizationZoneWidget(const QString &name, QWidget *p
102 ui->zoneNameLabel->setText(name);
102 ui->zoneNameLabel->setText(name);
103
103
104 ui->dragDropContainer->setPlaceHolderType(DragDropHelper::PlaceHolderType::Graph);
104 ui->dragDropContainer->setPlaceHolderType(DragDropHelper::PlaceHolderType::Graph);
105 ui->dragDropContainer->addAcceptedMimeType(
105 ui->dragDropContainer->setMimeType(MIME_TYPE_GRAPH,
106 MIME_TYPE_GRAPH, VisualizationDragDropContainer::DropBehavior::Inserted);
106 VisualizationDragDropContainer::DropBehavior::Inserted);
107 ui->dragDropContainer->addAcceptedMimeType(
107 ui->dragDropContainer->setMimeType(
108 MIME_TYPE_VARIABLE_LIST, VisualizationDragDropContainer::DropBehavior::InsertedAndMerged);
108 MIME_TYPE_VARIABLE_LIST, VisualizationDragDropContainer::DropBehavior::InsertedAndMerged);
109 ui->dragDropContainer->addAcceptedMimeType(
109 ui->dragDropContainer->setMimeType(MIME_TYPE_TIME_RANGE,
110 MIME_TYPE_TIME_RANGE, VisualizationDragDropContainer::DropBehavior::Merged);
110 VisualizationDragDropContainer::DropBehavior::Merged);
111 ui->dragDropContainer->setMimeType(MIME_TYPE_ZONE,
112 VisualizationDragDropContainer::DropBehavior::Forbidden);
111 ui->dragDropContainer->setAcceptMimeDataFunction([this](auto mimeData) {
113 ui->dragDropContainer->setAcceptMimeDataFunction([this](auto mimeData) {
112 return sqpApp->dragDropHelper().checkMimeDataForVisualization(mimeData,
114 return sqpApp->dragDropHelper().checkMimeDataForVisualization(mimeData,
113 ui->dragDropContainer);
115 ui->dragDropContainer);
@@ -332,6 +334,11 QMimeData *VisualizationZoneWidget::mimeData() const
332 auto mimeData = new QMimeData;
334 auto mimeData = new QMimeData;
333 mimeData->setData(MIME_TYPE_ZONE, QByteArray{});
335 mimeData->setData(MIME_TYPE_ZONE, QByteArray{});
334
336
337 if (auto firstGraph = impl->firstGraph(this)) {
338 auto timeRangeData = TimeController::mimeDataForTimeRange(firstGraph->graphRange());
339 mimeData->setData(MIME_TYPE_TIME_RANGE, timeRangeData);
340 }
341
335 return mimeData;
342 return mimeData;
336 }
343 }
337
344
@@ -27,7 +27,7
27 <number>0</number>
27 <number>0</number>
28 </property>
28 </property>
29 <property name="bottomMargin">
29 <property name="bottomMargin">
30 <number>0</number>
30 <number>6</number>
31 </property>
31 </property>
32 <item>
32 <item>
33 <widget class="QWidget" name="infobar" native="true">
33 <widget class="QWidget" name="infobar" native="true">
General Comments 0
You need to be logged in to leave comments. Login now