From 65291fac2609fe71e4be801a4d5349ddda5b9243 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Sun, 1 Apr 2012 01:29:07 +0200 Subject: [PATCH] new: saving of effect group --- src/clipitem.cpp | 2 +- src/customtrackview.cpp | 10 ++++---- src/effectslist.cpp | 10 ++++++-- src/effectslist.h | 4 ++++ src/effectslistwidget.cpp | 3 ++- src/effectstack/collapsibleeffect.cpp | 2 +- src/effectstack/collapsiblegroup.cpp | 14 ++++++++--- src/headertrack.cpp | 2 +- src/initeffects.cpp | 34 ++++++++++++++++++++------- 9 files changed, 59 insertions(+), 22 deletions(-) diff --git a/src/clipitem.cpp b/src/clipitem.cpp index fadf7ba5..1f350225 100644 --- a/src/clipitem.cpp +++ b/src/clipitem.cpp @@ -1638,7 +1638,7 @@ void ClipItem::dropEvent(QGraphicsSceneDragDropEvent * event) QDomDocument doc; doc.setContent(effects, true); QDomElement e = doc.documentElement(); - if (e.tagName() == "list") { + if (e.tagName() == "effectgroup") { // dropped an effect group QDomNodeList effectlist = e.elementsByTagName("effect"); for (int i = 0; i < effectlist.count(); i++) { diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index b2b87926..b3ca6e39 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -1730,7 +1730,7 @@ void CustomTrackView::slotAddGroupEffect(QDomElement effect, AbstractGroupItem * for (int i = 0; i < itemList.count(); i++) { if (itemList.at(i)->type() == AVWIDGET) { ClipItem *item = static_cast (itemList.at(i)); - if (effect.tagName() == "list") { + if (effect.tagName() == "effectgroup") { QDomNodeList effectlist = effect.elementsByTagName("effect"); for (int j = 0; j < effectlist.count(); j++) { processEffect(item, effectlist.at(j).toElement(), effectCommand); @@ -1757,7 +1757,7 @@ void CustomTrackView::slotAddEffect(QDomElement effect, GenTime pos, int track) QList itemList; QUndoCommand *effectCommand = new QUndoCommand(); QString effectName; - if (effect.tagName() == "list") { + if (effect.tagName() == "effectgroup") { effectName = effect.attribute("name"); } else { QDomElement namenode = effect.firstChildElement("name"); @@ -1786,7 +1786,7 @@ void CustomTrackView::slotAddEffect(QDomElement effect, GenTime pos, int track) for (int i = 0; i < itemList.count(); i++) { if (itemList.at(i)->type() == AVWIDGET) { ClipItem *item = static_cast (itemList.at(i)); - if (effect.tagName() == "list") { + if (effect.tagName() == "effectgroup") { QDomNodeList effectlist = effect.elementsByTagName("effect"); for (int j = 0; j < effectlist.count(); j++) { processEffect(item, effectlist.at(j).toElement(), effectCommand); @@ -6629,7 +6629,7 @@ void CustomTrackView::slotAddTrackEffect(const QDomElement &effect, int ix) QUndoCommand *effectCommand = new QUndoCommand(); QString effectName; - if (effect.tagName() == "list") { + if (effect.tagName() == "effectgroup") { effectName = effect.attribute("name"); } else { QDomElement namenode = effect.firstChildElement("name"); @@ -6637,7 +6637,7 @@ void CustomTrackView::slotAddTrackEffect(const QDomElement &effect, int ix) else effectName = i18n("effect"); } effectCommand->setText(i18n("Add %1", effectName)); - if (effect.tagName() == "list") { + if (effect.tagName() == "effectgroup") { QDomNodeList effectlist = effect.elementsByTagName("effect"); for (int j = 0; j < effectlist.count(); j++) { QDomElement trackeffect = effectlist.at(j).toElement(); diff --git a/src/effectslist.cpp b/src/effectslist.cpp index f673c0e1..2ceb0305 100644 --- a/src/effectslist.cpp +++ b/src/effectslist.cpp @@ -100,8 +100,14 @@ QStringList EffectsList::effectIdInfo(const int ix) const { QStringList info; QDomElement effect = m_baseElement.childNodes().at(ix).toElement(); - QDomElement namenode = effect.firstChildElement("name"); - info << i18n(namenode.text().toUtf8().data()) << effect.attribute("tag") << effect.attribute("id"); + if (effect.tagName() == "effectgroup") { + QString groupName = effect.attribute("name"); + info << groupName << groupName << groupName << QString::number(Kdenlive::groupEffect); + } + else { + QDomElement namenode = effect.firstChildElement("name"); + info << i18n(namenode.text().toUtf8().data()) << effect.attribute("tag") << effect.attribute("id"); + } return info; } diff --git a/src/effectslist.h b/src/effectslist.h index e52bb01f..8a851a79 100644 --- a/src/effectslist.h +++ b/src/effectslist.h @@ -32,6 +32,10 @@ #include +namespace Kdenlive { + enum EFFECTTYPE { simpleEffect, groupEffect }; +} + class EffectsList: public QDomDocument { public: diff --git a/src/effectslistwidget.cpp b/src/effectslistwidget.cpp index 2c510696..7d75ac88 100644 --- a/src/effectslistwidget.cpp +++ b/src/effectslistwidget.cpp @@ -246,7 +246,8 @@ void EffectsListWidget::loadEffects(const EffectsList *effectlist, KIcon icon, Q if (!effectInfo.isEmpty()) { item = new QTreeWidgetItem(parentItem, QStringList(effectInfo.takeFirst())); - item->setIcon(0, icon); + if (effectInfo.count() == 4) item->setIcon(0, KIcon("folder")); + else item->setIcon(0, icon); item->setData(0, TypeRole, type); item->setData(0, IdRole, effectInfo); item->setToolTip(0, effectlist->getInfo(effectInfo.at(0), effectInfo.at(1))); diff --git a/src/effectstack/collapsibleeffect.cpp b/src/effectstack/collapsibleeffect.cpp index 82c99ab9..71ed8e44 100644 --- a/src/effectstack/collapsibleeffect.cpp +++ b/src/effectstack/collapsibleeffect.cpp @@ -211,7 +211,7 @@ const QString CollapsibleEffect::getStyleSheet(QPalette p) QColor selected_bg = scheme.decoration(KColorScheme::FocusColor).color(); QColor hover_bg = scheme.decoration(KColorScheme::HoverColor).color(); QColor light_bg = scheme.shade(KColorScheme::LightShade); - QColor midlight_bg = scheme.shade(KColorScheme::MidlightShade); + //QColor midlight_bg = scheme.shade(KColorScheme::MidlightShade); QColor normal_bg = scheme.background(KColorScheme::AlternateBackground).color(); QColor alt_bg = scheme.background(KColorScheme::NormalBackground).color(); diff --git a/src/effectstack/collapsiblegroup.cpp b/src/effectstack/collapsiblegroup.cpp index 4e7afd84..30684c26 100644 --- a/src/effectstack/collapsiblegroup.cpp +++ b/src/effectstack/collapsiblegroup.cpp @@ -162,9 +162,17 @@ void CollapsibleGroup::slotSaveGroup() QDomDocument doc = effectsData(); QDomElement base = doc.documentElement(); QDomNodeList effects = base.elementsByTagName("effect"); - for (int i = 0; i < effects.count(); i++) - effects.at(i).toElement().removeAttribute("kdenlive_ix"); + for (int i = 0; i < effects.count(); i++) { + QDomElement eff = effects.at(i).toElement(); + eff.removeAttribute("kdenlive_ix"); + QString kdenliveInfo = eff.attribute("kdenlive_info"); + // Make sure all effects have the correct new group name + if (kdenliveInfo.count('/') >= 2) { + eff.setAttribute("kdenlive_info", kdenliveInfo.section('/', 0, 1) + "/" + name); + } + } + base.setAttribute("name", name); base.setAttribute("id", name); base.setAttribute("type", "custom"); @@ -324,7 +332,7 @@ QDomDocument CollapsibleGroup::effectsData() { QMutexLocker lock(&m_mutex); QDomDocument doc; - QDomElement list = doc.createElement("list"); + QDomElement list = doc.createElement("effectgroup"); list.setAttribute("name", m_title->text()); doc.appendChild(list); for (int j = 0; j < m_subWidgets.count(); j++) { diff --git a/src/headertrack.cpp b/src/headertrack.cpp index 86956b7f..af95f277 100644 --- a/src/headertrack.cpp +++ b/src/headertrack.cpp @@ -136,7 +136,7 @@ void HeaderTrack::dropEvent(QDropEvent * event) QDomDocument doc; doc.setContent(effects, true); QDomElement e = doc.documentElement(); - if (e.tagName() == "list") { + if (e.tagName() == "effectgroup") { // dropped an effect group QDomNodeList effectlist = e.elementsByTagName("effect"); for (int i = 0; i < effectlist.count(); i++) { diff --git a/src/initeffects.cpp b/src/initeffects.cpp index 62961b7c..6f0608fa 100644 --- a/src/initeffects.cpp +++ b/src/initeffects.cpp @@ -318,18 +318,25 @@ void initEffects::parseCustomEffectsFile() QDomDocument doc; QDomNodeList effects; QDomElement e; + int unknownGroupCount = 0; foreach(const QString & filename, fileList) { QString itemName = KUrl(path + filename).path(); QFile file(itemName); doc.setContent(&file, false); file.close(); - effects = doc.elementsByTagName("effect"); - if (effects.count() != 1) { - kDebug() << "More than one effect in file " << itemName << ", not supported yet"; - } else { - e = effects.item(0).toElement(); - effectsMap.insert(e.firstChildElement("name").text().toLower().toUtf8().data(), e); + QDomElement base = doc.documentElement(); + if (base.tagName() == "effectgroup") { + QString groupName = base.attribute("name"); + if (groupName.isEmpty()) { + groupName = i18n("Group %1", unknownGroupCount); + base.setAttribute("name", groupName); + unknownGroupCount++; + } + effectsMap.insert(groupName.toLower().toUtf8().data(), base); + } else if (base.tagName() == "effect") { + effectsMap.insert(e.firstChildElement("name").text().toLower().toUtf8().data(), base); } + else kDebug() << "Unsupported effect file: " << itemName; } foreach(const QDomElement & effect, effectsMap) MainWindow::customEffects.append(effect); @@ -343,7 +350,9 @@ void initEffects::parseEffectFile(EffectsList *customEffectList, EffectsList *au doc.setContent(&file, false); file.close(); QDomElement documentElement; - QDomNodeList effects = doc.elementsByTagName("effect"); + QDomNodeList effects; + QDomElement base = doc.documentElement(); + effects = doc.elementsByTagName("effect"); if (effects.count() == 0) { kDebug() << "Effect broken: " << name; @@ -404,7 +413,7 @@ void initEffects::parseEffectFile(EffectsList *customEffectList, EffectsList *au } // Parse effect information. - if ((filtersList.contains(tag) || producersList.contains(tag))) { + if (base.tagName() != "effectgroup" && (filtersList.contains(tag) || producersList.contains(tag))) { QString type = documentElement.attribute("type", QString()); if (type == "audio") audioEffectList->append(documentElement); @@ -414,6 +423,15 @@ void initEffects::parseEffectFile(EffectsList *customEffectList, EffectsList *au videoEffectList->append(documentElement); } } + if (base.tagName() == "effectgroup") { + QString type = base.attribute("type", QString()); + if (type == "audio") + audioEffectList->append(base); + else if (type == "custom") + customEffectList->append(base); + else + videoEffectList->append(base); + } } QDomDocument initEffects::createDescriptionFromMlt(Mlt::Repository* repository, const QString& /*type*/, const QString& filtername) -- 2.39.2