]> git.sesse.net Git - kdenlive/commitdiff
function for changing transitions
authorMarco Gittler <marco@gitma.de>
Thu, 20 Mar 2008 10:52:32 +0000 (10:52 +0000)
committerMarco Gittler <marco@gitma.de>
Thu, 20 Mar 2008 10:52:32 +0000 (10:52 +0000)
svn path=/branches/KDE4/; revision=2083

src/CMakeLists.txt
src/customtrackview.cpp
src/customtrackview.h
src/initeffects.cpp
src/kthumb.cpp
src/mainwindow.cpp
src/renderer.cpp
src/renderer.h
src/transitionsettings.cpp
src/transitionsettings.h

index 804e4d47a08ac3e3581bd44c07baefddae389da4..7a788bcc3d220db6cff89ad40c6ab9db62ce02fb 100644 (file)
@@ -96,6 +96,7 @@ set(kdenlive_SRCS
   recmonitor.cpp
   jogshuttle.cpp
   addtransitioncommand.cpp
+  edittransitioncommand.cpp
 )
 
 kde4_add_kcfg_files(kdenlive_SRCS GENERATE_MOC kdenlivesettings.kcfgc )
index bcb43f25463340954807d82e42cc32333a0e8f12..063c17ef09e3b894ea58a345aa347a3bdb7ff228 100644 (file)
@@ -37,6 +37,7 @@
 #include "addeffectcommand.h"
 #include "editeffectcommand.h"
 #include "addtransitioncommand.h"
+#include "edittransitioncommand.h"
 #include "kdenlivesettings.h"
 #include "transition.h"
 
@@ -545,6 +546,7 @@ void CustomTrackView::slotUpdateClipEffect(ClipItem *clip, QDomElement oldeffect
 void CustomTrackView::slotAddTransition(ClipItem* clip , QDomElement transition, GenTime startTime , int startTrack) {
     AddTransitionCommand* command = new AddTransitionCommand(this, startTrack, transition, startTime, true);
     m_commandStack->push(command);
+    m_document->setModified(true);
 }
 
 void CustomTrackView::addTransition(int startTrack, GenTime startPos , QDomElement e) {
@@ -578,6 +580,29 @@ void CustomTrackView::deleteTransition(int, GenTime, QDomElement e) {
     m_document->setModified(true);
 }
 
+void CustomTrackView::slotTransitionUpdated(QDomElement old, QDomElement newEffect) {
+    EditTransitionCommand *command = new EditTransitionCommand(this, newEffect.attribute("a_track").toInt(), GenTime(newEffect.attribute("start").toInt(), m_document->renderer()->fps()) , old, newEffect , true);
+    m_commandStack->push(command);
+    m_document->setModified(true);
+}
+
+void CustomTrackView::updateTransition(int track, GenTime pos, QDomElement transition) {
+    QMap < QString, QString> map;
+    QDomNamedNodeMap attribs = transition.attributes();
+    for (int i = 0;i < attribs.count();i++) {
+        if (attribs.item(i).nodeName() != "type" &&
+                attribs.item(i).nodeName() != "start" &&
+                attribs.item(i).nodeName() != "end"
+           )
+            map[attribs.item(i).nodeName()] = attribs.item(i).nodeValue();
+    }
+    m_document->renderer()->mltUpdateTransition(transition.attribute("type"), m_tracksList.count() - 1  - transition.attribute("transition_track").toInt(), m_tracksList.count() - transition.attribute("transition_track").toInt() ,
+            GenTime(transition.attribute("start").toInt(), m_document->renderer()->fps()),
+            GenTime(transition.attribute("end").toInt(), m_document->renderer()->fps()),
+            map);
+    m_document->setModified(true);
+}
+
 void CustomTrackView::addItem(DocClipBase *clip, QPoint pos) {
     int in = 0;
     GenTime out = clip->duration();
index f3fe449cb9fc54ea693518d3e15161ac4e830a9a..434a0126587cef57440471f1ee319907eb1f1503 100644 (file)
@@ -57,6 +57,7 @@ public:
     void updateEffect(int track, GenTime pos, QDomElement effect);
     void addTransition(int track, GenTime pos, QDomElement transition);
     void deleteTransition(int track, GenTime pos, QDomElement transition);
+    void updateTransition(int track, GenTime pos, QDomElement transition);
     void activateMonitor();
     int duration() const;
     void deleteSelectedClips();
@@ -73,6 +74,7 @@ public slots:
     void slotRefreshEffects(ClipItem *clip);
     void setDuration(int duration);
     void slotAddTransition(ClipItem* clip , QDomElement transition, GenTime startTime , int startTrack);
+    void slotTransitionUpdated(QDomElement, QDomElement);
 
 protected:
     virtual void drawBackground(QPainter * painter, const QRectF & rect);
index 7af74c379de1e8d3f6fcc94d165eb031ce9ebfeb..7dab6c211e420f3f4fd8be33a3b9d16b0b0915dc 100644 (file)
@@ -473,8 +473,20 @@ void initEffects::fillTransitionsList(Mlt::Repository * repository, EffectsList*
                 tname.appendChild(ret.createTextNode("Affine"));
                 ktrans.appendChild(tname);
                 transitions->append(ret.documentElement());
+            } else if (name == "region") {
+                QDomDocument ret;
+                QDomElement ktrans = ret.createElement("ktransition");
+                ret.appendChild(ktrans);
+                ktrans.setAttribute("tag", name);
+                QDomElement tname = ret.createElement("name");
+                tname.appendChild(ret.createTextNode("Region"));
+                ktrans.appendChild(tname);
+                transitions->append(ret.documentElement());
             }
         }
+        /*
 
+         <transition fill="1" in="11" a_track="1" out="73" mlt_service="luma" b_track="2" softness="0" resource="/home/marco/Projekte/kdenlive/install_cmake/share/apps/kdenlive/pgm/PAL/square2.pgm" />
+        */
     }
 }
index 54fb42798a72ec12d4db01e26041add108cab205..e8496b0e302b5643e0e7a6e24f2a575d6a9b25ba 100644 (file)
@@ -228,8 +228,8 @@ QPixmap KThumb::getFrame(Mlt::Producer* producer, int frame, int width, int heig
     Mlt::Filter m_convert(profile, "avcolour_space");
     m_convert.set("forced", mlt_image_rgb24a);
     producer->attach(m_convert);
-
-    producer->seek(frame);
+    if (frame > -1)
+        producer->seek(frame);
     Mlt::Frame * m_frame = producer->get_frame();
     mlt_image_format format = mlt_image_rgb24a;
     QPixmap pix(width, height);
index 820f88b7207013926c72aa905be6dc53c4427eb4..8097be716aac75cef53b3d564c3ad0533f8b2dba 100644 (file)
@@ -192,7 +192,8 @@ MainWindow::MainWindow(QWidget *parent)
     timeline_buttons_ui.buttonFitZoom->setIcon(KIcon("zoom-fit-best"));
     timeline_buttons_ui.buttonFitZoom->setToolTip(i18n("Fit zoom to project"));
 
-    setupGUI(Default, "kdenliveui.rc");
+    setupGUI(Default, NULL /*"kdenliveui.rc"*/);
+    kDebug() << factory() << " " << factory()->container("video_effects_menu", this);
 
     // build effects menus
     QAction *action;
@@ -708,6 +709,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) { //cha
             disconnect(effectStack, SIGNAL(removeEffect(ClipItem*, QDomElement)), m_activeTimeline->projectView(), SLOT(slotDeleteEffect(ClipItem*, QDomElement)));
             disconnect(effectStack, SIGNAL(changeEffectState(ClipItem*, QDomElement, bool)), m_activeTimeline->projectView(), SLOT(slotChangeEffectState(ClipItem*, QDomElement, bool)));
             disconnect(effectStack, SIGNAL(refreshEffectStack(ClipItem*)), m_activeTimeline->projectView(), SLOT(slotRefreshEffects(ClipItem*)));
+            disconnect(transitionConfig, SIGNAL(transitionUpdated(QDomElement, QDomElement)), trackView->projectView() , SLOT(slotTransitionUpdated(QDomElement, QDomElement)));
             disconnect(m_activeTimeline->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(activateMonitor()));
         }
         m_activeDocument->setRenderer(NULL);
@@ -738,6 +740,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) { //cha
     connect(effectStack, SIGNAL(removeEffect(ClipItem*, QDomElement)), trackView->projectView(), SLOT(slotDeleteEffect(ClipItem*, QDomElement)));
     connect(effectStack, SIGNAL(changeEffectState(ClipItem*, QDomElement, bool)), trackView->projectView(), SLOT(slotChangeEffectState(ClipItem*, QDomElement, bool)));
     connect(effectStack, SIGNAL(refreshEffectStack(ClipItem*)), trackView->projectView(), SLOT(slotRefreshEffects(ClipItem*)));
+    connect(transitionConfig, SIGNAL(transitionUpdated(QDomElement, QDomElement)), trackView->projectView() , SLOT(slotTransitionUpdated(QDomElement, QDomElement)));
     connect(trackView->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(activateMonitor()));
     trackView->projectView()->setContextMenu(m_timelineContextMenu, m_timelineContextClipMenu, m_timelineContextTransitionMenu);
     m_activeTimeline = trackView;
index 599f9d188103b43d0e2f7cd57288861037f6a6c0..e5da654add7871c7a18e5a1b3a9ba95c0301492c 100644 (file)
@@ -1335,8 +1335,59 @@ void Render::mltMoveTransition(QString type, int startTrack, int trackOffset, Ge
     m_isBlocked = false;
 }
 
+void Render::mltUpdateTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QMap <QString, QString> args) {
+    kDebug() << "update transition"  << tag;
+    QList<QString> li = args.keys();
+    for (int i = 0;i < li.size();i++) {
+        kDebug() << li[i] << " " << args[li[i]];
+    }
+    m_isBlocked = true;
+    m_mltConsumer->set("refresh", 0);
+    mlt_service serv = m_mltProducer->parent().get_service();
+
+    mlt_service nextservice = mlt_service_get_producer(serv);
+    mlt_properties properties = MLT_SERVICE_PROPERTIES(nextservice);
+    QString mlt_type = mlt_properties_get(properties, "mlt_type");
+    QString resource = mlt_properties_get(properties, "mlt_service");
+    int old_pos = (in.frames(m_fps) + out.frames(m_fps)) / 2;
+    int trackOffset = 0;
+    int new_in = in.frames(m_fps);
+    int new_out = out.frames(m_fps) - 1;
+    while (mlt_type == "transition") {
+        mlt_transition tr = (mlt_transition) nextservice;
+        int currentTrack = mlt_transition_get_b_track(tr);
+        int currentIn = (int) mlt_transition_get_in(tr);
+        int currentOut = (int) mlt_transition_get_out(tr);
+        kDebug() << "// FOUND EXISTING TRANS, IN: " << currentIn << ", OUT: " << currentOut << ", TRACK: " << currentTrack;
+        //kDebug()<<"// LOOKING FOR IN: "<<old_in<<", OUT: "<<old_out;
+        kDebug() << "// OLD IN: " << in.frames(m_fps) << " // OLD OUT: " << out.frames(m_fps) << ", TRACK: " << a_track << ", MID POS: " << old_pos;
+        if (/*resource == type &&*/ b_track == currentTrack && currentIn <= old_pos && currentOut >= old_pos) {
+            kDebug() << "found transition that matches" << resource;
+            //mlt_transition_set_in_and_out(tr, new_in, new_out);
+            //mlt_service old=_mlt_transition_servcie(tr);
+            //mlt_transition_init((mlt_transition_s*)tr->child,tag.toAscii().data());
+            //tr->child=tag.toAscii().data();
+
+
+
+            mlt_properties properties = MLT_TRANSITION_PROPERTIES(tr);
+            //mlt_events_disconnect(properties, nextservice);
+            mlt_events_fire(MLT_SERVICE_PROPERTIES(nextservice), "service-changed", NULL);
+            //mlt_properties_set_int(properties, "a_track", mlt_transition_get_a_track(tr) + trackOffset);
+            //mlt_properties_set_int(properties, "b_track", mlt_transition_get_b_track(tr) + trackOffset);
+            //}
+            break;
+        }
+        nextservice = mlt_service_producer(nextservice);
+        properties = MLT_SERVICE_PROPERTIES(nextservice);
+        mlt_type = mlt_properties_get(properties, "mlt_type");
+        resource = mlt_properties_get(properties, "mlt_service");
+    }
+    m_isBlocked = false;
+}
+
 void Render::mltDeleteTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QMap <QString, QString> args) {
-    kDebug() << "ja";
+
     m_isBlocked = true;
     m_mltConsumer->set("refresh", 0);
     mlt_service serv = m_mltProducer->parent().get_service();
index f65b3bb0d13415231b1d1b510b89c1af9c5ed169..609d953216cc359aedd129dd34e3e63b256dc71b 100644 (file)
@@ -160,6 +160,7 @@ Q_OBJECT public:
     void mltMoveTransition(QString type, int startTrack, int trackOffset, GenTime oldIn, GenTime oldOut, GenTime newIn, GenTime newOut);
     void mltAddTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QMap <QString, QString> args);
     void mltDeleteTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QMap <QString, QString> args);
+    void mltUpdateTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QMap <QString, QString> args);
 
 
 private:   // Private attributes & methods
index c0afc770ce0477012572bec7532068c4330c952d..83aa0d606b013af0b8251c32e4717e47d6ad605b 100644 (file)
@@ -16,6 +16,7 @@
  ***************************************************************************/
 
 #include "transitionsettings.h"
+#include "transition.h"
 #include <KDebug>
 
 TransitionSettings::TransitionSettings(EffectsList *transitions, QWidget* parent): QWidget(parent) {
@@ -24,9 +25,18 @@ TransitionSettings::TransitionSettings(EffectsList *transitions, QWidget* parent
     m_transitions = transitions;
     ui.listWidget->addItems(transitions->effectNames());
     kDebug() << transitions->effectNames().size() << " -" << transitions->size();
+    connect(ui.listWidget, SIGNAL(currentRowChanged(int)), this, SLOT(slotTransitionChanged()));
+}
+
+void TransitionSettings::slotTransitionChanged() {
+    QDomElement e = m_usedTransition->toXML();
+    QDomElement newElement = e.cloneNode().toElement();
+    newElement.setAttribute("type", ui.listWidget->currentItem()->text());
+    emit transitionUpdated(e, newElement);
 }
 
 void TransitionSettings::slotTransitionItemSelected(Transition* t) {
     setEnabled(t != NULL);
+    m_usedTransition = t;
 }
 
index a1da40f8b8eab52e85389e37a073446a23203198..4c7082106ff68a2834b4bdc5927e8dfc06015905 100644 (file)
@@ -28,8 +28,12 @@ public:
 private:
     Ui::TransitionSettings_UI ui;
     EffectsList *m_transitions;
+    Transition* m_usedTransition;
 public slots:
     void slotTransitionItemSelected(Transition*);
+    void slotTransitionChanged();
+signals:
+    void transitionUpdated(QDomElement, QDomElement);
 };
 
 #endif