From e4648e65755d8939c6f670488397a71671fb3285 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Mon, 9 Jan 2012 22:28:24 +0100 Subject: [PATCH] Support dropping a folder in project tree (import all its clips): http://kdenlive.org/mantis/view.php?id=1288 --- src/kdenlivedoc.h | 4 ++-- src/projectlist.cpp | 57 ++++++++++++++++++++++++++++++++++++++------- src/projectlist.h | 3 ++- 3 files changed, 53 insertions(+), 11 deletions(-) diff --git a/src/kdenlivedoc.h b/src/kdenlivedoc.h index 006b6007..2e241148 100644 --- a/src/kdenlivedoc.h +++ b/src/kdenlivedoc.h @@ -83,8 +83,8 @@ Q_OBJECT public: * * If the clip wasn't added before, it tries to add it to the project. */ bool addClipInfo(QDomElement elem, QDomElement orig, QString clipId); - void slotAddClipFile(const KUrl &url, const QString &group, const QString &groupId = QString(), const QString &comment = QString()); - void slotAddClipList(const KUrl::List urls, const QString &group, const QString &groupId = QString()); + void slotAddClipFile(const KUrl &url, const QString &group = QString(), const QString &groupId = QString(), const QString &comment = QString()); + void slotAddClipList(const KUrl::List urls, const QString &group = QString(), const QString &groupId = QString()); void deleteClip(const QString &clipId); int getFramePos(QString duration); DocClipBase *getBaseClip(const QString &clipId); diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 95c06db0..ed21467e 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -1193,9 +1193,9 @@ void ProjectList::editFolder(const QString folderName, const QString oldfolderNa m_doc->setModified(true); } -void ProjectList::slotAddFolder() +void ProjectList::slotAddFolder(const QString &name) { - AddFolderCommand *command = new AddFolderCommand(this, i18n("Folder"), QString::number(m_doc->clipManager()->getFreeFolderId()), true); + AddFolderCommand *command = new AddFolderCommand(this, name.isEmpty() ? i18n("Folder") : name, QString::number(m_doc->clipManager()->getFreeFolderId()), true); m_commandStack->push(command); } @@ -1665,25 +1665,53 @@ void ProjectList::slotAddClip(const QList givenList, const QString &group for (int i = 0; i < givenList.count(); i++) list << givenList.at(i); } + QList foldersList; foreach(const KUrl & file, list) { // Check there is no folder here KMimeType::Ptr type = KMimeType::findByUrl(file); if (type->is("inode/directory")) { - // user dropped a folder + // user dropped a folder, import its files list.removeAll(file); + QDir dir(file.path()); + QStringList result = dir.entryList(QDir::Files); + KUrl::List folderFiles; + folderFiles << file; + foreach(const QString & path, result) { + KUrl newFile = file; + newFile.addPath(path); + folderFiles.append(newFile); + } + if (folderFiles.count() > 1) foldersList.append(folderFiles); } } - if (list.isEmpty()) - return; - - if (givenList.isEmpty()) { + if (givenList.isEmpty() && !list.isEmpty()) { QStringList groupInfo = getGroup(); m_doc->slotAddClipList(list, groupInfo.at(0), groupInfo.at(1)); - } else { + } else if (!list.isEmpty()) { m_doc->slotAddClipList(list, groupName, groupId); } + + if (!foldersList.isEmpty()) { + // create folders + for (int i = 0; i < foldersList.count(); i++) { + KUrl::List urls = foldersList.at(i); + KUrl folderUrl = urls.takeFirst(); + QString folderName = folderUrl.fileName(); + FolderProjectItem *folder = NULL; + if (!folderName.isEmpty()) { + folder = getFolderItemByName(folderName); + if (folder == NULL) { + slotAddFolder(folderName); + folder = getFolderItemByName(folderName); + } + } + if (folder) + m_doc->slotAddClipList(urls, folder->groupName(), folder->clipId()); + else m_doc->slotAddClipList(urls); + } + } } void ProjectList::slotRemoveInvalidClip(const QString &id, bool replace) @@ -2291,6 +2319,19 @@ ProjectItem *ProjectList::getItemById(const QString &id) return NULL; } +FolderProjectItem *ProjectList::getFolderItemByName(const QString &name) +{ + FolderProjectItem *item = NULL; + QList hits = m_listView->findItems(name, Qt::MatchExactly, 0); + for (int i = 0; i < hits.count(); i++) { + if (hits.at(i)->type() == PROJECTFOLDERTYPE) { + item = static_cast(hits.at(i)); + break; + } + } + return item; +} + FolderProjectItem *ProjectList::getFolderItemById(const QString &id) { FolderProjectItem *item; diff --git a/src/projectlist.h b/src/projectlist.h index 7b0061a0..1f491e93 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -312,6 +312,7 @@ private: ProjectItem *getItemById(const QString &id); QTreeWidgetItem *getAnyItemById(const QString &id); FolderProjectItem *getFolderItemById(const QString &id); + FolderProjectItem *getFolderItemByName(const QString &name); QAction *m_openAction; QAction *m_reloadAction; QAction *m_discardCurrentClipJobs; @@ -402,7 +403,7 @@ private slots: void slotContextMenu(const QPoint &pos, QTreeWidgetItem *item); /** @brief Creates an AddFolderCommand. */ - void slotAddFolder(); + void slotAddFolder(const QString &name = QString()); /** @brief This is triggered when a clip description has been modified. */ void slotItemEdited(QTreeWidgetItem *item, int column); -- 2.39.5