]> git.sesse.net Git - kdenlive/blobdiff - src/mainwindow.cpp
et rid of deprecated KPixmapCache & fix freeze when saving in maximum zoom:
[kdenlive] / src / mainwindow.cpp
index d94135d1a1c73c339ca1fee0659e5d22b93da45b..d6d4363cf1ba30d6f45a7439814aafd06ef08928 100644 (file)
@@ -62,6 +62,7 @@
 #include "audiospectrum.h"
 #include "spectrogram.h"
 #include "archivewidget.h"
+#include "databackup/backupwidget.h"
 
 #include <KApplication>
 #include <KAction>
@@ -565,6 +566,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString &
     //connect(m_monitorManager, SIGNAL(connectMonitors()), this, SLOT(slotConnectMonitors()));
     connect(m_monitorManager, SIGNAL(raiseMonitor(AbstractMonitor *)), this, SLOT(slotRaiseMonitor(AbstractMonitor *)));
     connect(m_monitorManager, SIGNAL(checkColorScopes()), this, SLOT(slotUpdateColorScopes()));
+    connect(m_monitorManager, SIGNAL(clearScopes()), this, SLOT(slotClearColorScopes()));
     connect(m_effectList, SIGNAL(addEffect(const QDomElement)), this, SLOT(slotAddEffect(const QDomElement)));
     connect(m_effectList, SIGNAL(reloadEffects()), this, SLOT(slotReloadEffects()));
 
@@ -1160,6 +1162,10 @@ void MainWindow::setupActions()
     collection.addAction("project_settings", projectAction);
     connect(projectAction, SIGNAL(triggered(bool)), this, SLOT(slotEditProjectSettings()));
 
+    KAction* backupAction = new KAction(KIcon("edit-undo"), i18n("Open Backup File"), this);
+    collection.addAction("open_backup", backupAction);
+    connect(backupAction, SIGNAL(triggered(bool)), this, SLOT(slotOpenBackupDialog()));
+
     KAction* projectRender = new KAction(KIcon("media-record"), i18n("Render"), this);
     collection.addAction("project_render", projectRender);
     projectRender->setShortcut(Qt::CTRL + Qt::Key_Return);
@@ -1505,15 +1511,6 @@ void MainWindow::setupActions()
     showTitleBar->setChecked(KdenliveSettings::showtitlebars());
     slotShowTitleBars(KdenliveSettings::showtitlebars());
 
-
-    //const QByteArray state = layoutGroup.readEntry("layout1", QByteArray());
-
-    /*QAction *maxCurrent = new KAction(i18n("Maximize Current Widget"), this);
-    collection.addAction("maximize_current", maxCurrent);
-    maxCurrent->setCheckable(true);
-    maxCurrent->setChecked(false);
-    connect(maxCurrent, SIGNAL(triggered(bool)), this, SLOT(slotMaximizeCurrent(bool)));*/
-
     m_closeAction = KStandardAction::close(this,  SLOT(closeCurrentDocument()),   collection);
     KStandardAction::quit(this,                   SLOT(close()),                  collection);
     KStandardAction::open(this,                   SLOT(openFile()),               collection);
@@ -1624,8 +1621,6 @@ void MainWindow::setupActions()
     }
     //m_effectsActionCollection->readSettings();
 
-    //connect(collection, SIGNAL( clearStatusText() ),
-    //statusBar(), SLOT( clear() ) );
 }
 
 void MainWindow::slotDisplayActionMessage(QAction *a)
@@ -1674,9 +1669,7 @@ void MainWindow::slotLoadLayout(QAction *action)
     if (layoutId.isEmpty()) return;
     KSharedConfigPtr config = KGlobal::config();
     KConfigGroup layouts(config, "Layouts");
-    //QByteArray geom = QByteArray::fromBase64(layouts.readEntry(layoutId).toAscii());
     QByteArray state = QByteArray::fromBase64(layouts.readEntry(layoutId).toAscii());
-    //restoreGeometry(geom);
     restoreState(state);
 }
 
@@ -1802,8 +1795,8 @@ void MainWindow::newFile(bool showProjectSettings, bool force)
     }
     m_timelineArea->setEnabled(true);
     m_projectList->setEnabled(true);
-    
-    KdenliveDoc *doc = new KdenliveDoc(KUrl(), projectFolder, m_commandStack, profileName, documentProperties, projectTracks, m_projectMonitor->render, m_notesWidget, this);
+    bool openBackup;
+    KdenliveDoc *doc = new KdenliveDoc(KUrl(), projectFolder, m_commandStack, profileName, documentProperties, projectTracks, m_projectMonitor->render, m_notesWidget, &openBackup, this);
     doc->m_autosave = new KAutoSaveFile(KUrl(), doc);
     bool ok;
     TrackView *trackView = new TrackView(doc, &ok, this);
@@ -1967,6 +1960,11 @@ void MainWindow::openFile(const KUrl &url)
         delete ar;
         return;
     }
+    if (!url.fileName().endsWith(".kdenlive")) {
+        // This is not a Kdenlive project file, abort loading
+        KMessageBox::sorry(this, i18n("File %1 is not a Kdenlive project file", url.path()));
+        return;
+    }
     
     // Check if the document is already opened
     const int ct = m_timelineArea->count();
@@ -2027,7 +2025,8 @@ void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale)
     progressDialog.progressBar()->setValue(0);
     qApp->processEvents();
 
-    KdenliveDoc *doc = new KdenliveDoc(url, KdenliveSettings::defaultprojectfolder(), m_commandStack, KdenliveSettings::default_profile(), QMap <QString, QString> (), QPoint(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks()), m_projectMonitor->render, m_notesWidget, this, &progressDialog);
+    bool openBackup;
+    KdenliveDoc *doc = new KdenliveDoc(url, KdenliveSettings::defaultprojectfolder(), m_commandStack, KdenliveSettings::default_profile(), QMap <QString, QString> (), QPoint(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks()), m_projectMonitor->render, m_notesWidget, &openBackup, this, &progressDialog);
 
     progressDialog.progressBar()->setValue(1);
     progressDialog.progressBar()->setMaximum(4);
@@ -2074,6 +2073,7 @@ void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale)
     m_clipMonitor->refreshMonitor(true);
 
     progressDialog.progressBar()->setValue(4);
+    if (openBackup) slotOpenBackupDialog(url);
 }
 
 void MainWindow::recoverFiles(QList<KAutoSaveFile *> staleFiles)
@@ -2247,8 +2247,6 @@ void MainWindow::slotEditProjectSettings()
 
 void MainWindow::slotUpdateProjectProfile(const QString &profile)
 {
-    double dar = m_activeDocument->dar();
-
     // Recreate the stopmotion widget if profile changes
     if (m_stopmotion) {
         delete m_stopmotion;
@@ -2271,8 +2269,6 @@ void MainWindow::slotUpdateProjectProfile(const QString &profile)
     m_projectList->updateProjectFormat(m_activeDocument->timecode());
     if (m_renderWidget) m_renderWidget->setProfile(m_activeDocument->mltProfile());
     m_timelineArea->setTabText(m_timelineArea->currentIndex(), m_activeDocument->description());
-    //m_activeDocument->clipManager()->resetProducersList(m_projectMonitor->render->producersList());
-    if (dar != m_activeDocument->dar()) m_projectList->reloadClipThumbnails();
     if (updateFps) m_activeTimeline->updateProjectFps();
     m_activeDocument->setModified(true);
     m_commandStack->activeStack()->clear();
@@ -2387,7 +2383,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
             disconnect(m_projectList, SIGNAL(projectModified()), m_activeDocument, SLOT(setModified()));
             disconnect(m_projectList, SIGNAL(updateProfile(const QString &)), this, SLOT(slotUpdateProjectProfile(const QString &)));
 
-            disconnect(m_projectMonitor->render, SIGNAL(refreshDocumentProducers()), m_activeDocument, SLOT(checkProjectClips()));
+            disconnect(m_projectMonitor->render, SIGNAL(refreshDocumentProducers(bool, bool)), m_activeDocument, SLOT(checkProjectClips(bool, bool)));
 
             disconnect(m_activeDocument, SIGNAL(guidesUpdated()), this, SLOT(slotGuidesUpdated()));
             disconnect(m_activeDocument, SIGNAL(addProjectClip(DocClipBase *, bool)), m_projectList, SLOT(slotAddClip(DocClipBase *, bool)));
@@ -2463,7 +2459,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
     connect(m_projectMonitor, SIGNAL(zoneUpdated(QPoint)), doc, SLOT(setModified()));
     connect(m_clipMonitor, SIGNAL(zoneUpdated(QPoint)), doc, SLOT(setModified()));
     connect(m_projectMonitor, SIGNAL(durationChanged(int)), trackView, SLOT(setDuration(int)));
-    connect(m_projectMonitor->render, SIGNAL(refreshDocumentProducers()), doc, SLOT(checkProjectClips()));
+    connect(m_projectMonitor->render, SIGNAL(refreshDocumentProducers(bool, bool)), doc, SLOT(checkProjectClips(bool, bool)));
 
     connect(doc, SIGNAL(addProjectClip(DocClipBase *, bool)), m_projectList, SLOT(slotAddClip(DocClipBase *, bool)));
     connect(doc, SIGNAL(resetProjectList()), m_projectList, SLOT(slotResetProjectList()));
@@ -2473,6 +2469,8 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
 
     connect(doc, SIGNAL(docModified(bool)), this, SLOT(slotUpdateDocumentState(bool)));
     connect(doc, SIGNAL(guidesUpdated()), this, SLOT(slotGuidesUpdated()));
+    connect(doc, SIGNAL(saveTimelinePreview(const QString)), trackView, SLOT(slotSaveTimelinePreview(const QString)));
+    
     connect(m_notesWidget, SIGNAL(textChanged()), doc, SLOT(setModified()));
 
     connect(trackView->projectView(), SIGNAL(clipItemSelected(ClipItem*, int, bool)), m_effectStack, SLOT(slotClipItemSelected(ClipItem*, int)));
@@ -3546,20 +3544,20 @@ void MainWindow::slotSaveZone(Render *render, QPoint zone)
 
 void MainWindow::slotSetInPoint()
 {
-    if (m_clipMonitor->isActive())
+    if (m_clipMonitor->isActive()) {
         m_clipMonitor->slotSetZoneStart();
-    else
+    } else {
         m_projectMonitor->slotSetZoneStart();
-    //else m_activeTimeline->projectView()->setInPoint();
+    }
 }
 
 void MainWindow::slotSetOutPoint()
 {
-    if (m_clipMonitor->isActive())
+    if (m_clipMonitor->isActive()) {
         m_clipMonitor->slotSetZoneEnd();
-    else
+    } else {
         m_projectMonitor->slotSetZoneEnd();
-    // else m_activeTimeline->projectView()->setOutPoint();
+    }
 }
 
 void MainWindow::slotResizeItemStart()
@@ -3670,21 +3668,15 @@ void MainWindow::slotShowTimeline(bool show)
     }
 }
 
-void MainWindow::slotMaximizeCurrent(bool /*show*/)
+void MainWindow::slotMaximizeCurrent(bool)
 {
     //TODO: is there a way to maximize current widget?
-    //if (show == true)
-    {
-        m_timelineState = saveState();
-        QWidget *par = focusWidget()->parentWidget();
-        while (par->parentWidget() && par->parentWidget() != this)
-            par = par->parentWidget();
-        kDebug() << "CURRENT WIDGET: " << par->objectName();
-    }
-    /*else {
-    //centralWidget()->setHidden(false);
-    //restoreState(m_timelineState);
-    }*/
+
+    m_timelineState = saveState();
+    QWidget *par = focusWidget()->parentWidget();
+    while (par->parentWidget() && par->parentWidget() != this)
+        par = par->parentWidget();
+    kDebug() << "CURRENT WIDGET: " << par->objectName();
 }
 
 void MainWindow::loadTranscoders()
@@ -3841,17 +3833,18 @@ void MainWindow::slotPrepareRendering(bool scriptExport, bool zoneOnly, const QS
         // replace proxy clips with originals
         QMap <QString, QString> proxies = m_projectList->getProxies();
 
-
         QDomNodeList producers = doc.elementsByTagName("producer");
         QString producerResource;
         QString suffix;
         for (uint n = 0; n < producers.length(); n++) {
             QDomElement e = producers.item(n).toElement();
             producerResource = EffectsList::property(e, "resource");
-            if (!producerResource.startsWith("/") && !producerResource.isEmpty() ){
-                producerResource=root+"/"+producerResource;
+            if (producerResource.isEmpty()) continue;
+            if (!producerResource.startsWith("/")) {
+                producerResource.prepend(root + "/");
             }
             if (producerResource.contains('?')) {
+                // slowmotion producer
                 suffix = "?" + producerResource.section('?', 1);
                 producerResource = producerResource.section('?', 0, 0);
             }
@@ -3863,12 +3856,6 @@ void MainWindow::slotPrepareRendering(bool scriptExport, bool zoneOnly, const QS
                     // sometimes have different ratio than original clips
                     EffectsList::removeProperty(e, "aspect_ratio");
                 }
-                else if (!root.isEmpty() && producerResource.startsWith(root) && proxies.contains(producerResource.remove(0, root.count() + 1))) {
-                    EffectsList::setProperty(e, "resource", proxies.value(producerResource.remove(0, root.count() + 1)) + suffix);
-                    // We need to delete the "aspect_ratio" property because proxy clips
-                    // sometimes have different ratio than original clips
-                    EffectsList::removeProperty(e, "aspect_ratio");
-                }
             }
         }
         
@@ -4129,8 +4116,11 @@ QString MainWindow::getMimeType(bool open)
 {
     QString mimetype = "application/x-kdenlive";
     KMimeType::Ptr mime = KMimeType::mimeType(mimetype);
-    if (!mime) mimetype = "*.kdenlive";
-    if (open) mimetype.append(" application/x-compressed-tar");
+    if (!mime) {
+        mimetype = "*.kdenlive";
+        if (open) mimetype.append(" *.tar.gz");
+    }
+    else if (open) mimetype.append(" application/x-compressed-tar");
     return mimetype;
 }
 
@@ -4177,11 +4167,13 @@ void MainWindow::slotDoUpdateGfxScopeFrameRequest()
             m_projectMonitor->render->sendFrameForAnalysis = false;
         }
         m_clipMonitor->render->sendFrameForAnalysis = false;
-        m_recMonitor->analyseFrames(false);
+        if (m_recMonitor)
+            m_recMonitor->analyseFrames(false);
     } else {
         m_projectMonitor->render->sendFrameForAnalysis = true;
         m_clipMonitor->render->sendFrameForAnalysis = true;
-        m_recMonitor->analyseFrames(true);
+        if (m_recMonitor)
+            m_recMonitor->analyseFrames(true);
     }
 }
 
@@ -4221,11 +4213,18 @@ void MainWindow::slotUpdateColorScopes()
         if (!m_gfxScopesList.at(i)->widget()->visibleRegion().isEmpty() && !(static_cast<AbstractGfxScopeWidget *>(m_gfxScopesList.at(i)->widget())->autoRefreshEnabled())) request = true;
         static_cast<AbstractGfxScopeWidget *>(m_gfxScopesList.at(i)->widget())->slotActiveMonitorChanged();
     }
-    if (request) {
+    if (request && m_monitorManager->activeRenderer()) {
         m_monitorManager->activeRenderer()->sendFrameUpdate();
     }
 }
 
+void MainWindow::slotClearColorScopes()
+{
+    for (int i = 0; i < m_gfxScopesList.count(); i++) {
+        static_cast<AbstractGfxScopeWidget *>(m_gfxScopesList.at(i)->widget())->slotClearMonitor();
+    }
+}
+
 void MainWindow::slotOpenStopmotion()
 {
     if (m_stopmotion == NULL) {
@@ -4274,6 +4273,40 @@ void MainWindow::slotArchiveProject()
 }
 
 
+void MainWindow::slotOpenBackupDialog(const KUrl url)
+{
+    KUrl projectFile;
+    KUrl projectFolder;
+    QString projectId;
+    kDebug()<<"// BACKUP URL: "<<url.path();
+    if (!url.isEmpty()) {
+        // we could not open the project file, guess where the backups are
+        projectFolder = KUrl(KdenliveSettings::defaultprojectfolder());
+        projectFile = url;
+    }
+    else {
+        projectFolder = m_activeDocument->projectFolder();
+        projectFile = m_activeDocument->url();
+        projectId = m_activeDocument->getDocumentProperty("documentid");
+    }
+
+    BackupWidget *dia = new BackupWidget(projectFile, projectFolder, projectId, this);
+    if (dia->exec() == QDialog::Accepted) {
+        QString requestedBackup = dia->selectedFile();
+        m_activeDocument->backupLastSavedVersion(projectFile.path());
+        closeCurrentDocument(false);
+        doOpenFile(KUrl(requestedBackup), NULL);
+        m_activeDocument->setUrl(projectFile);
+        m_activeDocument->setModified(true);
+        setCaption(m_activeDocument->description());
+    }
+    delete dia;
+}
+
+
+
+
+
 #include "mainwindow.moc"
 
 #ifdef DEBUG_MAINW