From e906fc902420019ba9414ae4fffb232cfe1cf71b Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Fri, 14 Oct 2011 21:40:08 +0000 Subject: [PATCH] When missing or invalid clips, open only one dialog box instead of one for each clip svn path=/trunk/kdenlive/; revision=5966 --- src/projectlist.cpp | 66 ++++++++++++++++++++++++++++++++++++++++----- src/projectlist.h | 16 +++++++++++ 2 files changed, 76 insertions(+), 6 deletions(-) diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 2109bfa9..13615f7e 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -66,6 +66,44 @@ #include #include #include +#include + +InvalidDialog::InvalidDialog(const QString &caption, const QString &message, bool infoOnly, QWidget *parent) : KDialog(parent) +{ + setCaption(caption); + if (infoOnly) setButtons(KDialog::Ok); + else setButtons(KDialog::Yes | KDialog::No); + QWidget *w = new QWidget(this); + QVBoxLayout *l = new QVBoxLayout; + l->addWidget(new QLabel(message)); + m_clipList = new QListWidget; + l->addWidget(m_clipList); + w->setLayout(l); + setMainWidget(w); +} + +InvalidDialog::~InvalidDialog() +{ + delete m_clipList; +} + + +void InvalidDialog::addClip(const QString &id, const QString &path) +{ + QListWidgetItem *item = new QListWidgetItem(path); + item->setData(Qt::UserRole, id); + m_clipList->addItem(item); +} + +QStringList InvalidDialog::getIds() const +{ + QStringList ids; + for (int i = 0; i < m_clipList->count(); i++) { + ids << m_clipList->item(i)->data(Qt::UserRole).toString(); + } + return ids; +} + ProjectList::ProjectList(QWidget *parent) : QWidget(parent), @@ -78,7 +116,8 @@ ProjectList::ProjectList(QWidget *parent) : m_doc(NULL), m_refreshed(false), m_thumbnailQueue(), - m_abortAllProxies(false) + m_abortAllProxies(false), + m_invalidClipDialog(NULL) { QVBoxLayout *layout = new QVBoxLayout; layout->setContentsMargins(0, 0, 0, 0); @@ -1342,13 +1381,28 @@ void ProjectList::slotRemoveInvalidClip(const QString &id, bool replace) const QString path = item->referencedClip()->fileURL().path(); if (item->referencedClip()->isPlaceHolder()) replace = false; if (!path.isEmpty()) { + if (m_invalidClipDialog) { + m_invalidClipDialog->addClip(id, path); + return; + } + else { + if (replace) + m_invalidClipDialog = new InvalidDialog(i18n("Invalid clip"), i18n("Clip %1
is invalid, will be removed from project.", QString()), replace, kapp->activeWindow()); + else { + m_invalidClipDialog = new InvalidDialog(i18n("Invalid clip"), i18n("Clip %1
is missing or invalid. Remove it from project?", QString()), replace, kapp->activeWindow()); + } + m_invalidClipDialog->addClip(id, path); + int result = m_invalidClipDialog->exec(); + if (result == KDialog::Yes) replace = true; + } + } + if (m_invalidClipDialog) { if (replace) - KMessageBox::sorry(kapp->activeWindow(), i18n("Clip %1
is invalid, will be removed from project.", path)); - else if (KMessageBox::questionYesNo(kapp->activeWindow(), i18n("Clip %1
is missing or invalid. Remove it from project?", path), i18n("Invalid clip")) == KMessageBox::Yes) - replace = true; + emit deleteProjectClips(m_invalidClipDialog->getIds(), QMap ()); + delete m_invalidClipDialog; + m_invalidClipDialog = NULL; } - if (replace) - emit deleteProjectClips(QStringList() << id, QMap ()); + } } diff --git a/src/projectlist.h b/src/projectlist.h index 9d7727f2..98f9b7d6 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -47,6 +48,7 @@ #include "kdenlivesettings.h" #include "folderprojectitem.h" #include "subprojectitem.h" +#include namespace Mlt { @@ -70,6 +72,19 @@ const int NameRole = Qt::UserRole; const int DurationRole = NameRole + 1; const int UsageRole = NameRole + 2; +class InvalidDialog: public KDialog +{ + Q_OBJECT +public: + InvalidDialog(const QString &caption, const QString &message, bool infoOnly, QWidget *parent = 0); + virtual ~InvalidDialog(); + void addClip(const QString &id, const QString &path); + QStringList getIds() const; +private: + QListWidget *m_clipList; +}; + + class ItemDelegate: public QStyledItemDelegate { public: @@ -293,6 +308,7 @@ private: bool m_abortAllProxies; QList m_proxyList; QFutureSynchronizer m_proxyThreads; + InvalidDialog *m_invalidClipDialog; void requestClipThumbnail(const QString id); -- 2.39.2