|
1 | NO CONTENT: new file 100644, binary diff hidden |
@@ -102,6 +102,9 public slots: | |||
|
102 | 102 | /// Update the temporal parameters of every selected variable to dateTime |
|
103 | 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 | 109 | void onDataProvided(QUuid vIdentifier, const SqpRange &rangeRequested, |
|
107 | 110 | const SqpRange &cacheRangeRequested, |
@@ -94,6 +94,7 public: | |||
|
94 | 94 | signals: |
|
95 | 95 | void abortProgessRequested(std::shared_ptr<Variable> variable); |
|
96 | 96 | void requestVariable(const QVariantHash &productData); |
|
97 | void requestVariableRangeUpdate(std::shared_ptr<Variable> variable, const SqpRange &range); | |
|
97 | 98 | |
|
98 | 99 | private: |
|
99 | 100 | class VariableModelPrivate; |
@@ -187,6 +187,8 VariableController::VariableController(QObject *parent) | |||
|
187 | 187 | connect(&impl->m_VariableAcquisitionWorkerThread, &QThread::finished, |
|
188 | 188 | impl->m_VariableAcquisitionWorker.get(), &VariableAcquisitionWorker::finalize); |
|
189 | 189 | |
|
190 | connect(impl->m_VariableModel, &VariableModel::requestVariableRangeUpdate, this, | |
|
191 | &VariableController::onUpdateDateTime); | |
|
190 | 192 | |
|
191 | 193 | impl->m_VariableAcquisitionWorkerThread.start(); |
|
192 | 194 | } |
@@ -385,21 +387,7 void VariableController::onDateTimeOnSelection(const SqpRange &dateTime) | |||
|
385 | 387 | if (auto selectedVariable |
|
386 | 388 | = impl->m_VariableModel->variable(qAsConst(selectedRows).first().row())) { |
|
387 | 389 | |
|
388 | auto itVar = impl->m_VariableToIdentifierMap.find(selectedVariable); | |
|
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); | |
|
390 | onUpdateDateTime(selectedVariable, dateTime); | |
|
403 | 391 | } |
|
404 | 392 | } |
|
405 | 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 | 422 | void VariableController::onDataProvided(QUuid vIdentifier, const SqpRange &rangeRequested, |
|
416 | 423 | const SqpRange &cacheRangeRequested, |
|
417 | 424 | QVector<AcquisitionDataPacket> dataAcquired) |
@@ -13,6 +13,7 | |||
|
13 | 13 | |
|
14 | 14 | #include <QMimeData> |
|
15 | 15 | #include <QSize> |
|
16 | #include <QTimer> | |
|
16 | 17 | #include <unordered_map> |
|
17 | 18 | |
|
18 | 19 | Q_LOGGING_CATEGORY(LOG_VariableModel, "VariableModel") |
@@ -322,7 +323,9 bool VariableModel::canDropMimeData(const QMimeData *data, Qt::DropAction action | |||
|
322 | 323 | int column, const QModelIndex &parent) const |
|
323 | 324 | { |
|
324 | 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 | 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 | 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 | 356 | return dropDone; |
|
346 | 357 | } |
@@ -10,7 +10,7 class MacScrollBarStyle : public QProxyStyle { | |||
|
10 | 10 | |
|
11 | 11 | public: |
|
12 | 12 | int styleHint(StyleHint hint, const QStyleOption *option, const QWidget *widget, |
|
13 | QStyleHintReturn *returnData) const; | |
|
13 | QStyleHintReturn *returnData) const override; | |
|
14 | 14 | |
|
15 | 15 | void selfInstallOn(QWidget *widget, bool installOnSubWidgets); |
|
16 | 16 | }; |
@@ -23,7 +23,7 signals: | |||
|
23 | 23 | void dropOccuredOnWidget(VisualizationDragWidget *dragWidget, const QMimeData *mimeData); |
|
24 | 24 | |
|
25 | 25 | public: |
|
26 | enum class DropBehavior { Inserted, Merged, InsertedAndMerged }; | |
|
26 | enum class DropBehavior { Inserted, Merged, InsertedAndMerged, Forbidden }; | |
|
27 | 27 | using AcceptMimeDataFunction = std::function<bool(const QMimeData *mimeData)>; |
|
28 | 28 | |
|
29 | 29 | VisualizationDragDropContainer(QWidget *parent = nullptr); |
@@ -31,7 +31,7 public: | |||
|
31 | 31 | void addDragWidget(VisualizationDragWidget *dragWidget); |
|
32 | 32 | void insertDragWidget(int index, VisualizationDragWidget *dragWidget); |
|
33 | 33 | |
|
34 |
void |
|
|
34 | void setMimeType(const QString &mimeType, DropBehavior behavior); | |
|
35 | 35 | |
|
36 | 36 | int countDragWidget() const; |
|
37 | 37 |
@@ -12,5 +12,6 | |||
|
12 | 12 | <file>icones/previous.png</file> |
|
13 | 13 | <file>icones/unplot.png</file> |
|
14 | 14 | <file>icones/up.png</file> |
|
15 | <file>icones/time.png</file> | |
|
15 | 16 | </qresource> |
|
16 | 17 | </RCC> |
@@ -94,7 +94,7 void TimeWidget::dragEnterEvent(QDragEnterEvent *event) | |||
|
94 | 94 | |
|
95 | 95 | void TimeWidget::dragLeaveEvent(QDragLeaveEvent *event) |
|
96 | 96 | { |
|
97 |
setStyleSheet(QString |
|
|
97 | setStyleSheet(QString{}); | |
|
98 | 98 | } |
|
99 | 99 | |
|
100 | 100 | void TimeWidget::dropEvent(QDropEvent *event) |
@@ -109,7 +109,7 void TimeWidget::dropEvent(QDropEvent *event) | |||
|
109 | 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 | 143 | drag->setMimeData(mimeData); |
|
144 | 144 | |
|
145 |
auto pixmap = QPixmap |
|
|
146 | render(&pixmap); | |
|
147 | drag->setPixmap(pixmap); | |
|
148 | drag->setHotSpot(impl->m_DragStartPosition); | |
|
145 | auto pixmap = QPixmap{":/icones/time.png"}; | |
|
146 | drag->setPixmap(pixmap.scaledToWidth(22)); | |
|
149 | 147 | |
|
150 | 148 | sqpApp->dragDropHelper().resetDragAndDrop(); |
|
151 | 149 |
@@ -14,6 +14,8 | |||
|
14 | 14 | |
|
15 | 15 | Q_LOGGING_CATEGORY(LOG_VisualizationDragDropContainer, "VisualizationDragDropContainer") |
|
16 | 16 | |
|
17 | auto DRAGGED_MINIATURE_WIDTH = 200; // in pixels | |
|
18 | ||
|
17 | 19 | struct VisualizationDragDropContainer::VisualizationDragDropContainerPrivate { |
|
18 | 20 | |
|
19 | 21 | QVBoxLayout *m_Layout; |
@@ -34,18 +36,33 struct VisualizationDragDropContainer::VisualizationDragDropContainerPrivate { | |||
|
34 | 36 | |
|
35 | 37 | bool acceptMimeData(const QMimeData *data) const |
|
36 | 38 | { |
|
37 | for (const auto &type : m_AcceptedMimeTypes.keys()) { | |
|
38 | if (data->hasFormat(type) && m_AcceptMimeDataFun(data)) { | |
|
39 | return true; | |
|
39 | auto accepted = false; | |
|
40 | for (auto it = m_AcceptedMimeTypes.constBegin(); it != m_AcceptedMimeTypes.constEnd(); | |
|
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 | 63 | bool allowMergeForMimeData(const QMimeData *data) const |
|
47 | 64 | { |
|
48 |
|
|
|
65 | auto result = false; | |
|
49 | 66 | for (auto it = m_AcceptedMimeTypes.constBegin(); it != m_AcceptedMimeTypes.constEnd(); |
|
50 | 67 | ++it) { |
|
51 | 68 | |
@@ -106,7 +123,9 struct VisualizationDragDropContainer::VisualizationDragDropContainerPrivate { | |||
|
106 | 123 | |
|
107 | 124 | bool cursorIsInContainer(QWidget *container) const |
|
108 | 125 | { |
|
109 |
|
|
|
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 | 131 | int countDragWidget(const QWidget *parent, bool onlyVisible = false) const |
@@ -151,7 +170,7 void VisualizationDragDropContainer::insertDragWidget(int index, | |||
|
151 | 170 | &VisualizationDragDropContainer::startDrag); |
|
152 | 171 | } |
|
153 | 172 | |
|
154 |
void VisualizationDragDropContainer:: |
|
|
173 | void VisualizationDragDropContainer::setMimeType( | |
|
155 | 174 | const QString &mimeType, VisualizationDragDropContainer::DropBehavior behavior) |
|
156 | 175 | { |
|
157 | 176 | impl->m_AcceptedMimeTypes[mimeType] = behavior; |
@@ -183,14 +202,14 void VisualizationDragDropContainer::startDrag(VisualizationDragWidget *dragWidg | |||
|
183 | 202 | |
|
184 | 203 | // Note: The management of the drag object is done by Qt |
|
185 | 204 | auto drag = new QDrag{dragWidget}; |
|
186 | drag->setHotSpot(dragPosition); | |
|
187 | 205 | |
|
188 | 206 | auto mimeData = dragWidget->mimeData(); |
|
189 | 207 | drag->setMimeData(mimeData); |
|
190 | 208 | |
|
191 | 209 | auto pixmap = QPixmap(dragWidget->size()); |
|
192 | 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 | 214 | auto image = pixmap.toImage(); |
|
196 | 215 | mimeData->setImageData(image); |
@@ -374,7 +393,7 void VisualizationDragDropContainer::VisualizationDragDropContainerPrivate::find | |||
|
374 | 393 | auto &helper = sqpApp->dragDropHelper(); |
|
375 | 394 | |
|
376 | 395 | auto absPos = container->mapToGlobal(pos); |
|
377 |
auto isOnPlaceHolder = sqpApp->widgetAt(absPos) |
|
|
396 | auto isOnPlaceHolder = helper.placeHolder().isAncestorOf(sqpApp->widgetAt(absPos)); | |
|
378 | 397 | |
|
379 | 398 | if (countDragWidget(container, true) == 0) { |
|
380 | 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 | 79 | #endif |
|
80 | 80 | |
|
81 | 81 | ui->dragDropContainer->setPlaceHolderType(DragDropHelper::PlaceHolderType::Zone, "Zone"); |
|
82 |
ui->dragDropContainer->layout()->setContentsMargins(0, 0, 0, |
|
|
83 |
ui->dragDropContainer-> |
|
|
84 | MIME_TYPE_GRAPH, VisualizationDragDropContainer::DropBehavior::Inserted); | |
|
85 | ui->dragDropContainer->addAcceptedMimeType( | |
|
86 | MIME_TYPE_ZONE, VisualizationDragDropContainer::DropBehavior::Inserted); | |
|
87 | ui->dragDropContainer->addAcceptedMimeType( | |
|
88 | MIME_TYPE_VARIABLE_LIST, VisualizationDragDropContainer::DropBehavior::Inserted); | |
|
82 | ui->dragDropContainer->layout()->setContentsMargins(0, 0, 0, 12); | |
|
83 | ui->dragDropContainer->layout()->setSpacing(0); | |
|
84 | ui->dragDropContainer->setMimeType(MIME_TYPE_GRAPH, | |
|
85 | VisualizationDragDropContainer::DropBehavior::Inserted); | |
|
86 | ui->dragDropContainer->setMimeType(MIME_TYPE_ZONE, | |
|
87 | VisualizationDragDropContainer::DropBehavior::Inserted); | |
|
88 | ui->dragDropContainer->setMimeType(MIME_TYPE_VARIABLE_LIST, | |
|
89 | VisualizationDragDropContainer::DropBehavior::Inserted); | |
|
89 | 90 | |
|
90 | 91 | ui->dragDropContainer->setAcceptMimeDataFunction([this](auto mimeData) { |
|
91 | 92 | return sqpApp->dragDropHelper().checkMimeDataForVisualization(mimeData, |
@@ -102,12 +102,14 VisualizationZoneWidget::VisualizationZoneWidget(const QString &name, QWidget *p | |||
|
102 | 102 | ui->zoneNameLabel->setText(name); |
|
103 | 103 | |
|
104 | 104 | ui->dragDropContainer->setPlaceHolderType(DragDropHelper::PlaceHolderType::Graph); |
|
105 |
ui->dragDropContainer-> |
|
|
106 |
|
|
|
107 |
ui->dragDropContainer-> |
|
|
105 | ui->dragDropContainer->setMimeType(MIME_TYPE_GRAPH, | |
|
106 | VisualizationDragDropContainer::DropBehavior::Inserted); | |
|
107 | ui->dragDropContainer->setMimeType( | |
|
108 | 108 | MIME_TYPE_VARIABLE_LIST, VisualizationDragDropContainer::DropBehavior::InsertedAndMerged); |
|
109 |
ui->dragDropContainer-> |
|
|
110 |
|
|
|
109 | ui->dragDropContainer->setMimeType(MIME_TYPE_TIME_RANGE, | |
|
110 | VisualizationDragDropContainer::DropBehavior::Merged); | |
|
111 | ui->dragDropContainer->setMimeType(MIME_TYPE_ZONE, | |
|
112 | VisualizationDragDropContainer::DropBehavior::Forbidden); | |
|
111 | 113 | ui->dragDropContainer->setAcceptMimeDataFunction([this](auto mimeData) { |
|
112 | 114 | return sqpApp->dragDropHelper().checkMimeDataForVisualization(mimeData, |
|
113 | 115 | ui->dragDropContainer); |
@@ -332,6 +334,11 QMimeData *VisualizationZoneWidget::mimeData() const | |||
|
332 | 334 | auto mimeData = new QMimeData; |
|
333 | 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 | 342 | return mimeData; |
|
336 | 343 | } |
|
337 | 344 |
General Comments 0
You need to be logged in to leave comments.
Login now