]> git.sesse.net Git - kdenlive/commitdiff
First steps to save timeline clip groups
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 18 Mar 2009 12:51:39 +0000 (12:51 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 18 Mar 2009 12:51:39 +0000 (12:51 +0000)
svn path=/trunk/kdenlive/; revision=3162

src/clipmanager.cpp
src/clipmanager.h
src/customtrackview.cpp
src/customtrackview.h
src/kdenlivedoc.cpp

index 2960180f385b924461ab09594a0bd19547e9bb38..5ed26f2bda0ffdd6af298f183e51da40ef2e6fce 100644 (file)
@@ -23,6 +23,7 @@
 #include "kdenlivesettings.h"
 #include "docclipbase.h"
 #include "kdenlivedoc.h"
+#include "abstractclipitem.h"
 
 #include <mlt++/Mlt.h>
 
@@ -30,6 +31,8 @@
 #include <KFileDialog>
 #include <kio/netaccess.h>
 
+#include <QGraphicsItemGroup>
+
 ClipManager::ClipManager(KdenliveDoc *doc): m_doc(doc), m_audioThumbsEnabled(false), m_audioThumbsQueue(QList <QString> ()), m_generatingAudioId(QString()) {
     m_clipIdCounter = 1;
     m_folderIdCounter = 1;
@@ -339,3 +342,35 @@ void ClipManager::deleteFolder(const QString &id) {
     m_folderList.remove(id);
 }
 
+void ClipManager::setGroups(QList <QGraphicsItem *> groups) {
+    m_groupsList = groups;
+}
+
+QDomElement ClipManager::groupsXml() const {
+    QDomDocument doc;
+    QDomElement groups = doc.createElement("groups");
+    doc.appendChild(groups);
+    for (int i = 0; i < m_groupsList.count(); i++) {
+        QDomElement group = doc.createElement("group");
+        groups.appendChild(group);
+        QList <QGraphicsItem *> children = static_cast <QGraphicsItemGroup *>(m_groupsList.at(i))->childItems();
+        for (int j = 0; j < children.count(); j++) {
+            if (children.at(j)->type() == AVWIDGET || children.at(j)->type() == TRANSITIONWIDGET) {
+                AbstractClipItem *item = static_cast <AbstractClipItem *>(children.at(j));
+                ItemInfo info = item->info();
+                if (item->type() == AVWIDGET) {
+                    QDomElement clip = doc.createElement("clipitem");
+                    clip.setAttribute("track", info.track);
+                    clip.setAttribute("position", info.startPos.frames(m_doc->fps()));
+                    group.appendChild(clip);
+                } else if (item->type() == TRANSITIONWIDGET) {
+                    QDomElement clip = doc.createElement("transitionitem");
+                    clip.setAttribute("track", info.track);
+                    clip.setAttribute("position", info.startPos.frames(m_doc->fps()));
+                    group.appendChild(clip);
+                }
+            }
+        }
+    }
+    return doc.documentElement();
+}
index 2d5f510795fb4dc8a0440a8e8fa74c511090277f..2e1459d3e44d2a8a84a8072c321a5906357e7246 100644 (file)
@@ -38,6 +38,7 @@
 
 class KdenliveDoc;
 class DocClipBase;
+class QGraphicsItem;
 
 namespace Mlt {
 class Producer;
@@ -46,7 +47,6 @@ class Producer;
 class ClipManager: public QObject {
 Q_OBJECT public:
 
-
     ClipManager(KdenliveDoc *doc);
     virtual ~ ClipManager();
     void addClip(DocClipBase *clip);
@@ -75,6 +75,8 @@ Q_OBJECT public:
     void addFolder(const QString&, const QString&);
     void deleteFolder(const QString&);
     void clear();
+    void setGroups(QList <QGraphicsItem *> groups);
+    QDomElement groupsXml() const;
 
 public slots:
     void updatePreviewSettings();
@@ -82,6 +84,8 @@ public slots:
 private:   // Private attributes
     /** the list of clips in the document */
     QList <DocClipBase*> m_clipList;
+    /** the list of groups in the document */
+    QList <QGraphicsItem *> m_groupsList;
     QMap <QString, QString> m_folderList;
     QList <QString> m_audioThumbsQueue;
     /** the document undo stack*/
index d145b745d855c4d821878c3a2e0df35aaff82f5c..d6a2680a44c8b5ca2a0dc161857acf3b2cdce888 100644 (file)
@@ -912,6 +912,7 @@ void CustomTrackView::groupSelectedItems(bool force, bool createNewGroup) {
                     selection.at(i)->setFlags(QGraphicsItem::ItemIsSelectable);
                 }
             }
+            syncGroups();
             KdenliveSettings::setSnaptopoints(snap);
         } else {
             m_selectionGroup = new AbstractGroupItem(m_document->fps());
@@ -3950,4 +3951,15 @@ void CustomTrackView::getTransitionAvailableSpace(AbstractClipItem *item, GenTim
     }
 }
 
+void CustomTrackView::syncGroups() {
+    // create groups list
+    QList<QGraphicsItem*> items = scene()->items();
+    int i = 0;
+    while (i < items.count()) {
+        if (items.at(i)->type() != GROUPWIDGET) items.removeAt(i);
+        else i++;
+    }
+    m_document->clipManager()->setGroups(items);
+}
+
 #include "customtrackview.moc"
index 8b0d95b68f56b115772247696b16460643a61e3f..878f7aa7749433670da8c3863523969c28e8756b 100644 (file)
@@ -234,6 +234,8 @@ private:
     void getClipAvailableSpace(AbstractClipItem *item, GenTime &minimum, GenTime &maximum);
     /** Get available space for transition move (min and max free positions) */
     void getTransitionAvailableSpace(AbstractClipItem *item, GenTime &minimum, GenTime &maximum);
+    /** Send a list of all current groups to clipmanager */
+    void syncGroups();
 
 
 private slots:
index 388de5851600323c684972fbb07d01bfe20a8887..826413acf5b4c511005200d1058d350c0c7dd4fd 100644 (file)
@@ -984,8 +984,13 @@ bool KdenliveDoc::saveSceneList(const QString &path, const QString &scene) {
         }
     }
     addedXml.appendChild(markers);
+
+    // Add guides
     if (!m_guidesXml.isNull()) addedXml.appendChild(sceneList.importNode(m_guidesXml, true));
 
+    // Add clip groups
+    addedXml.appendChild(sceneList.importNode(m_clipManager->groupsXml(), true));
+
     //wes.appendChild(doc.importNode(kdenliveData, true));
 
     QFile file(path);