]> git.sesse.net Git - kdenlive/commitdiff
Fix ungrouping and track effect drop
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Thu, 29 Mar 2012 23:42:20 +0000 (01:42 +0200)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Thu, 29 Mar 2012 23:42:20 +0000 (01:42 +0200)
src/customtrackview.cpp
src/effectstack/collapsibleeffect.cpp
src/effectstack/collapsibleeffect.h
src/effectstack/collapsiblegroup.cpp
src/headertrack.cpp
src/headertrack.h
src/kdenlivedoc.cpp
src/kdenlivedoc.h
src/trackview.cpp

index 362305159191ac8715a576086afec63684dcf8c8..3cd0003b61877a2505e403175e2b266462233e06 100644 (file)
@@ -1837,7 +1837,7 @@ void CustomTrackView::processEffect(ClipItem *item, QDomElement effect, QUndoCom
             return;
         }
     }
-    if (item->hasEffect(effect.attribute("tag"), effect.attribute("id")) != -1 && effect.attribute("unique", "0") != "0") {
+    if (effect.attribute("unique", "0") != "0" && item->hasEffect(effect.attribute("tag"), effect.attribute("id")) != -1) {
        emit displayMessage(i18n("Effect already present in clip"), ErrorMessage);
         return;
     }
@@ -6625,9 +6625,42 @@ bool CustomTrackView::hasAudio(int track) const
 
 void CustomTrackView::slotAddTrackEffect(const QDomElement &effect, int ix)
 {
-    AddEffectCommand *command = new AddEffectCommand(this, m_document->tracksCount() - ix, GenTime(-1), effect, true);
-    m_commandStack->push(command);
-    setDocumentModified();
+    
+    QUndoCommand *effectCommand = new QUndoCommand();
+    QString effectName;
+    if (effect.tagName() == "list") {
+        effectName = effect.attribute("name");
+    } else {
+        QDomElement namenode = effect.firstChildElement("name");
+        if (!namenode.isNull()) effectName = i18n(namenode.text().toUtf8().data());
+        else effectName = i18n("effect");
+    }
+    effectCommand->setText(i18n("Add %1", effectName));
+    if (effect.tagName() == "list") {
+        QDomNodeList effectlist = effect.elementsByTagName("effect");
+        for (int j = 0; j < effectlist.count(); j++) {
+            QDomElement trackeffect = effectlist.at(j).toElement();
+            if (trackeffect.attribute("unique", "0") != "0" && m_document->hasTrackEffect(m_document->tracksCount() - ix - 1, trackeffect.attribute("tag"), trackeffect.attribute("id")) != -1) {
+                emit displayMessage(i18n("Effect already present in track"), ErrorMessage);
+                continue;
+            }
+            new AddEffectCommand(this, m_document->tracksCount() - ix, GenTime(-1), trackeffect, true, effectCommand);
+        }
+    }
+    else {
+        if (effect.attribute("unique", "0") != "0" && m_document->hasTrackEffect(m_document->tracksCount() - ix - 1, effect.attribute("tag"), effect.attribute("id")) != -1) {
+            emit displayMessage(i18n("Effect already present in track"), ErrorMessage);
+            delete effectCommand;
+            return;
+        }
+        new AddEffectCommand(this, m_document->tracksCount() - ix, GenTime(-1), effect, true, effectCommand);
+    }
+
+    if (effectCommand->childCount() > 0) {
+        m_commandStack->push(effectCommand);
+        setDocumentModified();
+    }
+    else delete effectCommand;
 }
 
 
index 47f39de4e2b6eaf8bd116c3aa01b4d9562ca41c4..d731715a27e4f6a8d4de4da83bff07a089980fc5 100644 (file)
@@ -425,14 +425,6 @@ void CollapsibleEffect::slotShow(bool show)
     emit parameterChanged(m_original_effect, m_effect, effectIndex());   
 }
 
-void CollapsibleEffect::updateGroupIndex(int groupIndex)
-{
-    m_info.groupIndex = groupIndex;
-    if (groupIndex == -1) m_info.groupName.clear();
-    m_effect.setAttribute("kdenlive_info", m_info.toString());
-    emit parameterChanged(m_original_effect, m_effect, effectIndex());
-}
-
 void CollapsibleEffect::setGroupIndex(int ix)
 {
     m_info.groupIndex = ix;
@@ -448,18 +440,12 @@ QString CollapsibleEffect::infoString() const
     return m_info.toString();
 }
 
-void CollapsibleEffect::removeGroup(int ix, QVBoxLayout *layout)
+void CollapsibleEffect::removeFromGroup()
 {
-    QVBoxLayout *vbox = static_cast<QVBoxLayout *>(widgetFrame->layout());
-    if (vbox == NULL) return;
-    
-    for (int j = vbox->count() - 1; j >= 0; j--) {
-       QLayoutItem *child = vbox->takeAt(j);
-       CollapsibleEffect *e = static_cast<CollapsibleEffect *>(child->widget());
-       layout->insertWidget(ix, e);
-       e->updateGroupIndex(-1);
-       delete child;
-    }
+    m_info.groupIndex = -1;
+    m_info.groupName.clear();
+    m_effect.setAttribute("kdenlive_info", m_info.toString());
+    emit parameterChanged(m_original_effect, m_effect, effectIndex());
 }
 
 int CollapsibleEffect::groupIndex() const
index 38d893e76450efbdb9ec163fb69e698b0bbc973e..536adc9308426eef17e731671dce15c97093c0ef 100644 (file)
@@ -136,7 +136,8 @@ public:
     int effectIndex() const;
     void setGroupIndex(int ix);
     void setGroupName(const QString &groupName);
-    void removeGroup(int ix, QVBoxLayout *layout);
+    /** @brief Remove this effect from its group. */
+    void removeFromGroup();
     QString infoString() const;
     bool isActive() const;
     /** @brief Should the wheel event be sent to parent widget for scrolling. */
@@ -173,8 +174,6 @@ private:
     QPoint m_clickPoint;
     EffectInfo m_info;
     
-    void updateGroupIndex(int groupIndex);
-    
 protected:
     virtual void mouseDoubleClickEvent ( QMouseEvent * event );
     virtual void mousePressEvent ( QMouseEvent * event );
index de38ff5dfe5a97aa49cd7b98e50635f2f7a156bf..ac0ab4ec115dd1967caab731e05b3c0f5c9c61fe 100644 (file)
@@ -49,6 +49,7 @@ void MyEditableLabel::mouseDoubleClickEvent ( QMouseEvent * e )
 {
     setReadOnly(false);
     selectAll();
+    e->accept();
 }
 
 
@@ -242,6 +243,7 @@ void CollapsibleGroup::removeGroup(int ix, QVBoxLayout *layout)
     for (int i = m_subWidgets.count() - 1; i >= 0 ; i--) {
        vbox->removeWidget(m_subWidgets.at(i));
        layout->insertWidget(ix, m_subWidgets.at(i));
+        m_subWidgets.at(i)->removeFromGroup();
     }
     m_subWidgets.clear();
 }
index 2241ec9b552ce0bb0703c61f5d3fb8b9536c1bfa..86956b7fb204cec148821388cbfcef1fb11de3ed 100644 (file)
@@ -135,9 +135,19 @@ void HeaderTrack::dropEvent(QDropEvent * event)
     const QString effects = QString::fromUtf8(event->mimeData()->data("kdenlive/effectslist"));
     QDomDocument doc;
     doc.setContent(effects, true);
-    const QDomElement e = doc.documentElement();
+    QDomElement e = doc.documentElement();
+    if (e.tagName() == "list") {
+        // dropped an effect group
+        QDomNodeList effectlist = e.elementsByTagName("effect");
+        for (int i = 0; i < effectlist.count(); i++) {
+            effectlist.at(i).toElement().removeAttribute("kdenlive_ix");
+        }
+    } else {
+        // single effect dropped
+        e.removeAttribute("kdenlive_ix");
+    }
     emit selectTrack(m_index);
-    emit addTrackInfo(e, m_index);
+    emit addTrackEffect(e, m_index);
     /*if (scene() && !scene()->views().isEmpty()) {
         event->accept();
         CustomTrackView *view = (CustomTrackView *) scene()->views()[0];
index 8163a9fb9a8d2a2e6f689d8e426e2f0b7c4c2563..3b69acf071c1871a2e21ab16361936d8d5f7d61a 100644 (file)
@@ -66,7 +66,7 @@ signals:
     void renameTrack(int, QString);
     void selectTrack(int);
     void configTrack(int);
-    void addTrackInfo(const QDomElement, int);
+    void addTrackEffect(const QDomElement, int);
     void showTrackEffects(int);
 };
 
index 54581a12124093ec22706a7174efa0a29153a912..d52d8fa7c6ce616f0ed5073812d78a8150dc5870 100644 (file)
@@ -1552,6 +1552,16 @@ QDomElement KdenliveDoc::getTrackEffect(int trackIndex, int effectIndex) const
     return list.itemFromIndex(effectIndex).cloneNode().toElement();
 }
 
+int KdenliveDoc::hasTrackEffect(int trackIndex, const QString &tag, const QString &id) const
+{
+    if (trackIndex < 0 || trackIndex >= m_tracksList.count()) {
+        kWarning() << "Get Track effect outisde of range";
+        return -1;
+    }
+    EffectsList list = m_tracksList.at(trackIndex).effectsList;
+    return list.hasEffect(tag, id);
+}
+
 bool KdenliveDoc::saveCustomEffects(QDomNodeList customeffects)
 {
     QDomElement e;
index fcdb0979170f8d6d5735103a16fcaff25314a04b..d9bacf130e5eacb8552e69583b11e3bfb0265871 100644 (file)
@@ -155,6 +155,8 @@ Q_OBJECT public:
     void setTrackEffect(int trackIndex, int effectIndex, QDomElement effect);
     const EffectsList getTrackEffects(int ix);
     QDomElement getTrackEffect(int trackIndex, int effectIndex) const;
+    /** @brief Check if a track already contains a specific effect. */
+    int hasTrackEffect(int trackIndex, const QString &tag, const QString &id) const;
     /** @brief Get a list of folder id's that were opened on last save. */
     QStringList getExpandedFolders();
     /** @brief Read the display ratio from an xml project file. */
index 435712d156affcbdd64dc67d360e43efd95a2f4a..c3cc0d11fc9fce0540f83e48ccb0269407a0d04c 100644 (file)
@@ -561,7 +561,7 @@ void TrackView::slotRebuildTrackHeaders()
         connect(header, SIGNAL(selectTrack(int)), m_trackview, SLOT(slotSelectTrack(int)));
         connect(header, SIGNAL(renameTrack(int, QString)), this, SLOT(slotRenameTrack(int, QString)));
         connect(header, SIGNAL(configTrack(int)), this, SIGNAL(configTrack(int)));
-        connect(header, SIGNAL(addTrackInfo(const QDomElement, int)), m_trackview, SLOT(slotAddTrackEffect(const QDomElement, int)));
+        connect(header, SIGNAL(addTrackEffect(const QDomElement, int)), m_trackview, SLOT(slotAddTrackEffect(const QDomElement, int)));
         connect(header, SIGNAL(showTrackEffects(int)), this, SLOT(slotShowTrackEffects(int)));
         headers_container->layout()->addWidget(header);
     }