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;
}
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;
}
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"]);
#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);
}
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) {
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()));
QList <QString> ids;
ids << id;
m_doc->deleteProjectClip(ids);
+ if (!m_infoQueue.isEmpty()) QTimer::singleShot(300, this, SLOT(slotProcessNextClipInQueue()));
}
void ProjectList::slotAddColorClip() {
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) {
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) {
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);
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());
/** 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: