]> git.sesse.net Git - kdenlive/commitdiff
* Fix some transition undo problems
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 18 Nov 2008 00:17:25 +0000 (00:17 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 18 Nov 2008 00:17:25 +0000 (00:17 +0000)
* New: allow user to select on which track a transition applies:
http://www.kdenlive.org/mantis/view.php?id=273

svn path=/branches/KDE4/; revision=2710

12 files changed:
src/customtrackview.cpp
src/customtrackview.h
src/edittransitioncommand.cpp
src/mainwindow.cpp
src/renderer.cpp
src/trackview.cpp
src/trackview.h
src/transition.cpp
src/transition.h
src/transitionsettings.cpp
src/transitionsettings.h
src/widgets/transitionsettings_ui.ui

index 6eb6a570042e9a33b918702381de7445e521a4fa..99321d46dfe98e7ecf5150c8935a54b699f2f452 100644 (file)
@@ -1127,12 +1127,25 @@ void CustomTrackView::deleteTransition(ItemInfo transitionInfo, int endTrack, QD
 }
 
 void CustomTrackView::slotTransitionUpdated(Transition *tr, QDomElement old) {
-    EditTransitionCommand *command = new EditTransitionCommand(this, tr->track(), tr->startPos(), old, tr->toXML() , true);
+    EditTransitionCommand *command = new EditTransitionCommand(this, tr->track(), tr->startPos(), old, tr->toXML(), true);
     m_commandStack->push(command);
     m_document->setModified(true);
 }
 
-void CustomTrackView::updateTransition(int track, GenTime pos, QDomElement oldTransition, QDomElement transition) {
+void CustomTrackView::slotTransitionTrackUpdated(Transition *tr, int track) {
+    QDomElement old = tr->toXML().cloneNode().toElement();
+    if (track == 0) {
+        track = getPreviousVideoTrack(tr->track());
+        tr->setForcedTrack(false, track);
+    } else {
+        tr->setForcedTrack(true, m_scene->m_tracksList.count() + 1 - track);
+    }
+    EditTransitionCommand *command = new EditTransitionCommand(this, tr->track(), tr->startPos(), old, tr->toXML(), true);
+    m_commandStack->push(command);
+    m_document->setModified(true);
+}
+
+void CustomTrackView::updateTransition(int track, GenTime pos, QDomElement oldTransition, QDomElement transition, bool updateTransitionWidget) {
     Transition *item = getTransitionItemAt((int)pos.frames(m_document->fps()), track);
     if (!item) {
         kWarning() << "Unable to find transition at pos :" << pos.frames(m_document->fps()) << ", ON track: " << track;
@@ -1140,6 +1153,7 @@ void CustomTrackView::updateTransition(int track, GenTime pos, QDomElement oldTr
     }
     m_document->renderer()->mltUpdateTransition(oldTransition.attribute("tag"), transition.attribute("tag"), transition.attribute("transition_btrack").toInt(), m_scene->m_tracksList.count() - transition.attribute("transition_atrack").toInt(), item->startPos(), item->endPos(), transition);
     item->setTransitionParameters(transition);
+    if (updateTransitionWidget) emit transitionItemSelected(item, true);
     m_document->setModified(true);
 }
 
index e1b901203e81f8c4ff4a3992202f4469de4f6fb4..0e38085728a512898c2f1f66bcb0101327fb7188 100644 (file)
@@ -72,7 +72,7 @@ public:
     void moveEffect(int track, GenTime pos, int oldPos, int newPos);
     void addTransition(ItemInfo transitionInfo, int endTrack, QDomElement params);
     void deleteTransition(ItemInfo transitionInfo, int endTrack, QDomElement params);
-    void updateTransition(int track, GenTime pos,  QDomElement oldTransition, QDomElement transition);
+    void updateTransition(int track, GenTime pos,  QDomElement oldTransition, QDomElement transition, bool updateTransitionWidget);
     void moveTransition(GenTime oldpos, GenTime newpos);
     void activateMonitor();
     int duration() const;
@@ -112,6 +112,7 @@ public slots:
     void slotAddTransition(ClipItem* clip, ItemInfo transitionInfo, int endTrack, QDomElement transition = QDomElement());
     void slotAddTransitionToSelectedClips(QDomElement transition);
     void slotTransitionUpdated(Transition *, QDomElement);
+    void slotTransitionTrackUpdated(Transition *tr, int track);
     void slotSwitchTrackAudio(int ix);
     void slotSwitchTrackVideo(int ix);
     void slotUpdateClip(const QString &clipId);
@@ -209,7 +210,7 @@ signals:
     void zoomOut();
     void mousePosition(int);
     void clipItemSelected(ClipItem*, int ix = -1);
-    void transitionItemSelected(Transition*);
+    void transitionItemSelected(Transition*, bool update = false);
     void activateDocumentMonitor();
     void trackHeightChanged();
     void displayMessage(const QString, MessageType);
index 92ec2d6bfe529a9436e5771403fc697b18c600a8..313990bd9818ad52e84e17b791022a171b1c5fe5 100644 (file)
@@ -20,7 +20,7 @@
 #include "customtrackview.h"
 
 EditTransitionCommand::EditTransitionCommand(CustomTrackView *view, const int track, GenTime pos, QDomElement oldeffect, QDomElement effect, bool doIt)
-        : m_view(view), m_track(track), m_pos(pos), m_oldeffect(oldeffect), m_doIt(doIt) {
+        : m_view(view), m_track(track), m_pos(pos), m_oldeffect(oldeffect), m_doIt(false) {
     m_effect = effect.cloneNode().toElement();
     QString effectName;
     QDomNode namenode = effect.elementsByTagName("name").item(0);
@@ -31,7 +31,7 @@ EditTransitionCommand::EditTransitionCommand(CustomTrackView *view, const int tr
 
 // virtual
 int EditTransitionCommand::id() const {
-    return 1;
+    return 2;
 }
 
 // virtual
@@ -45,10 +45,11 @@ bool EditTransitionCommand::mergeWith(const QUndoCommand * other) {
 
 // virtual
 void EditTransitionCommand::undo() {
-    m_view->updateTransition(m_track, m_pos, m_effect, m_oldeffect);
+    m_view->updateTransition(m_track, m_pos, m_effect, m_oldeffect, m_doIt);
 }
 // virtual
 void EditTransitionCommand::redo() {
-    m_view->updateTransition(m_track, m_pos, m_oldeffect, m_effect);
+    m_view->updateTransition(m_track, m_pos, m_oldeffect, m_effect, m_doIt);
+    m_doIt = true;
 }
 
index 1273c558f8e0bed595f6fe8fff48e15e42efb18e..34247298bca35a305528d9cdde50b922c3010136 100644 (file)
@@ -929,7 +929,7 @@ void MainWindow::closeCurrentDocument() {
     if (m_timelineArea->count() == 0) {
         m_activeDocument = NULL;
         effectStack->clear();
-        transitionConfig->slotTransitionItemSelected(NULL);
+        transitionConfig->slotTransitionItemSelected(NULL, false);
     }
 }
 
@@ -1262,8 +1262,8 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) { //cha
             disconnect(m_activeDocument, SIGNAL(deleteTimelineClip(const QString &)), m_activeTimeline, SLOT(slotDeleteClip(const QString &)));
             disconnect(m_activeTimeline->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), effectStack, SLOT(slotClipItemSelected(ClipItem*, int)));
             disconnect(m_activeTimeline->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), this, SLOT(slotActivateEffectStackView()));
-            disconnect(m_activeTimeline, SIGNAL(transitionItemSelected(Transition*)), transitionConfig, SLOT(slotTransitionItemSelected(Transition*)));
-            disconnect(m_activeTimeline, SIGNAL(transitionItemSelected(Transition*)), this, SLOT(slotActivateTransitionView()));
+            disconnect(m_activeTimeline, SIGNAL(transitionItemSelected(Transition*, bool)), transitionConfig, SLOT(slotTransitionItemSelected(Transition*, bool)));
+            disconnect(m_activeTimeline, SIGNAL(transitionItemSelected(Transition*, bool)), this, SLOT(slotActivateTransitionView()));
             disconnect(m_zoomSlider, SIGNAL(valueChanged(int)), m_activeTimeline, SLOT(slotChangeZoom(int)));
             disconnect(m_activeTimeline->projectView(), SIGNAL(displayMessage(const QString&, MessageType)), m_messageLabel, SLOT(setMessage(const QString&, MessageType)));
             disconnect(m_activeTimeline->projectView(), SIGNAL(showClipFrame(DocClipBase *, const int)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *, const int)));
@@ -1276,6 +1276,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) { //cha
             disconnect(effectStack, SIGNAL(refreshEffectStack(ClipItem*)), m_activeTimeline->projectView(), SLOT(slotRefreshEffects(ClipItem*)));
             disconnect(effectStack, SIGNAL(reloadEffects()), this, SLOT(slotReloadEffects()));
             disconnect(transitionConfig, SIGNAL(transitionUpdated(Transition *, QDomElement)), m_activeTimeline->projectView() , SLOT(slotTransitionUpdated(Transition *, QDomElement)));
+            disconnect(transitionConfig, SIGNAL(transitionTrackUpdated(Transition *, int)), m_activeTimeline->projectView() , SLOT(slotTransitionTrackUpdated(Transition *, int)));
             disconnect(transitionConfig, SIGNAL(seekTimeline(int)), m_activeTimeline->projectView() , SLOT(setCursorPos(int)));
             disconnect(m_activeTimeline->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(activateMonitor()));
             disconnect(m_activeTimeline, SIGNAL(zoneMoved(int, int)), m_projectMonitor, SLOT(slotZoneMoved(int, int)));
@@ -1290,7 +1291,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) { //cha
     KdenliveSettings::setProject_fps(doc->fps());
     m_monitorManager->resetProfiles(doc->timecode());
     m_projectList->setDocument(doc);
-    transitionConfig->updateProjectFormat(doc->mltProfile(), doc->timecode());
+    transitionConfig->updateProjectFormat(doc->mltProfile(), doc->timecode(), trackView->tracksNumber());
     effectStack->updateProjectFormat(doc->mltProfile(), doc->timecode());
     connect(m_projectList, SIGNAL(clipSelected(DocClipBase *)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *)));
     connect(m_projectList, SIGNAL(projectModified()), doc, SLOT(setModified()));
@@ -1312,8 +1313,8 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) { //cha
 
     connect(trackView->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), effectStack, SLOT(slotClipItemSelected(ClipItem*, int)));
     connect(trackView->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), this, SLOT(slotActivateEffectStackView()));
-    connect(trackView, SIGNAL(transitionItemSelected(Transition*)), transitionConfig, SLOT(slotTransitionItemSelected(Transition*)));
-    connect(trackView, SIGNAL(transitionItemSelected(Transition*)), this, SLOT(slotActivateTransitionView()));
+    connect(trackView, SIGNAL(transitionItemSelected(Transition*, bool)), transitionConfig, SLOT(slotTransitionItemSelected(Transition*, bool)));
+    connect(trackView, SIGNAL(transitionItemSelected(Transition*, bool)), this, SLOT(slotActivateTransitionView()));
     m_zoomSlider->setValue(doc->zoom());
     connect(m_zoomSlider, SIGNAL(valueChanged(int)), trackView, SLOT(slotChangeZoom(int)));
     connect(trackView->projectView(), SIGNAL(zoomIn()), this, SLOT(slotZoomIn()));
@@ -1329,6 +1330,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) { //cha
     connect(effectStack, SIGNAL(changeEffectPosition(ClipItem*, int, int)), trackView->projectView(), SLOT(slotChangeEffectPosition(ClipItem*, int, int)));
     connect(effectStack, SIGNAL(refreshEffectStack(ClipItem*)), trackView->projectView(), SLOT(slotRefreshEffects(ClipItem*)));
     connect(transitionConfig, SIGNAL(transitionUpdated(Transition *, QDomElement)), trackView->projectView() , SLOT(slotTransitionUpdated(Transition *, QDomElement)));
+    connect(transitionConfig, SIGNAL(transitionTrackUpdated(Transition *, int)), trackView->projectView() , SLOT(slotTransitionTrackUpdated(Transition *, int)));
     connect(transitionConfig, SIGNAL(seekTimeline(int)), trackView->projectView() , SLOT(setCursorPos(int)));
     connect(effectStack, SIGNAL(reloadEffects()), this, SLOT(slotReloadEffects()));
 
index 08e47371eed2041afc092fd93ca9eebf717d571e..4a913797a92fc9f6a858e946b735f22a385cfcee 100644 (file)
@@ -2128,7 +2128,6 @@ void Render::mltUpdateTransition(QString oldTag, QString tag, int a_track, int b
 
 void Render::mltUpdateTransitionParams(QString type, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml) {
     m_isBlocked = true;
-
     Mlt::Service service(m_mltProducer->parent().get_service());
     Mlt::Tractor tractor(service);
     Mlt::Field *field = tractor.field();
@@ -2146,6 +2145,7 @@ void Render::mltUpdateTransitionParams(QString type, int a_track, int b_track, G
     while (mlt_type == "transition") {
         mlt_transition tr = (mlt_transition) nextservice;
         int currentTrack = mlt_transition_get_b_track(tr);
+        int currentBTrack = mlt_transition_get_a_track(tr);
         int currentIn = (int) mlt_transition_get_in(tr);
         int currentOut = (int) mlt_transition_get_out(tr);
 
@@ -2156,7 +2156,10 @@ void Render::mltUpdateTransitionParams(QString type, int a_track, int b_track, G
             QMap<QString, QString>::Iterator it;
             QString key;
             mlt_properties transproperties = MLT_TRANSITION_PROPERTIES(tr);
-
+            mlt_properties_set_int(transproperties, "force_track", xml.attribute("force_track").toInt());
+            if (currentBTrack != a_track) {
+                mlt_properties_set_int(properties, "a_track", a_track);
+            }
             for (it = map.begin(); it != map.end(); ++it) {
                 key = it.key();
                 char *name = decodedString(key);
index bbe2210032900661ab3d44c2db8879bddc219d49..d4ccbde877d0346d63bf0d9df1b2702f68aca7aa 100644 (file)
@@ -82,7 +82,7 @@ TrackView::TrackView(KdenliveDoc *doc, QWidget *parent)
     connect(m_trackview, SIGNAL(cursorMoved(int, int)), m_ruler, SLOT(slotCursorMoved(int, int)));
     connect(m_trackview->horizontalScrollBar(), SIGNAL(valueChanged(int)), m_ruler, SLOT(slotMoveRuler(int)));
     connect(m_trackview, SIGNAL(mousePosition(int)), this, SIGNAL(mousePosition(int)));
-    connect(m_trackview, SIGNAL(transitionItemSelected(Transition*)), this, SLOT(slotTransitionItemSelected(Transition*)));
+    connect(m_trackview, SIGNAL(transitionItemSelected(Transition*, bool)), this, SLOT(slotTransitionItemSelected(Transition*, bool)));
     slotChangeZoom(m_doc->zoom());
 }
 
@@ -92,7 +92,7 @@ int TrackView::duration() const {
 }
 
 int TrackView::tracksNumber() const {
-    return m_projectTracks;
+    return m_projectTracks - 1;
 }
 
 int TrackView::inPoint() const {
@@ -107,8 +107,8 @@ void TrackView::slotSetZone(QPoint p) {
     m_ruler->setZone(p);
 }
 
-void TrackView::slotTransitionItemSelected(Transition *t) {
-    emit transitionItemSelected(t);
+void TrackView::slotTransitionItemSelected(Transition *t, bool update) {
+    emit transitionItemSelected(t, update);
 }
 
 void TrackView::setDuration(int dur) {
@@ -178,6 +178,7 @@ void TrackView::parseDocument(QDomDocument doc) {
         int a_track = 0;
         int b_track = 0;
         bool isAutomatic = false;
+        bool forceTrack = false;
         QString mlt_geometry;
         QString mlt_service;
         for (int k = 0; k < transitionparams.count(); k++) {
@@ -190,10 +191,11 @@ void TrackView::parseDocument(QDomDocument doc) {
                     //kDebug() << "//  TRANSITRION " << i << " IS NOT VALID (INTERN ADDED)";
                     //break;
                 } else if (paramName == "a_track") a_track = p.text().toInt();
-                else if (paramName == "b_track") b_track = m_projectTracks - 1 - p.text().toInt();
+                else if (paramName == "b_track") b_track = p.text().toInt();
                 else if (paramName == "mlt_service") mlt_service = p.text();
                 else if (paramName == "geometry") mlt_geometry = p.text();
-                else if (paramName == "automatic" && p.text() == "1") isAutomatic = true;;
+                else if (paramName == "automatic" && p.text() == "1") isAutomatic = true;
+                else if (paramName == "force_track" && p.text() == "1") forceTrack = true;
             }
         }
         if (transitionAdd || mlt_service != "mix") {
@@ -258,9 +260,10 @@ void TrackView::parseDocument(QDomDocument doc) {
 
             transitionInfo.startPos = GenTime(e.attribute("in").toInt(), m_doc->fps());
             transitionInfo.endPos = GenTime(e.attribute("out").toInt() + 1, m_doc->fps());
-            transitionInfo.track = b_track;
+            transitionInfo.track = m_projectTracks - 1 - b_track;
             //kDebug() << "///////////////   +++++++++++  ADDING TRANSITION ON TRACK: " << b_track << ", TOTAL TRKA: " << m_projectTracks;
             Transition *tr = new Transition(transitionInfo, a_track, m_doc->fps(), base, isAutomatic);
+            if (forceTrack) tr->setForcedTrack(true, a_track);
             m_scene->addItem(tr);
         }
     }
index fa202e28f07b2bbe663775b80b8b154ca11dcd4c..25fa7f71c1fe46ade3710525d83cc0b9234c7e64 100644 (file)
@@ -89,14 +89,14 @@ private:
 private slots:
     void setCursorPos(int pos);
     void moveCursorPos(int pos);
-    void slotTransitionItemSelected(Transition*);
+    void slotTransitionItemSelected(Transition*, bool update);
     void slotRebuildTrackHeaders();
 
 
 signals:
     void mousePosition(int);
     void cursorMoved();
-    void transitionItemSelected(Transition*);
+    void transitionItemSelected(Transition*, bool);
     void zoneMoved(int, int);
 };
 
index 897dbfed6ffead4b452d5c3e23d10bc65eb22a32..e633817d581f6b798be04b4f6dcf9b7899223fa7 100644 (file)
@@ -33,7 +33,7 @@
 #include "customtrackscene.h"
 #include "mainwindow.h"
 
-Transition::Transition(const ItemInfo info, int transitiontrack, double fps, QDomElement params, bool automaticTransition) : AbstractClipItem(info, QRectF(), fps), m_gradient(QLinearGradient(0, 0, 0, 0)), m_automaticTransition(automaticTransition) {
+Transition::Transition(const ItemInfo info, int transitiontrack, double fps, QDomElement params, bool automaticTransition) : AbstractClipItem(info, QRectF(), fps), m_gradient(QLinearGradient(0, 0, 0, 0)), m_automaticTransition(automaticTransition), m_forceTransitionTrack(false) {
     setRect(0, 0, (qreal)(info.endPos - info.startPos).frames(fps) - 0.02, (qreal)(KdenliveSettings::trackheight() / 3 * 2 - 1));
     setPos((qreal) info.startPos.frames(fps), (qreal)(info.track * KdenliveSettings::trackheight() + KdenliveSettings::trackheight() / 3 * 2));
 
@@ -54,6 +54,7 @@ Transition::Transition(const ItemInfo info, int transitiontrack, double fps, QDo
     }
     if (m_automaticTransition) m_parameters.setAttribute("automatic", 1);
     else if (m_parameters.attribute("automatic") == "1") m_automaticTransition = true;
+    if (m_parameters.attribute("force_track") == "1") m_forceTransitionTrack = true;
     m_name = m_parameters.elementsByTagName("name").item(0).toElement().text();
     m_secondClip = 0;
     setFlags(QGraphicsItem::ItemClipsToShape | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
@@ -85,6 +86,8 @@ bool Transition::isAutomatic() const {
 
 void Transition::setTransitionParameters(const QDomElement params) {
     m_parameters = params;
+    if (m_parameters.attribute("force_track") == "1") setForcedTrack(true, m_parameters.attribute("transition_btrack").toInt());
+    else if (m_parameters.attribute("force_track") == "0") setForcedTrack(false, m_parameters.attribute("transition_btrack").toInt());
     m_name = m_parameters.elementsByTagName("name").item(0).toElement().text();
     update();
 }
@@ -118,7 +121,16 @@ int Transition::transitionEndTrack() const {
 }
 
 void Transition::updateTransitionEndTrack(int newtrack) {
-    m_transitionTrack = newtrack;
+    if (!m_forceTransitionTrack) m_transitionTrack = newtrack;
+}
+
+void Transition::setForcedTrack(bool force, int track) {
+    m_forceTransitionTrack = force;
+    m_transitionTrack = track;
+}
+
+bool Transition::forcedTrack() const {
+    return m_forceTransitionTrack;
 }
 
 void Transition::paint(QPainter *painter,
@@ -128,6 +140,7 @@ void Transition::paint(QPainter *painter,
     QRectF exposed = option->exposedRect;
     painter->setClipRect(exposed);
     QRectF br = rect();
+    QRectF mapped = painter->matrix().mapRect(br);
     m_gradient.setStart(0, br.y());
     m_gradient.setFinalStop(0, br.bottom());
     painter->fillRect(br, m_gradient);
@@ -135,14 +148,22 @@ void Transition::paint(QPainter *painter,
     int top = (int)(br.y() + br.height() / 2 - 7);
     QPointF p1(br.x(), br.y() + br.height() / 2 - 7);
     painter->setMatrixEnabled(false);
-    painter->drawPixmap(painter->matrix().map(p1) + QPointF(5, 0), transitionPixmap());
-    painter->setPen(QColor(0, 0, 0, 180));
-    top += painter->fontInfo().pixelSize();
-    QPointF p2(br.x(), top);
-    painter->drawText(painter->matrix().map(p2) + QPointF(26, 1), transitionName());
-    painter->setPen(QColor(255, 255, 255, 180));
-    QPointF p3(br.x(), top);
-    painter->drawText(painter->matrix().map(p3) + QPointF(25, 0), transitionName());
+    //painter->drawPixmap(painter->matrix().map(p1) + QPointF(5, 0), transitionPixmap());
+    QString text = transitionName();
+    if (forcedTrack()) text.append("|>");
+    QRectF txtBounding = painter->boundingRect(mapped, Qt::AlignHCenter | Qt::AlignVCenter, " " + text + " ");
+    painter->fillRect(txtBounding, QBrush(QColor(50, 50, 0, 150)));
+    txtBounding.translate(QPointF(1, 1));
+    painter->setPen(QColor(255, 255, 255, 255));
+    painter->drawText(txtBounding, Qt::AlignCenter, text);
+
+    /*    painter->setPen(QColor(0, 0, 0, 180));
+        top += painter->fontInfo().pixelSize();
+        QPointF p2(br.x(), top);
+        painter->drawText(painter->matrix().map(p2) + QPointF(26, 1), transitionName());
+        painter->setPen(QColor(255, 255, 255, 180));
+        QPointF p3(br.x(), top);
+        painter->drawText(painter->matrix().map(p3) + QPointF(25, 0), transitionName());*/
     painter->setMatrixEnabled(true);
     QPen pen = painter->pen();
     if (isSelected()) {
@@ -259,6 +280,7 @@ QDomElement Transition::toXML() {
     m_parameters.setAttribute("transition_btrack", m_transitionTrack);
     m_parameters.setAttribute("start", startPos().frames(m_fps));
     m_parameters.setAttribute("end", endPos().frames(m_fps));
+    m_parameters.setAttribute("force_track", m_forceTransitionTrack);
 
     if (m_secondClip) {
         m_parameters.setAttribute("clipb_starttime", m_secondClip->startPos().frames(m_referenceClip->fps()));
index 30b8137951f3dd2e7ac9e94a3d4229a669c50220..b7bd2b500ff3b1dcb6323817056d5ca95962a277 100644 (file)
@@ -66,6 +66,8 @@ public:
     bool isValid() const;
     /** Transition should be linked to another track */
     void updateTransitionEndTrack(int newtrack);
+    void setForcedTrack(bool force, int track);
+    bool forcedTrack() const;
     const ClipItem *referencedClip() const;
     Transition *clone();
     bool isAutomatic() const;
@@ -77,6 +79,7 @@ private:
     bool m_singleClip;
     QLinearGradient m_gradient;
     QString m_name;
+    bool m_forceTransitionTrack;
 
     /** true if the transition was added automatically and should be moved with its clip */
     bool m_automaticTransition;
index ee0f599e6ed229a37d075a1fd8831ddc5d6d0345..d35798dfd5087af344caa26ef9a5233833f80292 100644 (file)
@@ -25,7 +25,7 @@
 #include "kdenlivesettings.h"
 #include "mainwindow.h"
 
-TransitionSettings::TransitionSettings(QWidget* parent): QWidget(parent) {
+TransitionSettings::TransitionSettings(QWidget* parent): QWidget(parent), m_tracksCount(0) {
     ui.setupUi(this);
     effectEdit = new EffectStackEdit(ui.frame);
     connect(effectEdit, SIGNAL(seekTimeline(int)), this, SIGNAL(seekTimeline(int)));
@@ -37,14 +37,25 @@ TransitionSettings::TransitionSettings(QWidget* parent): QWidget(parent) {
     //kDebug() << MainWindow::transitions.effectNames().size();
     //ui.listWidget->setCurrentRow(0);
     connect(ui.transitionList, SIGNAL(activated(int)), this, SLOT(slotTransitionChanged()));
+    connect(ui.transitionTrack, SIGNAL(activated(int)), this, SLOT(slotTransitionTrackChanged()));
+
     connect(this, SIGNAL(transferParamDesc(const QDomElement&, int , int)), effectEdit , SLOT(transferParamDesc(const QDomElement&, int , int)));
     connect(effectEdit, SIGNAL(parameterChanged(const QDomElement&, const QDomElement&)), this , SLOT(slotUpdateEffectParams(const QDomElement&, const QDomElement&)));
-    ui.splitter->setStretchFactor(0, 1);
-    ui.splitter->setStretchFactor(1, 10);
 }
 
-void TransitionSettings::updateProjectFormat(MltVideoProfile profile, Timecode t) {
+void TransitionSettings::updateProjectFormat(MltVideoProfile profile, Timecode t, const uint tracksCount) {
+    m_tracksCount = tracksCount;
     effectEdit->updateProjectFormat(profile, t);
+    QStringList tracksList;
+    tracksList << i18n("Auto");
+    for (uint i = 0; i < tracksCount; i++) {
+        tracksList << QString::number(i);
+    }
+    tracksList << i18n("Black");
+    ui.transitionTrack->blockSignals(true);
+    ui.transitionTrack->clear();
+    ui.transitionTrack->addItems(tracksList);
+    ui.transitionTrack->blockSignals(false);
 }
 
 
@@ -56,24 +67,39 @@ void TransitionSettings::slotTransitionChanged(bool reinit) {
         emit transferParamDesc(newTransition, m_usedTransition->startPos().frames(KdenliveSettings::project_fps()), m_usedTransition->endPos().frames(KdenliveSettings::project_fps()));
     } else {
         //slotUpdateEffectParams(e, e);
-        emit transferParamDesc(e, m_usedTransition->startPos().frames(KdenliveSettings::project_fps()), m_usedTransition->endPos().frames(KdenliveSettings::project_fps()));
+        effectEdit->transferParamDesc(e, m_usedTransition->startPos().frames(KdenliveSettings::project_fps()), m_usedTransition->endPos().frames(KdenliveSettings::project_fps()));
     }
 }
 
-void TransitionSettings::slotTransitionItemSelected(Transition* t) {
+void TransitionSettings::slotTransitionTrackChanged() {
+    emit transitionTrackUpdated(m_usedTransition, ui.transitionTrack->currentIndex());
+}
+
+void TransitionSettings::slotTransitionItemSelected(Transition* t, bool update) {
     setEnabled(t != NULL);
     if (t == m_usedTransition) {
-        if (t && (t->duration() != m_transitionDuration || t->startPos() != m_transitionStart)) {
+        if (t == NULL) return;
+        if (update) {
+            ui.transitionTrack->blockSignals(true);
+            if (t->forcedTrack()) ui.transitionTrack->setCurrentIndex(m_tracksCount + 1 - t->transitionEndTrack());
+            else ui.transitionTrack->setCurrentIndex(0);
+            ui.transitionTrack->blockSignals(false);
+        }
+        if (update || t->duration() != m_transitionDuration || t->startPos() != m_transitionStart) {
             m_transitionDuration = t->duration();
             m_transitionStart = t->startPos();
             slotTransitionChanged(false);
         }
         return;
-    }
+    } else if (update) return;
     m_usedTransition = t;
     if (m_usedTransition) {
         m_transitionDuration = t->duration();
         m_transitionStart = t->startPos();
+        ui.transitionTrack->blockSignals(true);
+        if (!t->forcedTrack()) ui.transitionTrack->setCurrentIndex(0);
+        else ui.transitionTrack->setCurrentIndex(m_tracksCount + 1 - t->transitionEndTrack());
+        ui.transitionTrack->blockSignals(false);
         int ix = ui.transitionList->findText(m_usedTransition->transitionName(), Qt::MatchExactly);
         if (ix != -1) {
             ui.transitionList->blockSignals(true);
index a06e6197492b512dd36d86cc45ad6ea081dbdc53..344533bf7b2bb6ae5c459dd9383c817273d3e353 100644 (file)
@@ -29,10 +29,11 @@ class EffectStackEdit;
 
 class TransitionSettings : public QWidget  {
     Q_OBJECT
+
 public:
     TransitionSettings(QWidget* parent = 0);
     void raiseWindow(QWidget*);
-    void updateProjectFormat(MltVideoProfile profile, Timecode t);
+    void updateProjectFormat(MltVideoProfile profile, Timecode t, const uint tracksCount);
 
 private:
     Ui::TransitionSettings_UI ui;
@@ -40,14 +41,19 @@ private:
     Transition* m_usedTransition;
     GenTime m_transitionDuration;
     GenTime m_transitionStart;
+    int m_tracksCount;
 
 public slots:
-    void slotTransitionItemSelected(Transition*);
+    void slotTransitionItemSelected(Transition*, bool);
     void slotTransitionChanged(bool reinit = true);
     void slotUpdateEffectParams(const QDomElement&, const QDomElement&);
 
+private slots:
+    void slotTransitionTrackChanged();
+
 signals:
     void transitionUpdated(Transition *, QDomElement);
+    void transitionTrackUpdated(Transition *, int);
     void transferParamDesc(const QDomElement&, int , int);
     void seekTimeline(int);
 };
index 8161691addd88c204750d63bba8a3a04370e8a83..1a4a50a569e60844af2f154364872b05f3e60d5e 100644 (file)
@@ -5,7 +5,7 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>291</width>
+    <width>335</width>
     <height>189</height>
    </rect>
   </property>
    <item row="0" column="0" >
     <widget class="QLabel" name="label" >
      <property name="text" >
-      <string>Transition type</string>
+      <string>Type</string>
      </property>
     </widget>
    </item>
-   <item row="1" column="0" colspan="2" >
-    <widget class="QSplitter" name="splitter" >
-     <property name="orientation" >
-      <enum>Qt::Horizontal</enum>
+   <item row="0" column="1" >
+    <widget class="KComboBox" name="transitionList" >
+     <property name="sizePolicy" >
+      <sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
      </property>
-     <widget class="QFrame" name="frame" >
-      <property name="sizePolicy" >
-       <sizepolicy vsizetype="Preferred" hsizetype="Expanding" >
-        <horstretch>0</horstretch>
-        <verstretch>0</verstretch>
-       </sizepolicy>
-      </property>
-      <property name="frameShape" >
-       <enum>QFrame::NoFrame</enum>
-      </property>
-      <property name="frameShadow" >
-       <enum>QFrame::Plain</enum>
-      </property>
-     </widget>
     </widget>
    </item>
-   <item row="0" column="1" >
-    <widget class="KComboBox" name="transitionList" />
+   <item row="0" column="2" >
+    <widget class="QLabel" name="label_2" >
+     <property name="text" >
+      <string>with track</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="3" >
+    <widget class="KComboBox" name="transitionTrack" />
+   </item>
+   <item row="1" column="0" colspan="4" >
+    <widget class="QFrame" name="frame" >
+     <property name="sizePolicy" >
+      <sizepolicy vsizetype="Preferred" hsizetype="Expanding" >
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="frameShape" >
+      <enum>QFrame::NoFrame</enum>
+     </property>
+     <property name="frameShadow" >
+      <enum>QFrame::Plain</enum>
+     </property>
+    </widget>
    </item>
   </layout>
-  <zorder>splitter</zorder>
-  <zorder>label</zorder>
-  <zorder>transitionList</zorder>
  </widget>
  <customwidgets>
   <customwidget>