]> git.sesse.net Git - kdenlive/blobdiff - src/mainwindow.cpp
Allow importing of clips into project from command line:
[kdenlive] / src / mainwindow.cpp
index 5de3702c6cf08bb187a61991739535fb30223ecd..f544335aa4f266228365104e3da8056777f2ada0 100644 (file)
@@ -120,7 +120,7 @@ EffectsList MainWindow::audioEffects;
 EffectsList MainWindow::customEffects;
 EffectsList MainWindow::transitions;
 
-MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent) :
+MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & clipsToLoad, QWidget *parent) :
         KXmlGuiWindow(parent),
         m_activeDocument(NULL),
         m_activeTimeline(NULL),
@@ -172,26 +172,26 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent
 
     m_projectListDock = new QDockWidget(i18n("Project Tree"), this);
     m_projectListDock->setObjectName("project_tree");
-    m_projectList = new ProjectList(this);
+    m_projectList = new ProjectList();
     m_projectListDock->setWidget(m_projectList);
     addDockWidget(Qt::TopDockWidgetArea, m_projectListDock);
 
     m_clipMonitorDock = new QDockWidget(i18n("Clip Monitor"), this);
     m_clipMonitorDock->setObjectName("clip_monitor");
-    m_clipMonitor = new Monitor("clip", m_monitorManager, QString(), this);
+    m_clipMonitor = new Monitor("clip", m_monitorManager, QString());
     m_clipMonitorDock->setWidget(m_clipMonitor);
     addDockWidget(Qt::TopDockWidgetArea, m_clipMonitorDock);
 
     m_projectMonitorDock = new QDockWidget(i18n("Project Monitor"), this);
     m_projectMonitorDock->setObjectName("project_monitor");
-    m_projectMonitor = new Monitor("project", m_monitorManager, QString(), this);
+    m_projectMonitor = new Monitor("project", m_monitorManager, QString());
     m_projectMonitorDock->setWidget(m_projectMonitor);
     addDockWidget(Qt::TopDockWidgetArea, m_projectMonitorDock);
 
 #ifndef Q_WS_MAC
     m_recMonitorDock = new QDockWidget(i18n("Record Monitor"), this);
     m_recMonitorDock->setObjectName("record_monitor");
-    m_recMonitor = new RecMonitor("record", this);
+    m_recMonitor = new RecMonitor("record");
     m_recMonitorDock->setWidget(m_recMonitor);
     addDockWidget(Qt::TopDockWidgetArea, m_recMonitorDock);
     connect(m_recMonitor, SIGNAL(addProjectClip(KUrl)), this, SLOT(slotAddProjectClip(KUrl)));
@@ -200,13 +200,13 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent
 
     m_effectStackDock = new QDockWidget(i18n("Effect Stack"), this);
     m_effectStackDock->setObjectName("effect_stack");
-    m_effectStack = new EffectStackView(m_projectMonitor, this);
+    m_effectStack = new EffectStackView(m_projectMonitor);
     m_effectStackDock->setWidget(m_effectStack);
     addDockWidget(Qt::TopDockWidgetArea, m_effectStackDock);
 
     m_transitionConfigDock = new QDockWidget(i18n("Transition"), this);
     m_transitionConfigDock->setObjectName("transition");
-    m_transitionConfig = new TransitionSettings(m_projectMonitor, this);
+    m_transitionConfig = new TransitionSettings(m_projectMonitor);
     m_transitionConfigDock->setWidget(m_transitionConfig);
     addDockWidget(Qt::TopDockWidgetArea, m_transitionConfigDock);
 
@@ -216,7 +216,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent
     m_effectListDock->setWidget(m_effectList);
     addDockWidget(Qt::TopDockWidgetArea, m_effectListDock);
 
-    m_vectorscope = new Vectorscope(m_projectMonitor, m_clipMonitor, this);
+    m_vectorscope = new Vectorscope(m_projectMonitor, m_clipMonitor);
     m_vectorscopeDock = new QDockWidget(i18n("Vectorscope"), this);
     m_vectorscopeDock->setObjectName(m_vectorscope->widgetName());
     m_vectorscopeDock->setWidget(m_vectorscope);
@@ -226,7 +226,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent
     connect(m_vectorscope, SIGNAL(requestAutoRefresh(bool)), this, SLOT(slotUpdateScopeFrameRequest()));
     m_scopesList.append(m_vectorscopeDock);
 
-    m_waveform = new Waveform(m_projectMonitor, m_clipMonitor, this);
+    m_waveform = new Waveform(m_projectMonitor, m_clipMonitor);
     m_waveformDock = new QDockWidget(i18n("Waveform"), this);
     m_waveformDock->setObjectName(m_waveform->widgetName());
     m_waveformDock->setWidget(m_waveform);
@@ -236,7 +236,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent
     connect(m_waveform, SIGNAL(requestAutoRefresh(bool)), this, SLOT(slotUpdateScopeFrameRequest()));
     m_scopesList.append(m_waveformDock);
 
-    m_RGBParade = new RGBParade(m_projectMonitor, m_clipMonitor, this);
+    m_RGBParade = new RGBParade(m_projectMonitor, m_clipMonitor);
     m_RGBParadeDock = new QDockWidget(i18n("RGB Parade"), this);
     m_RGBParadeDock->setObjectName(m_RGBParade->widgetName());
     m_RGBParadeDock->setWidget(m_RGBParade);
@@ -246,7 +246,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent
     connect(m_RGBParade, SIGNAL(requestAutoRefresh(bool)), this, SLOT(slotUpdateScopeFrameRequest()));
     m_scopesList.append(m_RGBParadeDock);
 
-    m_histogram = new Histogram(m_projectMonitor, m_clipMonitor, this);
+    m_histogram = new Histogram(m_projectMonitor, m_clipMonitor);
     m_histogramDock = new QDockWidget(i18n("Histogram"), this);
     m_histogramDock->setObjectName(m_histogram->widgetName());
     m_histogramDock->setWidget(m_histogram);
@@ -259,7 +259,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent
 
     m_undoViewDock = new QDockWidget(i18n("Undo History"), this);
     m_undoViewDock->setObjectName("undo_history");
-    m_undoView = new QUndoView(this);
+    m_undoView = new QUndoView();
     m_undoView->setCleanIcon(KIcon("edit-clear"));
     m_undoView->setEmptyLabel(i18n("Clean"));
     m_undoViewDock->setWidget(m_undoView);
@@ -469,6 +469,16 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent
         newFile(false);
     }
 
+    if (!clipsToLoad.isEmpty() && m_activeDocument) {
+        QStringList list = clipsToLoad.split(',');
+        QList <QUrl> urls;
+        foreach(QString path, list) {
+            kDebug() << QDir::current().absoluteFilePath(path);
+            urls << QUrl::fromLocalFile(QDir::current().absoluteFilePath(path));
+        }
+        m_projectList->slotAddClip(urls);
+    }
+
 #ifndef NO_JOGSHUTTLE
     activateShuttleDevice();
 #endif /* NO_JOGSHUTTLE */
@@ -483,17 +493,12 @@ MainWindow::~MainWindow()
     if (m_projectMonitor) m_projectMonitor->stop();
     if (m_clipMonitor) m_clipMonitor->stop();
 
-    if (m_activeTimeline) delete m_activeTimeline;
-
+    delete m_activeTimeline;
     delete m_effectStack;
     delete m_transitionConfig;
-
-    if (m_activeDocument) delete m_activeDocument;
-#ifndef Q_WS_MAC
-    // This sometimes causes crash on exit on OS X for some reason.
+    delete m_activeDocument;
     delete m_projectMonitor;
     delete m_clipMonitor;
-#endif
     delete m_shortcutRemoveFocus;
     Mlt::Factory::close();
 }
@@ -731,7 +736,7 @@ void MainWindow::slotFullScreen()
     KToggleFullScreenAction::setFullScreen(this, actionCollection()->action("fullscreen")->isChecked());
 }
 
-void MainWindow::slotAddEffect(const QDomElement effect, GenTime pos, int track)
+void MainWindow::slotAddEffect(const QDomElement effect)
 {
     if (!m_activeDocument) return;
     if (effect.isNull()) {
@@ -739,7 +744,10 @@ void MainWindow::slotAddEffect(const QDomElement effect, GenTime pos, int track)
         return;
     }
     QDomElement effectToAdd = effect.cloneNode().toElement();
-    m_activeTimeline->projectView()->slotAddEffect(effectToAdd, pos, track);
+    bool ok;
+    int ix = m_effectStack->isTrackMode(&ok);
+    if (ok) m_activeTimeline->projectView()->slotAddTrackEffect(effectToAdd, m_activeDocument->tracksCount() - ix);
+    else m_activeTimeline->projectView()->slotAddEffect(effectToAdd, GenTime(), -1);
 }
 
 void MainWindow::slotRaiseMonitor(bool clipMonitor)
@@ -810,8 +818,12 @@ void MainWindow::setupActions()
 
     KToolBar *toolbar = new KToolBar("statusToolBar", this, Qt::BottomToolBarArea);
     toolbar->setMovable(false);
+    KColorScheme scheme(palette().currentColorGroup(), KColorScheme::Window, KSharedConfig::openConfig(KdenliveSettings::colortheme()));
+    QColor buttonBg = scheme.background(KColorScheme::LinkBackground).color();
+    QColor buttonBord = scheme.foreground(KColorScheme::LinkText).color();
+    QColor buttonBord2 = scheme.shade(KColorScheme::LightShade);
     statusBar()->setStyleSheet(QString("QStatusBar QLabel {font-size:%1pt;} QStatusBar::item { border: 0px; font-size:%1pt;padding:0px; }").arg(statusBar()->font().pointSize()));
-    QString style1 = "QToolBar { border: 0px } QToolButton { border-style: inset; border:1px solid #999999;border-radius: 3px;margin: 0px 3px;padding: 0px;} QToolButton:checked { background-color: rgba(224, 224, 0, 100); border-style: inset; border:1px solid #cc6666;border-radius: 3px;}";
+    QString style1 = QString("QToolBar { border: 0px } QToolButton { border-style: inset; border:1px solid transparent;border-radius: 3px;margin: 0px 3px;padding: 0px;} QToolButton:hover { background: rgb(%7, %8, %9);border-style: inset; border:1px solid rgb(%7, %8, %9);border-radius: 3px;} QToolButton:checked { background-color: rgb(%1, %2, %3); border-style: inset; border:1px solid rgb(%4, %5, %6);border-radius: 3px;}").arg(buttonBg.red()).arg(buttonBg.green()).arg(buttonBg.blue()).arg(buttonBord.red()).arg(buttonBord.green()).arg(buttonBord.blue()).arg(buttonBord2.red()).arg(buttonBord2.green()).arg(buttonBord2.blue());
     QString styleBorderless = "QToolButton { border-width: 0px;margin: 1px 3px 0px;padding: 0px;}";
 
     //create edit mode buttons
@@ -1576,21 +1588,27 @@ void MainWindow::slotRunWizard()
 
 void MainWindow::newFile(bool showProjectSettings, bool force)
 {
-    if (!m_timelineArea->isEnabled() && !force) return;
+    if (!m_timelineArea->isEnabled() && !force)
+        return;
     m_fileRevert->setEnabled(false);
-    QString profileName;
-    KUrl projectFolder;
+    QString profileName = KdenliveSettings::default_profile();
+    KUrl projectFolder = KdenliveSettings::defaultprojectfolder();
     QPoint projectTracks(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks());
     if (!showProjectSettings) {
-        if (!KdenliveSettings::activatetabs()) closeCurrentDocument();
-        profileName = KdenliveSettings::default_profile();
-        projectFolder = KdenliveSettings::defaultprojectfolder();
+        if (!KdenliveSettings::activatetabs())
+            if (!closeCurrentDocument())
+                return;
     } else {
         ProjectSettings *w = new ProjectSettings(NULL, QStringList(), projectTracks.x(), projectTracks.y(), KdenliveSettings::defaultprojectfolder(), false, true, this);
-        if (w->exec() != QDialog::Accepted) return;
-        if (!KdenliveSettings::activatetabs()) closeCurrentDocument();
-        if (KdenliveSettings::videothumbnails() != w->enableVideoThumbs()) slotSwitchVideoThumbs();
-        if (KdenliveSettings::audiothumbnails() != w->enableAudioThumbs()) slotSwitchAudioThumbs();
+        if (w->exec() != QDialog::Accepted)
+            return;
+        if (!KdenliveSettings::activatetabs())
+            if (!closeCurrentDocument())
+                return;
+        if (KdenliveSettings::videothumbnails() != w->enableVideoThumbs())
+            slotSwitchVideoThumbs();
+        if (KdenliveSettings::audiothumbnails() != w->enableAudioThumbs())
+            slotSwitchAudioThumbs();
         profileName = w->selectedProfile();
         projectFolder = w->selectedFolder();
         projectTracks = w->tracks();
@@ -1613,7 +1631,8 @@ void MainWindow::newFile(bool showProjectSettings, bool force)
     if (m_timelineArea->count() == 1) {
         connectDocumentInfo(doc);
         connectDocument(trackView, doc);
-    } else m_timelineArea->setTabBarHidden(false);
+    } else
+        m_timelineArea->setTabBarHidden(false);
     m_monitorManager->activateMonitor("clip");
     m_closeAction->setEnabled(m_timelineArea->count() > 1);
 }
@@ -1627,10 +1646,10 @@ void MainWindow::activateDocument()
     connectDocument(currentTab, currentDoc);
 }
 
-void MainWindow::closeCurrentDocument(bool saveChanges)
+bool MainWindow::closeCurrentDocument(bool saveChanges)
 {
     QWidget *w = m_timelineArea->currentWidget();
-    if (!w) return;
+    if (!w) return true;
     // closing current document
     int ix = m_timelineArea->currentIndex() + 1;
     if (ix == m_timelineArea->count()) ix = 0;
@@ -1646,10 +1665,10 @@ void MainWindow::closeCurrentDocument(bool saveChanges)
         switch (KMessageBox::warningYesNoCancel(this, message)) {
         case KMessageBox::Yes :
             // save document here. If saving fails, return false;
-            if (saveFile() == false) return;
+            if (saveFile() == false) return false;
             break;
         case KMessageBox::Cancel :
-            return;
+            return false;
             break;
         default:
             break;
@@ -1675,6 +1694,7 @@ void MainWindow::closeCurrentDocument(bool saveChanges)
     } else {
         delete w;
     }
+    return true;
 }
 
 bool MainWindow::saveFileAs(const QString &outputFileName)
@@ -1774,6 +1794,8 @@ void MainWindow::openFile(const KUrl &url)
         return;
     }
 
+    if (!KdenliveSettings::activatetabs()) if (!closeCurrentDocument()) return;
+
     // Check for backup file
     QList<KAutoSaveFile *> staleFiles = KAutoSaveFile::staleFiles(url);
     if (!staleFiles.isEmpty()) {
@@ -1791,7 +1813,6 @@ void MainWindow::openFile(const KUrl &url)
             }
         }
     }
-    if (!KdenliveSettings::activatetabs()) closeCurrentDocument();
     m_messageLabel->setMessage(i18n("Opening file %1", url.path()), InformationMessage);
     m_messageLabel->repaint();
     doOpenFile(url, NULL);
@@ -1836,7 +1857,6 @@ void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale)
 
 void MainWindow::recoverFiles(QList<KAutoSaveFile *> staleFiles)
 {
-    if (!KdenliveSettings::activatetabs()) closeCurrentDocument();
     foreach(KAutoSaveFile *stale, staleFiles) {
         /*if (!stale->open(QIODevice::QIODevice::ReadOnly)) {
                   // show an error message; we could not steal the lockfile
@@ -2713,6 +2733,9 @@ void MainWindow::slotFitZoom()
 
 void MainWindow::slotSetZoom(int value)
 {
+    value = qMax(m_zoomSlider->minimum(), value);
+    value = qMin(m_zoomSlider->maximum(), value);
+
     if (m_activeTimeline)
         m_activeTimeline->slotChangeZoom(value);
 
@@ -2839,6 +2862,8 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip)
         //m_activeDocument->editTextClip(clip->getProperty("xml"), clip->getId());
         return;
     }
+
+    // any type of clip but a title
     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) {
@@ -2846,6 +2871,7 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip)
         if (newprops.isEmpty()) return;
         EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newprops, true);
         m_activeDocument->commandStack()->push(command);
+        m_activeDocument->setModified();
 
         if (dia.needsTimelineRefresh()) {
             // update clip occurences in timeline
@@ -3509,8 +3535,8 @@ void MainWindow::slotRevert()
 {
     if (KMessageBox::warningContinueCancel(this, i18n("This will delete all changes made since you last saved your project. Are you sure you want to continue?"), i18n("Revert to last saved version")) == KMessageBox::Cancel) return;
     KUrl url = m_activeDocument->url();
-    closeCurrentDocument(false);
-    doOpenFile(url, NULL);
+    if (closeCurrentDocument(false))
+        doOpenFile(url, NULL);
 }
 
 
@@ -3562,8 +3588,9 @@ void MainWindow::slotChangePalette(QAction *action, const QString &themename)
                 ((QWidget*)subchild)->setPalette(plt);
         }
     }
-    if (m_activeTimeline)
+    if (m_activeTimeline) {
         m_activeTimeline->projectView()->updatePalette();
+    }
 }
 
 
@@ -3765,7 +3792,7 @@ void MainWindow::slotUpdateColorScopes()
 {
     bool request = false;
     for (int i = 0; i < m_scopesList.count(); i++) {
-       // Check if we need the renderer to send a new frame for update
+        // Check if we need the renderer to send a new frame for update
         if (!m_scopesList.at(i)->widget()->visibleRegion().isEmpty() && !(static_cast<AbstractScopeWidget *>(m_scopesList.at(i)->widget())->autoRefreshEnabled())) request = true;
         static_cast<AbstractScopeWidget *>(m_scopesList.at(i)->widget())->slotActiveMonitorChanged(m_clipMonitor->isActive());
     }