diff --git a/core/src/DataSource/DataSourceController.cpp b/core/src/DataSource/DataSourceController.cpp index 6d42abf..94b62c8 100644 --- a/core/src/DataSource/DataSourceController.cpp +++ b/core/src/DataSource/DataSourceController.cpp @@ -174,7 +174,7 @@ void DataSourceController::finalize() void DataSourceController::requestVariable(const QVariantHash &productData) { - DataSourceItem *sourceItem = impl->findDataSourceItem(productData); + auto sourceItem = impl->findDataSourceItem(productData); if (sourceItem) { auto sourceName = sourceItem->rootItem().name(); diff --git a/core/src/DataSource/DataSourceItem.cpp b/core/src/DataSource/DataSourceItem.cpp index a1fe8e7..cff4322 100644 --- a/core/src/DataSource/DataSourceItem.cpp +++ b/core/src/DataSource/DataSourceItem.cpp @@ -130,9 +130,8 @@ DataSourceItem *DataSourceItem::findItem(const QVariantHash &data, bool recursiv return child.get(); } - if (recursive) { - auto foundItem = child->findItem(data, true); - if (foundItem) { + if (recursive) { + if (auto foundItem = child->findItem(data, true)) { return foundItem; } } diff --git a/core/src/Variable/VariableModel.cpp b/core/src/Variable/VariableModel.cpp index 9ef8378..dd26938 100644 --- a/core/src/Variable/VariableModel.cpp +++ b/core/src/Variable/VariableModel.cpp @@ -312,7 +312,7 @@ bool VariableModel::canDropMimeData(const QMimeData *data, Qt::DropAction action bool VariableModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) { - bool dropDone = false; + auto dropDone = false; if (data->hasFormat(MIME_TYPE_PRODUCT_LIST)) { QDataStream stream(data->data(MIME_TYPE_PRODUCT_LIST)); diff --git a/gui/src/DragDropHelper.cpp b/gui/src/DragDropHelper.cpp index 4bc8951..7f96d19 100644 --- a/gui/src/DragDropHelper.cpp +++ b/gui/src/DragDropHelper.cpp @@ -149,6 +149,9 @@ struct DragDropHelper::DragDropHelperPrivate { VisualizationDragWidget *m_HighlightedDragWidget = nullptr; + QMetaObject::Connection m_DragWidgetDestroyedConnection; + QMetaObject::Connection m_HighlightedWidgetDestroyedConnection; + explicit DragDropHelperPrivate() : m_PlaceHolder{std::make_unique()}, m_DragDropScroller{std::make_unique()} @@ -194,6 +197,18 @@ void DragDropHelper::resetDragAndDrop() void DragDropHelper::setCurrentDragWidget(VisualizationDragWidget *dragWidget) { + if (impl->m_CurrentDragWidget) { + + QObject::disconnect(impl->m_DragWidgetDestroyedConnection); + } + + if (dragWidget) { + // ensures the impl->m_CurrentDragWidget is reset when the widget is destroyed + impl->m_DragWidgetDestroyedConnection + = QObject::connect(dragWidget, &VisualizationDragWidget::destroyed, + [this]() { impl->m_CurrentDragWidget = nullptr; }); + } + impl->m_CurrentDragWidget = dragWidget; } @@ -251,12 +266,19 @@ void DragDropHelper::setHightlightedDragWidget(VisualizationDragWidget *dragWidg { if (impl->m_HighlightedDragWidget) { impl->m_HighlightedDragWidget->highlightForMerge(false); + QObject::disconnect(impl->m_HighlightedWidgetDestroyedConnection); } if (dragWidget) { - impl->m_HighlightedDragWidget = dragWidget; - impl->m_HighlightedDragWidget->highlightForMerge(true); + dragWidget->highlightForMerge(true); + + // ensures the impl->m_HighlightedDragWidget is reset when the widget is destroyed + impl->m_DragWidgetDestroyedConnection + = QObject::connect(dragWidget, &VisualizationDragWidget::destroyed, + [this]() { impl->m_HighlightedDragWidget = nullptr; }); } + + impl->m_HighlightedDragWidget = dragWidget; } bool DragDropHelper::checkMimeDataForVisualization(const QMimeData *mimeData, diff --git a/gui/src/Visualization/VisualizationDragDropContainer.cpp b/gui/src/Visualization/VisualizationDragDropContainer.cpp index 005611b..f31b5e8 100644 --- a/gui/src/Visualization/VisualizationDragDropContainer.cpp +++ b/gui/src/Visualization/VisualizationDragDropContainer.cpp @@ -75,10 +75,7 @@ struct VisualizationDragDropContainer::VisualizationDragDropContainerPrivate { bool cursorIsInContainer(QWidget *container) const { - auto adustNum = 18; // to be safe, in case of scrollbar on the side - auto containerRect = QRect(QPoint(), container->contentsRect().size()) - .adjusted(adustNum, adustNum, -adustNum, -adustNum); - return containerRect.contains(container->mapFromGlobal(QCursor::pos())); + return container->isAncestorOf(sqpApp->widgetAt(QCursor::pos())); } int countDragWidget(const QWidget *parent) const @@ -171,6 +168,10 @@ void VisualizationDragDropContainer::startDrag(VisualizationDragWidget *dragWidg helper.insertPlaceHolder(impl->m_Layout, dragWidgetIndex); dragWidget->setVisible(false); } + else { + // The drag starts directly outside the drop zone + // do not add the placeHolder + } // Note: The exec() is blocking on windows but not on linux and macOS drag->exec(Qt::MoveAction | Qt::CopyAction);