X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Ftrackview.cpp;h=7535509648aa32002bc37f99b9964ed604d2b85f;hb=c5720a8894dd5a0dbd06f3330299dc669454fa06;hp=431876109fe650088a636beea15394131b72aa66;hpb=56f69242fee94baa6a0ed504b9cc51e0b5eb04ae;p=kdenlive diff --git a/src/trackview.cpp b/src/trackview.cpp index 43187610..75355096 100644 --- a/src/trackview.cpp +++ b/src/trackview.cpp @@ -34,7 +34,7 @@ #include "kdenlivedoc.h" #include "mainwindow.h" #include "customtrackview.h" - +#include "initeffects.h" TrackView::TrackView(KdenliveDoc *doc, QWidget *parent) : QWidget(parent), m_doc(doc), m_scale(1.0), m_projectTracks(0) { @@ -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) { @@ -120,10 +120,10 @@ void TrackView::parseDocument(QDomDocument doc) { int cursorPos = 0; m_documentErrors = QString(); // kDebug() << "//// DOCUMENT: " << doc.toString(); - QDomNode props = doc.elementsByTagName("properties").item(0); + /*QDomNode props = doc.elementsByTagName("properties").item(0); if (!props.isNull()) { cursorPos = props.toElement().attribute("timeline_position").toInt(); - } + }*/ // parse project tracks QDomNodeList tracks = doc.elementsByTagName("track"); @@ -133,7 +133,6 @@ void TrackView::parseDocument(QDomDocument doc) { int trackduration = 0; QDomElement e; QDomElement p; - bool videotrack; int pos = m_projectTracks - 1; @@ -148,8 +147,15 @@ void TrackView::parseDocument(QDomDocument doc) { p = playlists.item(j).toElement(); if (p.attribute("id") == playlist_name) break; } - videotrack = (e.attribute("hide") != "video"); - trackduration = slotAddProjectTrack(pos, p, videotrack); + if (e.attribute("hide") == "video") { + m_doc->switchTrackVideo(i - 1, true); + } else if (e.attribute("hide") == "audio") { + m_doc->switchTrackAudio(i - 1, true); + } else if (e.attribute("hide") == "both") { + m_doc->switchTrackVideo(i - 1, true); + m_doc->switchTrackAudio(i - 1, true); + } + trackduration = slotAddProjectTrack(pos, p); pos--; //kDebug() << " PRO DUR: " << trackduration << ", TRACK DUR: " << duration; if (trackduration > duration) duration = trackduration; @@ -178,6 +184,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 +197,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") { @@ -257,10 +265,11 @@ void TrackView::parseDocument(QDomDocument doc) { kDebug() << "/////// TRANSITION XML: "<< doc.toString();*/ transitionInfo.startPos = GenTime(e.attribute("in").toInt(), m_doc->fps()); - transitionInfo.endPos = GenTime(e.attribute("out").toInt(), m_doc->fps()); - transitionInfo.track = b_track; + transitionInfo.endPos = GenTime(e.attribute("out").toInt() + 1, m_doc->fps()); + 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); } } @@ -326,7 +335,7 @@ void TrackView::refresh() { } void TrackView::slotRebuildTrackHeaders() { - QList list = m_trackview->tracksList(); + QList list = m_doc->tracksList(); QList widgets = this->findChildren(); for (int i = 0; i < widgets.count(); i++) delete widgets.at(i); @@ -335,30 +344,17 @@ void TrackView::slotRebuildTrackHeaders() { HeaderTrack *header = new HeaderTrack(i, list.at(max - i - 1), this); connect(header, SIGNAL(switchTrackVideo(int)), m_trackview, SLOT(slotSwitchTrackVideo(int))); connect(header, SIGNAL(switchTrackAudio(int)), m_trackview, SLOT(slotSwitchTrackAudio(int))); - /* - //TODO: re-enable when add / remove track is implemented - connect(header, SIGNAL(deleteTrack(int)), m_trackview, SLOT(slotDeleteTrack(int))); - connect(header, SIGNAL(insertTrack(int)), m_trackview, SLOT(slotInsertTrack(int)));*/ + + connect(header, SIGNAL(deleteTrack(int)), this, SIGNAL(deleteTrack(int))); + connect(header, SIGNAL(insertTrack(int)), this, SIGNAL(insertTrack(int))); + connect(header, SIGNAL(changeTrack(int)), this, SIGNAL(changeTrack(int))); m_headersLayout->addWidget(header); } view->headers_container->adjustSize(); } -int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool videotrack) { - TrackInfo info; - - if (videotrack) { - info.type = VIDEOTRACK; - info.isMute = false; - info.isBlind = false; - } else { - info.type = AUDIOTRACK; - info.isMute = false; - info.isBlind = false; - } - - m_trackview->addTrack(info); +int TrackView::slotAddProjectTrack(int ix, QDomElement xml) { int trackTop = KdenliveSettings::trackheight() * ix; // parse track int position = 0; @@ -401,11 +397,11 @@ int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool videotrack) { for (int ix = 0; ix < effects.count(); ix++) { QDomElement effect = effects.at(ix).toElement(); if (effect.tagName() == "filter") { - kDebug() << " * * * * * * * * * * ** CLIP EFF FND * * * * * * * * * * *"; // add effect to clip QString effecttag; QString effectid; QString effectindex; + QString ladspaEffectFile; // Get effect tag & index for (QDomNode n3 = effect.firstChild(); !n3.isNull(); n3 = n3.nextSibling()) { // parse effect parameters @@ -416,9 +412,18 @@ int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool videotrack) { effectid = effectparam.text(); } else if (effectparam.attribute("name") == "kdenlive_ix") { effectindex = effectparam.text(); + } else if (effectparam.attribute("name") == "src") { + ladspaEffectFile = effectparam.text(); + if (!QFile::exists(ladspaEffectFile)) { + // If the ladspa effect file is missing, recreate it + kDebug() << "// MISSING LADSPA FILE: " << ladspaEffectFile; + ladspaEffectFile = m_doc->getLadspaFile(); + effectparam.firstChild().setNodeValue(ladspaEffectFile); + kDebug() << "// ... REPLACED WITH: " << ladspaEffectFile; + } } } - + //kDebug() << "+ + CLIP EFF FND: " << effecttag << ", " << effectid << ", " << effectindex; // get effect standard tags QDomElement clipeffect = MainWindow::customEffects.getEffectByTag(QString(), effectid); if (clipeffect.isNull()) clipeffect = MainWindow::videoEffects.getEffectByTag(effecttag, effectid); @@ -434,7 +439,7 @@ int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool videotrack) { QDomNodeList clipeffectparams = currenteffect.childNodes(); if (MainWindow::videoEffects.hasKeyFrames(currenteffect)) { - kDebug() << " * * * * * * * * * * ** CLIP EFF WITH KFR FND * * * * * * * * * * *"; + //kDebug() << " * * * * * * * * * * ** CLIP EFF WITH KFR FND * * * * * * * * * * *"; // effect is key-framable, read all effects to retrieve keyframes double factor; QString starttag; @@ -479,6 +484,7 @@ int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool videotrack) { if (subeffectparam.attribute("name") == "kdenlive_ix" && subeffectparam.text() != effectindex) { //We are not in the same effect, stop parsing lastParsedEffect = n2.previousSibling(); + ix--; continueParsing = false; break; } else if (subeffectparam.attribute("name") == endtag) { @@ -486,8 +492,10 @@ int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool videotrack) { break; } } - if (continueParsing) keyframes.append(QString::number(effectout) + ":" + QString::number(endvalue) + ";"); - ix++; + if (continueParsing) { + keyframes.append(QString::number(effectout) + ":" + QString::number(endvalue) + ";"); + ix++; + } } params = currenteffect.elementsByTagName("parameter"); @@ -498,6 +506,14 @@ int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool videotrack) { if (!continueParsing) { n2 = lastParsedEffect; } + } else { + // Check if effect has in/out points + if (effect.hasAttribute("in")) { + EffectsList::setParameter(currenteffect, "in", effect.attribute("in")); + } + if (effect.hasAttribute("out")) { + EffectsList::setParameter(currenteffect, "out", effect.attribute("out")); + } } // adjust effect parameters @@ -507,16 +523,29 @@ int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool videotrack) { 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); + double factor = e.attribute("factor", "1").toDouble(); + if (factor != 1) { + e.setAttribute("value", paramvalue.toDouble() * factor); + } else e.setAttribute("value", paramvalue); break; } } } + if (effecttag == "ladspa") { + //QString ladspaEffectFile = EffectsList::parameter(effect, "src", "property"); + + if (!QFile::exists(ladspaEffectFile)) { + // If the ladspa effect file is missing, recreate it + initEffects::ladspaEffectFile(ladspaEffectFile, currenteffect.attribute("ladspaid").toInt(), m_trackview->getLadspaParams(currenteffect)); + } + currenteffect.setAttribute("src", ladspaEffectFile); + } item->addEffect(currenteffect, false); item->effectsCounter(); }