]> git.sesse.net Git - kdenlive/blobdiff - src/projectlist.cpp
Rewrote DVD creation, should now support correctly 4:3 and 16:9 menus, letterbox...
[kdenlive] / src / projectlist.cpp
index 70ea5a10774f1d588967242708dea648cd83b2cc..3a8f93298a35442ddd06711aff5695250514fb2c 100644 (file)
@@ -310,7 +310,7 @@ ProjectList::ProjectList(QWidget *parent) :
     connect(this, SIGNAL(processNextThumbnail()), this, SLOT(slotProcessNextThumbnail()));
     connect(m_listView, SIGNAL(projectModified()), this, SIGNAL(projectModified()));
     connect(m_listView, SIGNAL(itemSelectionChanged()), this, SLOT(slotClipSelected()));
-    connect(m_listView, SIGNAL(focusMonitor()), this, SIGNAL(raiseClipMonitor()));
+    connect(m_listView, SIGNAL(focusMonitor(bool)), this, SIGNAL(raiseClipMonitor(bool)));
     connect(m_listView, SIGNAL(pauseMonitor()), this, SIGNAL(pauseMonitor()));
     connect(m_listView, SIGNAL(requestMenu(const QPoint &, QTreeWidgetItem *)), this, SLOT(slotContextMenu(const QPoint &, QTreeWidgetItem *)));
     connect(m_listView, SIGNAL(addClip()), this, SIGNAL(pauseMonitor()));
@@ -946,6 +946,7 @@ void ProjectList::slotPauseMonitor()
 void ProjectList::slotUpdateClipProperties(const QString &id, QMap <QString, QString> properties)
 {
     ProjectItem *item = getItemById(id);
+    kDebug()<<"// PROPS: "<<properties;
     if (item) {
         slotUpdateClipProperties(item, properties);
         if (properties.contains("out") || properties.contains("force_fps") || properties.contains("resource") || properties.contains("video_index") || properties.contains("audio_index")) {
@@ -954,10 +955,11 @@ void ProjectList::slotUpdateClipProperties(const QString &id, QMap <QString, QSt
                    properties.contains("xmldata") ||
                    properties.contains("force_aspect_num") ||
                    properties.contains("force_aspect_den") ||
+                   properties.contains("full_luma") ||
                    properties.contains("templatetext")) {
             slotRefreshClipThumbnail(item);
             emit refreshClip(id, true);
-        } else if (properties.contains("full_luma") || properties.contains("force_colorspace") || properties.contains("loop")) {
+        } else if (properties.contains("force_colorspace") || properties.contains("loop")) {
             emit refreshClip(id, false);
         }
     }
@@ -3009,9 +3011,9 @@ void ProjectList::slotProcessJobs()
             MeltJob *jb = static_cast<MeltJob *> (job);
             jb->setProducer(currentClip->getProducer(), currentClip->fileURL());
            if (jb->isProjectFilter())
-             connect(job, SIGNAL(gotFilterJobResults(QString,int, int, QString,stringMap,QStringList)), this, SLOT(slotGotFilterJobResults(QString,int, int, QString,stringMap,QStringList)));
+             connect(job, SIGNAL(gotFilterJobResults(QString,int, int, stringMap,stringMap)), this, SLOT(slotGotFilterJobResults(QString,int, int,stringMap,stringMap)));
            else
-               connect(job, SIGNAL(gotFilterJobResults(QString,int, int, QString,stringMap,QStringList)), this, SIGNAL(gotFilterJobResults(QString,int, int, QString,stringMap,QStringList)));
+               connect(job, SIGNAL(gotFilterJobResults(QString,int, int, stringMap,stringMap)), this, SIGNAL(gotFilterJobResults(QString,int, int,stringMap,stringMap)));
         }
         job->startJob();
         if (job->jobStatus == JOBDONE) {
@@ -3436,19 +3438,19 @@ void ProjectList::discardJobs(const QString &id, JOBTYPE type) {
     }
 }
 
-void ProjectList::slotStartFilterJob(ItemInfo info, const QString&id, const QString&filterName, const QString&filterParams, const QString&finalFilterName, const QString&consumer, const QString&consumerParams, const QStringList &extraParams)
+void ProjectList::slotStartFilterJob(ItemInfo info, const QString&id, const QString&filterName, const QString&filterParams, const QString&consumer, const QString&consumerParams, const QMap <QString, QString> &extraParams)
 {
     ProjectItem *item = getItemById(id);
     if (!item) return;
     QStringList jobParams;
     jobParams << QString::number(info.cropStart.frames(m_fps)) << QString::number((info.cropStart + info.cropDuration).frames(m_fps));
-    jobParams << QString() << filterName << filterParams << consumer << consumerParams << QString::number(info.startPos.frames(m_fps)) << QString::number(info.track) << finalFilterName;
+    jobParams << QString() << filterName << filterParams << consumer << consumerParams << QString::number(info.startPos.frames(m_fps)) << QString::number(info.track);
     MeltJob *job = new MeltJob(item->clipType(), id, jobParams, extraParams);
     if (job->isExclusive() && hasPendingJob(item, job->jobType)) {
         delete job;
         return;
     }
-    job->description = i18n("Filter %1", finalFilterName);
+    job->description = i18n("Filter %1", extraParams.value("finalfilter"));
     m_jobList.append(job);
     setJobStatus(item, job->jobType, JOBWAITING, 0, job->statusMessage());
     slotCheckJobProcess();
@@ -3492,16 +3494,16 @@ void ProjectList::startClipFilterJob(const QString &filterName, const QString &c
        jobParams << filterName << "bounding=\"25%x25%:25%x25\" shot_change_list=0";
        // Consumer
        jobParams << "null" << "all=1 terminate_on_pause=1 real_time=-1";
-       QStringList extraParams;
-       extraParams << "key:shot_change_list";
-       extraParams << "projecttreefilter";
+       QMap <QString, QString> extraParams;
+       extraParams.insert("key", "shot_change_list");
+       extraParams.insert("projecttreefilter", "1");
        if (ui.add_markers->isChecked()) {
            // We want to create markers
-           extraParams << QString("addmarkers:%1").arg(ui.marker_type->currentIndex());
+           extraParams.insert("addmarkers", QString::number(ui.marker_type->currentIndex()));
        }
        if (ui.cut_scenes->isChecked()) {
            // We want to cut scenes
-           extraParams << "cutscenes";
+           extraParams.insert("cutscenes", "1");
        }
        delete d;
        processClipJob(ids, QString(), false, jobParams, i18n("Auto split"), extraParams);
@@ -3509,15 +3511,15 @@ void ProjectList::startClipFilterJob(const QString &filterName, const QString &c
     else {
        QPointer<ClipStabilize> d = new ClipStabilize(destination, ids.count(), filterName);
        if (d->exec() == QDialog::Accepted) {
-           QStringList extraParams;
-           extraParams << "producer_profile";
+           QMap <QString, QString> extraParams;
+           extraParams.insert("producer_profile", "1");
            processClipJob(ids, d->destination(), d->autoAddClip(), d->params(), d->desc(), extraParams);
        }
        delete d;
     }
 }
 
-void ProjectList::processClipJob(QStringList ids, const QString&destination, bool autoAdd, QStringList jobParams, const QString &description, QStringList extraParams)
+void ProjectList::processClipJob(QStringList ids, const QString&destination, bool autoAdd, QStringList jobParams, const QString &description, QMap <QString, QString> extraParams)
 {
     QStringList preParams;
     // in and out
@@ -3611,38 +3613,31 @@ void ProjectList::slotClosePopup()
     m_errorLog.clear();
 }
 
-void ProjectList::slotGotFilterJobResults(QString id, int , int , QString filter, stringMap results, QStringList extra)
+void ProjectList::slotGotFilterJobResults(QString id, int , int , stringMap results, stringMap filterInfo)
 {
+    // Currently, only the first value of results is used
+    kDebug()<<"// FILTER RES:\n"<<filterInfo<<"\n--------------\n"<<results;
     ProjectItem *clip = getItemById(id);
     if (!clip) return;
     // Check for return value
-    QString returnKey;
     int markersType = -1;
-    for (int i = 0; i < extra.count(); i++) {
-       if (extra.at(i).startsWith("key:"))
-           returnKey = extra.at(i).section(':', 1);
-       if (extra.at(i).startsWith("addmarkers:")) {
-           markersType = extra.at(i).section(':', 1).toInt();
-       }
-    }
-    if (returnKey.isEmpty()) {
-       emit displayMessage(i18n("No data returned from clip analysis"), ErrorMessage);
-       return;
-    }
-    QStringList returnData = results.value(returnKey).split(';', QString::SkipEmptyParts);
-    if (returnData.isEmpty()) {
+    if (filterInfo.contains("addmarkers")) markersType = filterInfo.value("addmarkers").toInt();
+    if (results.isEmpty()) {
        emit displayMessage(i18n("No data returned from clip analysis"), ErrorMessage);
        return;
     }
     emit displayMessage(i18n("Processing data analysis"), InformationMessage);
     bool dataProcessed = false;
-    if (extra.contains("cutscenes")) {
+    QString key = filterInfo.value("key");
+    QStringList value = results.value(key).split(';', QString::SkipEmptyParts);
+    kDebug()<<"// RESULT; "<<key<<" = "<<value;
+    if (filterInfo.contains("cutscenes")) {
        // Check if we want to cut scenes from returned data
        dataProcessed = true;
        int cutPos = 0;
        QUndoCommand *command = new QUndoCommand();
        command->setText(i18n("Auto Split Clip"));
-       foreach (QString pos, returnData) {
+       foreach (QString pos, value) {
            if (!pos.contains("=")) continue;
            int newPos = pos.section("=", 0, 0).toInt();
            // Don't use scenes shorter than 1 second
@@ -3662,7 +3657,7 @@ void ProjectList::slotGotFilterJobResults(QString id, int , int , QString filter
        command->setText(i18n("Add Markers"));
        QList <CommentedTime> markersList;
        int index = 1;
-       foreach (QString pos, returnData) {
+       foreach (QString pos, value) {
            if (!pos.contains("=")) continue;
            int newPos = pos.section("=", 0, 0).toInt();
            // Don't use scenes shorter than 1 second
@@ -3674,10 +3669,9 @@ void ProjectList::slotGotFilterJobResults(QString id, int , int , QString filter
        }
        emit addMarkers(id, markersList);
     }
-    if (!dataProcessed || extra.contains("storedata")) {
+    if (!dataProcessed || filterInfo.contains("storedata")) {
        // Store returned data as clip extra data
-       
-       clip->referencedClip()->setAnalysisData(i18n("Motion vectors"), results.value(returnKey));
+       clip->referencedClip()->setAnalysisData(filterInfo.contains("displaydataname") ? filterInfo.value("displaydataname") : key, results.value(key));
        emit updateAnalysisData(clip->referencedClip());
     }
 }