// calculate new position.
if (group() != 0) return pos();
QPointF newPos = value.toPointF();
- kDebug() << "/// MOVING CLIP ITEM.------------";
+ //kDebug() << "/// MOVING CLIP ITEM.------------";
int xpos = projectScene()->getSnapPointForPos((int) newPos.x(), KdenliveSettings::snaptopoints());
xpos = qMax(xpos, 0);
newPos.setX(xpos);
if (event->buttons() != Qt::NoButton) {
if (m_dragItem && m_tool == SELECTTOOL) {
if (m_operationMode == MOVE) {
- QGraphicsView::mouseMoveEvent(event);
+ if ((event->pos() - m_clickEvent).manhattanLength() >= QApplication::startDragDistance()) QGraphicsView::mouseMoveEvent(event);
/*&& (event->pos() - m_clickEvent).manhattanLength() >= QApplication::startDragDistance()) {
double snappedPos = getSnapPointForPos(mapToScene(event->pos()).x() - m_clickPoint.x());
m_commandStack->push(command);
}
+void CustomTrackView::updateAllThumbs() {
+ QList<QGraphicsItem *> itemList = items();
+ ClipItem *item;
+ Transition *transitionitem;
+ for (int i = 0; i < itemList.count(); i++) {
+ if (itemList.at(i)->type() == AVWIDGET) {
+ item = static_cast <ClipItem *>(itemList.at(i));
+ item->refreshClip();
+ qApp->processEvents();
+ }
+ }
+}
+
#include "customtrackview.moc"
void setDocumentModified();
void setInPoint();
void setOutPoint();
+ void updateAllThumbs();
public slots:
void setCursorPos(int pos, bool seek = true);
}
void DocClipBase::setProducer(Mlt::Producer *producer) {
+ if (producer == NULL) return;
m_clipProducer = producer;
m_clipProducer->set("transparency", m_properties.value("transparency").toInt());
if (m_thumbProd) m_thumbProd->setProducer(producer);
#include <KIO/NetAccess>
#include <KApplication>
+#include <mlt++/Mlt.h>
+
#include "kdenlivedoc.h"
#include "docclipbase.h"
#include "profilesdialog.h"
max = producers.count();
for (int i = 0; i < max; i++) {
QDomElement prod = producers.at(i).toElement();
-
if (prod.attribute("mlt_service") == "framebuffer") {
QString slowmotionprod = prod.attribute("resource");
slowmotionprod.replace(':', '?');
m_render = render;
emit progressInfo(i18n("Loading playlist..."), 0);
qApp->processEvents();
- if (m_render) m_render->setSceneList(m_document.toString(), m_startPos);
+ if (m_render) {
+ m_render->setSceneList(m_document.toString(), m_startPos);
+ checkProjectClips();
+ }
emit progressInfo(QString(), -1);
}
+void KdenliveDoc::checkProjectClips() {
+ if (m_render == NULL) return;
+ QList <Mlt::Producer *> prods = m_render->producersList();
+ QString id ;
+ for (int i = 0; i < prods.count(); i++) {
+ id = prods.at(i)->get("id");
+ DocClipBase *clip = m_clipManager->getClipById(id);
+ if (clip && clip->producer() == NULL) {
+ clip->setProducer(prods.at(i));
+ }
+ }
+}
+
Render *KdenliveDoc::renderer() {
return m_render;
}
emit updateClipDisplay(id);
}
-void KdenliveDoc::updateAllProjectClips() {
- QList <DocClipBase*> list = m_clipManager->documentClipList();
- for (int i = 0; i < list.count(); i++)
- emit updateClipDisplay(list.at(i)->getId());
-}
-
int KdenliveDoc::getFramePos(QString duration) {
return m_timecode.getFrameCount(duration, m_fps);
}
KUrl projectFolder() const;
/** Used to inform main app of the current document loading progress */
void loadingProgressed();
- void updateAllProjectClips();
void syncGuides(QList <Guide *> guides);
void setZoom(int factor);
int zoom() const;
void convertDocument(double version);
QDomDocument createEmptyDocument(const int videotracks, const int audiotracks);
QString colorToString(const QColor& c);
+ void checkProjectClips();
public slots:
void slotCreateTextClip(QString group, const QString &groupId);
doc->setRenderer(m_projectMonitor->render);
m_commandStack->setActiveStack(doc->commandStack());
KdenliveSettings::setProject_display_ratio(doc->dar());
- doc->updateAllProjectClips();
+ m_projectList->updateAllClips();
+ trackView->projectView()->updateAllThumbs();
//m_overView->setScene(trackView->projectScene());
}
}
-void ProjectList::slotAddClip(DocClipBase *clip) {
+void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties) {
const QString parent = clip->toXML().attribute("groupid");
ProjectItem *item = NULL;
if (parent != 0) {
}
if (!annotation.isEmpty()) item->setText(2, annotation);
}
- emit getFileProperties(clip->toXML(), clip->getId());
+ if (getProperties) emit getFileProperties(clip->toXML(), clip->getId());
}
void ProjectList::slotUpdateClip(const QString &id) {
item->setData(1, UsageRole, QString::number(item->numReferences()));
}
+void ProjectList::updateAllClips() {
+ QTreeWidgetItemIterator it(listView);
+ while (*it) {
+ ProjectItem *item = static_cast <ProjectItem *>(*it);
+ if (!item->isGroup()) {
+ if (item->referencedClip()->producer() == NULL) emit getFileProperties(item->referencedClip()->toXML(), item->referencedClip()->getId());
+ else {
+ slotRefreshClipThumbnail(item, false);
+ item->changeDuration(item->referencedClip()->producer()->get_playtime());
+ }
+ item->setData(1, UsageRole, QString::number(item->numReferences()));
+ qApp->processEvents();
+ }
+ ++it;
+ }
+}
+
void ProjectList::slotAddClip(QUrl givenUrl, QString group) {
if (!m_commandStack) kDebug() << "!!!!!!!!!!!!!!!! NO CMD STK";
KUrl::List list;
listView->clear();
QList <DocClipBase*> list = doc->clipManager()->documentClipList();
for (int i = 0; i < list.count(); i++) {
- slotAddClip(list.at(i));
+ slotAddClip(list.at(i), false);
}
m_fps = doc->fps();
if (item) slotRefreshClipThumbnail(item);
}
-void ProjectList::slotRefreshClipThumbnail(ProjectItem *item) {
+void ProjectList::slotRefreshClipThumbnail(ProjectItem *item, bool update) {
if (item) {
- kDebug() << " / / / /PROJECT LIST, REFRESH THMB";
int height = 50;
int width = (int)(height * m_render->dar());
QPixmap pix = item->referencedClip()->thumbProducer()->extractImage(item->referencedClip()->getClipThumbFrame(), width, height);
item->setIcon(0, pix);
- emit projectModified();
+ if (update) emit projectModified();
}
}
QDomElement producersList();
void setRenderer(Render *projectRender);
void slotUpdateClipProperties(const QString &id, QMap <QString, QString> properties);
+ void updateAllClips();
public slots:
void setDocument(KdenliveDoc *doc);
void slotReplyGetImage(const QString &clipId, int pos, const QPixmap &pix, int w, int h);
void slotReplyGetFileProperties(const QString &clipId, Mlt::Producer *producer, const QMap < QString, QString > &properties, const QMap < QString, QString > &metadata);
- void slotAddClip(DocClipBase *clip);
+ void slotAddClip(DocClipBase *clip, bool getProperties = true);
void slotDeleteClip(const QString &clipId);
void slotUpdateClip(const QString &id);
void slotRefreshClipThumbnail(const QString &clipId);
- void slotRefreshClipThumbnail(ProjectItem *item);
+ void slotRefreshClipThumbnail(ProjectItem *item, bool update = true);
void slotRemoveInvalidClip(const QString &id);
void slotSelectClip(const QString &ix);
fileConsumer.start();
}
+QList <Mlt::Producer *> Render::producersList() {
+ QList <Mlt::Producer *> prods;
+ QStringList ids;
+ Mlt::Service service(m_mltProducer->parent().get_service());
+ Mlt::Tractor tractor(service);
+ Mlt::Field *field = tractor.field();
+
+ int trackNb = tractor.count();
+ for (int t = 1; t < trackNb; t++) {
+ Mlt::Producer trackProducer(tractor.track(t));
+ Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
+ int clipNb = trackPlaylist.count();
+ kDebug() << "// PARSING SCENE TRACK: " << t << ", CLIPS: " << clipNb;
+ for (int i = 0; i < clipNb; i++) {
+ Mlt::Producer *prod = trackPlaylist.get_clip(i);
+ Mlt::Producer *nprod = new Mlt::Producer(prod->get_parent());
+ //kDebug()<<"PROD: "<<nprod->get("producer")<<", ID: "<<nprod->get("id")<<nprod->get("resource");
+ if (nprod && !nprod->is_blank() && !ids.contains(nprod->get("id"))) {
+ ids.append(nprod->get("id"));
+ prods.append(nprod);
+ }
+ }
+ }
+ return prods;
+}
+
#include "renderer.moc"
in the ClipManager list and speed is the current speed */
int mltChangeClipSpeed(ItemInfo info, double speed, Mlt::Producer *prod);
+ QList <Mlt::Producer *> producersList();
+
private: // Private attributes & methods
/** The name of this renderer - useful to identify the renderes by what they do - e.g. background rendering, workspace monitor, etc... */
QString m_name;