]> git.sesse.net Git - kdenlive/commitdiff
* Be more clever when adding several clips to a project
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 26 Aug 2008 23:38:37 +0000 (23:38 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 26 Aug 2008 23:38:37 +0000 (23:38 +0000)
* Fix handling of effects in old Kdenlive project files

svn path=/branches/KDE4/; revision=2383

src/addclipcommand.cpp
src/addclipcommand.h
src/clipmanager.cpp
src/clipmanager.h
src/kdenlivedoc.cpp
src/kdenlivedoc.h
src/mainwindow.cpp
src/projectitem.cpp
src/projectlist.cpp
src/projectlist.h

index e1e5ca736d12cd7e8a32aa910556e075becba8e5..cda6a485d791847a7a4694fa3fc3b47161cef97e 100644 (file)
@@ -22,8 +22,7 @@
 #include "addclipcommand.h"
 #include "kdenlivedoc.h"
 
-AddClipCommand::AddClipCommand(KdenliveDoc *doc, const QDomElement &xml, const uint id, bool doIt)
-        : m_doc(doc), m_xml(xml), m_id(id), m_doIt(doIt) {
+AddClipCommand::AddClipCommand(KdenliveDoc *doc, const QDomElement &xml, const uint id, bool doIt, QUndoCommand * parent) : QUndoCommand(parent), m_doc(doc), m_xml(xml), m_id(id), m_doIt(doIt) {
     if (doIt) setText(i18n("Add clip"));
     else setText(i18n("Delete clip"));
 }
index d5d51e025920ffd447695431b0f2033e8c20d872..3a4b3d520ce9aa7136e44215af6028e6ce228d5a 100644 (file)
@@ -29,7 +29,7 @@ class KdenliveDoc;
 
 class AddClipCommand : public QUndoCommand {
 public:
-    AddClipCommand(KdenliveDoc *list, const QDomElement &xml, const uint id, bool doIt);
+    AddClipCommand(KdenliveDoc *list, const QDomElement &xml, const uint id, bool doIt, QUndoCommand * parent = 0);
 
     virtual void undo();
     virtual void redo();
index 232b311cbec1972404e45fb6995d8be4240224ba..7827c52397888c8e3974c5e8998c1d0885037ac9 100644 (file)
@@ -18,6 +18,7 @@
  ***************************************************************************/
 #include <KDebug>
 #include <KFileDialog>
+#include <kio/netaccess.h>
 
 #include "addclipcommand.h"
 #include "kdenlivesettings.h"
@@ -91,6 +92,33 @@ DocClipBase *ClipManager::getClipById(int clipId) {
     return NULL;
 }
 
+void ClipManager::slotAddClipList(const KUrl::List urls, const QString group, const int groupId) {
+    QUndoCommand *addClips = new QUndoCommand();
+    addClips->setText("Add clips");
+
+    foreach(const KUrl file, urls) {
+        if (KIO::NetAccess::exists(file, KIO::NetAccess::SourceSide, NULL)) {
+            QDomDocument doc;
+            QDomElement prod = doc.createElement("producer");
+            if (!group.isEmpty()) {
+                prod.setAttribute("groupname", group);
+                prod.setAttribute("groupid", groupId);
+            }
+            prod.setAttribute("resource", file.path());
+            uint id = m_clipIdCounter++;
+            prod.setAttribute("id", QString::number(id));
+            KMimeType::Ptr type = KMimeType::findByUrl(file);
+            if (type->name().startsWith("image/")) {
+                prod.setAttribute("type", (int) IMAGE);
+                prod.setAttribute("in", "0");
+                prod.setAttribute("out", m_doc->getFramePos(KdenliveSettings::image_duration()) - 1);
+            }
+            new AddClipCommand(m_doc, prod, id, true, addClips);
+        }
+    }
+    m_doc->commandStack()->push(addClips);
+}
+
 void ClipManager::slotAddClipFile(const KUrl url, const QString group, const int groupId) {
     kDebug() << "/////  CLIP MANAGER, ADDING CLIP: " << url;
     QDomDocument doc;
@@ -182,4 +210,8 @@ int ClipManager::getFreeClipId() {
     return m_clipIdCounter++;
 }
 
+int ClipManager::lastClipId() const {
+    return m_clipIdCounter - 1;
+}
+
 
index 32c3fbba35e5d863db7df0849dcf7a5510c59595..b671870977aa7772a9e0e71df85cc299869d4bce 100644 (file)
@@ -49,6 +49,7 @@ Q_OBJECT public:
     DocClipBase *getClipAt(int pos);
     void deleteClip(uint clipId);
     void slotAddClipFile(const KUrl url, const QString group, const int groupId);
+    void slotAddClipList(const KUrl::List urls, const QString group, const int groupId);
     void slotAddTextClipFile(const QString path, const QString xml, const QString group, const int groupId);
     void slotAddColorClipFile(const QString name, const QString color, QString duration, const QString group, const int groupId);
     void slotAddSlideshowClipFile(const QString name, const QString path, int count, const QString duration, const bool loop, const bool fade, const QString &luma_duration, const QString &luma_file, const int softness, const QString group, const int groupId);
@@ -58,6 +59,7 @@ Q_OBJECT public:
     void checkAudioThumbs();
     QList <DocClipBase*> documentClipList();
     int getFreeClipId();
+    int lastClipId() const;
 
 private:   // Private attributes
     /** the list of clips in the document */
index 170cccfc134d29cac2ebf9990e18742858ac15a5..ef161d8e7e799b4ff4cb3133cdd357408c3190fb 100644 (file)
@@ -314,9 +314,28 @@ void KdenliveDoc::convertDocument(double version) {
         tractor.insertAfter(transitions.at(0), QDomNode());
     }
 
-    QDomElement markers = m_document.createElement("markers");
+    // Fix filters format
+    QDomNodeList filters = m_document.elementsByTagName("filter");
+    max = filters.count();
+    for (int i = 0; i < max; i++) {
+        QDomElement filt = filters.at(i).toElement();
+        QDomNamedNodeMap attrs = filt.attributes();
+        for (int j = 0; j < attrs.count(); j++) {
+            QDomAttr a = attrs.item(j).toAttr();
+            if (!a.isNull()) {
+                kDebug() << " FILTER; adding :" << a.name() << ":" << a.value();
+                QDomElement e = m_document.createElement("property");
+                e.setAttribute("name", a.name());
+                QDomText value = m_document.createTextNode(a.value());
+                e.appendChild(value);
+                filt.appendChild(e);
+            }
+        }
+    }
+
 
-    // change producer names
+    // move markers to a global list
+    QDomElement markers = m_document.createElement("markers");
     QDomNodeList producers = m_document.elementsByTagName("producer");
     max = producers.count();
     for (int i = 0; i < max; i++) {
@@ -606,9 +625,17 @@ void KdenliveDoc::deleteClip(const uint clipId) {
     m_clipManager->deleteClip(clipId);
 }
 
+void KdenliveDoc::slotAddClipList(const KUrl::List urls, const QString group, const int groupId) {
+    m_clipManager->slotAddClipList(urls, group, groupId);
+    emit selectLastAddedClip(m_clipManager->lastClipId());
+    setModified(true);
+}
+
+
 void KdenliveDoc::slotAddClipFile(const KUrl url, const QString group, const int groupId) {
     kDebug() << "/////////  DOCUM, ADD CLP: " << url;
     m_clipManager->slotAddClipFile(url, group, groupId);
+    emit selectLastAddedClip(m_clipManager->lastClipId());
     setModified(true);
 }
 
index f19526ba931cab671d74bcf57a57cda8a2c9a394..e8320e194bb81fe0f2e755c1f3c2e0dde0043292 100644 (file)
@@ -67,6 +67,7 @@ Q_OBJECT public:
     void addFolder(const QString foldername, int clipId, bool edit);
     void deleteFolder(const QString foldername, int clipId);
     void slotAddClipFile(const KUrl url, const QString group, const int groupId = -1);
+    void slotAddClipList(const KUrl::List urls, const QString group, const int groupId = -1);
     void slotAddTextClipFile(const QString path, const QString xml, const QString group, const int groupId = -1);
     void editTextClip(QString path, int id);
     void slotAddFolder(const QString folderName);
@@ -147,6 +148,7 @@ signals:
     /** emited when the document state has been modified (= needs saving or not) */
     void docModified(bool);
     void refreshClipThumbnail(int);
+    void selectLastAddedClip(const int);
 };
 
 #endif
index a1ca5ce46d6af62f66f9cbe9685a695f6259a8d6..6ad902e9962c7aa9b043d51fabee9e9425cc2cb2 100644 (file)
@@ -1043,6 +1043,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) { //cha
             disconnect(m_activeDocument, SIGNAL(signalDeleteProjectClip(int)), m_projectList, SLOT(slotDeleteClip(int)));
             disconnect(m_activeDocument, SIGNAL(updateClipDisplay(int)), m_projectList, SLOT(slotUpdateClip(int)));
             disconnect(m_activeDocument, SIGNAL(refreshClipThumbnail(int)), m_projectList, SLOT(slotRefreshClipThumbnail(int)));
+            disconnect(m_activeDocument, SIGNAL(selectLastAddedClip(const int)), m_projectList, SLOT(slotSelectClip(const int)));
             disconnect(m_activeDocument, SIGNAL(deletTimelineClip(int)), m_activeTimeline, SLOT(slotDeleteClip(int)));
             disconnect(m_activeTimeline, SIGNAL(clipItemSelected(ClipItem*)), effectStack, SLOT(slotClipItemSelected(ClipItem*)));
             disconnect(m_activeTimeline, SIGNAL(clipItemSelected(ClipItem*)), this, SLOT(slotActivateEffectStackView()));
@@ -1080,6 +1081,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) { //cha
     connect(doc, SIGNAL(signalDeleteProjectClip(int)), m_projectList, SLOT(slotDeleteClip(int)));
     connect(doc, SIGNAL(updateClipDisplay(int)), m_projectList, SLOT(slotUpdateClip(int)));
     connect(doc, SIGNAL(refreshClipThumbnail(int)), m_projectList, SLOT(slotRefreshClipThumbnail(int)));
+    connect(doc, SIGNAL(selectLastAddedClip(const int)), m_projectList, SLOT(slotSelectClip(const int)));
 
     connect(doc, SIGNAL(deletTimelineClip(int)), trackView, SLOT(slotDeleteClip(int)));
     connect(doc, SIGNAL(docModified(bool)), this, SLOT(slotUpdateDocumentState(bool)));
index c0981e1575bd97eb719a013ef8ce19276a4ed39c..4e83180bafc015f93cc42efbb23bde6b277d00c1 100644 (file)
@@ -93,7 +93,7 @@ ProjectItem::ProjectItem(QTreeWidget * parent, DocClipBase *clip)
     if (name.isEmpty()) name = KUrl(m_clip->getProperty("resource")).fileName();
     m_clipType = (CLIPTYPE) m_clip->getProperty("type").toInt();
     setText(1, name);
-    kDebug() << "PROJECT ITE;. ADDING LCIP: " << m_clipId;
+    //kDebug() << "PROJECT ITE;. ADDING LCIP: " << m_clipId;
 }
 
 ProjectItem::ProjectItem(QTreeWidgetItem * parent, DocClipBase *clip)
@@ -106,7 +106,7 @@ ProjectItem::ProjectItem(QTreeWidgetItem * parent, DocClipBase *clip)
     if (name.isEmpty()) name = KUrl(m_clip->getProperty("resource")).fileName();
     m_clipType = (CLIPTYPE) m_clip->getProperty("type").toInt();
     setText(1, name);
-    kDebug() << "PROJECT ITE;. ADDING LCIP: " << m_clipId;
+    //kDebug() << "PROJECT ITE;. ADDING LCIP: " << m_clipId;
 }
 
 
index 982318a36c3c587953e0a9fb4817bf56fe330c77..66c054e0b15bd3471ebc6de54ce11121ad684733 100644 (file)
@@ -30,7 +30,6 @@
 #include <KLocale>
 #include <KFileDialog>
 #include <KInputDialog>
-#include <kio/netaccess.h>
 #include <KMessageBox>
 
 #include <nepomuk/global.h>
@@ -324,10 +323,7 @@ void ProjectList::slotAddClip(QUrl givenUrl, QString group) {
             groupId = item->clipId();
         }
     }
-    foreach(const KUrl file, list) {
-        if (KIO::NetAccess::exists(file, KIO::NetAccess::SourceSide, NULL))
-            m_doc->slotAddClipFile(file, group, groupId);
-    }
+    m_doc->slotAddClipList(list, group, groupId);
 }
 
 void ProjectList::slotRemoveInvalidClip(int id) {
@@ -466,7 +462,6 @@ void ProjectList::slotReplyGetFileProperties(int clipId, Mlt::Producer *producer
     if (item) {
         item->setProperties(properties, metadata);
         item->referencedClip()->setProducer(producer);
-        listView->setCurrentItem(item);
         emit receivedClipDuration(clipId, item->clipMaxDuration());
     } else kDebug() << "////////  COULD NOT FIND CLIP TO UPDATE PRPS...";
 }
@@ -487,4 +482,12 @@ ProjectItem *ProjectList::getItemById(int id) {
     return NULL;
 }
 
+void ProjectList::slotSelectClip(const int ix) {
+    ProjectItem *p = getItemById(ix);
+    if (p) {
+        listView->setCurrentItem(p);
+        listView->scrollToItem(p);
+    }
+}
+
 #include "projectlist.moc"
index cfa7d80dd8f4622f33be51a3cedd5112408c6a85..124dd4b9f53f6ada09b4328a9d9fb05b88a011c1 100644 (file)
@@ -119,6 +119,7 @@ public slots:
     void slotRefreshClipThumbnail(int clipId);
     void slotRefreshClipThumbnail(ProjectItem *item);
     void slotRemoveInvalidClip(int id);
+    void slotSelectClip(const int ix);
 
 private:
     ProjectListView *listView;