]> git.sesse.net Git - kdenlive/blobdiff - src/mainwindow.cpp
* Cleanup monitor / MLT communication
[kdenlive] / src / mainwindow.cpp
index 4a95de14abb492b1f8c532b88713dc00c0210207..4a6375497733639b43960629e1961ece2ef34b85 100644 (file)
@@ -692,6 +692,7 @@ void MainWindow::slotConnectMonitors()
     m_projectList->setRenderer(m_projectMonitor->render);
     //connect(m_projectList, SIGNAL(receivedClipDuration(const QString &)), this, SLOT(slotUpdateClip(const QString &)));
     connect(m_projectList, SIGNAL(showClipProperties(DocClipBase *)), this, SLOT(slotShowClipProperties(DocClipBase *)));
+    connect(m_projectList, SIGNAL(showClipProperties(QList <DocClipBase *>, QMap<QString, QString>)), this, SLOT(slotShowClipProperties(QList <DocClipBase *>, QMap<QString, QString>)));
     connect(m_projectList, SIGNAL(getFileProperties(const QDomElement, const QString &, int, bool)), m_projectMonitor->render, SLOT(getFileProperties(const QDomElement, const QString &, int, bool)));
     connect(m_projectMonitor->render, SIGNAL(replyGetImage(const QString &, const QPixmap &)), m_projectList, SLOT(slotReplyGetImage(const QString &, const QPixmap &)));
     connect(m_projectMonitor->render, SIGNAL(replyGetFileProperties(const QString &, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &, bool)), m_projectList, SLOT(slotReplyGetFileProperties(const QString &, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &, bool)));
@@ -1418,14 +1419,14 @@ void MainWindow::slotRunWizard()
     delete w;
 }
 
-void MainWindow::newFile(bool showProjectSettings)
+void MainWindow::newFile(bool showProjectSettings, bool force)
 {
-    if (!m_timelineArea->isEnabled()) return;
+    if (!m_timelineArea->isEnabled() && !force) return;
     m_fileRevert->setEnabled(false);
     QString profileName;
     KUrl projectFolder;
     QPoint projectTracks(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks());
-    if (!showProjectSettings && m_timelineArea->count() == 0) {
+    if (!showProjectSettings) {
         if (!KdenliveSettings::activatetabs()) closeCurrentDocument();
         profileName = KdenliveSettings::default_profile();
         projectFolder = KdenliveSettings::defaultprojectfolder();
@@ -1440,6 +1441,8 @@ void MainWindow::newFile(bool showProjectSettings)
         projectTracks = w->tracks();
         delete w;
     }
+    m_timelineArea->setEnabled(true);
+    m_projectList->setEnabled(true);
     KdenliveDoc *doc = new KdenliveDoc(KUrl(), projectFolder, m_commandStack, profileName, projectTracks, m_projectMonitor->render, this);
     doc->m_autosave = new KAutoSaveFile(KUrl(), doc);
     bool ok;
@@ -1447,9 +1450,8 @@ void MainWindow::newFile(bool showProjectSettings)
     m_timelineArea->addTab(trackView, KIcon("kdenlive"), doc->description());
     if (!ok) {
         // MLT is broken
-        m_timelineArea->setEnabled(false);
-        m_projectList->setEnabled(false);
-        m_monitorManager->slotBlockMonitors();
+        //m_timelineArea->setEnabled(false);
+        //m_projectList->setEnabled(false);
         slotPreferences(6);
         return;
     }
@@ -1655,8 +1657,9 @@ void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale)
     if (!ok) {
         m_timelineArea->setEnabled(false);
         m_projectList->setEnabled(false);
-        m_monitorManager->slotBlockMonitors();
-        slotPreferences(6);
+        KMessageBox::sorry(this, i18n("Cannot open file %1.\nProject is corrupted.", url.path()));
+        slotGotProgressInfo(QString(), -1);
+        newFile(false, true);
         return;
     }
     m_timelineArea->setTabToolTip(m_timelineArea->currentIndex(), doc->url().path());
@@ -1936,6 +1939,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
             disconnect(m_activeTimeline->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), this, SLOT(slotActivateEffectStackView()));
             disconnect(m_activeTimeline->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), m_transitionConfig, SLOT(slotTransitionItemSelected(Transition*, int, QPoint, bool)));
             disconnect(m_activeTimeline->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), this, SLOT(slotActivateTransitionView(Transition *)));
+            disconnect(m_activeTimeline->projectView(), SIGNAL(playMonitor()), m_projectMonitor, SLOT(slotPlay()));
             disconnect(m_zoomSlider, SIGNAL(valueChanged(int)), m_activeTimeline, SLOT(slotChangeZoom(int)));
             disconnect(m_activeTimeline->projectView(), SIGNAL(displayMessage(const QString&, MessageType)), m_messageLabel, SLOT(setMessage(const QString&, MessageType)));
             disconnect(m_activeTimeline->projectView(), SIGNAL(showClipFrame(DocClipBase *, QPoint, const int)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *, QPoint, const int)));
@@ -2012,6 +2016,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
     connect(trackView->projectView(), SIGNAL(displayMessage(const QString&, MessageType)), m_messageLabel, SLOT(setMessage(const QString&, MessageType)));
 
     connect(trackView->projectView(), SIGNAL(showClipFrame(DocClipBase *, QPoint, const int)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *, QPoint, const int)));
+    connect(trackView->projectView(), SIGNAL(playMonitor()), m_projectMonitor, SLOT(slotPlay()));
 
 
     connect(m_effectStack, SIGNAL(updateClipEffect(ClipItem*, QDomElement, QDomElement, int)), trackView->projectView(), SLOT(slotUpdateClipEffect(ClipItem*, QDomElement, QDomElement, int)));
@@ -2548,10 +2553,12 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip)
                 if (description.isEmpty()) description = clip->getProperty("description");
                 else newprops.insert("templatetext", description);
                 //newprops.insert("xmldata", m_projectList->generateTemplateXml(newtemplate, description).toString());
-
-                EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newprops, true);
-                m_activeDocument->commandStack()->push(command);
+                if (!newprops.isEmpty()) {
+                    EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newprops, true);
+                    m_activeDocument->commandStack()->push(command);
+                }
             }
+            delete dia;
             return;
         }
         QString path = clip->getProperty("resource");
@@ -2579,7 +2586,9 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip)
     ClipProperties dia(clip, m_activeDocument->timecode(), m_activeDocument->fps(), this);
     connect(&dia, SIGNAL(addMarker(const QString &, GenTime, QString)), m_activeTimeline->projectView(), SLOT(slotAddClipMarker(const QString &, GenTime, QString)));
     if (dia.exec() == QDialog::Accepted) {
-        EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), dia.properties(), true);
+        QMap <QString, QString> newprops = dia.properties();
+        if (newprops.isEmpty()) return;
+        EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newprops, true);
         m_activeDocument->commandStack()->push(command);
 
         if (dia.needsTimelineRefresh()) {
@@ -2589,6 +2598,24 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip)
     }
 }
 
+
+void MainWindow::slotShowClipProperties(QList <DocClipBase *> cliplist, QMap<QString, QString> commonproperties)
+{
+    ClipProperties dia(cliplist, commonproperties, this);
+    if (dia.exec() == QDialog::Accepted) {
+        QUndoCommand *command = new QUndoCommand();
+        command->setText(i18n("Edit clips"));
+        for (int i = 0; i < cliplist.count(); i++) {
+            DocClipBase *clip = cliplist.at(i);
+            new EditClipCommand(m_projectList, clip->getId(), clip->properties(), dia.properties(), true, command);
+        }
+        m_activeDocument->commandStack()->push(command);
+        for (int i = 0; i < cliplist.count(); i++) {
+            m_activeTimeline->projectView()->slotUpdateClip(cliplist.at(i)->getId(), dia.needsTimelineReload());
+        }
+    }
+}
+
 void MainWindow::customEvent(QEvent* e)
 {
     if (e->type() == QEvent::User) {
@@ -2994,8 +3021,12 @@ void MainWindow::loadTranscoders()
     QMapIterator<QString, QString> i(profiles);
     while (i.hasNext()) {
         i.next();
+        QStringList data = i.value().split(";", QString::SkipEmptyParts);
         QAction *a = transMenu->addAction(i.key());
-        a->setData(i.value());
+        a->setData(data);
+        if (data.count() > 1) {
+            a->setToolTip(data.at(1));
+        }
         connect(a, SIGNAL(triggered()), this, SLOT(slotTranscode()));
     }
 }
@@ -3003,13 +3034,22 @@ void MainWindow::loadTranscoders()
 void MainWindow::slotTranscode(KUrl::List urls)
 {
     QString params;
+    QString desc;
+    QString condition;
     if (urls.isEmpty()) {
-        urls.append(m_projectList->currentClipUrl());
         QAction *action = qobject_cast<QAction *>(sender());
-        params = action->data().toString();
+        QStringList data = action->data().toStringList();
+        params = data.at(0);
+        if (data.count() > 1) desc = data.at(1);
+        if (data.count() > 2) condition = data.at(2);
+        urls << m_projectList->getConditionalUrls(condition);
+        urls.removeAll(KUrl());
     }
-    if (urls.isEmpty()) return;
-    ClipTranscode *d = new ClipTranscode(urls, params);
+    if (urls.isEmpty()) {
+        m_messageLabel->setMessage(i18n("No clip to transcode"), ErrorMessage);
+        return;
+    }
+    ClipTranscode *d = new ClipTranscode(urls, params, desc);
     connect(d, SIGNAL(addClip(KUrl)), this, SLOT(slotAddProjectClip(KUrl)));
     d->show();
     //QProcess::startDetached("ffmpeg", parameters);