]> git.sesse.net Git - kdenlive/blobdiff - src/kdenlivedoc.cpp
Remember render settings for project (zone, guides,...):
[kdenlive] / src / kdenlivedoc.cpp
index 97467f462cc8c29b040f42dc57782435d7655b34..dafa9aea6435dc61befc291f0dd72f0b66427c5a 100644 (file)
@@ -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);
@@ -342,7 +359,7 @@ QDomDocument KdenliveDoc::createEmptyDocument(QList <TrackInfo> tracks)
 
     QDomElement blank0 = doc.createElement("entry");
     blank0.setAttribute("in", "0");
-    blank0.setAttribute("out", "0");
+    blank0.setAttribute("out", "1");
     blank0.setAttribute("producer", "black");
     playlist.appendChild(blank0);
 
@@ -359,13 +376,13 @@ QDomDocument KdenliveDoc::createEmptyDocument(QList <TrackInfo> 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 <b>%1</b><br>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 <b>%1</b><br />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 <b>%1</b><br>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 <b>%1</b><br />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 <b>%1</b><br>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 <b>%1</b><br />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 <QString, QString> KdenliveDoc::getRenderProperties() const
+{
+    QMap <QString, QString> renderProperties;
+    QMapIterator<QString, QString> i(m_documentProperties);
+    while (i.hasNext()) {
+        i.next();
+        if (i.key().startsWith("render")) renderProperties.insert(i.key(), i.value());
+    }
+    return renderProperties;
+}
+
 #include "kdenlivedoc.moc"