]> git.sesse.net Git - kdenlive/commitdiff
Fix handling of effects (do not rely on i18n name for identification)
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 15 Oct 2008 23:09:55 +0000 (23:09 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 15 Oct 2008 23:09:55 +0000 (23:09 +0000)
svn path=/branches/KDE4/; revision=2472

src/clipitem.cpp
src/clipitem.h
src/customtrackview.cpp
src/effectslist.cpp
src/effectslist.h
src/effectslistview.cpp
src/effectslistwidget.cpp
src/mainwindow.cpp

index d3d4712eee31f58e5fa339c99e29aac7f1d54455..b30ca3201ea6bdc24afbc578f941dcc84f59bad0 100644 (file)
@@ -77,6 +77,8 @@ ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double fps)
         connect(endThumbTimer, SIGNAL(timeout()), this, SLOT(slotGetEndThumb()));
 
         connect(this, SIGNAL(getThumb(int, int)), clip->thumbProducer(), SLOT(extractImage(int, int)));
+        //connect(this, SIGNAL(getThumb(int, int)), clip->thumbProducer(), SLOT(getVideoThumbs(int, int)));
+
         connect(clip->thumbProducer(), SIGNAL(thumbReady(int, QPixmap)), this, SLOT(slotThumbReady(int, QPixmap)));
         connect(clip, SIGNAL(gotAudioData()), this, SLOT(slotGotAudioData()));
         QTimer::singleShot(200, this, SLOT(slotFetchThumbs()));
@@ -1002,6 +1004,10 @@ int ClipItem::effectsCount() {
     return m_effectList.size();
 }
 
+int ClipItem::hasEffect(const QString &tag, const QString &id) const {
+    return m_effectList.hasEffect(tag, id);
+}
+
 QStringList ClipItem::effectNames() {
     return m_effectList.effectNames();
 }
index 256f94293ad5262d45c1547e8ec4b270c4f7e9f2..c1589cd74bcff254270fcba901514518e28681d9 100644 (file)
@@ -96,6 +96,7 @@ public:
     void setSpeed(const double speed);
     double speed() const;
     GenTime maxDuration() const;
+    int hasEffect(const QString &tag, const QString &id) const;
 
 protected:
     //virtual void mouseMoveEvent(QGraphicsSceneMouseEvent * event);
index 7511527dafd5529a50922644c6592c258627f601..61721561de384fcd7d3987b8fce62b358aacfd5d 100644 (file)
@@ -1342,9 +1342,8 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
     } else if (m_operationMode == FADEIN) {
         // resize fade in effect
         ClipItem * item = (ClipItem *) m_dragItem;
-        QStringList clipeffects = item->effectNames();
-        if (clipeffects.contains(i18n("Fade in"))) {
-            int ix = clipeffects.indexOf(i18n("Fade in"));
+        int ix = item->hasEffect("volume", "fadein");
+        if (ix != -1) {
             QDomElement oldeffect = item->effectAt(ix);
             int start = item->cropStart().frames(m_document->fps());
             int end = item->fadeIn();
@@ -1352,13 +1351,13 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
                 slotDeleteEffect(item, oldeffect);
             } else {
                 end += start;
-                QDomElement effect = MainWindow::audioEffects.getEffectByName("Fade in");
+                QDomElement effect = MainWindow::audioEffects.getEffectByTag("volume", "fadein");
                 EffectsList::setParameter(effect, "in", QString::number(start));
                 EffectsList::setParameter(effect, "out", QString::number(end));
                 slotUpdateClipEffect(item, oldeffect, effect, ix);
             }
         } else if (item->fadeIn() != 0) {
-            QDomElement effect = MainWindow::audioEffects.getEffectByName("Fade in");
+            QDomElement effect = MainWindow::audioEffects.getEffectByTag("volume", "fadein");
             int start = item->cropStart().frames(m_document->fps());
             int end = item->fadeIn() + start;
             EffectsList::setParameter(effect, "in", QString::number(start));
@@ -1368,9 +1367,8 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
     } else if (m_operationMode == FADEOUT) {
         // resize fade in effect
         ClipItem * item = (ClipItem *) m_dragItem;
-        QStringList clipeffects = item->effectNames();
-        if (clipeffects.contains(i18n("Fade out"))) {
-            int ix = clipeffects.indexOf(i18n("Fade out"));
+        int ix = item->hasEffect("volume", "fadeout");
+        if (ix != -1) {
             QDomElement oldeffect = item->effectAt(ix);
             int end = (item->duration() + item->cropStart()).frames(m_document->fps());
             int start = item->fadeOut();
@@ -1378,13 +1376,13 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
                 slotDeleteEffect(item, oldeffect);
             } else {
                 start = end - start;
-                QDomElement effect = MainWindow::audioEffects.getEffectByName("Fade out");
+                QDomElement effect = MainWindow::audioEffects.getEffectByTag("volume", "fadeout");
                 EffectsList::setParameter(effect, "in", QString::number(start));
                 EffectsList::setParameter(effect, "out", QString::number(end));
                 slotUpdateClipEffect(item, oldeffect, effect, ix);
             }
         } else if (item->fadeOut() != 0) {
-            QDomElement effect = MainWindow::audioEffects.getEffectByName("Fade out");
+            QDomElement effect = MainWindow::audioEffects.getEffectByTag("volume", "fadeout");
             int end = (item->duration() + item->cropStart()).frames(m_document->fps());
             int start = end - item->fadeOut();
             EffectsList::setParameter(effect, "in", QString::number(start));
index 19e9137975a10a2b3eec834833b9dabaa389068f..b5b9cee7a0cef42bd195007b5f982b4b22bf24ec 100644 (file)
@@ -70,7 +70,7 @@ QDomElement EffectsList::getEffectByTag(const QString & tag, const QString & id)
 
     if (!id.isEmpty()) for (int i = 0; i < this->size(); ++i) {
             QDomElement effect =  this->at(i);
-            kDebug() << "// SRCH EFFECT; " << id << ", LKING: " << effect.attribute("id");
+            //kDebug() << "// SRCH EFFECT; " << id << ", LKING: " << effect.attribute("id");
             if (effect.attribute("id") == id) {
                 QDomNodeList params = effect.elementsByTagName("parameter");
                 for (int i = 0; i < params.count(); i++) {
@@ -98,6 +98,24 @@ QDomElement EffectsList::getEffectByTag(const QString & tag, const QString & id)
     return QDomElement();
 }
 
+int EffectsList::hasEffect(const QString & tag, const QString & id) const {
+    for (int i = 0; i < this->size(); ++i) {
+        QDomElement effect =  this->at(i);
+        if (!id.isEmpty()) {
+            if (effect.attribute("id") == id) return i;
+        } else if (!tag.isEmpty() && effect.attribute("tag") == tag) return i;
+    }
+    return -1;
+}
+
+QStringList EffectsList::effectIdInfo(const int ix) const {
+    QStringList info;
+    QDomElement effect =  this->at(ix);
+    QDomNode namenode = effect.elementsByTagName("name").item(0);
+    info << namenode.toElement().text().toUtf8().data() << effect.attribute("tag") << effect.attribute("id");
+    return info;
+}
+
 QStringList EffectsList::effectNames() {
     QStringList list;
     for (int i = 0; i < this->size(); ++i) {
@@ -109,9 +127,9 @@ QStringList EffectsList::effectNames() {
     return list;
 }
 
-QString EffectsList::getInfo(QString effectName) {
+QString EffectsList::getInfo(const QString & tag, const QString & id) {
     QString info;
-    QDomElement effect = getEffectByName(effectName);
+    QDomElement effect = getEffectByTag(tag, id);
     QDomNode namenode = effect.elementsByTagName("description").item(0);
     if (!namenode.isNull()) info = i18n(namenode.toElement().text().toUtf8().data());
     namenode = effect.elementsByTagName("author").item(0);
index 462e283ff74fd7a4b1caa492346a9c42a3cf6582..7b6d12539fa5edba6fbfec596b14304910520321 100644 (file)
@@ -35,8 +35,11 @@ public:
     /** Returns an XML version of this Effect.*/
     QDomElement getEffectByName(const QString & name) const;
     QDomElement getEffectByTag(const QString & tag, const QString & id) const;
+    /** if the list contains effect defined by tag + id, returns effect index, otherwise -1 */
+    int hasEffect(const QString & tag, const QString & id) const;
+    QStringList effectIdInfo(const int ix) const;
     QStringList effectNames();
-    QString getInfo(QString effectName);
+    QString getInfo(const QString & tag, const QString & id);
     QMap <QString, QString> effect(const QString & name);
     static bool hasKeyFrames(QDomElement effect);
     static void setParameter(QDomElement effect, QString name, QString value);
index 8c1d88648e08f8ffb3d7ff313771daa07e9b5cbf..b0aa78698a24a4fb9484a56c7fd00fb9711bb69e 100644 (file)
@@ -87,7 +87,7 @@ void EffectsListView::slotEffectSelected() {
 
 void EffectsListView::slotUpdateInfo() {
     QString info = m_effectsList->currentInfo();
-    if (!info.isEmpty()) ui.infopanel->setText(info);
+    ui.infopanel->setText(info);
 }
 
 KListWidget *EffectsListView::listView() {
index ad0a35a45f050924a21ac42786e84a43a3b8dc13..e8cdfa6dcf508015ea0d1079d2b8d30870fef489 100644 (file)
@@ -31,6 +31,9 @@ static const int EFFECT_VIDEO = 1;
 static const int EFFECT_AUDIO = 2;
 static const int EFFECT_CUSTOM = 3;
 
+const int TypeRole = Qt::UserRole;
+const int IdRole = TypeRole + 1;
+
 EffectsListWidget::EffectsListWidget(QMenu *menu, QWidget *parent)
         : KListWidget(parent), m_menu(menu) {
     //setSelectionMode(QAbstractItemView::ExtendedSelection);
@@ -48,23 +51,37 @@ EffectsListWidget::~EffectsListWidget() {
 
 void EffectsListWidget::initList() {
     clear();
-    QStringList names = MainWindow::videoEffects.effectNames();
     QListWidgetItem *item;
-    foreach(const QString &str, names) {
-        item = new QListWidgetItem(str, this);
-        item->setData(Qt::UserRole, QString::number((int) EFFECT_VIDEO));
+    QString effectName;
+    QStringList effectInfo;
+    int ct = MainWindow::videoEffects.count();
+    for (int ix = 0; ix < ct; ix ++) {
+        effectInfo = MainWindow::videoEffects.effectIdInfo(ix);
+        if (!effectInfo.isEmpty()) {
+            item = new QListWidgetItem(effectInfo.takeFirst(), this);
+            item->setData(TypeRole, QString::number((int) EFFECT_VIDEO));
+            item->setData(IdRole, effectInfo);
+        }
     }
 
-    names = MainWindow::audioEffects.effectNames();
-    foreach(const QString &str, names) {
-        item = new QListWidgetItem(str, this);
-        item->setData(Qt::UserRole, QString::number((int) EFFECT_AUDIO));
+    ct = MainWindow::audioEffects.count();
+    for (int ix = 0; ix < ct; ix ++) {
+        effectInfo = MainWindow::audioEffects.effectIdInfo(ix);
+        if (!effectInfo.isEmpty()) {
+            item = new QListWidgetItem(effectInfo.takeFirst(), this);
+            item->setData(TypeRole, QString::number((int) EFFECT_AUDIO));
+            item->setData(IdRole, effectInfo);
+        }
     }
 
-    names = MainWindow::customEffects.effectNames();
-    foreach(const QString &str, names) {
-        item = new QListWidgetItem(str, this);
-        item->setData(Qt::UserRole, QString::number((int) EFFECT_CUSTOM));
+    ct = MainWindow::customEffects.count();
+    for (int ix = 0; ix < ct; ix ++) {
+        effectInfo = MainWindow::customEffects.effectIdInfo(ix);
+        if (!effectInfo.isEmpty()) {
+            item = new QListWidgetItem(effectInfo.takeFirst(), this);
+            item->setData(TypeRole, QString::number((int) EFFECT_CUSTOM));
+            item->setData(IdRole, effectInfo);
+        }
     }
 }
 
@@ -75,15 +92,17 @@ QDomElement EffectsListWidget::currentEffect() {
 QDomElement EffectsListWidget::itemEffect(QListWidgetItem *item) {
     QDomElement effect;
     if (!item) return effect;
-    switch (item->data(Qt::UserRole).toInt()) {
+    QStringList effectInfo = item->data(IdRole).toStringList();
+    kDebug() << "// EFFECT SELECTED: " << effectInfo;
+    switch (item->data(TypeRole).toInt()) {
     case 1:
-        effect =  MainWindow::videoEffects.getEffectByName(item->text());
+        effect =  MainWindow::videoEffects.getEffectByTag(effectInfo.at(0), effectInfo.at(1));
         break;
     case 2:
-        effect = MainWindow::audioEffects.getEffectByName(item->text());
+        effect = MainWindow::audioEffects.getEffectByTag(effectInfo.at(0), effectInfo.at(1));
         break;
     default:
-        effect = MainWindow::customEffects.getEffectByName(item->text());
+        effect = MainWindow::customEffects.getEffectByTag(effectInfo.at(0), effectInfo.at(1));
         break;
     }
     return effect;
@@ -94,15 +113,16 @@ QString EffectsListWidget::currentInfo() {
     QListWidgetItem *item = currentItem();
     if (!item) return QString();
     QString info;
-    switch (item->data(Qt::UserRole).toInt()) {
+    QStringList effectInfo = item->data(IdRole).toStringList();
+    switch (item->data(TypeRole).toInt()) {
     case 1:
-        info = MainWindow::videoEffects.getInfo(item->text());
+        info = MainWindow::videoEffects.getInfo(effectInfo.at(0), effectInfo.at(1));
         break;
     case 2:
-        info = MainWindow::audioEffects.getInfo(item->text());
+        info = MainWindow::audioEffects.getInfo(effectInfo.at(0), effectInfo.at(1));
         break;
     default:
-        info = MainWindow::customEffects.getInfo(item->text());
+        info = MainWindow::customEffects.getInfo(effectInfo.at(0), effectInfo.at(1));
         break;
     }
     return info;
@@ -132,7 +152,8 @@ void EffectsListWidget::mouseMoveEvent(QMouseEvent *event) {
             const QList <QListWidgetItem *>list = selectedItems();
             QDomDocument doc;
             foreach(QListWidgetItem *item, list) {
-                doc.appendChild(doc.importNode(itemEffect(item), true));
+                QDomElement e = itemEffect(item);
+                if (!e.isNull()) doc.appendChild(doc.importNode(e, true));
             }
             QByteArray data;
             data.append(doc.toString().toUtf8());
@@ -160,7 +181,7 @@ void EffectsListWidget::dragMoveEvent(QDragMoveEvent * event) {
 //virtual
 void EffectsListWidget::contextMenuEvent(QContextMenuEvent * event) {
     QListWidgetItem *item = itemAt(event->pos());
-    if (item && item->data(Qt::UserRole).toInt() == EFFECT_CUSTOM) m_menu->popup(event->globalPos());
+    if (item && item->data(TypeRole).toInt() == EFFECT_CUSTOM) m_menu->popup(event->globalPos());
 }
 
 #include "effectslistwidget.moc"
index 7a73edd47fa667704dfa30ae474b23982a6b7d26..f609da918425b742f0c6d9f211c29ffe18d9e647 100644 (file)
@@ -208,28 +208,40 @@ MainWindow::MainWindow(const QString &MltPath, QWidget *parent)
     // build effects menus
     QAction *action;
     QMenu *videoEffectsMenu = static_cast<QMenu*>(factory()->container("video_effects_menu", this));
+
+    int ix = 0;
     QStringList effects = videoEffects.effectNames();
+    QStringList effectInfo;
     foreach(const QString &name, effects) {
         action = new QAction(name, this);
-        action->setData(name);
+        effectInfo = videoEffects.effectIdInfo(ix);
+        action->setData(effectInfo);
         videoEffectsMenu->addAction(action);
+        ix++;
     }
     QMenu *audioEffectsMenu = static_cast<QMenu*>(factory()->container("audio_effects_menu", this));
+
+    ix = 0;
     effects = audioEffects.effectNames();
     foreach(const QString &name, effects) {
         action = new QAction(name, this);
-        action->setData(name);
+        effectInfo = audioEffects.effectIdInfo(ix);
+        action->setData(effectInfo);
         audioEffectsMenu->addAction(action);
+        ix++;
     }
     m_customEffectsMenu = static_cast<QMenu*>(factory()->container("custom_effects_menu", this));
     effects = customEffects.effectNames();
     if (effects.isEmpty()) m_customEffectsMenu->setEnabled(false);
     else m_customEffectsMenu->setEnabled(true);
 
+    ix = 0;
     foreach(const QString &name, effects) {
         action = new QAction(name, this);
-        action->setData(name);
+        effectInfo = videoEffects.effectIdInfo(ix);
+        action->setData(effectInfo);
         m_customEffectsMenu->addAction(action);
+        ix++;
     }
 
     QMenu *newEffect = new QMenu(this);
@@ -1409,20 +1421,25 @@ void MainWindow::slotAddTransition(QAction *result) {
 
 void MainWindow::slotAddVideoEffect(QAction *result) {
     if (!result) return;
-    QDomElement effect = videoEffects.getEffectByName(result->data().toString());
+    QStringList info = result->data().toStringList();
+    if (info.isEmpty()) return;
+    QDomElement effect = videoEffects.getEffectByTag(info.at(1), info.at(2));
     slotAddEffect(effect);
 }
 
 void MainWindow::slotAddAudioEffect(QAction *result) {
     if (!result) return;
-    QDomElement effect = audioEffects.getEffectByName(result->data().toString());
+    QStringList info = result->data().toStringList();
+    if (info.isEmpty()) return;
+    QDomElement effect = audioEffects.getEffectByTag(info.at(1), info.at(2));
     slotAddEffect(effect);
 }
 
 void MainWindow::slotAddCustomEffect(QAction *result) {
     if (!result) return;
-    if (result->data().toString().isEmpty()) return;
-    QDomElement effect = customEffects.getEffectByName(result->data().toString());
+    QStringList info = result->data().toStringList();
+    if (info.isEmpty()) return;
+    QDomElement effect = customEffects.getEffectByTag(info.at(1), info.at(2));
     slotAddEffect(effect);
 }