#ifndef SCIQLOP_DRAGDROPHELPER_H #define SCIQLOP_DRAGDROPHELPER_H #include #include #include class QVBoxLayout; class QScrollArea; class VisualizationDragWidget; class VisualizationDragDropContainer; class QMimeData; Q_DECLARE_LOGGING_CATEGORY(LOG_DragDropHelper) /** * @brief Helper class for drag&drop operations. * @note The helper is accessible from the sqpApp singleton and has the same life as the whole * application (like a controller). But contrary to a controller, it doesn't live in a thread and * can interect with the gui. * @see SqpApplication */ class DragDropHelper { public: static const QString MIME_TYPE_GRAPH; static const QString MIME_TYPE_ZONE; DragDropHelper(); virtual ~DragDropHelper(); /// Resets some internal variables. Must be called before any new drag&drop operation. void resetDragAndDrop(); /// Sets the visualization widget currently being drag on the visualization. void setCurrentDragWidget(VisualizationDragWidget *dragWidget); /// Returns the visualization widget currently being drag on the visualization. /// Can be null if a new visualization widget is intended to be created by the drag&drop /// operation. VisualizationDragWidget *getCurrentDragWidget() const; QWidget &placeHolder() const; void insertPlaceHolder(QVBoxLayout *layout, int index); void removePlaceHolder(); bool isPlaceHolderSet() const; /// Checks if the specified mime data is valid for a drop in the visualization bool checkMimeDataForVisualization(const QMimeData *mimeData, VisualizationDragDropContainer *dropContainer); void addDragDropScrollArea(QScrollArea *scrollArea); void removeDragDropScrollArea(QScrollArea *scrollArea); QUrl imageTemporaryUrl(const QImage &image) const; void setHightlightedDragWidget(VisualizationDragWidget *dragWidget); private: class DragDropHelperPrivate; spimpl::unique_impl_ptr impl; }; /** * @brief Event filter class which manage the scroll of QScrollArea during a drag&drop operation. * @note A QScrollArea inside an other QScrollArea is not fully supported. */ class DragDropScroller : public QObject { Q_OBJECT public: DragDropScroller(QObject *parent = nullptr); void addScrollArea(QScrollArea *scrollArea); void removeScrollArea(QScrollArea *scrollArea); protected: bool eventFilter(QObject *obj, QEvent *event); private: class DragDropScrollerPrivate; spimpl::unique_impl_ptr impl; private slots: void onTimer(); }; #endif // SCIQLOP_DRAGDROPHELPER_H