From: Jean-Baptiste Mardelle Date: Wed, 18 Mar 2009 17:27:31 +0000 (+0000) Subject: improve management of groups X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=7222ed9c39ca2c77fee92f124623278f1011761f;p=kdenlive improve management of groups svn path=/trunk/kdenlive/; revision=3163 --- diff --git a/src/clipmanager.cpp b/src/clipmanager.cpp index 5ed26f2b..5d23d5f3 100644 --- a/src/clipmanager.cpp +++ b/src/clipmanager.cpp @@ -24,6 +24,7 @@ #include "docclipbase.h" #include "kdenlivedoc.h" #include "abstractclipitem.h" +#include "abstractgroupitem.h" #include @@ -342,8 +343,14 @@ void ClipManager::deleteFolder(const QString &id) { m_folderList.remove(id); } -void ClipManager::setGroups(QList 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 children = static_cast (m_groupsList.at(i))->childItems(); + QList 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 (children.at(j)); diff --git a/src/clipmanager.h b/src/clipmanager.h index 2e1459d3..a5c92231 100644 --- a/src/clipmanager.h +++ b/src/clipmanager.h @@ -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 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 m_clipList; /** the list of groups in the document */ - QList m_groupsList; + QList m_groupsList; QMap m_folderList; QList m_audioThumbsQueue; /** the document undo stack*/ diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index d6a2680a..2b9f17d2 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -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 (children.at(i)); + AbstractGroupItem *group = static_cast (children.at(i)); //kDebug()<<"// GRP POS:"<scenePos()<<", SELECT:"<scenePos() != selectionPos) group->translate(selectionPos.x(), selectionPos.y()); //group->setPos(-selectionPos.x(), -selectionPos.y()); QList 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 groups; + QList groups; for (int i = 0; i < selection.count(); i++) { - if (selection.at(i)->type() == GROUPWIDGET && !groups.contains(static_cast(selection.at(i)))) { - groups.append(static_cast(selection.at(i))); - } else if (selection.at(i)->parentItem() && !groups.contains(static_cast(selection.at(i)->parentItem()))) groups.append(static_cast(selection.at(i)->parentItem())); + if (selection.at(i)->type() == GROUPWIDGET && !groups.contains(static_cast(selection.at(i)))) { + groups.append(static_cast(selection.at(i))); + } else if (selection.at(i)->parentItem() && !groups.contains(static_cast(selection.at(i)->parentItem()))) groups.append(static_cast(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 clipInfos, QList 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 (clip->parentItem())); + if (clip->parentItem() && clip->parentItem()->type() == GROUPWIDGET) { + AbstractGroupItem *grp = static_cast (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 (tr->parentItem())); + if (tr->parentItem() && tr->parentItem()->type() == GROUPWIDGET) { + AbstractGroupItem *grp = static_cast (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 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" diff --git a/src/customtrackview.h b/src/customtrackview.h index 878f7aa7..8b0d95b6 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -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: