From 5273a3b061a94e37ec3289211f67006731c93cab Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Tue, 15 Sep 2009 22:40:49 +0000 Subject: [PATCH] Add option to remove unused clips from project tree: http://www.kdenlive.org/mantis/view.php?id=1140 svn path=/trunk/kdenlive/; revision=3894 --- src/clipmanager.cpp | 15 ++++++++++----- src/clipmanager.h | 2 +- src/kdenlivedoc.cpp | 4 ++-- src/kdenlivedoc.h | 2 +- src/kdenliveui.rc | 3 ++- src/mainwindow.cpp | 10 ++++++++++ src/mainwindow.h | 1 + src/projectlist.cpp | 17 +++++++++++++++-- src/projectlist.h | 3 ++- 9 files changed, 44 insertions(+), 13 deletions(-) diff --git a/src/clipmanager.cpp b/src/clipmanager.cpp index 32602a7d..5465081e 100644 --- a/src/clipmanager.cpp +++ b/src/clipmanager.cpp @@ -148,13 +148,18 @@ void ClipManager::addClip(DocClipBase *clip) if (!gid.isEmpty() && gid.toInt() >= m_folderIdCounter) m_folderIdCounter = gid.toInt() + 1; } -void ClipManager::slotDeleteClip(const QString &clipId) +void ClipManager::slotDeleteClips(QStringList ids) { - DocClipBase *clip = getClipById(clipId); - if (clip) { - AddClipCommand *command = new AddClipCommand(m_doc, clip->toXML(), clipId, false); - m_doc->commandStack()->push(command); + QUndoCommand *delClips = new QUndoCommand(); + delClips->setText(i18np("Delete clip", "Delete clips", ids.size())); + + for (int i = 0; i < ids.size(); i++) { + DocClipBase *clip = getClipById(ids.at(i)); + if (clip) { + new AddClipCommand(m_doc, clip->toXML(), ids.at(i), false, delClips); + } } + m_doc->commandStack()->push(delClips); } void ClipManager::deleteClip(const QString &clipId) diff --git a/src/clipmanager.h b/src/clipmanager.h index d5e2bbb3..470de23d 100644 --- a/src/clipmanager.h +++ b/src/clipmanager.h @@ -63,7 +63,7 @@ Q_OBJECT public: 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 QString &groupId); DocClipBase *getClipById(QString clipId); const QList getClipByResource(QString resource); - void slotDeleteClip(const QString & clipId); + void slotDeleteClips(QStringList ids); void setThumbsProgress(const QString &message, int progress); void checkAudioThumbs(); QList documentClipList() const; diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index ad0ab37c..d76aa59b 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -1030,12 +1030,12 @@ void KdenliveDoc::addClipInfo(QDomElement elem, QDomElement orig, QString clipId } } -void KdenliveDoc::deleteProjectClip(QList ids) +void KdenliveDoc::deleteProjectClip(QStringList ids) { for (int i = 0; i < ids.size(); ++i) { emit deleteTimelineClip(ids.at(i)); - m_clipManager->slotDeleteClip(ids.at(i)); } + m_clipManager->slotDeleteClips(ids); setModified(true); } diff --git a/src/kdenlivedoc.h b/src/kdenlivedoc.h index 6f6bfd3c..42370544 100644 --- a/src/kdenlivedoc.h +++ b/src/kdenlivedoc.h @@ -74,7 +74,7 @@ Q_OBJECT public: int getFramePos(QString duration); DocClipBase *getBaseClip(const QString &clipId); void updateClip(const QString id); - void deleteProjectClip(QList ids); + void deleteProjectClip(QStringList ids); /** Inform application of the audio thumbnails generation progress */ void setThumbsProgress(const QString &message, int progress); const QString &profilePath() const; diff --git a/src/kdenliveui.rc b/src/kdenliveui.rc index b099be38..cfe35999 100644 --- a/src/kdenliveui.rc +++ b/src/kdenliveui.rc @@ -1,6 +1,6 @@ - + Extra Toolbar @@ -40,6 +40,7 @@ + diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 867f6ccd..a6019f7f 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -853,6 +853,10 @@ void MainWindow::setupActions() projectRender->setShortcut(Qt::CTRL + Qt::Key_Return); connect(projectRender, SIGNAL(triggered(bool)), this, SLOT(slotRenderProject())); + KAction* projectClean = new KAction(KIcon("edit-clear"), i18n("Clean Project"), this); + collection->addAction("project_clean", projectClean); + connect(projectClean, SIGNAL(triggered(bool)), this, SLOT(slotCleanProject())); + KAction* monitorPlay = new KAction(KIcon("media-playback-start"), i18n("Play"), this); KShortcut playShortcut; playShortcut.setPrimary(Qt::Key_Space); @@ -1684,6 +1688,12 @@ void MainWindow::setRenderingFinished(const QString &url, int status, const QStr if (m_renderWidget) m_renderWidget->setRenderStatus(url, status, error); } +void MainWindow::slotCleanProject() +{ + if (KMessageBox::warningContinueCancel(this, i18n("This will remove all unused clips from your project."), i18n("Clean up project")) == KMessageBox::Cancel) return; + m_projectList->cleanup(); +} + void MainWindow::slotUpdateMousePosition(int pos) { if (m_activeDocument) diff --git a/src/mainwindow.h b/src/mainwindow.h index 1abc23ca..b1aa4a76 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -312,6 +312,7 @@ private slots: void slotUpdateTimecodeFormat(int ix); /** Removes the focus of anything */ void slotRemoveFocus(); + void slotCleanProject(); signals: Q_SCRIPTABLE void abortRenderJob(const QString &url); diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 38fdad2c..a8f76657 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -212,6 +212,19 @@ void ProjectList::slotOpenClip() } } +void ProjectList::cleanup() +{ + m_listView->clearSelection(); + QTreeWidgetItemIterator it(m_listView); + ProjectItem *item; + while (*it) { + item = static_cast (*it); + if (item->numReferences() == 0) item->setSelected(true); + it++; + } + slotRemoveClip(); +} + void ProjectList::slotReloadClip(const QString &id) { QList selected; @@ -383,7 +396,7 @@ void ProjectList::slotContextMenu(const QPoint &pos, QTreeWidgetItem *item) void ProjectList::slotRemoveClip() { if (!m_listView->currentItem()) return; - QList ids; + QStringList ids; QMap folderids; QList selected = m_listView->selectedItems(); ProjectItem *item; @@ -670,7 +683,7 @@ void ProjectList::slotRemoveInvalidClip(const QString &id, bool replace) if (KMessageBox::questionYesNo(this, i18n("Clip %1
is missing or invalid. Remove it from project?", path), i18n("Invalid clip")) == KMessageBox::Yes) replace = true; } } - QList ids; + QStringList ids; ids << id; if (replace) m_doc->deleteProjectClip(ids); } diff --git a/src/projectlist.h b/src/projectlist.h index 7b1310c8..319437a8 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -71,7 +71,7 @@ public: extendItem(w, } */ - void drawFocus ( QPainter * painter, const QStyleOptionViewItem & option, const QRect & rect ) const { + void drawFocus ( QPainter *, const QStyleOptionViewItem &, const QRect & ) const { } void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { @@ -133,6 +133,7 @@ public: QString currentClipUrl() const; void reloadClipThumbnails(); QDomDocument generateTemplateXml(QString data, const QString &replaceString); + void cleanup(); public slots: void setDocument(KdenliveDoc *doc); -- 2.39.2