]> git.sesse.net Git - kdenlive/commitdiff
improve management of groups
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 18 Mar 2009 17:27:31 +0000 (17:27 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 18 Mar 2009 17:27:31 +0000 (17:27 +0000)
svn path=/trunk/kdenlive/; revision=3163

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

index 5ed26f2bda0ffdd6af298f183e51da40ef2e6fce..5d23d5f3f5069025380799249fd10d35a9389891 100644 (file)
@@ -24,6 +24,7 @@
 #include "docclipbase.h"
 #include "kdenlivedoc.h"
 #include "abstractclipitem.h"
+#include "abstractgroupitem.h"
 
 #include <mlt++/Mlt.h>
 
@@ -342,8 +343,14 @@ void ClipManager::deleteFolder(const QString &id) {
     m_folderList.remove(id);
 }
 
-void ClipManager::setGroups(QList <QGraphicsItem *> groups) {
-    m_groupsList = groups;
+AbstractGroupItem *ClipManager::createGroup() {
+    AbstractGroupItem *group = new AbstractGroupItem(m_doc->fps());
+    m_groupsList.append(group);
+    return group;
+}
+
+void ClipManager::removeGroup(AbstractGroupItem *group) {
+    m_groupsList.removeAll(group);
 }
 
 QDomElement ClipManager::groupsXml() const {
@@ -353,7 +360,7 @@ QDomElement ClipManager::groupsXml() const {
     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();
+        QList <QGraphicsItem *> children = 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));
index 2e1459d3e44d2a8a84a8072c321a5906357e7246..a5c92231939fe779f40dbb7fa50277ca6be91521 100644 (file)
@@ -38,7 +38,7 @@
 
 class KdenliveDoc;
 class DocClipBase;
-class QGraphicsItem;
+class AbstractGroupItem;
 
 namespace Mlt {
 class Producer;
@@ -75,7 +75,8 @@ Q_OBJECT public:
     void addFolder(const QString&, const QString&);
     void deleteFolder(const QString&);
     void clear();
-    void setGroups(QList <QGraphicsItem *> groups);
+    AbstractGroupItem *createGroup();
+    void removeGroup(AbstractGroupItem *group);
     QDomElement groupsXml() const;
 
 public slots:
@@ -85,7 +86,7 @@ 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;
+    QList <AbstractGroupItem *> m_groupsList;
     QMap <QString, QString> m_folderList;
     QList <QString> m_audioThumbsQueue;
     /** the document undo stack*/
index d6a2680a44c8b5ca2a0dc161857acf3b2cdce888..2b9f17d2d76bbfe79b94bdcfa61d24fa887f8702 100644 (file)
@@ -823,12 +823,13 @@ void CustomTrackView::resetSelectionGroup(bool selectItems) {
                 children.at(i)->setSelected(selectItems);
 
                 // Rebuild groups or they get corrupted (because of translate / move issues)
-                QGraphicsItemGroup *group = static_cast <QGraphicsItemGroup *>(children.at(i));
+                AbstractGroupItem *group = static_cast <AbstractGroupItem *>(children.at(i));
                 //kDebug()<<"// GRP POS:"<<group->scenePos()<<", SELECT:"<<selectionPos;
                 if (group->scenePos() != selectionPos)
                     group->translate(selectionPos.x(), selectionPos.y());
                 //group->setPos(-selectionPos.x(), -selectionPos.y());
                 QList<QGraphicsItem *> selection = group->childItems();
+                m_document->clipManager()->removeGroup(group);
                 scene()->destroyItemGroup(group);
                 if (!selection.isEmpty()) {
                     QPointF top = selection.at(0)->sceneBoundingRect().topLeft();
@@ -844,7 +845,7 @@ void CustomTrackView::resetSelectionGroup(bool selectItems) {
                         }
                     }
 
-                    AbstractGroupItem *newGroup = new AbstractGroupItem(m_document->fps());
+                    AbstractGroupItem *newGroup = m_document->clipManager()->createGroup();
                     newGroup->translate(-top.x(), -top.y() + 1);
                     newGroup->setPos(top.x(), top.y() - 1);
                     scene()->addItem(newGroup);
@@ -885,22 +886,23 @@ void CustomTrackView::groupSelectedItems(bool force, bool createNewGroup) {
         bool snap = KdenliveSettings::snaptopoints();
         KdenliveSettings::setSnaptopoints(false);
         if (createNewGroup) {
-            AbstractGroupItem *newGroup = new AbstractGroupItem(m_document->fps());
+            AbstractGroupItem *newGroup = m_document->clipManager()->createGroup();
             newGroup->translate(-top.x(), -top.y() + 1);
             newGroup->setPos(top.x(), top.y() - 1);
             scene()->addItem(newGroup);
 
             // CHeck if we are trying to include a group in a group
-            QList <QGraphicsItemGroup *> groups;
+            QList <AbstractGroupItem *> groups;
             for (int i = 0; i < selection.count(); i++) {
-                if (selection.at(i)->type() == GROUPWIDGET && !groups.contains(static_cast<QGraphicsItemGroup *>(selection.at(i)))) {
-                    groups.append(static_cast<QGraphicsItemGroup *>(selection.at(i)));
-                } else if (selection.at(i)->parentItem() && !groups.contains(static_cast<QGraphicsItemGroup *>(selection.at(i)->parentItem()))) groups.append(static_cast<QGraphicsItemGroup *>(selection.at(i)->parentItem()));
+                if (selection.at(i)->type() == GROUPWIDGET && !groups.contains(static_cast<AbstractGroupItem *>(selection.at(i)))) {
+                    groups.append(static_cast<AbstractGroupItem *>(selection.at(i)));
+                } else if (selection.at(i)->parentItem() && !groups.contains(static_cast<AbstractGroupItem *>(selection.at(i)->parentItem()))) groups.append(static_cast<AbstractGroupItem *>(selection.at(i)->parentItem()));
             }
             if (!groups.isEmpty()) {
                 // ungroup previous groups
                 while (!groups.isEmpty()) {
-                    QGraphicsItemGroup *grp = groups.takeFirst();
+                    AbstractGroupItem *grp = groups.takeFirst();
+                    m_document->clipManager()->removeGroup(grp);
                     scene()->destroyItemGroup(grp);
                 }
                 selection = m_scene->selectedItems();
@@ -912,7 +914,6 @@ 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());
@@ -2629,13 +2630,21 @@ void CustomTrackView::doGroupClips(QList <ItemInfo> clipInfos, QList <ItemInfo>
         for (int i = 0; i < clipInfos.count(); i++) {
             ClipItem *clip = getClipItemAt(clipInfos.at(i).startPos, clipInfos.at(i).track);
             if (clip == NULL) continue;
-            if (clip->parentItem()) scene()->destroyItemGroup(static_cast <QGraphicsItemGroup *>(clip->parentItem()));
+            if (clip->parentItem() && clip->parentItem()->type() == GROUPWIDGET) {
+                AbstractGroupItem *grp = static_cast <AbstractGroupItem *>(clip->parentItem());
+                m_document->clipManager()->removeGroup(grp);
+                scene()->destroyItemGroup(grp);
+            }
             clip->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
         }
         for (int i = 0; i < transitionInfos.count(); i++) {
             Transition *tr = getTransitionItemAt(transitionInfos.at(i).startPos, transitionInfos.at(i).track);
             if (tr == NULL) continue;
-            if (tr->parentItem()) scene()->destroyItemGroup(static_cast <QGraphicsItemGroup *>(tr->parentItem()));
+            if (tr->parentItem() && tr->parentItem()->type() == GROUPWIDGET) {
+                AbstractGroupItem *grp = static_cast <AbstractGroupItem *>(tr->parentItem());
+                m_document->clipManager()->removeGroup(grp);
+                scene()->destroyItemGroup(grp);
+            }
             tr->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
         }
         m_document->setModified(true);
@@ -3951,15 +3960,5 @@ 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 878f7aa7749433670da8c3863523969c28e8756b..8b0d95b68f56b115772247696b16460643a61e3f 100644 (file)
@@ -234,8 +234,6 @@ 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: