X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fkdenlivedoc.cpp;h=dafa9aea6435dc61befc291f0dd72f0b66427c5a;hb=7c066a50b5c795b85b4e94d489dfb18458d7ce7b;hp=4c672235bb54fe085adab77461d281ee7cad1de1;hpb=f20225e0078b03502709b4bee99563cd5593ee75;p=kdenlive diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index 4c672235..dafa9aea 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -203,9 +203,20 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup m_document = createEmptyDocument(tracks.x(), tracks.y()); } + // Set the video profile (empty == default) KdenliveSettings::setCurrent_profile(profilePath()); - // Set the video profile (empty == default) + // Ask to create the project directory if it does not exist + if (!QFile::exists(m_projectFolder.path())) { + int create = KMessageBox::questionYesNo(parent, i18n("Project directory %1 does not exist. Create it?", m_projectFolder.path())); + if (create == KMessageBox::Yes) { + QDir projectDir(m_projectFolder.path()); + bool ok = projectDir.mkpath(m_projectFolder.path()); + if (!ok) { + KMessageBox::sorry(parent, i18n("The directory %1, could not be created.\nPlease make sure you have the required permissions.", m_projectFolder.path())); + } + } + } // Make sure the project folder is usable if (m_projectFolder.isEmpty() || !KIO::NetAccess::exists(m_projectFolder.path(), KIO::NetAccess::DestinationSide, parent)) { @@ -269,10 +280,16 @@ QDomDocument KdenliveDoc::createEmptyDocument(int videotracks, int audiotracks) m_tracksList.clear(); + // Tracks are added «backwards», so we need to reverse the track numbering + // mbt 331: http://www.kdenlive.org/mantis/view.php?id=331 + // Better default names for tracks: Audio 1 etc. instead of blank numbers for (int i = 0; i < audiotracks; i++) { + audioTrack.trackName = QString("Audio ") + QString::number(audiotracks - i); m_tracksList.append(audioTrack); + } for (int i = 0; i < videotracks; i++) { + videoTrack.trackName = QString("Video ") + QString::number(videotracks - i); m_tracksList.append(videoTrack); } return createEmptyDocument(m_tracksList); @@ -359,13 +376,13 @@ QDomDocument KdenliveDoc::createEmptyDocument(QList tracks) track0.setAttribute("producer", "black_track"); tractor.appendChild(track0); - // create audio tracks + // create audio and video tracks for (int i = 1; i < total; i++) { QDomElement track = doc.createElement("track"); track.setAttribute("producer", "playlist" + QString::number(i)); - if (tracks.at(i - 1).type == AUDIOTRACK) + if (tracks.at(i - 1).type == AUDIOTRACK) { track.setAttribute("hide", "video"); - else if (tracks.at(i - 1).isBlind) + } else if (tracks.at(i - 1).isBlind) track.setAttribute("hide", "video"); if (tracks.at(i - 1).isMute) track.setAttribute("hide", "audio"); @@ -481,6 +498,11 @@ bool KdenliveDoc::saveSceneList(const QString &path, const QString &scene) QDomDocument sceneList; sceneList.setContent(scene, true); QDomElement mlt = sceneList.firstChildElement("mlt"); + if (mlt.isNull() || !mlt.hasChildNodes()) { + //Make sure we don't save if scenelist is corrupted + KMessageBox::error(kapp->activeWindow(), i18n("Cannot write to file %1, scene list is corrupted.", path)); + return false; + } QDomElement addedXml = sceneList.createElement("kdenlivedoc"); mlt.appendChild(addedXml); @@ -515,7 +537,7 @@ bool KdenliveDoc::saveSceneList(const QString &path, const QString &scene) // tracks info QDomElement tracksinfo = sceneList.createElement("tracksinfo"); - foreach(const TrackInfo &info, m_tracksList) { + foreach(const TrackInfo & info, m_tracksList) { QDomElement trackinfo = sceneList.createElement("trackinfo"); if (info.type == AUDIOTRACK) trackinfo.setAttribute("type", "audio"); trackinfo.setAttribute("mute", info.isMute); @@ -734,7 +756,6 @@ void KdenliveDoc::setRenderer(Render *render) { void KdenliveDoc::checkProjectClips() { - kDebug() << "+++++++++++++ + + + + CHK PCLIPS"; if (m_render == NULL) return; m_clipManager->resetProducersList(m_render->producersList()); } @@ -873,10 +894,10 @@ void KdenliveDoc::addClip(QDomElement elem, QString clipId, bool createClipItem) int action = KMessageBox::No; if (!size.isEmpty() && !hash.isEmpty()) { if (!m_searchFolder.isEmpty()) newpath = searchFileRecursively(m_searchFolder, size, hash); - else action = (KMessageBox::ButtonCode) KMessageBox::questionYesNoCancel(kapp->activeWindow(), i18n("Clip %1
is invalid, what do you want to do?", path), i18n("File not found"), KGuiItem(i18n("Search automatically")), KGuiItem(i18n("Keep as placeholder"))); + else action = (KMessageBox::ButtonCode) KMessageBox::questionYesNoCancel(kapp->activeWindow(), i18n("Clip %1
is invalid, what do you want to do?", path), i18n("File not found"), KGuiItem(i18n("Search automatically")), KGuiItem(i18n("Keep as placeholder"))); } else { if (elem.attribute("type").toInt() == SLIDESHOW) { - int res = KMessageBox::questionYesNoCancel(kapp->activeWindow(), i18n("Clip %1
is invalid or missing, what do you want to do?", path), i18n("File not found"), KGuiItem(i18n("Search manually")), KGuiItem(i18n("Keep as placeholder"))); + int res = KMessageBox::questionYesNoCancel(kapp->activeWindow(), i18n("Clip %1
is invalid or missing, what do you want to do?", path), i18n("File not found"), KGuiItem(i18n("Search manually")), KGuiItem(i18n("Keep as placeholder"))); if (res == KMessageBox::Yes) newpath = KFileDialog::getExistingDirectory(KUrl("kfiledialog:///clipfolder"), kapp->activeWindow(), i18n("Looking for %1", path)); else { @@ -884,7 +905,7 @@ void KdenliveDoc::addClip(QDomElement elem, QString clipId, bool createClipItem) action = res; } } else { - int res = KMessageBox::questionYesNoCancel(kapp->activeWindow(), i18n("Clip %1
is invalid or missing, what do you want to do?", path), i18n("File not found"), KGuiItem(i18n("Search manually")), KGuiItem(i18n("Keep as placeholder"))); + int res = KMessageBox::questionYesNoCancel(kapp->activeWindow(), i18n("Clip %1
is invalid or missing, what do you want to do?", path), i18n("File not found"), KGuiItem(i18n("Search manually")), KGuiItem(i18n("Keep as placeholder"))); if (res == KMessageBox::Yes) newpath = KFileDialog::getOpenFileName(KUrl("kfiledialog:///clipfolder"), QString(), kapp->activeWindow(), i18n("Looking for %1", path)); else { @@ -957,7 +978,7 @@ QString KdenliveDoc::searchFileRecursively(const QDir &dir, const QString &match * 1 MB = 1 second per 450 files (or faster) * 10 MB = 9 seconds per 450 files (or faster) */ - if (file.size() > 1000000*2) { + if (file.size() > 1000000 * 2) { fileData = file.read(1000000); if (file.seek(file.size() - 1000000)) fileData.append(file.readAll()); @@ -1015,14 +1036,6 @@ void KdenliveDoc::addClipInfo(QDomElement elem, QDomElement orig, QString clipId } } -void KdenliveDoc::deleteProjectClip(QStringList ids) -{ - for (int i = 0; i < ids.size(); ++i) { - emit deleteTimelineClip(ids.at(i)); - } - m_clipManager->slotDeleteClips(ids); - setModified(true); -} void KdenliveDoc::deleteClip(const QString &clipId) { @@ -1054,6 +1067,13 @@ DocClipBase *KdenliveDoc::getBaseClip(const QString &clipId) return m_clipManager->getClipById(clipId); } +void KdenliveDoc::slotCreateXmlClip(const QString &name, const QDomElement xml, QString group, const QString &groupId) +{ + m_clipManager->slotAddXmlClipFile(name, xml, group, groupId); + setModified(true); + emit selectLastAddedClip(QString::number(m_clipManager->lastClipId())); +} + void KdenliveDoc::slotCreateColorClip(const QString &name, const QString &color, const QString &duration, QString group, const QString &groupId) { m_clipManager->slotAddColorClipFile(name, color, duration, group, groupId); @@ -1074,7 +1094,7 @@ void KdenliveDoc::slotCreateTextClip(QString group, const QString &groupId, cons KStandardDirs::makeDir(titlesFolder); TitleWidget *dia_ui = new TitleWidget(templatePath, m_timecode, titlesFolder, m_render, kapp->activeWindow()); if (dia_ui->exec() == QDialog::Accepted) { - m_clipManager->slotAddTextClipFile(i18n("Title clip"), dia_ui->duration(), dia_ui->xml().toString(), group, groupId); + m_clipManager->slotAddTextClipFile(i18n("Title clip"), dia_ui->outPoint(), dia_ui->xml().toString(), group, groupId); setModified(true); emit selectLastAddedClip(QString::number(m_clipManager->lastClipId())); } @@ -1155,7 +1175,7 @@ QPoint KdenliveDoc::getTracksCount() const { int audio = 0; int video = 0; - foreach(const TrackInfo &info, m_tracksList) { + foreach(const TrackInfo & info, m_tracksList) { if (info.type == VIDEOTRACK) video++; else audio++; } @@ -1225,5 +1245,16 @@ const QString KdenliveDoc::getDocumentProperty(const QString &name) const return m_documentProperties.value(name); } +QMap KdenliveDoc::getRenderProperties() const +{ + QMap renderProperties; + QMapIterator i(m_documentProperties); + while (i.hasNext()) { + i.next(); + if (i.key().startsWith("render")) renderProperties.insert(i.key(), i.value()); + } + return renderProperties; +} + #include "kdenlivedoc.moc"