#include "DragDropHelper.h" #include "Visualization/VisualizationDragWidget.h" #include "SqpApplication.h" #include #include #include #include #include #include #include const QString DragDropHelper::MIME_TYPE_GRAPH = "scqlop/graph"; const QString DragDropHelper::MIME_TYPE_ZONE = "scqlop/zone"; struct DragDropHelper::DragDropHelperPrivate { VisualizationDragWidget* m_currentDragWidget = nullptr; std::unique_ptr m_placeHolder = nullptr; std::unique_ptr m_dragDropScroller = nullptr; QString m_imageTempUrl; //Temporary file for image url generated by the drag & drop. Not using QTemporaryFile to have a name which is not generated. explicit DragDropHelperPrivate() : m_placeHolder{std::make_unique()}, m_dragDropScroller{std::make_unique()} { m_placeHolder->setStyleSheet("background-color: #BBD5EE; border:2px solid #2A7FD4"); sqpApp->installEventFilter(m_dragDropScroller.get()); m_imageTempUrl = QDir::temp().absoluteFilePath("Scqlop_graph.png"); } void preparePlaceHolder() const { if (m_currentDragWidget) { m_placeHolder->setMinimumSize(m_currentDragWidget->size()); m_placeHolder->setSizePolicy(m_currentDragWidget->sizePolicy()); } else { m_placeHolder->setMinimumSize(200, 200); } } }; DragDropHelper::DragDropHelper() : impl{spimpl::make_unique_impl()} { } DragDropHelper::~DragDropHelper() { QFile::remove(impl->m_imageTempUrl); } void DragDropHelper::setCurrentDragWidget(VisualizationDragWidget *dragWidget) { impl->m_currentDragWidget = dragWidget; } VisualizationDragWidget *DragDropHelper::getCurrentDragWidget() const { return impl->m_currentDragWidget; } QWidget& DragDropHelper::placeHolder() const { return *impl->m_placeHolder; } void DragDropHelper::insertPlaceHolder(QVBoxLayout *layout, int index) { removePlaceHolder(); impl->preparePlaceHolder(); layout->insertWidget(index, impl->m_placeHolder.get()); impl->m_placeHolder->show(); } void DragDropHelper::removePlaceHolder() { auto parentWidget = impl->m_placeHolder->parentWidget(); if (parentWidget) { parentWidget->layout()->removeWidget(impl->m_placeHolder.get()); impl->m_placeHolder->setParent(nullptr); impl->m_placeHolder->hide(); } } bool DragDropHelper::isPlaceHolderSet() const { return impl->m_placeHolder->parentWidget(); } QUrl DragDropHelper::imageTemporaryUrl(const QImage& image) const { image.save(impl->m_imageTempUrl); return QUrl::fromLocalFile(impl->m_imageTempUrl); }