#include "kthumb.h"
-ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double fps)
+ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double fps, bool generateThumbs)
: AbstractClipItem(info, QRectF(), fps), m_clip(clip), m_resizeMode(NONE), m_grabPoint(0), m_maxTrack(0), m_hasThumbs(false), startThumbTimer(NULL), endThumbTimer(NULL), m_effectsCounter(1), audioThumbWasDrawn(false), m_opacity(1.0), m_timeLine(0), m_startThumbRequested(false), m_endThumbRequested(false), m_startFade(0), m_endFade(0), m_hover(false), m_selectedEffect(-1), m_speed(1.0), framePixelWidth(0), m_startPix(QPixmap()), m_endPix(QPixmap()) {
setRect(0, 0, (info.endPos - info.startPos).frames(fps) - 0.02, (qreal)(KdenliveSettings::trackheight() - 2));
setPos((qreal) info.startPos.frames(fps), (qreal)(info.track * KdenliveSettings::trackheight()) + 1);
connect(clip->thumbProducer(), SIGNAL(thumbReady(int, QPixmap)), this, SLOT(slotThumbReady(int, QPixmap)));
connect(clip, SIGNAL(gotAudioData()), this, SLOT(slotGotAudioData()));
- QTimer::singleShot(200, this, SLOT(slotFetchThumbs()));
+ if (generateThumbs) QTimer::singleShot(200, this, SLOT(slotFetchThumbs()));
/*if (m_clip->producer()) {
videoThumbProducer.init(this, m_clip->producer(), KdenliveSettings::trackheight() * KdenliveSettings::project_display_ratio(), KdenliveSettings::trackheight());
Q_OBJECT
public:
- ClipItem(DocClipBase *clip, ItemInfo info, double fps);
+ ClipItem(DocClipBase *clip, ItemInfo info, double fps, bool generateThumbs = true);
virtual ~ ClipItem();
virtual void paint(QPainter *painter,
const QStyleOptionGraphicsItem *option,
m_commandStack->push(command);
}
-void CustomTrackView::updateAllThumbs() {
+void CustomTrackView::slotUpdateAllThumbs() {
QList<QGraphicsItem *> itemList = items();
ClipItem *item;
Transition *transitionitem;
if (itemList.at(i)->type() == AVWIDGET) {
item = static_cast <ClipItem *>(itemList.at(i));
item->refreshClip();
- //qApp->processEvents();
+ qApp->processEvents();
}
}
}
void setDocumentModified();
void setInPoint();
void setOutPoint();
- void updateAllThumbs();
public slots:
void setCursorPos(int pos, bool seek = true);
void copyClip();
void pasteClip();
void pasteClipEffects();
+ void slotUpdateAllThumbs();
protected:
virtual void drawBackground(QPainter * painter, const QRectF & rect);
m_activeDocument->backupMltPlaylist();
if (m_activeTimeline) {
disconnect(m_projectMonitor, SIGNAL(renderPosition(int)), m_activeTimeline, SLOT(moveCursorPos(int)));
- disconnect(m_projectMonitor, SIGNAL(zoneUpdated(QPoint)), trackView, SLOT(slotSetZone(QPoint)));
+ disconnect(m_projectMonitor, SIGNAL(zoneUpdated(QPoint)), m_activeTimeline, SLOT(slotSetZone(QPoint)));
disconnect(m_projectMonitor, SIGNAL(durationChanged(int)), m_activeTimeline, SLOT(setDuration(int)));
disconnect(m_projectList, SIGNAL(projectModified()), m_activeDocument, SLOT(setModified()));
disconnect(m_activeDocument, SIGNAL(guidesUpdated()), this, SLOT(slotGuidesUpdated()));
disconnect(effectStack, SIGNAL(updateClipEffect(ClipItem*, QDomElement, QDomElement, int)), m_activeTimeline->projectView(), SLOT(slotUpdateClipEffect(ClipItem*, QDomElement, QDomElement, int)));
disconnect(effectStack, SIGNAL(removeEffect(ClipItem*, QDomElement)), m_activeTimeline->projectView(), SLOT(slotDeleteEffect(ClipItem*, QDomElement)));
disconnect(effectStack, SIGNAL(changeEffectState(ClipItem*, int, bool)), m_activeTimeline->projectView(), SLOT(slotChangeEffectState(ClipItem*, int, bool)));
- disconnect(effectStack, SIGNAL(changeEffectPosition(ClipItem*, int, int)), trackView->projectView(), SLOT(slotChangeEffectPosition(ClipItem*, int, int)));
+ disconnect(effectStack, SIGNAL(changeEffectPosition(ClipItem*, int, int)), m_activeTimeline->projectView(), SLOT(slotChangeEffectPosition(ClipItem*, int, int)));
disconnect(effectStack, SIGNAL(refreshEffectStack(ClipItem*)), m_activeTimeline->projectView(), SLOT(slotRefreshEffects(ClipItem*)));
disconnect(effectStack, SIGNAL(reloadEffects()), this, SLOT(slotReloadEffects()));
- disconnect(transitionConfig, SIGNAL(transitionUpdated(Transition *, QDomElement)), trackView->projectView() , SLOT(slotTransitionUpdated(Transition *, QDomElement)));
- disconnect(transitionConfig, SIGNAL(seekTimeline(int)), trackView->projectView() , SLOT(setCursorPos(int)));
+ disconnect(transitionConfig, SIGNAL(transitionUpdated(Transition *, QDomElement)), m_activeTimeline->projectView() , SLOT(slotTransitionUpdated(Transition *, QDomElement)));
+ disconnect(transitionConfig, SIGNAL(seekTimeline(int)), m_activeTimeline->projectView() , SLOT(setCursorPos(int)));
disconnect(m_activeTimeline->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(activateMonitor()));
- disconnect(trackView, SIGNAL(zoneMoved(int, int)), m_projectMonitor, SLOT(slotZoneMoved(int, int)));
+ disconnect(m_activeTimeline, SIGNAL(zoneMoved(int, int)), m_projectMonitor, SLOT(slotZoneMoved(int, int)));
+ disconnect(m_projectList, SIGNAL(loadingIsOver()), m_activeTimeline->projectView(), SLOT(slotUpdateAllThumbs()));
effectStack->clear();
}
m_activeDocument->setRenderer(NULL);
connect(trackView->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(activateMonitor()));
connect(trackView, SIGNAL(zoneMoved(int, int)), m_projectMonitor, SLOT(slotZoneMoved(int, int)));
+ connect(m_projectList, SIGNAL(loadingIsOver()), trackView->projectView(), SLOT(slotUpdateAllThumbs()));
trackView->projectView()->setContextMenu(m_timelineContextMenu, m_timelineContextClipMenu, m_timelineContextTransitionMenu);
m_activeTimeline = trackView;
m_commandStack->setActiveStack(doc->commandStack());
KdenliveSettings::setProject_display_ratio(doc->dar());
m_projectList->updateAllClips();
- trackView->projectView()->updateAllThumbs();
doc->clipManager()->checkAudioThumbs();
//m_overView->setScene(trackView->projectScene());
#include "projectlistview.h"
ProjectList::ProjectList(QWidget *parent)
- : QWidget(parent), m_render(NULL), m_fps(-1), m_commandStack(NULL), m_selectedItem(NULL), m_infoQueue(QMap <QString, QDomElement> ()), m_thumbnailQueue(QList <QString> ()) {
+ : QWidget(parent), m_render(NULL), m_fps(-1), m_commandStack(NULL), m_selectedItem(NULL), m_infoQueue(QMap <QString, QDomElement> ()), m_thumbnailQueue(QList <QString> ()), m_refreshed(false) {
QWidget *vbox = new QWidget;
listView = new ProjectListView(this);;
requestClipInfo(clip->toXML(), clip->getId());
} else {
requestClipThumbnail(item->clipId());
- //slotRefreshClipThumbnail(item, false);
item->changeDuration(item->referencedClip()->producer()->get_playtime());
}
item->setData(1, UsageRole, QString::number(item->numReferences()));
}
++it;
}
+ QTimer::singleShot(500, this, SLOT(slotCheckForEmptyQueue()));
}
void ProjectList::slotAddClip(QUrl givenUrl, QString group) {
void ProjectList::setDocument(KdenliveDoc *doc) {
listView->clear();
+ m_thumbnailQueue.clear();
+ m_infoQueue.clear();
+ m_refreshed = false;
QList <DocClipBase*> list = doc->clipManager()->documentClipList();
+ listView->blockSignals(true);
for (int i = 0; i < list.count(); i++) {
slotAddClip(list.at(i), false);
}
m_doc = doc;
QTreeWidgetItem *first = listView->topLevelItem(0);
if (first) listView->setCurrentItem(first);
+ listView->blockSignals(false);
m_toolbar->setEnabled(true);
}
return prods;
}
+void ProjectList::slotCheckForEmptyQueue() {
+ if (!m_refreshed && m_thumbnailQueue.isEmpty() && m_infoQueue.isEmpty()) {
+ m_refreshed = true;
+ emit loadingIsOver();
+ } else QTimer::singleShot(500, this, SLOT(slotCheckForEmptyQueue()));
+}
void ProjectList::requestClipThumbnail(const QString &id) {
m_thumbnailQueue.append(id);
}
void ProjectList::slotProcessNextThumbnail() {
- if (m_thumbnailQueue.isEmpty()) return;
+ if (m_thumbnailQueue.isEmpty()) {
+ return;
+ }
slotRefreshClipThumbnail(m_thumbnailQueue.takeFirst(), false);
}
void ProjectList::slotRefreshClipThumbnail(ProjectItem *item, bool update) {
if (item) {
+ if (!item->referencedClip()) return;
int height = 50;
int width = (int)(height * m_render->dar());
QPixmap pix = item->referencedClip()->thumbProducer()->extractImage(item->referencedClip()->getClipThumbFrame(), width, height);
KdenliveDoc *m_doc;
ItemDelegate *m_listViewDelegate;
ProjectItem *m_selectedItem;
+ bool m_refreshed;
QMap <QString, QDomElement> m_infoQueue;
void requestClipInfo(const QDomElement xml, const QString id);
QList <QString> m_thumbnailQueue;
void slotUpdateClipProperties(ProjectItem *item, QMap <QString, QString> properties);
void slotProcessNextClipInQueue();
void slotProcessNextThumbnail();
+ void slotCheckForEmptyQueue();
//void slotShowMenu(const QPoint &pos);
signals:
void receivedClipDuration(const QString &, int);
void showClipProperties(DocClipBase *);
void projectModified();
+ void loadingIsOver();
};
#endif
clipinfo.cropStart = GenTime(in, m_doc->fps());
clipinfo.track = ix;
//kDebug() << "// INSERTINGÂ CLIP: " << in << "x" << out << ", track: " << ix << ", ID: " << id << ", SCALE: " << m_scale << ", FPS: " << m_doc->fps();
- ClipItem *item = new ClipItem(clip, clipinfo, m_doc->fps());
+ ClipItem *item = new ClipItem(clip, clipinfo, m_doc->fps(), false);
if (hasSpeedAttribute) item->setSpeed(speed);
m_scene->addItem(item);
clip->addReference();