From: Jean-Baptiste Mardelle Date: Sat, 18 Oct 2008 16:39:47 +0000 (+0000) Subject: Load clip info & thumbnail one after another so that we don't freeze the system when... X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=62d59d0733c09dbbb68bc1a785eadefc3db8ac77;p=kdenlive Load clip info & thumbnail one after another so that we don't freeze the system when adding lots of clips, disable project tree while fetching infos svn path=/branches/KDE4/; revision=2474 --- diff --git a/src/projectitem.cpp b/src/projectitem.cpp index 751efd46..c9dc7e1d 100644 --- a/src/projectitem.cpp +++ b/src/projectitem.cpp @@ -58,6 +58,7 @@ ProjectItem::ProjectItem(QTreeWidget * parent, DocClipBase *clip) m_clipType = (CLIPTYPE) m_clip->getProperty("type").toInt(); setText(1, name); setText(2, m_clip->description()); + //setFlags(Qt::NoItemFlags); //kDebug() << "PROJECT ITE;. ADDING LCIP: " << m_clipId; } @@ -72,6 +73,7 @@ ProjectItem::ProjectItem(QTreeWidgetItem * parent, DocClipBase *clip) m_clipType = (CLIPTYPE) m_clip->getProperty("type").toInt(); setText(1, name); setText(2, m_clip->description()); + //setFlags(Qt::NoItemFlags); //kDebug() << "PROJECT ITE;. ADDING LCIP: " << m_clipId; } @@ -191,6 +193,7 @@ void ProjectItem::slotSetToolTip() { void ProjectItem::setProperties(const QMap < QString, QString > &attributes, const QMap < QString, QString > &metadata) { if (m_clip == NULL) return; + //setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled); if (attributes.contains("duration")) { //if (m_clipType == AUDIO || m_clipType == VIDEO || m_clipType == AV) //m_clip->setProperty("duration", attributes["duration"]); diff --git a/src/projectlist.cpp b/src/projectlist.cpp index aa012b2f..95716709 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -53,13 +53,12 @@ #include "projectlistview.h" ProjectList::ProjectList(QWidget *parent) - : QWidget(parent), m_render(NULL), m_fps(-1), m_commandStack(NULL), m_selectedItem(NULL) { + : QWidget(parent), m_render(NULL), m_fps(-1), m_commandStack(NULL), m_selectedItem(NULL), m_infoQueue(QMap ()), m_thumbnailQueue(QList ()) { QWidget *vbox = new QWidget; listView = new ProjectListView(this);; QVBoxLayout *layout = new QVBoxLayout; m_clipIdCounter = 0; - // setup toolbar searchView = new KTreeWidgetSearchLine(this); m_toolbar = new QToolBar("projectToolBar", this); @@ -339,7 +338,28 @@ void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties) { } if (!annotation.isEmpty()) item->setText(2, annotation); } - if (getProperties) emit getFileProperties(clip->toXML(), clip->getId()); + if (getProperties) requestClipInfo(clip->toXML(), clip->getId()); +} + +void ProjectList::requestClipInfo(const QDomElement xml, const QString id) { + m_infoQueue.insert(id, xml); + listView->setEnabled(false); + if (m_infoQueue.count() == 1) QTimer::singleShot(300, this, SLOT(slotProcessNextClipInQueue())); +} + +void ProjectList::slotProcessNextClipInQueue() { + if (m_infoQueue.isEmpty()) { + listView->setEnabled(true); + return; + } + QMap::const_iterator i = m_infoQueue.constBegin(); + if (i != m_infoQueue.constEnd()) { + const QDomElement dom = i.value(); + const QString id = i.key(); + m_infoQueue.remove(i.key()); + emit getFileProperties(dom, id); + } + if (m_infoQueue.isEmpty()) listView->setEnabled(true); } void ProjectList::slotUpdateClip(const QString &id) { @@ -364,9 +384,10 @@ void ProjectList::updateAllClips() { pix.save(clip->fileURL().path()); delete dia_ui; } - emit getFileProperties(clip->toXML(), clip->getId()); + requestClipInfo(clip->toXML(), clip->getId()); } else { - slotRefreshClipThumbnail(item, false); + requestClipThumbnail(item->clipId()); + //slotRefreshClipThumbnail(item, false); item->changeDuration(item->referencedClip()->producer()->get_playtime()); } item->setData(1, UsageRole, QString::number(item->numReferences())); @@ -411,6 +432,7 @@ void ProjectList::slotRemoveInvalidClip(const QString &id) { QList ids; ids << id; m_doc->deleteProjectClip(ids); + if (!m_infoQueue.isEmpty()) QTimer::singleShot(300, this, SLOT(slotProcessNextClipInQueue())); } void ProjectList::slotAddColorClip() { @@ -518,9 +540,21 @@ QDomElement ProjectList::producersList() { return prods; } -void ProjectList::slotRefreshClipThumbnail(const QString &clipId) { + +void ProjectList::requestClipThumbnail(const QString &id) { + m_thumbnailQueue.append(id); + if (m_thumbnailQueue.count() == 1) QTimer::singleShot(300, this, SLOT(slotProcessNextThumbnail())); +} + +void ProjectList::slotProcessNextThumbnail() { + if (m_thumbnailQueue.isEmpty()) return; + slotRefreshClipThumbnail(m_thumbnailQueue.takeFirst(), false); +} + +void ProjectList::slotRefreshClipThumbnail(const QString &clipId, bool update) { ProjectItem *item = getItemById(clipId); - if (item) slotRefreshClipThumbnail(item); + if (item) slotRefreshClipThumbnail(item, update); + else slotProcessNextThumbnail(); } void ProjectList::slotRefreshClipThumbnail(ProjectItem *item, bool update) { @@ -530,16 +564,18 @@ void ProjectList::slotRefreshClipThumbnail(ProjectItem *item, bool update) { QPixmap pix = item->referencedClip()->thumbProducer()->extractImage(item->referencedClip()->getClipThumbFrame(), width, height); item->setIcon(0, pix); if (update) emit projectModified(); + if (!m_thumbnailQueue.isEmpty()) QTimer::singleShot(300, this, SLOT(slotProcessNextThumbnail())); } } void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Producer *producer, const QMap < QString, QString > &properties, const QMap < QString, QString > &metadata) { ProjectItem *item = getItemById(clipId); - if (item) { + if (item && producer) { item->setProperties(properties, metadata); item->referencedClip()->setProducer(producer); emit receivedClipDuration(clipId, item->clipMaxDuration()); } else kDebug() << "//////// COULD NOT FIND CLIP TO UPDATE PRPS..."; + if (!m_infoQueue.isEmpty()) QTimer::singleShot(300, this, SLOT(slotProcessNextClipInQueue())); } void ProjectList::slotReplyGetImage(const QString &clipId, int pos, const QPixmap &pix, int w, int h) { diff --git a/src/projectlist.h b/src/projectlist.h index 20b812ec..9fa7cb1b 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -117,7 +117,7 @@ public slots: void slotAddClip(DocClipBase *clip, bool getProperties = true); void slotDeleteClip(const QString &clipId); void slotUpdateClip(const QString &id); - void slotRefreshClipThumbnail(const QString &clipId); + void slotRefreshClipThumbnail(const QString &clipId, bool update = true); void slotRefreshClipThumbnail(ProjectItem *item, bool update = true); void slotRemoveInvalidClip(const QString &id); void slotSelectClip(const QString &ix); @@ -140,6 +140,10 @@ private: KdenliveDoc *m_doc; ItemDelegate *m_listViewDelegate; ProjectItem *m_selectedItem; + QMap m_infoQueue; + void requestClipInfo(const QDomElement xml, const QString id); + QList m_thumbnailQueue; + void requestClipThumbnail(const QString &id); private slots: void slotAddClip(QUrl givenUrl = QUrl(), QString group = QString()); @@ -154,6 +158,8 @@ private slots: /** This is triggered when a clip description has been modified */ void slotItemEdited(QTreeWidgetItem *item, int column); void slotUpdateClipProperties(ProjectItem *item, QMap properties); + void slotProcessNextClipInQueue(); + void slotProcessNextThumbnail(); //void slotShowMenu(const QPoint &pos); signals: diff --git a/src/renderer.cpp b/src/renderer.cpp index 2b747f3b..0c44902e 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -468,8 +468,9 @@ void Render::getFileProperties(const QDomElement &xml, const QString &clipId) { QMap < QString, QString > metadataPropertyMap; KUrl url = KUrl(xml.attribute("resource", QString::null)); - Mlt::Producer *producer; + Mlt::Producer *producer = NULL; if (xml.attribute("type").toInt() == TEXT && !QFile::exists(url.path())) { + emit replyGetFileProperties(clipId, producer, filePropertyMap, metadataPropertyMap); return; } if (xml.attribute("type").toInt() == COLOR) { @@ -517,7 +518,7 @@ void Render::getFileProperties(const QDomElement &xml, const QString &clipId) { filePropertyMap["duration"] = QString::number(producer->get_playtime()); //kDebug() << "/////// PRODUCER: " << url.path() << " IS: " << producer.get_playtime(); - Mlt::Frame * frame = producer->get_frame(); + Mlt::Frame *frame = producer->get_frame(); if (xml.attribute("type").toInt() == SLIDESHOW) { if (xml.hasAttribute("ttl")) producer->set("ttl", xml.attribute("ttl").toInt());