From 187e1c42fa6cc0f7449a6956ab0ccb94597347b3 Mon Sep 17 00:00:00 2001 From: Marco Gittler Date: Thu, 20 Mar 2008 10:52:32 +0000 Subject: [PATCH] function for changing transitions svn path=/branches/KDE4/; revision=2083 --- src/CMakeLists.txt | 1 + src/customtrackview.cpp | 25 ++++++++++++++++++ src/customtrackview.h | 2 ++ src/initeffects.cpp | 12 +++++++++ src/kthumb.cpp | 4 +-- src/mainwindow.cpp | 5 +++- src/renderer.cpp | 53 +++++++++++++++++++++++++++++++++++++- src/renderer.h | 1 + src/transitionsettings.cpp | 10 +++++++ src/transitionsettings.h | 4 +++ 10 files changed, 113 insertions(+), 4 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 804e4d47..7a788bcc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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 ) diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index bcb43f25..063c17ef 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -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(); diff --git a/src/customtrackview.h b/src/customtrackview.h index f3fe449c..434a0126 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -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); diff --git a/src/initeffects.cpp b/src/initeffects.cpp index 7af74c37..7dab6c21 100644 --- a/src/initeffects.cpp +++ b/src/initeffects.cpp @@ -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()); } } + /* + + */ } } diff --git a/src/kthumb.cpp b/src/kthumb.cpp index 54fb4279..e8496b0e 100644 --- a/src/kthumb.cpp +++ b/src/kthumb.cpp @@ -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); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 820f88b7..8097be71 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -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; diff --git a/src/renderer.cpp b/src/renderer.cpp index 599f9d18..e5da654a 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -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 args) { + kDebug() << "update transition" << tag; + QList 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_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 args) { - kDebug() << "ja"; + m_isBlocked = true; m_mltConsumer->set("refresh", 0); mlt_service serv = m_mltProducer->parent().get_service(); diff --git a/src/renderer.h b/src/renderer.h index f65b3bb0..609d9532 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -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 args); void mltDeleteTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QMap args); + void mltUpdateTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QMap args); private: // Private attributes & methods diff --git a/src/transitionsettings.cpp b/src/transitionsettings.cpp index c0afc770..83aa0d60 100644 --- a/src/transitionsettings.cpp +++ b/src/transitionsettings.cpp @@ -16,6 +16,7 @@ ***************************************************************************/ #include "transitionsettings.h" +#include "transition.h" #include 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; } diff --git a/src/transitionsettings.h b/src/transitionsettings.h index a1da40f8..4c708210 100644 --- a/src/transitionsettings.h +++ b/src/transitionsettings.h @@ -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 -- 2.39.2