]> git.sesse.net Git - kdenlive/commitdiff
Load clip info & thumbnail one after another so that we don't freeze the system when...
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 18 Oct 2008 16:39:47 +0000 (16:39 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 18 Oct 2008 16:39:47 +0000 (16:39 +0000)
svn path=/branches/KDE4/; revision=2474

src/projectitem.cpp
src/projectlist.cpp
src/projectlist.h
src/renderer.cpp

index 751efd46514ae17b26987595f0a3f0305a5d37be..c9dc7e1dee1893bdffb3c1299241991180b1e54d 100644 (file)
@@ -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"]);
index aa012b2fca5ebbad7aa0d55fa3bf2c229610ce19..95716709500699a613ca137711ac3e7408b0b20e 100644 (file)
 #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 <QString, QDomElement> ()), m_thumbnailQueue(QList <QString> ()) {
 
     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<QString, QDomElement>::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 <QString> 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) {
index 20b812ecc4e808a96d7d4687c8c6a3cf0c0ebebd..9fa7cb1b1c9403efa72e4563eef7d6f432b17f93 100644 (file)
@@ -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 <QString, QDomElement> m_infoQueue;
+    void requestClipInfo(const QDomElement xml, const QString id);
+    QList <QString> 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 <QString, QString> properties);
+    void slotProcessNextClipInQueue();
+    void slotProcessNextThumbnail();
     //void slotShowMenu(const QPoint &pos);
 
 signals:
index 2b747f3b089a177a1a93d102fc7dbd1c245f2363..0c44902e8143d519476e1e2c97173428d433966c 100644 (file)
@@ -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());