X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fprojectlist.cpp;h=9c74ef09852424a7bb58f98c20c3c73534e04d57;hb=3d9ff40b713934e307b6ac7808bd8d56d0bd66f7;hp=ca4ba8c1755424a61a0af2a33198247815e053bf;hpb=5bc0935dd65ffecbaf4c09dd4ce6199f3b02547c;p=kdenlive diff --git a/src/projectlist.cpp b/src/projectlist.cpp index ca4ba8c1..9c74ef09 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -314,21 +314,21 @@ ProjectList::ProjectList(QWidget *parent) : connect(m_listView, SIGNAL(itemSelectionChanged()), this, SLOT(slotClipSelected())); 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(requestMenu(QPoint,QTreeWidgetItem*)), this, SLOT(slotContextMenu(QPoint,QTreeWidgetItem*))); connect(m_listView, SIGNAL(addClip()), this, SIGNAL(pauseMonitor())); connect(m_listView, SIGNAL(addClip()), this, SLOT(slotAddClip())); - connect(m_listView, SIGNAL(addClip(const QList , const QString &, const QString &)), this, SLOT(slotAddClip(const QList , const QString &, const QString &))); - connect(this, SIGNAL(addClip(const QString, const QString &, const QString &)), this, SLOT(slotAddClip(const QString, const QString &, const QString &))); - connect(m_listView, SIGNAL(addClipCut(const QString &, int, int)), this, SLOT(slotAddClipCut(const QString &, int, int))); - connect(m_listView, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotItemEdited(QTreeWidgetItem *, int))); - connect(m_listView, SIGNAL(showProperties(DocClipBase *)), this, SIGNAL(showClipProperties(DocClipBase *))); + connect(m_listView, SIGNAL(addClip(QList,QString,QString)), this, SLOT(slotAddClip(QList,QString,QString))); + connect(this, SIGNAL(addClip(QString,QString,QString)), this, SLOT(slotAddClip(QString,QString,QString))); + connect(m_listView, SIGNAL(addClipCut(QString,int,int)), this, SLOT(slotAddClipCut(QString,int,int))); + connect(m_listView, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(slotItemEdited(QTreeWidgetItem*,int))); + connect(m_listView, SIGNAL(showProperties(DocClipBase*)), this, SIGNAL(showClipProperties(DocClipBase*))); - connect(this, SIGNAL(cancelRunningJob(const QString, stringMap )), this, SLOT(slotCancelRunningJob(const QString, stringMap))); - connect(this, SIGNAL(processLog(const QString, int , int, const QString)), this, SLOT(slotProcessLog(const QString, int , int, const QString))); + connect(this, SIGNAL(cancelRunningJob(QString,stringMap)), this, SLOT(slotCancelRunningJob(QString,stringMap))); + connect(this, SIGNAL(processLog(QString,int,int,QString)), this, SLOT(slotProcessLog(QString,int,int,QString))); - connect(this, SIGNAL(updateJobStatus(const QString, int, int, const QString, const QString, const QString)), this, SLOT(slotUpdateJobStatus(const QString, int, int, const QString, const QString, const QString))); + connect(this, SIGNAL(updateJobStatus(QString,int,int,QString,QString,QString)), this, SLOT(slotUpdateJobStatus(QString,int,int,QString,QString,QString))); - connect(this, SIGNAL(gotProxy(const QString)), this, SLOT(slotGotProxyForId(const QString))); + connect(this, SIGNAL(gotProxy(QString)), this, SLOT(slotGotProxyForId(QString))); m_listViewDelegate = new ItemDelegate(m_listView); m_listView->setItemDelegate(m_listViewDelegate); @@ -847,7 +847,10 @@ void ProjectList::slotClipSelected() // this is a sub item, use base clip m_deleteButton->defaultAction()->setEnabled(true); clip = static_cast (item->parent()); - if (clip == NULL) kDebug() << "-----------ERROR"; + if (clip == NULL) { + kDebug() << "-----------ERROR"; + return; + } SubProjectItem *sub = static_cast (item); if (clip->referencedClip()->getProducer() == NULL) m_render->getFileProperties(clip->referencedClip()->toXML(), clip->clipId(), m_listView->iconSize().height(), true); emit clipSelected(clip->referencedClip(), sub->zone()); @@ -1329,8 +1332,8 @@ void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties) item = new ProjectItem(m_listView, clip, pixelSize); } if (item->data(0, DurationRole).isNull()) item->setData(0, DurationRole, i18n("Loading")); - connect(clip, SIGNAL(createProxy(const QString &)), this, SLOT(slotCreateProxy(const QString &))); - connect(clip, SIGNAL(abortProxy(const QString &, const QString &)), this, SLOT(slotAbortProxy(const QString, const QString))); + connect(clip, SIGNAL(createProxy(QString)), this, SLOT(slotCreateProxy(QString))); + connect(clip, SIGNAL(abortProxy(QString,QString)), this, SLOT(slotAbortProxy(QString,QString))); if (getProperties) { //item->setFlags(Qt::ItemIsSelectable); @@ -1493,7 +1496,7 @@ void ProjectList::getCachedThumbnail(ProjectItem *item) } } -QPixmap ProjectList::roundedPixmap(QImage img) +QPixmap ProjectList::roundedPixmap(const QImage &img) { QPixmap pix(img.width(), img.height()); pix.fill(Qt::transparent); @@ -1507,7 +1510,7 @@ QPixmap ProjectList::roundedPixmap(QImage img) return pix; } -QPixmap ProjectList::roundedPixmap(QPixmap source) +QPixmap ProjectList::roundedPixmap(const QPixmap &source) { QPixmap pix(source.width(), source.height()); pix.fill(Qt::transparent); @@ -2045,12 +2048,12 @@ void ProjectList::setDocument(KdenliveDoc *doc) slotAddClip(list.at(i), false); m_listView->blockSignals(false); - connect(m_doc->clipManager(), SIGNAL(reloadClip(const QString &)), this, SLOT(slotReloadClip(const QString &))); - connect(m_doc->clipManager(), SIGNAL(modifiedClip(const QString &)), this, SLOT(slotModifiedClip(const QString &))); - connect(m_doc->clipManager(), SIGNAL(missingClip(const QString &)), this, SLOT(slotMissingClip(const QString &))); - connect(m_doc->clipManager(), SIGNAL(availableClip(const QString &)), this, SLOT(slotAvailableClip(const QString &))); - connect(m_doc->clipManager(), SIGNAL(checkAllClips(bool, bool, QStringList)), this, SLOT(updateAllClips(bool, bool, QStringList))); - connect(m_doc->clipManager(), SIGNAL(thumbReady(const QString &, int, QImage)), this, SLOT(slotSetThumbnail(const QString &, int, QImage))); + connect(m_doc->clipManager(), SIGNAL(reloadClip(QString)), this, SLOT(slotReloadClip(QString))); + connect(m_doc->clipManager(), SIGNAL(modifiedClip(QString)), this, SLOT(slotModifiedClip(QString))); + connect(m_doc->clipManager(), SIGNAL(missingClip(QString)), this, SLOT(slotMissingClip(QString))); + connect(m_doc->clipManager(), SIGNAL(availableClip(QString)), this, SLOT(slotAvailableClip(QString))); + connect(m_doc->clipManager(), SIGNAL(checkAllClips(bool,bool,QStringList)), this, SLOT(updateAllClips(bool,bool,QStringList))); + connect(m_doc->clipManager(), SIGNAL(thumbReady(QString,int,QImage)), this, SLOT(slotSetThumbnail(QString,int,QImage))); } void ProjectList::slotSetThumbnail(const QString &id, int framePos, QImage img) @@ -2377,8 +2380,9 @@ void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Produce return; } if (replace) toReload = clipId; - if (!toReload.isEmpty()) + if (!toReload.isEmpty()) { emit clipNeedsReload(toReload); + } } bool ProjectList::adjustProjectProfileToItem(ProjectItem *item) @@ -2636,9 +2640,9 @@ KUrl::List ProjectList::getConditionalUrls(const QString &condition) const return result; } -QStringList ProjectList::getConditionalIds(const QString &condition) const +QMap ProjectList::getConditionalIds(const QString &condition) const { - QStringList result; + QMap result; ProjectItem *item; QList list = m_listView->selectedItems(); for (int i = 0; i < list.count(); i++) { @@ -2659,7 +2663,7 @@ QStringList ProjectList::getConditionalIds(const QString &condition) const else if (condition.startsWith("acodec") && !clip->hasAudioCodec(condition.section('=', 1, 1))) continue; } - result.append(item->clipId()); + result.insert(item->clipId(), item->clipUrl().path()); } return result; } @@ -2965,14 +2969,14 @@ void ProjectList::slotCutClipJob(const QString &id, QPoint zone) void ProjectList::slotTranscodeClipJob(const QString &condition, QString params, QString desc) { QStringList existingFiles; - QStringList ids = getConditionalIds(condition); + QMap ids = getConditionalIds(condition); + QMap::const_iterator i = ids.constBegin(); QStringList destinations; - foreach(const QString &id, ids) { - ProjectItem *item = getItemById(id); - if (!item) continue; - QString newFile = params.section(' ', -1).replace("%1", item->clipUrl().path()); - destinations << newFile; + while (i != ids.constEnd()) { + QString newFile = params.section(' ', -1).replace("%1", i.value()); + destinations << newFile; if (QFile::exists(newFile)) existingFiles << newFile; + ++i; } if (!existingFiles.isEmpty()) { if (KMessageBox::warningContinueCancelList(this, i18n("The transcoding job will overwrite the following files:"), existingFiles) == KMessageBox::Cancel) return; @@ -3005,10 +3009,11 @@ void ProjectList::slotTranscodeClipJob(const QString &condition, QString params, params = ui.extra_params->toPlainText().simplified(); KdenliveSettings::setAdd_new_clip(ui.add_clip->isChecked()); int index = 0; - foreach(const QString &id, ids) { - ProjectItem *item = getItemById(id); + i = ids.constBegin(); + while (i != ids.constEnd()) { + ProjectItem *item = getItemById(i.key()); if (!item || !item->referencedClip()) continue; - QString src = item->clipUrl().path(); + QString src = i.value(); QString dest; if (ids.count() > 1) { dest = destinations.at(index); @@ -3024,13 +3029,14 @@ void ProjectList::slotTranscodeClipJob(const QString &condition, QString params, jobParams << duration; jobParams << QString::number(KdenliveSettings::add_new_clip()); jobParams << params; - CutClipJob *job = new CutClipJob(item->clipType(), id, jobParams); + CutClipJob *job = new CutClipJob(item->clipType(), i.key(), jobParams); if (job->isExclusive() && hasPendingJob(item, job->jobType)) { delete job; continue; } m_jobList.append(job); setJobStatus(item, job->jobType, JOBWAITING, 0, job->statusMessage()); + ++i; } delete d; slotCheckJobProcess(); @@ -3125,16 +3131,16 @@ void ProjectList::slotProcessJobs() file.close(); QFile::remove(destination); } - connect(job, SIGNAL(jobProgress(QString, int, int)), this, SIGNAL(processLog(QString, int, int))); - connect(job, SIGNAL(cancelRunningJob(const QString, stringMap)), this, SIGNAL(cancelRunningJob(const QString, stringMap))); + connect(job, SIGNAL(jobProgress(QString,int,int)), this, SIGNAL(processLog(QString,int,int))); + connect(job, SIGNAL(cancelRunningJob(QString,stringMap)), this, SIGNAL(cancelRunningJob(QString,stringMap))); if (job->jobType == MLTJOB) { MeltJob *jb = static_cast (job); jb->setProducer(currentClip->getProducer(), currentClip->fileURL()); if (jb->isProjectFilter()) - connect(job, SIGNAL(gotFilterJobResults(QString,int, int, stringMap,stringMap)), this, SLOT(slotGotFilterJobResults(QString,int, int,stringMap,stringMap))); + 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, stringMap,stringMap)), this, SIGNAL(gotFilterJobResults(QString,int, int,stringMap,stringMap))); + connect(job, SIGNAL(gotFilterJobResults(QString,int,int,stringMap,stringMap)), this, SIGNAL(gotFilterJobResults(QString,int,int,stringMap,stringMap))); } job->startJob(); if (job->status() == JOBDONE) { @@ -3361,8 +3367,8 @@ void ProjectList::setJobStatus(ProjectItem *item, JOBTYPE jobType, CLIPJOBSTATUS void ProjectList::monitorItemEditing(bool enable) { - if (enable) connect(m_listView, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotItemEdited(QTreeWidgetItem *, int))); - else disconnect(m_listView, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotItemEdited(QTreeWidgetItem *, int))); + if (enable) connect(m_listView, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(slotItemEdited(QTreeWidgetItem*,int))); + else disconnect(m_listView, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(slotItemEdited(QTreeWidgetItem*,int))); } QStringList ProjectList::expandedFolders() const @@ -3564,8 +3570,8 @@ void ProjectList::slotStartFilterJob(ItemInfo info, const QString&id, const QStr 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); + jobParams << QString::number((int) info.cropStart.frames(m_fps)) << QString::number((int) (info.cropStart + info.cropDuration).frames(m_fps)); + jobParams << QString() << filterName << filterParams << consumer << consumerParams << QString::number((int) 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; @@ -3579,19 +3585,63 @@ void ProjectList::slotStartFilterJob(ItemInfo info, const QString&id, const QStr void ProjectList::startClipFilterJob(const QString &filterName, const QString &condition) { - QStringList ids = getConditionalIds(condition); - QString destination; - ProjectItem *item = getItemById(ids.at(0)); + QMap ids = getConditionalIds(condition); + QStringList destination; + QMap::const_iterator first = ids.constBegin(); + if (first == ids.constEnd()) { + emit displayMessage(i18n("Cannot find clip to process filter %1", filterName), -2, ErrorMessage); + return; + } + ProjectItem *item = getItemById(first.key()); if (!item) { emit displayMessage(i18n("Cannot find clip to process filter %1", filterName), -2, ErrorMessage); return; } if (ids.count() == 1) { - destination = item->clipUrl().path(); + destination << item->clipUrl().path(); } else { - destination = item->clipUrl().directory(); + destination = ids.values(); + } + if (filterName == "framebuffer") { + Mlt::Profile profile; + QStringList keys = ids.keys(); + int ix = 0; + foreach(const QString &url, destination) { + QString prodstring = QString("framebuffer:" + url + "?-1"); + Mlt::Producer *reversed = new Mlt::Producer(profile, prodstring.toUtf8().constData()); + if (!reversed || !reversed->is_valid()) { + emit displayMessage(i18n("Cannot reverse clip"), -2, ErrorMessage); + continue; + } + QString dest = url + ".mlt"; + if (QFile::exists(dest)) { + if (KMessageBox::questionYesNo(this, i18n("File %1 already exists.\nDo you want to overwrite it?", dest)) == KMessageBox::No) continue; + } + Mlt::Consumer *cons = new Mlt::Consumer(profile, "xml", dest.toUtf8().constData()); + if (cons == NULL || !cons->is_valid()) { + emit displayMessage(i18n("Cannot render reversed clip"), -2, ErrorMessage); + continue; + } + Mlt::Playlist list; + list.insert_at(0, reversed, 0); + delete reversed; + cons->connect(list); + cons->run(); + delete cons; + QString groupId; + QString groupName; + DocClipBase *base = m_doc->clipManager()->getClipById(keys.at(ix)); + if (base) { + groupId = base->getProperty("groupid"); + groupName = base->getProperty("groupname"); + } + emit addClip(dest, groupId, groupName); + ix++; + } + return; } + if (filterName == "motion_est") { // Show config dialog QPointer d = new QDialog(this); @@ -3639,14 +3689,14 @@ void ProjectList::startClipFilterJob(const QString &filterName, const QString &c extraParams.insert("cutscenes", "1"); } delete d; - processClipJob(ids, QString(), false, jobParams, i18n("Auto split"), extraParams); + processClipJob(ids.keys(), QString(), false, jobParams, i18n("Auto split"), extraParams); } else { - QPointer d = new ClipStabilize(destination, ids.count(), filterName); + QPointer d = new ClipStabilize(destination, filterName); if (d->exec() == QDialog::Accepted) { QMap extraParams; extraParams.insert("producer_profile", "1"); - processClipJob(ids, d->destination(), d->autoAddClip(), d->params(), d->desc(), extraParams); + processClipJob(ids.keys(), d->destination(), d->autoAddClip(), d->params(), d->desc(), extraParams); } delete d; }