From c788eaacac281c73e8de8c88b506363c3460b3e8 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Mon, 31 Jan 2011 01:13:24 +0000 Subject: [PATCH] Speedup project opening (threaded loading) and fix shortcut conflict svn path=/trunk/kdenlive/; revision=5369 --- src/kdenlivedoc.cpp | 1 - src/mainwindow.cpp | 5 +- src/projectlist.cpp | 160 ++++++++++++++++++++++++++------------------ src/projectlist.h | 15 ++++- src/renderer.cpp | 6 +- src/renderer.h | 5 +- 6 files changed, 114 insertions(+), 78 deletions(-) diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index aaa022eb..d1a340b8 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -987,7 +987,6 @@ bool KdenliveDoc::addClip(QDomElement elem, QString clipId, bool createClipItem) if (createClipItem) { emit addProjectClip(clip); - //qApp->processEvents(); } return true; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 95eb7c5a..bbfaa6e3 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -398,7 +398,6 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & // Stop motion actions. Beware of the order, we MUST use the same order in stopmotion/stopmotion.cpp m_stopmotion_actions = new KActionCategory(i18n("Stop Motion"), actionCollection()); action = new KAction(KIcon("media-record"), i18n("Capture frame"), this); - action->setShortcut(Qt::Key_Space); //action->setShortcutContext(Qt::WidgetWithChildrenShortcut); m_stopmotion_actions->addAction("stopmotion_capture", action); action = new KAction(i18n("Switch live / captured frame"), this); @@ -863,9 +862,9 @@ void MainWindow::slotConnectMonitors() connect(m_projectList, SIGNAL(deleteProjectClips(QStringList, QMap)), this, SLOT(slotDeleteProjectClips(QStringList, QMap))); connect(m_projectList, SIGNAL(showClipProperties(DocClipBase *)), this, SLOT(slotShowClipProperties(DocClipBase *))); connect(m_projectList, SIGNAL(showClipProperties(QList , QMap)), this, SLOT(slotShowClipProperties(QList , QMap))); - connect(m_projectList, SIGNAL(getFileProperties(const QDomElement, const QString &, int, bool)), m_projectMonitor->render, SLOT(getFileProperties(const QDomElement, const QString &, int, bool))); + connect(m_projectList, SIGNAL(getFileProperties(const QDomElement, const QString &, int, bool, bool)), m_projectMonitor->render, SLOT(getFileProperties(const QDomElement, const QString &, int, bool, 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))); + connect(m_projectMonitor->render, SIGNAL(replyGetFileProperties(const QString &, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &, bool, bool)), m_projectList, SLOT(slotReplyGetFileProperties(const QString &, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &, bool, bool))); connect(m_projectMonitor->render, SIGNAL(removeInvalidClip(const QString &, bool)), m_projectList, SLOT(slotRemoveInvalidClip(const QString &, bool))); diff --git a/src/projectlist.cpp b/src/projectlist.cpp index a6c3e9d3..cd1c8d83 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -63,6 +63,7 @@ #include #include #include +#include ProjectList::ProjectList(QWidget *parent) : QWidget(parent), @@ -80,7 +81,7 @@ ProjectList::ProjectList(QWidget *parent) : QVBoxLayout *layout = new QVBoxLayout; layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); - + qRegisterMetaType("QDomElement"); // setup toolbar QFrame *frame = new QFrame; frame->setFrameStyle(QFrame::NoFrame); @@ -115,13 +116,7 @@ ProjectList::ProjectList(QWidget *parent) : m_proxyAction->setCheckable(true); m_proxyAction->setChecked(false); connect(m_proxyAction, SIGNAL(toggled(bool)), this, SLOT(slotProxyCurrentItem(bool))); - - - m_queueTimer.setInterval(100); - connect(&m_queueTimer, SIGNAL(timeout()), this, SLOT(slotProcessNextClipInQueue())); - m_queueTimer.setSingleShot(true); - - + 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, SLOT(slotClipSelected())); @@ -318,11 +313,11 @@ void ProjectList::editClipSelection(QList list) } if (allowDurationChange) commonproperties.insert("out", QString::number(commonDuration)); - QMapIterator p(commonproperties); + /*QMapIterator p(commonproperties); while (p.hasNext()) { p.next(); kDebug() << "Result: " << p.key() << " = " << p.value(); - } + }*/ emit showClipProperties(clipList, commonproperties); } @@ -451,7 +446,7 @@ void ProjectList::slotReloadClip(const QString &id) } } - emit getFileProperties(e, item->clipId(), m_listView->iconSize().height(), true); + emit getFileProperties(e, item->clipId(), m_listView->iconSize().height(), true, false); } } } @@ -554,7 +549,7 @@ void ProjectList::slotClipSelected() return; } clip = static_cast (m_listView->currentItem()); - if (clip) + if (clip && clip->referencedClip()) emit clipSelected(clip->referencedClip()); m_editButton->defaultAction()->setEnabled(true); m_deleteButton->defaultAction()->setEnabled(true); @@ -591,7 +586,9 @@ void ProjectList::adjustProxyActions(ProjectItem *clip) const return; } m_proxyAction->setEnabled(true); + m_proxyAction->blockSignals(true); m_proxyAction->setChecked(clip->hasProxy()); + m_proxyAction->blockSignals(false); } void ProjectList::adjustTranscodeActions(ProjectItem *clip) const @@ -649,16 +646,16 @@ void ProjectList::slotUpdateClipProperties(ProjectItem *clip, QMap setProperties(properties); if (properties.contains("name")) { - m_listView->blockSignals(true); + monitorItemEditing(false); clip->setText(0, properties.value("name")); - m_listView->blockSignals(false); + monitorItemEditing(true); emit clipNameChanged(clip->clipId(), properties.value("name")); } if (properties.contains("description")) { CLIPTYPE type = clip->clipType(); - m_listView->blockSignals(true); + monitorItemEditing(false); clip->setText(1, properties.value("description")); - m_listView->blockSignals(false); + monitorItemEditing(true); #ifdef NEPOMUK if (KdenliveSettings::activate_nepomuk() && (type == AUDIO || type == VIDEO || type == AV || type == IMAGE || type == PLAYLIST)) { // Use Nepomuk system to store clip description @@ -946,9 +943,9 @@ void ProjectList::deleteProjectFolder(QMap map) void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties) { m_listView->setEnabled(false); - if (getProperties) m_listView->blockSignals(true); const QString parent = clip->getProperty("groupid"); ProjectItem *item = NULL; + monitorItemEditing(false); if (!parent.isEmpty()) { FolderProjectItem *parentitem = getFolderItemById(parent); if (!parentitem) { @@ -967,24 +964,21 @@ void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties) item = new ProjectItem(m_listView, clip); if (item->data(0, DurationRole).isNull()) item->setData(0, DurationRole, i18n("Loading")); if (getProperties) { - m_listView->blockSignals(true); m_refreshed = false; - // Proxy clips CLIPTYPE t = clip->clipType(); if ((t == VIDEO || t == AV || t == UNKNOWN) && KdenliveSettings::enableproxy()) { if (clip->getProperty("proxy").isEmpty()) { connect(clip, SIGNAL(proxyReady(const QString, bool)), this, SLOT(slotGotProxy(const QString, bool))); - item->setProxyStatus(1); + setProxyStatus(item, 1); clip->generateProxy(m_doc->projectFolder()); } else { // Proxy clip already created - item->setProxyStatus(2); + setProxyStatus(item, 2); QDomElement e = clip->toXML().cloneNode().toElement(); e.removeAttribute("file_hash"); m_infoQueue.insert(clip->getId(), e); - } } else { @@ -996,6 +990,11 @@ void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties) } //m_render->getFileProperties(clip->toXML(), clip->getId(), true); } + else if (!clip->getProperty("proxy").isEmpty()) { + connect(clip, SIGNAL(proxyReady(const QString, bool)), this, SLOT(slotGotProxy(const QString, bool))); + setProxyStatus(item, 1); + clip->generateProxy(m_doc->projectFolder()); + } clip->askForAudioThumbs(); KUrl url = clip->fileURL(); @@ -1033,32 +1032,29 @@ void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties) } } } + monitorItemEditing(true); if (m_listView->isEnabled()) { updateButtons(); - if (getProperties) - m_listView->blockSignals(false); } - if (getProperties && !m_queueTimer.isActive()) - slotProcessNextClipInQueue(); + if (getProperties && m_processingClips.isEmpty()) + m_queueRunner = QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue); } void ProjectList::slotGotProxy(const QString id, bool success) { ProjectItem *item = getItemById(id); if (item) { - disconnect(m_listView, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotItemEdited(QTreeWidgetItem *, int))); if (success) { // Proxy clip successfully created - item->setProxyStatus(2); + setProxyStatus(item, 2); QDomElement e = item->referencedClip()->toXML().cloneNode().toElement(); e.removeAttribute("file_hash"); e.setAttribute("replace", 1); m_infoQueue.insert(id, e); - if (!m_queueTimer.isActive()) slotProcessNextClipInQueue(); + if (!m_queueRunner.isRunning() && m_processingClips.isEmpty()) m_queueRunner = QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue); } - else item->setProxyStatus(0); - connect(m_listView, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotItemEdited(QTreeWidgetItem *, int))); + else setProxyStatus(item, 0); update(); } } @@ -1082,7 +1078,7 @@ void ProjectList::requestClipInfo(const QDomElement xml, const QString id) void ProjectList::slotProcessNextClipInQueue() { if (m_infoQueue.isEmpty()) { - slotProcessNextThumbnail(); + emit processNextThumbnail(); return; } @@ -1090,24 +1086,27 @@ void ProjectList::slotProcessNextClipInQueue() if (j != m_infoQueue.constEnd()) { QDomElement dom = j.value(); const QString id = j.key(); - m_infoQueue.remove(j.key()); + m_infoQueue.remove(id); + m_processingClips.append(id); bool replace; if (dom.hasAttribute("replace")) { + // Proxy action was enabled / disabled and we want to replace current producer dom.removeAttribute("replace"); replace = true; } else replace = false; - emit getFileProperties(dom, id, m_listView->iconSize().height(), replace); + bool selectClip = !replace; + if (m_infoQueue.count() > 1) selectClip = false; + emit getFileProperties(dom, id, m_listView->iconSize().height(), replace, selectClip); } - if (!m_infoQueue.isEmpty()) m_queueTimer.start(); } void ProjectList::slotUpdateClip(const QString &id) { ProjectItem *item = getItemById(id); - m_listView->blockSignals(true); + monitorItemEditing(false); if (item) item->setData(0, UsageRole, QString::number(item->numReferences())); - m_listView->blockSignals(false); + monitorItemEditing(true); } void ProjectList::updateAllClips() @@ -1118,7 +1117,7 @@ void ProjectList::updateAllClips() QTreeWidgetItemIterator it(m_listView); DocClipBase *clip; ProjectItem *item; - m_listView->blockSignals(true); + monitorItemEditing(false); while (*it) { if ((*it)->type() == PROJECTSUBCLIPTYPE) { // subitem @@ -1152,10 +1151,11 @@ void ProjectList::updateAllClips() //qApp->processEvents(); ++it; } - if (!m_queueTimer.isActive()) - m_queueTimer.start(); + /*if (!m_queueTimer.isActive()) + m_queueTimer.start();*/ + if (!m_queueRunner.isRunning() && m_processingClips.isEmpty()) m_queueRunner = QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue); if (m_listView->isEnabled()) - m_listView->blockSignals(false); + monitorItemEditing(true); m_listView->setSortingEnabled(true); if (m_infoQueue.isEmpty()) slotProcessNextThumbnail(); @@ -1255,7 +1255,8 @@ void ProjectList::slotAddClip(const QList givenList, const QString &group void ProjectList::slotRemoveInvalidClip(const QString &id, bool replace) { ProjectItem *item = getItemById(id); - QTimer::singleShot(300, this, SLOT(slotProcessNextClipInQueue())); + m_processingClips.removeAll(id); + if (!m_queueRunner.isRunning() && m_processingClips.isEmpty()) m_queueRunner = QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue); if (item) { const QString path = item->referencedClip()->fileURL().path(); if (item->referencedClip()->isPlaceHolder()) replace = false; @@ -1377,6 +1378,7 @@ void ProjectList::setDocument(KdenliveDoc *doc) { m_listView->blockSignals(true); m_listView->clear(); + m_processingClips.clear(); m_listView->setSortingEnabled(false); emit clipSelected(NULL); m_thumbnailQueue.clear(); @@ -1527,10 +1529,10 @@ void ProjectList::slotRefreshClipThumbnail(QTreeWidgetItem *it, bool update) pix = item->referencedClip()->thumbProducer()->extractImage(frame, width, height); if (!pix.isNull()) { - m_listView->blockSignals(true); + monitorItemEditing(false); it->setData(0, Qt::DecorationRole, pix); - if (m_listView->isEnabled()) - m_listView->blockSignals(false); + monitorItemEditing(true); + if (!isSubItem) m_doc->cachePixmap(item->getClipHash(), pix); else @@ -1543,19 +1545,22 @@ void ProjectList::slotRefreshClipThumbnail(QTreeWidgetItem *it, bool update) } } -void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Producer *producer, const QMap < QString, QString > &properties, const QMap < QString, QString > &metadata, bool replace) +void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Producer *producer, const QMap < QString, QString > &properties, const QMap < QString, QString > &metadata, bool replace, bool selectClip) { QString toReload; ProjectItem *item = getItemById(clipId); + m_processingClips.removeAll(clipId); + if (m_infoQueue.isEmpty() && m_processingClips.isEmpty()) m_listView->setEnabled(true); if (item && producer) { - m_listView->blockSignals(true); + //m_listView->blockSignals(true); + monitorItemEditing(false); item->setProperties(properties, metadata); if (item->referencedClip()->isPlaceHolder() && producer->is_valid()) { item->referencedClip()->setValid(); item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsDropEnabled); toReload = clipId; } - if (item->referencedClip()->getProperty("proxy").isEmpty()) item->setProxyStatus(0); + if (item->referencedClip()->getProperty("proxy").isEmpty()) setProxyStatus(item, 0); item->referencedClip()->setProducer(producer, replace); item->referencedClip()->askForAudioThumbs(); if (!replace && item->data(0, Qt::DecorationRole).isNull()) @@ -1576,11 +1581,12 @@ void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Produce delete producer; }*/ if (m_listView->isEnabled()) - m_listView->blockSignals(false); + monitorItemEditing(true); /*if (item->icon(0).isNull()) { requestClipThumbnail(clipId); }*/ } else kDebug() << "//////// COULD NOT FIND CLIP TO UPDATE PRPS..."; + if (selectClip && m_infoQueue.isEmpty()) { if (item && m_infoQueue.isEmpty() && m_thumbnailQueue.isEmpty()) { m_listView->setCurrentItem(item); bool updatedProfile = false; @@ -1596,11 +1602,11 @@ void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Produce int max = m_doc->clipManager()->clipsCount(); emit displayMessage(i18n("Loading clips"), (int)(100 *(max - m_infoQueue.count()) / max)); } + } if (!toReload.isEmpty()) emit clipNeedsReload(toReload, true); - qApp->processEvents(); - slotProcessNextClipInQueue(); + if (!m_queueRunner.isRunning() && m_processingClips.isEmpty()) m_queueRunner = QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue); } bool ProjectList::adjustProjectProfileToItem(ProjectItem *item) @@ -1666,8 +1672,9 @@ void ProjectList::slotReplyGetImage(const QString &clipId, const QPixmap &pix) { ProjectItem *item = getItemById(clipId); if (item && !pix.isNull()) { - m_listView->blockSignals(true); + monitorItemEditing(false); item->setData(0, Qt::DecorationRole, pix); + monitorItemEditing(true); m_doc->cachePixmap(item->getClipHash(), pix); if (m_listView->isEnabled()) m_listView->blockSignals(false); @@ -1860,7 +1867,7 @@ void ProjectList::addClipCut(const QString &id, int in, int out, const QString d if (clip) { DocClipBase *base = clip->referencedClip(); base->addCutZone(in, out); - m_listView->blockSignals(true); + monitorItemEditing(false); SubProjectItem *sub = new SubProjectItem(clip, in, out, desc); if (newItem && desc.isEmpty() && !m_listView->isColumnHidden(1)) { if (!clip->isExpanded()) @@ -1871,7 +1878,7 @@ void ProjectList::addClipCut(const QString &id, int in, int out, const QString d QPixmap p = clip->referencedClip()->thumbProducer()->extractImage(in, (int)(sub->sizeHint(0).height() * m_render->dar()), sub->sizeHint(0).height() - 2); sub->setData(0, Qt::DecorationRole, p); m_doc->cachePixmap(clip->getClipHash() + '#' + QString::number(in), p); - m_listView->blockSignals(false); + monitorItemEditing(true); } emit projectModified(); } @@ -1884,9 +1891,9 @@ void ProjectList::removeClipCut(const QString &id, int in, int out) base->removeCutZone(in, out); SubProjectItem *sub = getSubItem(clip, QPoint(in, out)); if (sub) { - m_listView->blockSignals(true); + monitorItemEditing(false); delete sub; - m_listView->blockSignals(false); + monitorItemEditing(true); } } emit projectModified(); @@ -1928,10 +1935,10 @@ void ProjectList::doUpdateClipCut(const QString &id, const QPoint oldzone, const return; DocClipBase *base = clip->referencedClip(); base->updateCutZone(oldzone.x(), oldzone.y(), zone.x(), zone.y(), comment); - m_listView->blockSignals(true); + monitorItemEditing(false); sub->setZone(zone); sub->setDescription(comment); - m_listView->blockSignals(false); + monitorItemEditing(true); emit projectModified(); } @@ -2007,7 +2014,7 @@ void ProjectList::updateProxyConfig() if (KdenliveSettings::enableproxy()) { DocClipBase *clip = item->referencedClip(); connect(clip, SIGNAL(proxyReady(const QString, bool)), this, SLOT(slotGotProxy(const QString, bool))); - item->setProxyStatus(1); + setProxyStatus(item, 1); clip->generateProxy(m_doc->projectFolder()); } else if (!item->referencedClip()->getProperty("proxy").isEmpty()) { @@ -2021,20 +2028,28 @@ void ProjectList::updateProxyConfig() } ++it; } - if (!m_infoQueue.isEmpty() && !m_queueTimer.isActive()) m_queueTimer.start(); - + if (!m_infoQueue.isEmpty() && !m_queueRunner.isRunning() && m_processingClips.isEmpty()) m_queueRunner = QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue); } void ProjectList::slotProxyCurrentItem(bool doProxy) { - if (m_listView->currentItem()) { - if (m_listView->currentItem()->type() == PROJECTCLIPTYPE) { - ProjectItem *item = static_cast (m_listView->currentItem()); + QList list = m_listView->selectedItems(); + QTreeWidgetItem *listItem; + for (int i = 0; i < list.count(); i++) { + listItem = list.at(i); + if (listItem->type() == PROJECTFOLDERTYPE) { + for (int j = 0; j < listItem->childCount(); j++) { + QTreeWidgetItem *sub = listItem->child(j); + if (!list.contains(sub)) list.append(sub); + } + } + if (listItem->type() == PROJECTCLIPTYPE) { + ProjectItem *item = static_cast (listItem); if (item->referencedClip()) { if (doProxy) { DocClipBase *clip = item->referencedClip(); connect(clip, SIGNAL(proxyReady(const QString, bool)), this, SLOT(slotGotProxy(const QString, bool))); - item->setProxyStatus(1); + setProxyStatus(item, 1); clip->generateProxy(m_doc->projectFolder()); } else if (!item->referencedClip()->getProperty("proxy").isEmpty()) { @@ -2046,9 +2061,22 @@ void ProjectList::slotProxyCurrentItem(bool doProxy) m_infoQueue.insert(item->clipId(), e); } } - if (!m_infoQueue.isEmpty() && !m_queueTimer.isActive()) m_queueTimer.start(); } } + if (!m_infoQueue.isEmpty() && !m_queueRunner.isRunning() && m_processingClips.isEmpty()) m_queueRunner = QtConcurrent::run(this, &ProjectList::slotProcessNextClipInQueue); +} + +void ProjectList::setProxyStatus(ProjectItem *item, int status) +{ + monitorItemEditing(false); + item->setProxyStatus(status); + monitorItemEditing(true); +} + +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))); } #include "projectlist.moc" diff --git a/src/projectlist.h b/src/projectlist.h index 9446daeb..fdb6d494 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -196,7 +197,7 @@ public slots: void setDocument(KdenliveDoc *doc); void updateAllClips(); void slotReplyGetImage(const QString &clipId, const QPixmap &pix); - void slotReplyGetFileProperties(const QString &clipId, Mlt::Producer *producer, const QMap < QString, QString > &properties, const QMap < QString, QString > &metadata, bool replace); + void slotReplyGetFileProperties(const QString &clipId, Mlt::Producer *producer, const QMap < QString, QString > &properties, const QMap < QString, QString > &metadata, bool replace, bool selectClip); void slotAddClip(DocClipBase *clip, bool getProperties); void slotDeleteClip(const QString &clipId); void slotUpdateClip(const QString &id); @@ -230,8 +231,8 @@ private: Render *m_render; Timecode m_timecode; double m_fps; - QTimer m_queueTimer; QMenu *m_menu; + QFuture m_queueRunner; QUndoStack *m_commandStack; ProjectItem *getItemById(const QString &id); QTreeWidgetItem *getAnyItemById(const QString &id); @@ -250,6 +251,7 @@ private: void requestClipInfo(const QDomElement xml, const QString id); QList m_thumbnailQueue; QAction *m_proxyAction; + QStringList m_processingClips; void requestClipThumbnail(const QString id); /** @brief Creates an EditFolderCommand to change the name of an folder item. */ @@ -268,6 +270,12 @@ private: /** @brief Sets the buttons enabled/disabled according to selected item. */ void updateButtons() const; + /** @brief Set the Proxy status on a clip. + * @param item The clip item to set status + * @param status The status (1 = creating proxy, 2 = proxy is ok) */ + void setProxyStatus(ProjectItem *item, int status); + void monitorItemEditing(bool enable); + private slots: void slotClipSelected(); void slotAddSlideshowClip(); @@ -304,7 +312,7 @@ private slots: signals: void clipSelected(DocClipBase *, QPoint zone = QPoint()); - void getFileProperties(const QDomElement, const QString &, int pixHeight, bool); + void getFileProperties(const QDomElement, const QString &, int pixHeight, bool, bool); void receivedClipDuration(const QString &); void showClipProperties(DocClipBase *); void showClipProperties(QList , QMap commonproperties); @@ -322,6 +330,7 @@ signals: void findInTimeline(const QString &clipId); /** @brief Request a profile change for current document. */ void updateProfile(const QString &); + void processNextThumbnail(); }; #endif diff --git a/src/renderer.cpp b/src/renderer.cpp index b5b4c9a3..c0a86da5 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -520,7 +520,7 @@ void Render::slotSplitView(bool doit) } } -void Render::getFileProperties(const QDomElement xml, const QString &clipId, int imageHeight, bool replaceProducer) +void Render::getFileProperties(const QDomElement xml, const QString &clipId, int imageHeight, bool replaceProducer, bool selectClip) { QString path; if (xml.hasAttribute("proxy")) path = xml.attribute("proxy"); @@ -623,7 +623,7 @@ void Render::getFileProperties(const QDomElement xml, const QString &clipId, int if (!replaceProducer && xml.hasAttribute("file_hash")) { // Clip already has all properties - emit replyGetFileProperties(clipId, producer, QMap < QString, QString >(), QMap < QString, QString >(), replaceProducer); + emit replyGetFileProperties(clipId, producer, QMap < QString, QString >(), QMap < QString, QString >(), replaceProducer, selectClip); return; } @@ -799,7 +799,7 @@ void Render::getFileProperties(const QDomElement xml, const QString &clipId, int metadataPropertyMap[ name.section('.', 0, -2)] = value; } producer->seek(0); - emit replyGetFileProperties(clipId, producer, filePropertyMap, metadataPropertyMap, replaceProducer); + emit replyGetFileProperties(clipId, producer, filePropertyMap, metadataPropertyMap, replaceProducer, selectClip); // FIXME: should delete this to avoid a leak... //delete producer; } diff --git a/src/renderer.h b/src/renderer.h index b53e2721..c3c2959b 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -320,7 +320,7 @@ private slots: signals: /** @brief The renderer received a reply to a getFileProperties request. */ - void replyGetFileProperties(const QString &clipId, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &, bool); + void replyGetFileProperties(const QString &clipId, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &, bool, bool); /** @brief The renderer received a reply to a getImage request. */ void replyGetImage(const QString &, const QPixmap &); @@ -377,9 +377,10 @@ public slots: @param clipId The clip Id string @param imageHeight The height (in pixels) of the returned thumbnail (height of a treewidgetitem in projectlist) @param replaceProducer If true, the MLT producer will be recreated + @param selectClip If true, clip item will be selected in project view * Upon return, the result will be emitted via replyGetFileProperties(). * Wraps the VEML command of the same name. */ - void getFileProperties(const QDomElement xml, const QString &clipId, int imageHeight, bool replaceProducer = true); + void getFileProperties(const QDomElement xml, const QString &clipId, int imageHeight, bool replaceProducer = true, bool selectClip = false); void exportFileToFirewire(QString srcFileName, int port, GenTime startTime, GenTime endTime); void mltSavePlaylist(); -- 2.39.2