[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kdenlive] src: Library widget: accept drops from Project Bin and Clip monitor
From:       Jean-Baptiste Mardelle <jb () kdenlive ! org>
Date:       2016-10-10 13:58:32
Message-ID: E1btb68-0000EW-5O () code ! kde ! org
[Download RAW message or body]

Git commit e20ef96051d98d0caf615c4dae0c40875b9c521a by Jean-Baptiste Mardelle.
Committed on 10/10/2016 at 13:58.
Pushed by mardelle into branch 'master'.

Library widget: accept drops from Project Bin and Clip monitor

M  +11   -0    src/bin/bin.cpp
M  +3    -1    src/bin/bin.h
M  +36   -5    src/library/librarywidget.cpp
M  +2    -0    src/library/librarywidget.h
M  +17   -0    src/mltcontroller/clipcontroller.cpp
M  +3    -0    src/mltcontroller/clipcontroller.h
M  +4    -0    src/project/projectmanager.cpp
M  +1    -0    src/project/projectmanager.h

http://commits.kde.org/kdenlive/e20ef96051d98d0caf615c4dae0c40875b9c521a

diff --git a/src/bin/bin.cpp b/src/bin/bin.cpp
index 8c6bd4f..20a4516 100644
--- a/src/bin/bin.cpp
+++ b/src/bin/bin.cpp
@@ -3554,3 +3554,14 @@ void Bin::showClearButton(bool show)
     m_searchLine->setClearButtonEnabled(show);
 }
 
+void Bin::saveZone(QStringList info, QDir dir)
+{
+    if (info.size() != 3) {
+        return;
+    }
+    ProjectClip *clip = getBinClip(info.first());
+    if (clip && clip->controller()) {
+        QPoint zone(info.at(1).toInt(), info.at(2).toInt());
+        clip->controller()->saveZone(zone, dir);
+    }
+}
diff --git a/src/bin/bin.h b/src/bin/bin.h
index 1d830ed..0a3c489 100644
--- a/src/bin/bin.h
+++ b/src/bin/bin.h
@@ -531,8 +531,10 @@ public:
     void rebuildProxies();
     /** @brief Return a list of all clips hashes used in this project */
     QStringList getProxyHashList();
-        /** @brief Get info (id, name) of a folder (or the currently selected one)  \
*/ +    /** @brief Get info (id, name) of a folder (or the currently selected one)  \
                */
     const QStringList getFolderInfo(QModelIndex selectedIx = QModelIndex());
+    /** @brief Save a clip zone as MLT playlist */
+    void saveZone(QStringList info, QDir dir);
 
 private slots:
     void slotAddClip();
diff --git a/src/library/librarywidget.cpp b/src/library/librarywidget.cpp
index 229f0f5..392e8b1 100644
--- a/src/library/librarywidget.cpp
+++ b/src/library/librarywidget.cpp
@@ -74,7 +74,7 @@ QMimeData * LibraryTree::mimeData(const QList<QTreeWidgetItem *> \
list) const  
 QStringList LibraryTree::mimeTypes() const
 {
-    return QStringList() << QString("text/uri-list");;
+    return QStringList() << QStringLiteral("text/uri-list") << \
QStringLiteral("kdenlive/clip") << QStringLiteral("kdenlive/producerslist");  }
 
 void LibraryTree::slotUpdateThumb(const QString &path, const QString &iconPath)
@@ -130,10 +130,8 @@ void LibraryTree::mousePressEvent(QMouseEvent * event)
 
 void LibraryTree::dropEvent(QDropEvent *event)
 {
-    const QMimeData* qMimeData = event->mimeData();
-    if (!qMimeData->hasUrls()) return;
     //QTreeWidget::dropEvent(event);
-    QList <QUrl> urls = qMimeData->urls();
+    const QMimeData* qMimeData = event->mimeData();
     QTreeWidgetItem *dropped = this->itemAt(event->pos());
     QString dest;
     if (dropped) {
@@ -142,8 +140,28 @@ void LibraryTree::dropEvent(QDropEvent *event)
             dest = QUrl::fromLocalFile(dest).adjusted(QUrl::RemoveFilename).path();
         }
     }
+    if (qMimeData->hasUrls()) {
+        QList <QUrl> urls = qMimeData->urls();
+        emit moveData(urls, dest);
+    } else if (qMimeData->hasFormat(QStringLiteral("kdenlive/clip"))) {
+        emit importSequence(QString(qMimeData->data(QStringLiteral("kdenlive/clip"))).split(';'), \
dest); +    } else if \
(qMimeData->hasFormat(QStringLiteral("kdenlive/producerslist"))) { +        \
QStringList list = QString(qMimeData->data(QStringLiteral("kdenlive/producerslist"))).split(';');
 +        foreach(QString data, list) {
+            if (data.startsWith(QLatin1Char('#'))) {
+                // Bin folder, not supported yet
+                continue;
+            }
+            if (data.contains(QLatin1Char('/'))) {
+                // Clip zone
+                emit importSequence(data.split(QLatin1Char('/')), dest);
+            } else {
+                // Full clip
+                emit importSequence(QStringList() << data << QStringLiteral("-1") << \
QStringLiteral("-1"), dest); +            }
+        }
+    }
     event->accept();
-    emit moveData(urls, dest);
 }
 
 
@@ -198,6 +216,7 @@ LibraryWidget::LibraryWidget(ProjectManager *manager, QWidget \
*parent) : QWidget  m_timer.setInterval(4000);
     connect(&m_timer, &QTimer::timeout, m_infoWidget, \
                &KMessageWidget::animatedHide);
     connect(m_libraryTree, &LibraryTree::moveData, this, \
&LibraryWidget::slotMoveData); +    connect(m_libraryTree, \
&LibraryTree::importSequence, this, &LibraryWidget::slotSaveSequence);  
     m_coreLister = new KCoreDirLister(this);
     m_coreLister->setDelayedMimeTypes(false);
@@ -398,6 +417,18 @@ void LibraryWidget::slotMoveData(QList <QUrl> urls, QString \
dest)  }
 }
 
+void LibraryWidget::slotSaveSequence(QStringList info, QString dest)
+{
+    if (info.isEmpty()) return;
+    if (dest .isEmpty()) {
+        // moving to library's root
+        dest = m_directory.absolutePath();
+    }
+    QDir dir(dest);
+    if (!dir.exists()) return;
+    m_manager->saveZone(info, dir);
+}
+
 void LibraryWidget::slotItemEdited(QTreeWidgetItem *item, int column)
 {
     if (!item || column != 0) return;
diff --git a/src/library/librarywidget.h b/src/library/librarywidget.h
index f5002c6..8f39932 100644
--- a/src/library/librarywidget.h
+++ b/src/library/librarywidget.h
@@ -155,6 +155,7 @@ public slots:
 
 signals:
     void moveData(QList <QUrl>, QString);
+    void importSequence(QStringList, QString);
 };
 
 
@@ -177,6 +178,7 @@ private slots:
     void slotAddFolder();
     void slotRenameItem();
     void slotMoveData(QList <QUrl>, QString);
+    void slotSaveSequence(QStringList info, QString dest);
     void slotItemEdited(QTreeWidgetItem *item, int column);
     void slotDownloadFinished(KJob *);
     void slotDownloadProgress(KJob *, unsigned long);
diff --git a/src/mltcontroller/clipcontroller.cpp \
b/src/mltcontroller/clipcontroller.cpp index 3f08f39..8177d9a 100644
--- a/src/mltcontroller/clipcontroller.cpp
+++ b/src/mltcontroller/clipcontroller.cpp
@@ -819,3 +819,20 @@ void ClipController::disableEffects(bool disable)
     if (changed) m_binController->updateTrackProducer(clipId());
 }
 
+void ClipController::saveZone(QPoint zone, QDir dir)
+{
+    QString path = QString(clipName() + "_" + QString::number(zone.x()) + ".mlt");
+    if (dir.exists(path)) {
+        //TODO ask for overwrite
+    }
+    Mlt::Consumer xmlConsumer(*profile(), ("xml:" + \
dir.absoluteFilePath(path)).toUtf8().constData()); +    \
xmlConsumer.set("terminate_on_pause", 1); +    Mlt::Producer \
prod(m_masterProducer->get_producer()); +    Mlt::Producer *prod2 = \
prod.cut(zone.x(), zone.y()); +    Mlt::Playlist list(*profile());
+    list.insert_at(0, *prod2, 0);
+    //list.set("title", desc.toUtf8().constData());
+    xmlConsumer.connect(list);
+    xmlConsumer.run();
+    delete prod2;
+}
diff --git a/src/mltcontroller/clipcontroller.h b/src/mltcontroller/clipcontroller.h
index 9a1bcf1..6b9f008 100644
--- a/src/mltcontroller/clipcontroller.h
+++ b/src/mltcontroller/clipcontroller.h
@@ -31,6 +31,7 @@ along with this program.  If not, see \
<http://www.gnu.org/licenses/>.  #include <QUrl>
 #include <QMutex>
 #include <QDateTime>
+#include <QDir>
 
 class QPixmap;
 class BinController;
@@ -194,6 +195,8 @@ public:
     void moveEffect(int oldPos, int newPos);
     /** @brief Request an update of all track producers */
     void reloadTrackProducers();
+    /** @brief Save an xml playlist of current clip with in/out points as \
zone.x()/y() */ +    void saveZone(QPoint zone, QDir dir);
 
 private:
     Mlt::Producer *m_masterProducer;
diff --git a/src/project/projectmanager.cpp b/src/project/projectmanager.cpp
index f1b9eb1..c92fa00 100644
--- a/src/project/projectmanager.cpp
+++ b/src/project/projectmanager.cpp
@@ -774,3 +774,7 @@ QString ProjectManager::getDefaultProjectFormat()
     return QStringLiteral("atsc_1080p_2997");
 }
 
+void ProjectManager::saveZone(QStringList info, QDir dir)
+{
+    pCore->bin()->saveZone(info, dir);
+}
diff --git a/src/project/projectmanager.h b/src/project/projectmanager.h
index 7a68e98..8db84d0 100644
--- a/src/project/projectmanager.h
+++ b/src/project/projectmanager.h
@@ -62,6 +62,7 @@ public:
     QString projectSceneList();
     /** @brief returns a default hd profile depending on timezone*/
     static QString getDefaultProjectFormat();
+    void saveZone(QStringList info, QDir dir);
 
 public slots:
     void newFile(bool showProjectSettings = true, bool force = false);


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic