From: Jean-Baptiste Mardelle Date: Mon, 12 May 2008 11:28:59 +0000 (+0000) Subject: load transitions when opening project file X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=2cc32048a98e4f16b8f80ef0dea04aaee54bccb0;p=kdenlive load transitions when opening project file svn path=/branches/KDE4/; revision=2184 --- diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 45c23ff4..84c72c57 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -138,7 +138,6 @@ void CustomTrackView::wheelEvent(QWheelEvent * e) { int CustomTrackView::getPreviousVideoTrack(int track) { track = m_tracksList.count() - track - 1; - int videoTracksCount = 0; track --; for (int i = track; i > -1; i--) { if (m_tracksList.at(i).type == VIDEOTRACK) return i + 1; diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index 63900522..0a881f88 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -112,11 +112,36 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, MltVideoPro transition.setAttribute("in", "0"); //TODO: Make audio mix last for all project duration transition.setAttribute("out", "15000"); - transition.setAttribute("a_track", QString::number(1)); - transition.setAttribute("b_track", QString::number(i)); - transition.setAttribute("mlt_service", "mix"); - transition.setAttribute("combine", "1"); - transition.setAttribute("internal_added", "237"); + + QDomElement property = m_document.createElement("property"); + property.setAttribute("name", "a_track"); + QDomText value = m_document.createTextNode(QString::number(1)); + property.appendChild(value); + transition.appendChild(property); + + property = m_document.createElement("property"); + property.setAttribute("name", "b_track"); + value = m_document.createTextNode(QString::number(i)); + property.appendChild(value); + transition.appendChild(property); + + property = m_document.createElement("property"); + property.setAttribute("name", "mlt_service"); + value = m_document.createTextNode("mix"); + property.appendChild(value); + transition.appendChild(property); + + property = m_document.createElement("property"); + property.setAttribute("name", "combine"); + value = m_document.createTextNode("1"); + property.appendChild(value); + transition.appendChild(property); + + property = m_document.createElement("property"); + property.setAttribute("name", "internal_added"); + value = m_document.createTextNode("237"); + property.appendChild(value); + transition.appendChild(property); tractor.appendChild(transition); } westley.appendChild(tractor); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index f681576c..3bb6b222 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -778,7 +778,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) { //cha disconnect(effectStack, SIGNAL(updateClipEffect(ClipItem*, QDomElement, QDomElement)), m_activeTimeline->projectView(), SLOT(slotUpdateClipEffect(ClipItem*, QDomElement, QDomElement))); 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(changeEffectPosition(ClipItem*, int, int)), trackView->projectView(), SLOT(slotChangeEffectPosition(ClipItem*, int, int))); + disconnect(effectStack, SIGNAL(changeEffectPosition(ClipItem*, int, int)), trackView->projectView(), SLOT(slotChangeEffectPosition(ClipItem*, int, int))); disconnect(effectStack, SIGNAL(refreshEffectStack(ClipItem*)), m_activeTimeline->projectView(), SLOT(slotRefreshEffects(ClipItem*))); disconnect(transitionConfig, SIGNAL(transitionUpdated(Transition *, QDomElement)), trackView->projectView() , SLOT(slotTransitionUpdated(Transition *, QDomElement))); disconnect(m_activeTimeline->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(activateMonitor())); diff --git a/src/trackview.cpp b/src/trackview.cpp index cd02fd72..d3fc2816 100644 --- a/src/trackview.cpp +++ b/src/trackview.cpp @@ -28,6 +28,7 @@ #include "headertrack.h" #include "trackview.h" #include "clipitem.h" +#include "transition.h" #include "kdenlivesettings.h" #include "clipmanager.h" #include "customruler.h" @@ -125,6 +126,8 @@ void TrackView::parseDocument(QDomDocument doc) { if (!props.isNull()) { cursorPos = props.toElement().attribute("timeline_position").toInt(); } + + // parse project tracks QDomNodeList tracks = doc.elementsByTagName("track"); QDomNodeList playlists = doc.elementsByTagName("playlist"); int duration = 300; @@ -152,6 +155,44 @@ void TrackView::parseDocument(QDomDocument doc) { if (trackduration > duration) duration = trackduration; } else pos--; } + + + // parse transitions + QDomNodeList transitions = doc.elementsByTagName("transition"); + int projectTransitions = transitions.count(); + kDebug() << "//////////// TIMELINE FOUND: " << projectTransitions << " transitions"; + for (int i = 0; i < projectTransitions; i++) { + e = transitions.item(i).toElement(); + QDomNodeList transitionparams = e.childNodes(); + bool transitionAdd = true; + int a_track = 0; + int b_track = 0; + QString mlt_service; + for (int k = 0; k < transitionparams.count(); k++) { + p = transitionparams.item(k).toElement(); + if (!p.isNull()) { + // do not add audio mixing transitions + if (p.attribute("name") == "internal_added" && p.text() == "237") { + transitionAdd = false; + kDebug() << "// TRANSITRION " << i << " IS NOT VALID (INTERN ADDED)"; + break; + } else if (p.attribute("name") == "a_track") a_track = p.text().toInt(); + else if (p.attribute("name") == "b_track") b_track = m_projectTracks - 1 - p.text().toInt(); + else if (p.attribute("name") == "mlt_service") mlt_service = p.text().toInt(); + } + } + if (transitionAdd) { + // Transition should be added to the scene + ItemInfo transitionInfo; + transitionInfo.startPos = GenTime(e.attribute("in").toInt(), m_doc->fps()); + transitionInfo.endPos = GenTime(e.attribute("out").toInt(), m_doc->fps()); + transitionInfo.track = b_track; + Transition *tr = new Transition(transitionInfo, a_track, m_scale, m_doc->fps(), QDomElement()); + m_scene->addItem(tr); + } + } + + m_trackview->setDuration(duration); slotRebuildTrackHeaders(); //m_trackview->setCursorPos(cursorPos); @@ -240,7 +281,7 @@ int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool videotrack) { if (elem.tagName() == "blank") { position += elem.attribute("length").toInt(); } else if (elem.tagName() == "entry") { - // Found a clip + // Found a clip int in = elem.attribute("in").toInt(); int id = elem.attribute("producer").toInt(); DocClipBase *clip = m_doc->clipManager()->getClipById(id); @@ -256,50 +297,50 @@ int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool videotrack) { m_scene->addItem(item); position += out; - // parse clip effects - for (QDomNode n2 = elem.firstChild(); !n2.isNull(); n2 = n2.nextSibling()) { - QDomElement effect = n2.toElement(); - if (effect.tagName() == "filter") { - // add effect to clip - QString effecttag; - QString effectindex; - // Get effect tag & index - for (QDomNode n3 = effect.firstChild(); !n3.isNull(); n3 = n3.nextSibling()) { - // parse effect parameters - QDomElement effectparam = n3.toElement(); - if (effectparam.attribute("name") == "tag") { - effecttag = effectparam.text(); - } - if (effectparam.attribute("name") == "kdenlive_ix") { - effectindex = effectparam.text(); - } - } - - // get effect standard tags - QDomElement clipeffect = MainWindow::videoEffects.getEffectByTag(effecttag); - clipeffect.setAttribute("kdenlive_ix",effectindex); - QDomNodeList clipeffectparams = clipeffect.childNodes(); - - // adjust effect parameters - for (QDomNode n3 = effect.firstChild(); !n3.isNull(); n3 = n3.nextSibling()) { - // parse effect parameters - QDomElement effectparam = n3.toElement(); - QString paramname = effectparam.attribute("name"); - QString paramvalue = effectparam.text(); - - // try to find this parameter in the effect xml - QDomElement e; - for (int k = 0; k < clipeffectparams.count(); k++) { - e = clipeffectparams.item(k).toElement(); - if (!e.isNull() && e.tagName() == "parameter" && e.attribute("name") == paramname) { - e.setAttribute("value", paramvalue); - break; - } - } - } - item->addEffect(clipeffect, false); - } - } + // parse clip effects + for (QDomNode n2 = elem.firstChild(); !n2.isNull(); n2 = n2.nextSibling()) { + QDomElement effect = n2.toElement(); + if (effect.tagName() == "filter") { + // add effect to clip + QString effecttag; + QString effectindex; + // Get effect tag & index + for (QDomNode n3 = effect.firstChild(); !n3.isNull(); n3 = n3.nextSibling()) { + // parse effect parameters + QDomElement effectparam = n3.toElement(); + if (effectparam.attribute("name") == "tag") { + effecttag = effectparam.text(); + } + if (effectparam.attribute("name") == "kdenlive_ix") { + effectindex = effectparam.text(); + } + } + + // get effect standard tags + QDomElement clipeffect = MainWindow::videoEffects.getEffectByTag(effecttag); + clipeffect.setAttribute("kdenlive_ix", effectindex); + QDomNodeList clipeffectparams = clipeffect.childNodes(); + + // adjust effect parameters + for (QDomNode n3 = effect.firstChild(); !n3.isNull(); n3 = n3.nextSibling()) { + // parse effect parameters + QDomElement effectparam = n3.toElement(); + QString paramname = effectparam.attribute("name"); + QString paramvalue = effectparam.text(); + + // try to find this parameter in the effect xml + QDomElement e; + for (int k = 0; k < clipeffectparams.count(); k++) { + e = clipeffectparams.item(k).toElement(); + if (!e.isNull() && e.tagName() == "parameter" && e.attribute("name") == paramname) { + e.setAttribute("value", paramvalue); + break; + } + } + } + item->addEffect(clipeffect, false); + } + } } else kWarning() << "CANNOT INSERT CLIP " << id; //m_clipList.append(clip);