diff --git a/gui/include/DragDropHelper.h b/gui/include/DragDropHelper.h index 30c3b5b..f33fdba 100644 --- a/gui/include/DragDropHelper.h +++ b/gui/include/DragDropHelper.h @@ -25,6 +25,8 @@ public: static const QString MIME_TYPE_GRAPH; static const QString MIME_TYPE_ZONE; + enum class PlaceHolderType { Default, Graph, Zone }; + DragDropHelper(); virtual ~DragDropHelper(); @@ -40,7 +42,8 @@ public: VisualizationDragWidget *getCurrentDragWidget() const; QWidget &placeHolder() const; - void insertPlaceHolder(QVBoxLayout *layout, int index); + void insertPlaceHolder(QVBoxLayout *layout, int index, PlaceHolderType type, + const QString &topLabelText); void removePlaceHolder(); bool isPlaceHolderSet() const; diff --git a/gui/include/Visualization/VisualizationDragDropContainer.h b/gui/include/Visualization/VisualizationDragDropContainer.h index c118d36..65e630b 100644 --- a/gui/include/Visualization/VisualizationDragDropContainer.h +++ b/gui/include/Visualization/VisualizationDragDropContainer.h @@ -9,6 +9,8 @@ #include +#include + Q_DECLARE_LOGGING_CATEGORY(LOG_VisualizationDragDropContainer) class VisualizationDragWidget; @@ -35,6 +37,9 @@ public: void setAcceptMimeDataFunction(AcceptMimeDataFunction fun); + void setPlaceHolderType(DragDropHelper::PlaceHolderType type, + const QString &placeHolderText = QString()); + protected: void dragEnterEvent(QDragEnterEvent *event); void dragLeaveEvent(QDragLeaveEvent *event); diff --git a/gui/src/DragDropHelper.cpp b/gui/src/DragDropHelper.cpp index 2b4bd1c..046d142 100644 --- a/gui/src/DragDropHelper.cpp +++ b/gui/src/DragDropHelper.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -144,6 +145,8 @@ struct DragDropHelper::DragDropHelperPrivate { VisualizationDragWidget *m_CurrentDragWidget = nullptr; std::unique_ptr m_PlaceHolder = nullptr; + QLabel *m_PlaceHolderLabel; + QWidget *m_PlaceBackground; 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. @@ -157,14 +160,25 @@ struct DragDropHelper::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()); + auto layout = new QVBoxLayout{m_PlaceHolder.get()}; + layout->setSpacing(0); + layout->setContentsMargins(0, 0, 0, 0); + + m_PlaceHolderLabel = new QLabel{"", m_PlaceHolder.get()}; + m_PlaceHolderLabel->setMinimumHeight(25); + layout->addWidget(m_PlaceHolderLabel); + + m_PlaceBackground = new QWidget{m_PlaceHolder.get()}; + m_PlaceBackground->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + layout->addWidget(m_PlaceBackground); + + sqpApp->installEventFilter(m_DragDropScroller.get()); m_ImageTempUrl = QDir::temp().absoluteFilePath("Sciqlop_graph.png"); } - void preparePlaceHolder() const + void preparePlaceHolder(DragDropHelper::PlaceHolderType type, const QString &topLabelText) const { if (m_CurrentDragWidget) { m_PlaceHolder->setMinimumSize(m_CurrentDragWidget->size()); @@ -177,6 +191,22 @@ struct DragDropHelper::DragDropHelperPrivate { m_PlaceHolder->setMinimumSize(0, GRAPH_MINIMUM_HEIGHT); m_PlaceHolder->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); } + + switch (type) { + case DragDropHelper::PlaceHolderType::Graph: + m_PlaceBackground->setStyleSheet( + "background-color: #BBD5EE; border: 1px solid #2A7FD4"); + break; + case DragDropHelper::PlaceHolderType::Zone: + case DragDropHelper::PlaceHolderType::Default: + m_PlaceBackground->setStyleSheet( + "background-color: #BBD5EE; border: 2px solid #2A7FD4"); + m_PlaceHolderLabel->setStyleSheet("color: #2A7FD4"); + break; + } + + m_PlaceHolderLabel->setText(topLabelText); + m_PlaceHolderLabel->setVisible(!topLabelText.isEmpty()); } }; @@ -218,16 +248,16 @@ VisualizationDragWidget *DragDropHelper::getCurrentDragWidget() const return impl->m_CurrentDragWidget; } - QWidget &DragDropHelper::placeHolder() const { return *impl->m_PlaceHolder; } -void DragDropHelper::insertPlaceHolder(QVBoxLayout *layout, int index) +void DragDropHelper::insertPlaceHolder(QVBoxLayout *layout, int index, PlaceHolderType type, + const QString &topLabelText) { removePlaceHolder(); - impl->preparePlaceHolder(); + impl->preparePlaceHolder(type, topLabelText); layout->insertWidget(index, impl->m_PlaceHolder.get()); impl->m_PlaceHolder->show(); } diff --git a/gui/src/Visualization/VisualizationDragDropContainer.cpp b/gui/src/Visualization/VisualizationDragDropContainer.cpp index 4a24902..969b6af 100644 --- a/gui/src/Visualization/VisualizationDragDropContainer.cpp +++ b/gui/src/Visualization/VisualizationDragDropContainer.cpp @@ -18,6 +18,8 @@ struct VisualizationDragDropContainer::VisualizationDragDropContainerPrivate { QVBoxLayout *m_Layout; QHash m_AcceptedMimeTypes; + QString m_PlaceHolderText; + DragDropHelper::PlaceHolderType m_PlaceHolderType = DragDropHelper::PlaceHolderType::Graph; VisualizationDragDropContainer::AcceptMimeDataFunction m_AcceptMimeDataFun = [](auto mimeData) { return true; }; @@ -166,6 +168,13 @@ void VisualizationDragDropContainer::setAcceptMimeDataFunction( impl->m_AcceptMimeDataFun = fun; } +void VisualizationDragDropContainer::setPlaceHolderType(DragDropHelper::PlaceHolderType type, + const QString &placeHolderText) +{ + impl->m_PlaceHolderType = type; + impl->m_PlaceHolderText = placeHolderText; +} + void VisualizationDragDropContainer::startDrag(VisualizationDragWidget *dragWidget, const QPoint &dragPosition) { @@ -192,7 +201,8 @@ void VisualizationDragDropContainer::startDrag(VisualizationDragWidget *dragWidg if (impl->cursorIsInContainer(this)) { auto dragWidgetIndex = impl->m_Layout->indexOf(dragWidget); - helper.insertPlaceHolder(impl->m_Layout, dragWidgetIndex); + helper.insertPlaceHolder(impl->m_Layout, dragWidgetIndex, impl->m_PlaceHolderType, + impl->m_PlaceHolderText); dragWidget->setVisible(false); } else { @@ -367,7 +377,7 @@ void VisualizationDragDropContainer::VisualizationDragDropContainerPrivate::find if (countDragWidget(container, true) == 0) { // Drop on an empty container, just add the placeHolder at the top - helper.insertPlaceHolder(m_Layout, 0); + helper.insertPlaceHolder(m_Layout, 0, m_PlaceHolderType, m_PlaceHolderText); } else if (!isOnPlaceHolder) { auto nbDragWidget = countDragWidget(container); @@ -408,7 +418,8 @@ void VisualizationDragDropContainer::VisualizationDragDropContainerPrivate::find } if (dropIndex != placeHolderIndex) { - helper.insertPlaceHolder(m_Layout, dropIndex); + helper.insertPlaceHolder(m_Layout, dropIndex, m_PlaceHolderType, + m_PlaceHolderText); } helper.setHightlightedDragWidget(nullptr); @@ -422,17 +433,17 @@ void VisualizationDragDropContainer::VisualizationDragDropContainerPrivate::find helper.setHightlightedDragWidget(dragWidgetHovered); } else { - qCWarning(LOG_VisualizationDragDropContainer()) << tr( - "VisualizationDragDropContainer::findPlaceHolderPosition, no valid drop " - "action."); + qCWarning(LOG_VisualizationDragDropContainer()) + << tr("VisualizationDragDropContainer::findPlaceHolderPosition, no valid drop " + "action."); Q_ASSERT(false); } } else { qCWarning(LOG_VisualizationDragDropContainer()) - << tr("VisualizationDragDropContainer::findPlaceHolderPosition, no widget " - "found in the " - "container"); + << tr("VisualizationDragDropContainer::findPlaceHolderPosition, no widget " + "found in the " + "container"); } } else { diff --git a/gui/src/Visualization/VisualizationTabWidget.cpp b/gui/src/Visualization/VisualizationTabWidget.cpp index dce0bcc..236b512 100644 --- a/gui/src/Visualization/VisualizationTabWidget.cpp +++ b/gui/src/Visualization/VisualizationTabWidget.cpp @@ -68,6 +68,8 @@ VisualizationTabWidget::VisualizationTabWidget(const QString &name, QWidget *par { ui->setupUi(this); + 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( diff --git a/gui/src/Visualization/VisualizationZoneWidget.cpp b/gui/src/Visualization/VisualizationZoneWidget.cpp index 07f14c3..69b0df3 100644 --- a/gui/src/Visualization/VisualizationZoneWidget.cpp +++ b/gui/src/Visualization/VisualizationZoneWidget.cpp @@ -101,6 +101,7 @@ 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(