X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Ftrackview.cpp;h=01f12a6779dfdfe8d5b8d149895371e1f367be8a;hb=8eebc1c84fdcb135e0a7f03bc6920d6630c6b055;hp=c89075c80a1ea08898e25f84827e0c2add6160ce;hpb=fec4b6aba639dac658d35475512c6f232c8aebe3;p=kdenlive diff --git a/src/trackview.cpp b/src/trackview.cpp index c89075c8..01f12a67 100644 --- a/src/trackview.cpp +++ b/src/trackview.cpp @@ -34,6 +34,7 @@ #include #include +#include #include #include @@ -101,10 +102,11 @@ TrackView::TrackView(KdenliveDoc *doc, bool *ok, QWidget *parent) : tracksLayout->addWidget(m_trackview); connect(m_trackview->verticalScrollBar(), SIGNAL(valueChanged(int)), headers_area->verticalScrollBar(), SLOT(setValue(int))); connect(m_trackview, SIGNAL(trackHeightChanged()), this, SLOT(slotRebuildTrackHeaders())); + connect(m_trackview, SIGNAL(tracksChanged()), this, SLOT(slotReloadTracks())); + connect(m_trackview, SIGNAL(updateTrackHeaders()), this, SLOT(slotRepaintTracks())); parseDocument(m_doc->toXml()); - int error = m_doc->setSceneList(); - if (error == -1) *ok = false; + if (m_doc->setSceneList() == -1) *ok = false; else *ok = true; 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))); @@ -121,6 +123,18 @@ TrackView::~TrackView() delete m_trackview; } +//virtual +void TrackView::keyPressEvent(QKeyEvent * event) +{ + if (event->key() == Qt::Key_Up) { + m_trackview->slotTrackUp(); + event->accept(); + } else if (event->key() == Qt::Key_Down) { + m_trackview->slotTrackDown(); + event->accept(); + } else QWidget::keyPressEvent(event); +} + int TrackView::duration() const { return m_trackview->duration(); @@ -241,7 +255,6 @@ void TrackView::parseDocument(QDomDocument doc) p = playlists.item(j).toElement(); if (p.attribute("id") == playlist_name) break; } - int black_clips = p.childNodes().count(); pos--; } } @@ -270,15 +283,36 @@ void TrackView::parseDocument(QDomDocument doc) transitionAdd = false; //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 = p.text().toInt(); - else if (paramName == "mlt_service") mlt_service = p.text(); + } else if (paramName == "a_track") { + a_track = qMax(0, p.text().toInt()); + a_track = qMin(m_projectTracks - 1, a_track); + if (a_track != p.text().toInt()) { + // the transition track was out of bounds + m_documentErrors.append(i18n("Transition %1 had an invalid track: %2 > %3", e.attribute("id"), p.text().toInt(), a_track) + '\n'); + EffectsList::setProperty(e, "a_track", QString::number(a_track)); + } + } else if (paramName == "b_track") { + b_track = qMax(0, p.text().toInt()); + b_track = qMin(m_projectTracks - 1, b_track); + if (b_track != p.text().toInt()) { + // the transition track was out of bounds + m_documentErrors.append(i18n("Transition %1 had an invalid track: %2 > %3", e.attribute("id"), p.text().toInt(), b_track) + '\n'); + EffectsList::setProperty(e, "b_track", QString::number(b_track)); + } + } else if (paramName == "mlt_service") mlt_service = p.text(); else if (paramName == "kdenlive_id") transitionId = p.text(); else if (paramName == "geometry") mlt_geometry = p.text(); else if (paramName == "automatic" && p.text() == "1") isAutomatic = true; else if (paramName == "force_track" && p.text() == "1") forceTrack = true; } } + if (a_track == b_track || b_track == 0) { + // invalid transition, remove it + m_documentErrors.append(i18n("Removed invalid transition: %1", e.attribute("id")) + '\n'); + tractor.removeChild(transitions.item(i)); + i--; + continue; + } if (transitionAdd || mlt_service != "mix") { // Transition should be added to the scene ItemInfo transitionInfo; @@ -385,6 +419,18 @@ void TrackView::parseDocument(QDomDocument doc) slotRebuildTrackHeaders(); if (!m_documentErrors.isNull()) KMessageBox::sorry(this, m_documentErrors); + if (infoXml.hasAttribute("upgraded")) { + // Our document was upgraded, create a backup copy just in case + QString baseFile = m_doc->url().path().section(".kdenlive", 0, 0); + int ct = 0; + QString backupFile = baseFile + "_backup" + QString::number(ct) + ".kdenlive"; + while (QFile::exists(backupFile)) { + ct++; + backupFile = baseFile + "_backup" + QString::number(ct) + ".kdenlive"; + } + if (KIO::NetAccess::file_copy(m_doc->url(), KUrl(backupFile), this)) KMessageBox::information(this, i18n("Your project file was upgraded to the latest Kdenlive document version.\n To make sure you don't lose data, a backup copy called %1 was created.", backupFile)); + else KMessageBox::information(this, i18n("Your project file was upgraded to the latest Kdenlive document version, it was not possible to create a backup copy.", backupFile)); + } //m_trackview->setCursorPos(cursorPos); //m_scrollBox->setGeometry(0, 0, 300 * zoomFactor(), m_scrollArea->height()); } @@ -440,6 +486,24 @@ void TrackView::refresh() m_trackview->viewport()->update(); } +void TrackView::slotRepaintTracks() +{ + QLayoutItem *child; + for (int i = 0; i < headers_container->layout()->count(); i++) { + child = headers_container->layout()->itemAt(i); + if (child->widget() && child->widget()->height() > 5) { + HeaderTrack *head = static_cast (child->widget()); + if (head) head->setSelectedIndex(m_trackview->selectedTrack()); + } + } +} + +void TrackView::slotReloadTracks() +{ + slotRebuildTrackHeaders(); + emit updateTracksInfo(); +} + void TrackView::slotRebuildTrackHeaders() { const QList list = m_doc->tracksList(); @@ -462,10 +526,11 @@ void TrackView::slotRebuildTrackHeaders() headers_container->layout()->addWidget(frame); TrackInfo info = list.at(max - i - 1); header = new HeaderTrack(i, info, height, headers_container); + header->setSelectedIndex(m_trackview->selectedTrack()); connect(header, SIGNAL(switchTrackVideo(int)), m_trackview, SLOT(slotSwitchTrackVideo(int))); connect(header, SIGNAL(switchTrackAudio(int)), m_trackview, SLOT(slotSwitchTrackAudio(int))); connect(header, SIGNAL(switchTrackLock(int)), m_trackview, SLOT(slotSwitchTrackLock(int))); - + connect(header, SIGNAL(selectTrack(int)), m_trackview, SLOT(slotSelectTrack(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))); @@ -558,8 +623,7 @@ int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool locked) clipinfo.startPos = GenTime(position, m_doc->fps()); clipinfo.endPos = clipinfo.startPos + GenTime(out - in + 1, m_doc->fps()); clipinfo.cropStart = GenTime(in, m_doc->fps()); - clipinfo.cropDuration = GenTime((int)((clipinfo.endPos - clipinfo.startPos).frames(m_doc->fps()) * speed + 0.5), m_doc->fps()); - clipinfo.originalcropStart = GenTime((int)((clipinfo.cropStart).frames(m_doc->fps()) * speed + 0.5), m_doc->fps()); + clipinfo.cropDuration = clipinfo.endPos - clipinfo.startPos; clipinfo.track = ix; //kDebug() << "// INSERTING CLIP: " << in << "x" << out << ", track: " << ix << ", ID: " << id << ", SCALE: " << m_scale << ", FPS: " << m_doc->fps(); @@ -727,7 +791,15 @@ int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool locked) if (factor.startsWith('%')) { fact = ProfilesDialog::getStringEval(m_doc->mltProfile(), factor); } else fact = factor.toDouble(); - e.setAttribute("value", paramvalue.toDouble() * fact); + if (e.attribute("type") == "simplekeyframe") { + QStringList kfrs = paramvalue.split(";"); + for (int l = 0; l < kfrs.count(); l++) { + QString fr = kfrs.at(l).section("=", 0, 0); + double val = kfrs.at(l).section("=", 1, 1).toDouble(); + kfrs[l] = fr + ":" + QString::number((int)(val * fact)); + } + e.setAttribute("keyframes", kfrs.join(";")); + } else e.setAttribute("value", paramvalue.toDouble() * fact); } else e.setAttribute("value", paramvalue); break; } @@ -861,7 +933,7 @@ void TrackView::slotRenameTrack(int ix) if (ok) { info.trackName = newName; m_doc->setTrackType(tracknumber - 1, info); - QTimer::singleShot(300, this, SLOT(slotRebuildTrackHeaders())); + QTimer::singleShot(300, this, SLOT(slotReloadTracks())); m_doc->setModified(true); } }