+bool EffectStackView2::eventFilter( QObject * o, QEvent * e )
+{
+ // Check if user clicked in an effect's top bar to start dragging it
+ if (e->type() == QEvent::MouseButtonPress) {
+ m_draggedEffect = qobject_cast<CollapsibleEffect*>(o);
+ if (m_draggedEffect) {
+ QMouseEvent *me = static_cast<QMouseEvent *>(e);
+ if (me->button() == Qt::LeftButton && (m_draggedEffect->frame->underMouse() || m_draggedEffect->title->underMouse()))
+ m_clickPoint = me->pos();
+ else {
+ m_clickPoint = QPoint();
+ m_draggedEffect = NULL;
+ }
+ e->accept();
+ return false;
+ }
+ }
+ if (e->type() == QEvent::MouseMove) {
+ if (qobject_cast<CollapsibleEffect*>(o)) {
+ CollapsibleEffect *effect = qobject_cast<CollapsibleEffect*>(o);
+ QMouseEvent *me = static_cast<QMouseEvent *>(e);
+ if (me->buttons() != Qt::LeftButton) {
+ e->accept();
+ return false;
+ }
+ else {
+ e->ignore();
+ return true;
+ }
+ }
+ }
+ return QWidget::eventFilter(o, e);
+}
+
+void EffectStackView2::mouseMoveEvent(QMouseEvent * event)
+{
+ if (m_draggedEffect && (event->buttons() & Qt::LeftButton) && (m_clickPoint != QPoint()) && ((event->pos() - m_clickPoint).manhattanLength() >= QApplication::startDragDistance()))
+ startDrag();
+}
+
+void EffectStackView2::mouseReleaseEvent(QMouseEvent * event)
+{
+ m_draggedEffect = NULL;
+ QWidget::mouseReleaseEvent(event);
+}
+
+void EffectStackView2::startDrag()
+{
+ QDrag *drag = new QDrag(this);
+ // The data to be transferred by the drag and drop operation is contained in a QMimeData object
+ QDomElement effect = m_draggedEffect->effect().cloneNode().toElement();
+ QPixmap pixmap = QPixmap::grabWidget(m_draggedEffect->title);
+ drag->setPixmap(pixmap);
+ effect.setAttribute("kdenlive_ix", 0);
+ QDomDocument doc;
+ doc.appendChild(doc.importNode(effect, true));
+ QMimeData *mime = new QMimeData;
+ QByteArray data;
+ data.append(doc.toString().toUtf8());
+ mime->setData("kdenlive/effectslist", data);
+
+ // Assign ownership of the QMimeData object to the QDrag object.
+ drag->setMimeData(mime);
+ // Start the drag and drop operation
+ drag->exec(Qt::CopyAction);// | Qt::MoveAction);
+}
+