]> git.sesse.net Git - kdenlive/commitdiff
Finally fix transition order issue:
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 18 Apr 2010 10:36:22 +0000 (10:36 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 18 Apr 2010 10:36:22 +0000 (10:36 +0000)
http://www.kdenlive.org/mantis/view.php?id=892

svn path=/trunk/kdenlive/; revision=4389

src/customtrackview.cpp
src/renderer.cpp
src/renderer.h
src/transitionsettings.cpp
src/transitionsettings.h

index b22bbf2e60eb3aaadfdb40f7b0b747c6ae8ad64a..b69ddd2873890002934aee9f765b54d575e1c1fc 100644 (file)
@@ -2150,7 +2150,9 @@ void CustomTrackView::updateTransition(int track, GenTime pos, QDomElement oldTr
         kWarning() << "Unable to find transition at pos :" << pos.frames(m_document->fps()) << ", ON track: " << track;
         return;
     }
-    m_document->renderer()->mltUpdateTransition(oldTransition.attribute("tag"), transition.attribute("tag"), transition.attribute("transition_btrack").toInt(), m_document->tracksCount() - transition.attribute("transition_atrack").toInt(), item->startPos(), item->endPos(), transition);
+    bool force = false;
+    if (oldTransition.attribute("transition_atrack") != transition.attribute("transition_atrack") || oldTransition.attribute("transition_btrack") != transition.attribute("transition_btrack")) force = true;
+    m_document->renderer()->mltUpdateTransition(oldTransition.attribute("tag"), transition.attribute("tag"), transition.attribute("transition_btrack").toInt(), m_document->tracksCount() - transition.attribute("transition_atrack").toInt(), item->startPos(), item->endPos(), transition, force);
     //kDebug() << "ORIGINAL TRACK: "<< oldTransition.attribute("transition_btrack") << ", NEW TRACK: "<<transition.attribute("transition_btrack");
     item->setTransitionParameters(transition);
     if (updateTransitionWidget) {
index 9ea419bea59beb4f2b70025116ab31bc2e6fc088..3ccb4214fee1e1ade8183f2d259a144c60145319 100644 (file)
@@ -3016,7 +3016,8 @@ bool Render::mltMoveTransition(QString type, int startTrack, int newTrack, int n
                 new_trans_props.inherit(trans_props);
                 new_transition.set_in_and_out(new_in, new_out);
                 field->disconnect_service(transition);
-                field->plant_transition(new_transition, newTransitionTrack, newTrack);
+                mltPlantTransition(field, new_transition, newTransitionTrack, newTrack);
+                //field->plant_transition(new_transition, newTransitionTrack, newTrack);
             } else transition.set_in_and_out(new_in, new_out);
             break;
         }
@@ -3033,9 +3034,50 @@ bool Render::mltMoveTransition(QString type, int startTrack, int newTrack, int n
     return found;
 }
 
-void Render::mltUpdateTransition(QString oldTag, QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml)
+
+void Render::mltPlantTransition(Mlt::Field *field, Mlt::Transition &tr, int a_track, int b_track)
+{
+    mlt_service nextservice = mlt_service_get_producer(field->get_service());
+    mlt_properties properties = MLT_SERVICE_PROPERTIES(nextservice);
+    QString mlt_type = mlt_properties_get(properties, "mlt_type");
+    QString resource = mlt_properties_get(properties, "mlt_service");
+    QList <Mlt::Transition *> trList;
+
+    while (mlt_type == "transition") {
+        Mlt::Transition transition((mlt_transition) nextservice);
+        int aTrack = transition.get_a_track();
+        int bTrack = transition.get_b_track();
+        if (resource != "mix" && (aTrack < a_track || (aTrack == a_track && bTrack > b_track))) {
+            Mlt::Properties trans_props(transition.get_properties());
+            char *tmp = decodedString(transition.get("mlt_service"));
+            Mlt::Transition *cp = new Mlt::Transition(*m_mltProfile, tmp);
+            delete[] tmp;
+            Mlt::Properties new_trans_props(cp->get_properties());
+            new_trans_props.inherit(trans_props);
+            trList.append(cp);
+            field->disconnect_service(transition);
+        }
+        //else kDebug() << "// FOUND TRANS OK, "<<resource<< ", A_: " << aTrack << ", B_ "<<bTrack;
+
+        nextservice = mlt_service_producer(nextservice);
+        if (nextservice == NULL) break;
+        properties = MLT_SERVICE_PROPERTIES(nextservice);
+        mlt_type = mlt_properties_get(properties, "mlt_type");
+        resource = mlt_properties_get(properties, "mlt_service");
+    }
+
+    field->plant_transition(tr, a_track, b_track);
+
+    // re-add upper transitions
+    for (int i = 0; i < trList.count(); i++) {
+        // kDebug()<< "REPLANT ON TK: "<<trList.at(i)->get_a_track()<<", "<<trList.at(i)->get_b_track();
+        field->plant_transition(*trList.at(i), trList.at(i)->get_a_track(), trList.at(i)->get_b_track());
+    }
+}
+
+void Render::mltUpdateTransition(QString oldTag, QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml, bool force)
 {
-    if (oldTag == tag) mltUpdateTransitionParams(tag, a_track, b_track, in, out, xml);
+    if (oldTag == tag && !force) mltUpdateTransitionParams(tag, a_track, b_track, in, out, xml);
     else {
         mltDeleteTransition(oldTag, a_track, b_track, in, out, xml, false);
         mltAddTransition(tag, a_track, b_track, in, out, xml, false);
@@ -3352,8 +3394,9 @@ bool Render::mltAddTransition(QString tag, int a_track, int b_track, GenTime in,
         delete[] name;
         delete[] value;
     }
-    // attach filter to the clip
-    field->plant_transition(*transition, a_track, b_track);
+    // attach transition
+    mltPlantTransition(field, *transition, a_track, b_track);
+    // field->plant_transition(*transition, a_track, b_track);
     delete[] transId;
     if (do_refresh) refresh();
     return true;
index d0c8c9296bf5b78aaab6c5cd274c2501998b9d27..92948354ca1c31760e0a9c3c24ff21bb596e58a3 100644 (file)
@@ -54,6 +54,7 @@ class Playlist;
 class Tractor;
 class Transition;
 class Frame;
+class Field;
 class Producer;
 class Filter;
 class Profile;
@@ -197,7 +198,7 @@ Q_OBJECT public:
     bool mltMoveTransition(QString type, int startTrack,  int newTrack, int newTransitionTrack, GenTime oldIn, GenTime oldOut, GenTime newIn, GenTime newOut);
     bool mltAddTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml, bool refresh = true);
     void mltDeleteTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml, bool refresh = true);
-    void mltUpdateTransition(QString oldTag, QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml);
+    void mltUpdateTransition(QString oldTag, QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml, bool force = false);
     void mltUpdateTransitionParams(QString type, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml);
     void mltAddClipTransparency(ItemInfo info, int transitiontrack, int id);
     void mltMoveTransparency(int startTime, int endTime, int startTrack, int endTrack, int id);
@@ -206,6 +207,7 @@ Q_OBJECT public:
     void mltInsertTrack(int ix, bool videoTrack);
     void mltDeleteTrack(int ix);
     bool mltUpdateClipProducer(int track, int pos, Mlt::Producer *prod);
+    void mltPlantTransition(Mlt::Field *field, Mlt::Transition &tr, int a_track, int b_track);
     Mlt::Producer *invalidProducer(const QString &id);
 
     /** Change speed of a clip in playlist. To do this, we create a new "framebuffer" producer.
index 833c1110397efbdec769f67e7b808aaa7df73774..810f7e5a1e898860b9677355845cae821d593de9 100644 (file)
@@ -29,7 +29,6 @@
 TransitionSettings::TransitionSettings(QWidget* parent) :
         QWidget(parent),
         m_usedTransition(NULL),
-        m_tracksCount(0),
         m_autoTrackTransition(0)
 {
     setupUi(this);
@@ -70,19 +69,26 @@ TransitionSettings::TransitionSettings(QWidget* parent) :
 
 void TransitionSettings::updateProjectFormat(MltVideoProfile profile, Timecode t, const QList <TrackInfo> info)
 {
-    m_tracksCount = info.count();
     m_effectEdit->updateProjectFormat(profile, t);
-    QStringList tracksList;
+    m_tracks = info;
+    updateTrackList();
+}
+
+void TransitionSettings::updateTrackList()
+{
     transitionTrack->blockSignals(true);
     transitionTrack->clear();
     transitionTrack->addItem(i18n("Auto"), -1);
-    for (int i = 0; i < m_tracksCount; i++) {
-        int ix = m_tracksCount - i - 1;
-        if (!info.at(ix).trackName.isEmpty())
-            transitionTrack->addItem(info.at(ix).trackName + '(' + QString::number(i) + ')');
-        else transitionTrack->addItem(QString::number(i));
+    int limit = 1;
+    if (m_usedTransition) limit = m_usedTransition->track() + 1;
+    kDebug() << "/ / TRANS TRK: " << limit;
+    for (int i = limit; i < m_tracks.count(); i++) {
+        int ix = m_tracks.count() - i - 1;
+        if (!m_tracks.at(ix).trackName.isEmpty())
+            transitionTrack->addItem(m_tracks.at(ix).trackName + '(' + QString::number(i) + ')', m_tracks.count() - i);
+        else transitionTrack->addItem(QString::number(i), m_tracks.count() - i);
     }
-    transitionTrack->addItem(i18n("Black"), m_tracksCount);
+    transitionTrack->addItem(i18n("Black"), 0);
     transitionTrack->blockSignals(false);
 }
 
@@ -112,7 +118,7 @@ void TransitionSettings::slotTransitionTrackChanged()
     int ix = 0;
     QDomElement oldxml = m_usedTransition->toXML().cloneNode().toElement();
     if (transitionTrack->currentIndex() > 0) {
-        ix = transitionTrack->count() - transitionTrack->currentIndex() - 1;
+        ix = transitionTrack->itemData(transitionTrack->currentIndex()).toInt();
         m_usedTransition->setForcedTrack(true, ix);
         m_effectEdit->updateParameter("force_track", "1");
         emit transitionUpdated(m_usedTransition, oldxml);
@@ -134,7 +140,8 @@ void TransitionSettings::slotTransitionItemSelected(Transition* t, int nextTrack
         if (t == NULL) return;
         if (update) {
             transitionTrack->blockSignals(true);
-            if (t->forcedTrack()) transitionTrack->setCurrentIndex(m_tracksCount + 1 - t->transitionEndTrack());
+            updateTrackList();
+            if (t->forcedTrack()) transitionTrack->setCurrentIndex(transitionTrack->findData(t->transitionEndTrack()));
             else transitionTrack->setCurrentIndex(0);
             transitionTrack->blockSignals(false);
         }
@@ -149,11 +156,12 @@ void TransitionSettings::slotTransitionItemSelected(Transition* t, int nextTrack
         m_transitionDuration = t->cropDuration();
         m_transitionStart = t->startPos();
         transitionTrack->blockSignals(true);
+        m_usedTransition = t;
+        updateTrackList();
         if (!t->forcedTrack()) transitionTrack->setCurrentIndex(0);
-        else transitionTrack->setCurrentIndex(m_tracksCount + 1 - t->transitionEndTrack());
+        else transitionTrack->setCurrentIndex(transitionTrack->findData(t->transitionEndTrack()));
         transitionTrack->blockSignals(false);
         int ix = transitionList->findData(t->transitionInfo(), Qt::UserRole, Qt::MatchExactly);
-        m_usedTransition = t;
         if (ix != -1) {
             transitionList->blockSignals(true);
             transitionList->setCurrentIndex(ix);
index 4d08933644f488f86b555c6a11b517daea07c60c..a8a76164e0e125759519066915c07cb7a21a59ea 100644 (file)
@@ -41,8 +41,9 @@ private:
     Transition* m_usedTransition;
     GenTime m_transitionDuration;
     GenTime m_transitionStart;
-    int m_tracksCount;
     int m_autoTrackTransition;
+    QList <TrackInfo> m_tracks;
+    void updateTrackList();
 
 public slots:
     void slotTransitionItemSelected(Transition* t, int nextTrack, QPoint p, bool update);