diff --git a/gui/include/Visualization/VisualizationDragDropContainer.h b/gui/include/Visualization/VisualizationDragDropContainer.h index d100bff..68a4aff 100644 --- a/gui/include/Visualization/VisualizationDragDropContainer.h +++ b/gui/include/Visualization/VisualizationDragDropContainer.h @@ -23,7 +23,7 @@ signals: void dropOccuredOnWidget(VisualizationDragWidget *dragWidget, const QMimeData *mimeData); public: - enum class DropBehavior { Inserted, Merged, InsertedAndMerged }; + enum class DropBehavior { Inserted, Merged, InsertedAndMerged, Forbidden }; using AcceptMimeDataFunction = std::function; VisualizationDragDropContainer(QWidget *parent = nullptr); @@ -31,7 +31,7 @@ public: void addDragWidget(VisualizationDragWidget *dragWidget); void insertDragWidget(int index, VisualizationDragWidget *dragWidget); - void addAcceptedMimeType(const QString &mimeType, DropBehavior behavior); + void setMimeType(const QString &mimeType, DropBehavior behavior); int countDragWidget() const; diff --git a/gui/src/Visualization/VisualizationDragDropContainer.cpp b/gui/src/Visualization/VisualizationDragDropContainer.cpp index fec53d5..4c5da09 100644 --- a/gui/src/Visualization/VisualizationDragDropContainer.cpp +++ b/gui/src/Visualization/VisualizationDragDropContainer.cpp @@ -36,13 +36,28 @@ struct VisualizationDragDropContainer::VisualizationDragDropContainerPrivate { bool acceptMimeData(const QMimeData *data) const { - for (const auto &type : m_AcceptedMimeTypes.keys()) { - if (data->hasFormat(type) && m_AcceptMimeDataFun(data)) { - return true; + auto accepted = false; + for (auto it = m_AcceptedMimeTypes.constBegin(); it != m_AcceptedMimeTypes.constEnd(); + ++it) { + const auto &type = it.key(); + const auto &behavior = it.value(); + + if (data->hasFormat(type)) { + if (behavior != DropBehavior::Forbidden) { + accepted = true; + } + else { + accepted = false; + break; + } } } - return false; + if (accepted) { + accepted = m_AcceptMimeDataFun(data); + } + + return accepted; } bool allowMergeForMimeData(const QMimeData *data) const @@ -153,7 +168,7 @@ void VisualizationDragDropContainer::insertDragWidget(int index, &VisualizationDragDropContainer::startDrag); } -void VisualizationDragDropContainer::addAcceptedMimeType( +void VisualizationDragDropContainer::setMimeType( const QString &mimeType, VisualizationDragDropContainer::DropBehavior behavior) { impl->m_AcceptedMimeTypes[mimeType] = behavior; diff --git a/gui/src/Visualization/VisualizationTabWidget.cpp b/gui/src/Visualization/VisualizationTabWidget.cpp index 136412e..c44bcad 100644 --- a/gui/src/Visualization/VisualizationTabWidget.cpp +++ b/gui/src/Visualization/VisualizationTabWidget.cpp @@ -80,12 +80,12 @@ VisualizationTabWidget::VisualizationTabWidget(const QString &name, QWidget *par ui->dragDropContainer->setPlaceHolderType(DragDropHelper::PlaceHolderType::Zone, "Zone"); ui->dragDropContainer->layout()->setContentsMargins(0, 0, 0, 5); - ui->dragDropContainer->addAcceptedMimeType( - MIME_TYPE_GRAPH, VisualizationDragDropContainer::DropBehavior::Inserted); - ui->dragDropContainer->addAcceptedMimeType( - MIME_TYPE_ZONE, VisualizationDragDropContainer::DropBehavior::Inserted); - ui->dragDropContainer->addAcceptedMimeType( - MIME_TYPE_VARIABLE_LIST, VisualizationDragDropContainer::DropBehavior::Inserted); + ui->dragDropContainer->setMimeType(MIME_TYPE_GRAPH, + VisualizationDragDropContainer::DropBehavior::Inserted); + ui->dragDropContainer->setMimeType(MIME_TYPE_ZONE, + VisualizationDragDropContainer::DropBehavior::Inserted); + ui->dragDropContainer->setMimeType(MIME_TYPE_VARIABLE_LIST, + VisualizationDragDropContainer::DropBehavior::Inserted); ui->dragDropContainer->setAcceptMimeDataFunction([this](auto mimeData) { return sqpApp->dragDropHelper().checkMimeDataForVisualization(mimeData, diff --git a/gui/src/Visualization/VisualizationZoneWidget.cpp b/gui/src/Visualization/VisualizationZoneWidget.cpp index f32c34d..3a52978 100644 --- a/gui/src/Visualization/VisualizationZoneWidget.cpp +++ b/gui/src/Visualization/VisualizationZoneWidget.cpp @@ -102,12 +102,14 @@ VisualizationZoneWidget::VisualizationZoneWidget(const QString &name, QWidget *p ui->zoneNameLabel->setText(name); ui->dragDropContainer->setPlaceHolderType(DragDropHelper::PlaceHolderType::Graph); - ui->dragDropContainer->addAcceptedMimeType( - MIME_TYPE_GRAPH, VisualizationDragDropContainer::DropBehavior::Inserted); - ui->dragDropContainer->addAcceptedMimeType( + ui->dragDropContainer->setMimeType(MIME_TYPE_GRAPH, + VisualizationDragDropContainer::DropBehavior::Inserted); + ui->dragDropContainer->setMimeType( MIME_TYPE_VARIABLE_LIST, VisualizationDragDropContainer::DropBehavior::InsertedAndMerged); - ui->dragDropContainer->addAcceptedMimeType( - MIME_TYPE_TIME_RANGE, VisualizationDragDropContainer::DropBehavior::Merged); + ui->dragDropContainer->setMimeType(MIME_TYPE_TIME_RANGE, + VisualizationDragDropContainer::DropBehavior::Merged); + ui->dragDropContainer->setMimeType(MIME_TYPE_ZONE, + VisualizationDragDropContainer::DropBehavior::Forbidden); ui->dragDropContainer->setAcceptMimeDataFunction([this](auto mimeData) { return sqpApp->dragDropHelper().checkMimeDataForVisualization(mimeData, ui->dragDropContainer); @@ -332,6 +334,11 @@ QMimeData *VisualizationZoneWidget::mimeData() const auto mimeData = new QMimeData; mimeData->setData(MIME_TYPE_ZONE, QByteArray{}); + if (auto firstGraph = impl->firstGraph(this)) { + auto timeRangeData = TimeController::mimeDataForTimeRange(firstGraph->graphRange()); + mimeData->setData(MIME_TYPE_TIME_RANGE, timeRangeData); + } + return mimeData; }