From: Jean-Baptiste Mardelle Date: Tue, 26 Aug 2008 23:38:37 +0000 (+0000) Subject: * Be more clever when adding several clips to a project X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=3d3976b9ef03fefcb02b23e5662ac9f5f3a8d72d;p=kdenlive * Be more clever when adding several clips to a project * Fix handling of effects in old Kdenlive project files svn path=/branches/KDE4/; revision=2383 --- diff --git a/src/addclipcommand.cpp b/src/addclipcommand.cpp index e1e5ca73..cda6a485 100644 --- a/src/addclipcommand.cpp +++ b/src/addclipcommand.cpp @@ -22,8 +22,7 @@ #include "addclipcommand.h" #include "kdenlivedoc.h" -AddClipCommand::AddClipCommand(KdenliveDoc *doc, const QDomElement &xml, const uint id, bool doIt) - : m_doc(doc), m_xml(xml), m_id(id), m_doIt(doIt) { +AddClipCommand::AddClipCommand(KdenliveDoc *doc, const QDomElement &xml, const uint id, bool doIt, QUndoCommand * parent) : QUndoCommand(parent), m_doc(doc), m_xml(xml), m_id(id), m_doIt(doIt) { if (doIt) setText(i18n("Add clip")); else setText(i18n("Delete clip")); } diff --git a/src/addclipcommand.h b/src/addclipcommand.h index d5d51e02..3a4b3d52 100644 --- a/src/addclipcommand.h +++ b/src/addclipcommand.h @@ -29,7 +29,7 @@ class KdenliveDoc; class AddClipCommand : public QUndoCommand { public: - AddClipCommand(KdenliveDoc *list, const QDomElement &xml, const uint id, bool doIt); + AddClipCommand(KdenliveDoc *list, const QDomElement &xml, const uint id, bool doIt, QUndoCommand * parent = 0); virtual void undo(); virtual void redo(); diff --git a/src/clipmanager.cpp b/src/clipmanager.cpp index 232b311c..7827c523 100644 --- a/src/clipmanager.cpp +++ b/src/clipmanager.cpp @@ -18,6 +18,7 @@ ***************************************************************************/ #include #include +#include #include "addclipcommand.h" #include "kdenlivesettings.h" @@ -91,6 +92,33 @@ DocClipBase *ClipManager::getClipById(int clipId) { return NULL; } +void ClipManager::slotAddClipList(const KUrl::List urls, const QString group, const int groupId) { + QUndoCommand *addClips = new QUndoCommand(); + addClips->setText("Add clips"); + + foreach(const KUrl file, urls) { + if (KIO::NetAccess::exists(file, KIO::NetAccess::SourceSide, NULL)) { + QDomDocument doc; + QDomElement prod = doc.createElement("producer"); + if (!group.isEmpty()) { + prod.setAttribute("groupname", group); + prod.setAttribute("groupid", groupId); + } + prod.setAttribute("resource", file.path()); + uint id = m_clipIdCounter++; + prod.setAttribute("id", QString::number(id)); + KMimeType::Ptr type = KMimeType::findByUrl(file); + if (type->name().startsWith("image/")) { + prod.setAttribute("type", (int) IMAGE); + prod.setAttribute("in", "0"); + prod.setAttribute("out", m_doc->getFramePos(KdenliveSettings::image_duration()) - 1); + } + new AddClipCommand(m_doc, prod, id, true, addClips); + } + } + m_doc->commandStack()->push(addClips); +} + void ClipManager::slotAddClipFile(const KUrl url, const QString group, const int groupId) { kDebug() << "///// CLIP MANAGER, ADDING CLIP: " << url; QDomDocument doc; @@ -182,4 +210,8 @@ int ClipManager::getFreeClipId() { return m_clipIdCounter++; } +int ClipManager::lastClipId() const { + return m_clipIdCounter - 1; +} + diff --git a/src/clipmanager.h b/src/clipmanager.h index 32c3fbba..b6718709 100644 --- a/src/clipmanager.h +++ b/src/clipmanager.h @@ -49,6 +49,7 @@ Q_OBJECT public: DocClipBase *getClipAt(int pos); void deleteClip(uint clipId); void slotAddClipFile(const KUrl url, const QString group, const int groupId); + void slotAddClipList(const KUrl::List urls, const QString group, const int groupId); void slotAddTextClipFile(const QString path, const QString xml, const QString group, const int groupId); void slotAddColorClipFile(const QString name, const QString color, QString duration, const QString group, const int groupId); void slotAddSlideshowClipFile(const QString name, const QString path, int count, const QString duration, const bool loop, const bool fade, const QString &luma_duration, const QString &luma_file, const int softness, const QString group, const int groupId); @@ -58,6 +59,7 @@ Q_OBJECT public: void checkAudioThumbs(); QList documentClipList(); int getFreeClipId(); + int lastClipId() const; private: // Private attributes /** the list of clips in the document */ diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index 170cccfc..ef161d8e 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -314,9 +314,28 @@ void KdenliveDoc::convertDocument(double version) { tractor.insertAfter(transitions.at(0), QDomNode()); } - QDomElement markers = m_document.createElement("markers"); + // Fix filters format + QDomNodeList filters = m_document.elementsByTagName("filter"); + max = filters.count(); + for (int i = 0; i < max; i++) { + QDomElement filt = filters.at(i).toElement(); + QDomNamedNodeMap attrs = filt.attributes(); + for (int j = 0; j < attrs.count(); j++) { + QDomAttr a = attrs.item(j).toAttr(); + if (!a.isNull()) { + kDebug() << " FILTER; adding :" << a.name() << ":" << a.value(); + QDomElement e = m_document.createElement("property"); + e.setAttribute("name", a.name()); + QDomText value = m_document.createTextNode(a.value()); + e.appendChild(value); + filt.appendChild(e); + } + } + } + - // change producer names + // move markers to a global list + QDomElement markers = m_document.createElement("markers"); QDomNodeList producers = m_document.elementsByTagName("producer"); max = producers.count(); for (int i = 0; i < max; i++) { @@ -606,9 +625,17 @@ void KdenliveDoc::deleteClip(const uint clipId) { m_clipManager->deleteClip(clipId); } +void KdenliveDoc::slotAddClipList(const KUrl::List urls, const QString group, const int groupId) { + m_clipManager->slotAddClipList(urls, group, groupId); + emit selectLastAddedClip(m_clipManager->lastClipId()); + setModified(true); +} + + void KdenliveDoc::slotAddClipFile(const KUrl url, const QString group, const int groupId) { kDebug() << "///////// DOCUM, ADD CLP: " << url; m_clipManager->slotAddClipFile(url, group, groupId); + emit selectLastAddedClip(m_clipManager->lastClipId()); setModified(true); } diff --git a/src/kdenlivedoc.h b/src/kdenlivedoc.h index f19526ba..e8320e19 100644 --- a/src/kdenlivedoc.h +++ b/src/kdenlivedoc.h @@ -67,6 +67,7 @@ Q_OBJECT public: void addFolder(const QString foldername, int clipId, bool edit); void deleteFolder(const QString foldername, int clipId); void slotAddClipFile(const KUrl url, const QString group, const int groupId = -1); + void slotAddClipList(const KUrl::List urls, const QString group, const int groupId = -1); void slotAddTextClipFile(const QString path, const QString xml, const QString group, const int groupId = -1); void editTextClip(QString path, int id); void slotAddFolder(const QString folderName); @@ -147,6 +148,7 @@ signals: /** emited when the document state has been modified (= needs saving or not) */ void docModified(bool); void refreshClipThumbnail(int); + void selectLastAddedClip(const int); }; #endif diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index a1ca5ce4..6ad902e9 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1043,6 +1043,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) { //cha disconnect(m_activeDocument, SIGNAL(signalDeleteProjectClip(int)), m_projectList, SLOT(slotDeleteClip(int))); disconnect(m_activeDocument, SIGNAL(updateClipDisplay(int)), m_projectList, SLOT(slotUpdateClip(int))); disconnect(m_activeDocument, SIGNAL(refreshClipThumbnail(int)), m_projectList, SLOT(slotRefreshClipThumbnail(int))); + disconnect(m_activeDocument, SIGNAL(selectLastAddedClip(const int)), m_projectList, SLOT(slotSelectClip(const int))); disconnect(m_activeDocument, SIGNAL(deletTimelineClip(int)), m_activeTimeline, SLOT(slotDeleteClip(int))); disconnect(m_activeTimeline, SIGNAL(clipItemSelected(ClipItem*)), effectStack, SLOT(slotClipItemSelected(ClipItem*))); disconnect(m_activeTimeline, SIGNAL(clipItemSelected(ClipItem*)), this, SLOT(slotActivateEffectStackView())); @@ -1080,6 +1081,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) { //cha connect(doc, SIGNAL(signalDeleteProjectClip(int)), m_projectList, SLOT(slotDeleteClip(int))); connect(doc, SIGNAL(updateClipDisplay(int)), m_projectList, SLOT(slotUpdateClip(int))); connect(doc, SIGNAL(refreshClipThumbnail(int)), m_projectList, SLOT(slotRefreshClipThumbnail(int))); + connect(doc, SIGNAL(selectLastAddedClip(const int)), m_projectList, SLOT(slotSelectClip(const int))); connect(doc, SIGNAL(deletTimelineClip(int)), trackView, SLOT(slotDeleteClip(int))); connect(doc, SIGNAL(docModified(bool)), this, SLOT(slotUpdateDocumentState(bool))); diff --git a/src/projectitem.cpp b/src/projectitem.cpp index c0981e15..4e83180b 100644 --- a/src/projectitem.cpp +++ b/src/projectitem.cpp @@ -93,7 +93,7 @@ ProjectItem::ProjectItem(QTreeWidget * parent, DocClipBase *clip) if (name.isEmpty()) name = KUrl(m_clip->getProperty("resource")).fileName(); m_clipType = (CLIPTYPE) m_clip->getProperty("type").toInt(); setText(1, name); - kDebug() << "PROJECT ITE;. ADDING LCIP: " << m_clipId; + //kDebug() << "PROJECT ITE;. ADDING LCIP: " << m_clipId; } ProjectItem::ProjectItem(QTreeWidgetItem * parent, DocClipBase *clip) @@ -106,7 +106,7 @@ ProjectItem::ProjectItem(QTreeWidgetItem * parent, DocClipBase *clip) if (name.isEmpty()) name = KUrl(m_clip->getProperty("resource")).fileName(); m_clipType = (CLIPTYPE) m_clip->getProperty("type").toInt(); setText(1, name); - kDebug() << "PROJECT ITE;. ADDING LCIP: " << m_clipId; + //kDebug() << "PROJECT ITE;. ADDING LCIP: " << m_clipId; } diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 982318a3..66c054e0 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -30,7 +30,6 @@ #include #include #include -#include #include #include @@ -324,10 +323,7 @@ void ProjectList::slotAddClip(QUrl givenUrl, QString group) { groupId = item->clipId(); } } - foreach(const KUrl file, list) { - if (KIO::NetAccess::exists(file, KIO::NetAccess::SourceSide, NULL)) - m_doc->slotAddClipFile(file, group, groupId); - } + m_doc->slotAddClipList(list, group, groupId); } void ProjectList::slotRemoveInvalidClip(int id) { @@ -466,7 +462,6 @@ void ProjectList::slotReplyGetFileProperties(int clipId, Mlt::Producer *producer if (item) { item->setProperties(properties, metadata); item->referencedClip()->setProducer(producer); - listView->setCurrentItem(item); emit receivedClipDuration(clipId, item->clipMaxDuration()); } else kDebug() << "//////// COULD NOT FIND CLIP TO UPDATE PRPS..."; } @@ -487,4 +482,12 @@ ProjectItem *ProjectList::getItemById(int id) { return NULL; } +void ProjectList::slotSelectClip(const int ix) { + ProjectItem *p = getItemById(ix); + if (p) { + listView->setCurrentItem(p); + listView->scrollToItem(p); + } +} + #include "projectlist.moc" diff --git a/src/projectlist.h b/src/projectlist.h index cfa7d80d..124dd4b9 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -119,6 +119,7 @@ public slots: void slotRefreshClipThumbnail(int clipId); void slotRefreshClipThumbnail(ProjectItem *item); void slotRemoveInvalidClip(int id); + void slotSelectClip(const int ix); private: ProjectListView *listView;