]> git.sesse.net Git - kdenlive/blobdiff - src/projectlist.cpp
* Cleanup folder creation
[kdenlive] / src / projectlist.cpp
index f9be438be27cbd484335239887a3a8ecce7fe7a7..82f6aa31ed7f021ca2f80708e864bb0ecb3406f9 100644 (file)
 
 #include "projectlist.h"
 #include "projectitem.h"
+#include "addfoldercommand.h"
 #include "kdenlivesettings.h"
 #include "slideshowclip.h"
 #include "ui_colorclip_ui.h"
 #include "titlewidget.h"
-
-
 #include "definitions.h"
 #include "clipmanager.h"
 #include "docclipbase.h"
@@ -51,6 +50,8 @@
 #include "renderer.h"
 #include "kthumb.h"
 #include "projectlistview.h"
+#include "editclipcommand.h"
+#include "editfoldercommand.h"
 
 ProjectList::ProjectList(QWidget *parent)
         : QWidget(parent), m_render(NULL), m_fps(-1), m_commandStack(NULL), m_selectedItem(NULL), m_infoQueue(QMap <QString, QDomElement> ()), m_thumbnailQueue(QList <QString> ()), m_refreshed(false) {
@@ -175,9 +176,17 @@ void ProjectList::slotUpdateClipProperties(const QString &id, QMap <QString, QSt
 void ProjectList::slotUpdateClipProperties(ProjectItem *clip, QMap <QString, QString> properties) {
     if (!clip) return;
     if (!clip->isGroup()) clip->setProperties(properties);
+    if (properties.contains("name")) {
+        listView->blockSignals(true);
+        clip->setText(1, properties.value("name"));
+        listView->blockSignals(false);
+        emit clipNameChanged(clip->clipId(), properties.value("name"));
+    }
     if (properties.contains("description")) {
         CLIPTYPE type = clip->clipType();
+        listView->blockSignals(true);
         clip->setText(2, properties.value("description"));
+        listView->blockSignals(false);
         if (KdenliveSettings::activate_nepomuk() && (type == AUDIO || type == VIDEO || type == AV || type == IMAGE || type == PLAYLIST)) {
             // Use Nepomuk system to store clip description
             Nepomuk::Resource f(clip->clipUrl().path());
@@ -195,16 +204,36 @@ void ProjectList::slotUpdateClipProperties(ProjectItem *clip, QMap <QString, QSt
 void ProjectList::slotItemEdited(QTreeWidgetItem *item, int column) {
     ProjectItem *clip = static_cast <ProjectItem*>(item);
     if (column == 2) {
-        QMap <QString, QString> props;
-        props["description"] = item->text(2);
-        slotUpdateClipProperties(clip, props);
-    } else if (column == 1 && clip->isGroup()) {
-        m_doc->slotEditFolder(item->text(1), clip->groupName(), clip->clipId());
-        clip->setGroupName(item->text(1));
-        const int children = item->childCount();
-        for (int i = 0; i < children; i++) {
-            ProjectItem *child = static_cast <ProjectItem *>(item->child(i));
-            child->setProperty("groupname", item->text(1));
+        if (clip->referencedClip()) {
+            QMap <QString, QString> oldprops;
+            QMap <QString, QString> newprops;
+            oldprops["description"] = clip->referencedClip()->getProperty("description");
+            newprops["description"] = item->text(2);
+            slotUpdateClipProperties(clip, newprops);
+            EditClipCommand *command = new EditClipCommand(this, clip->clipId(), oldprops, newprops, false);
+            m_commandStack->push(command);
+        }
+    } else if (column == 1) {
+        if (clip->isGroup()) {
+            editFolder(item->text(1), clip->groupName(), clip->clipId());
+            clip->setGroupName(item->text(1));
+            m_doc->clipManager()->addFolder(clip->clipId(), item->text(1));
+            const int children = item->childCount();
+            for (int i = 0; i < children; i++) {
+                ProjectItem *child = static_cast <ProjectItem *>(item->child(i));
+                child->setProperty("groupname", item->text(1));
+            }
+        } else {
+            if (clip->referencedClip()) {
+                QMap <QString, QString> oldprops;
+                QMap <QString, QString> newprops;
+                oldprops["name"] = clip->referencedClip()->getProperty("name");
+                newprops["name"] = item->text(1);
+                slotUpdateClipProperties(clip, newprops);
+                emit projectModified();
+                EditClipCommand *command = new EditClipCommand(this, clip->clipId(), oldprops, newprops, false);
+                m_commandStack->push(command);
+            }
         }
     }
 }
@@ -241,7 +270,7 @@ void ProjectList::slotRemoveClip() {
         }
     }
     if (!ids.isEmpty()) m_doc->deleteProjectClip(ids);
-    if (!folderids.isEmpty()) m_doc->deleteProjectFolder(folderids);
+    if (!folderids.isEmpty()) deleteProjectFolder(folderids);
     if (listView->topLevelItemCount() == 0) {
         m_editAction->setEnabled(false);
         m_deleteAction->setEnabled(false);
@@ -265,68 +294,80 @@ void ProjectList::slotDeleteClip(const QString &clipId) {
     }
 }
 
-void ProjectList::slotAddFolder() {
 
-    // QString folderName = KInputDialog::getText(i18n("New Folder"), i18n("Enter new folder name: "));
-    // if (folderName.isEmpty()) return;
-    m_doc->slotAddFolder(i18n("Folder")); //folderName);
+void ProjectList::editFolder(const QString folderName, const QString oldfolderName, const QString &clipId) {
+    EditFolderCommand *command = new EditFolderCommand(this, folderName, oldfolderName, clipId, false);
+    m_commandStack->push(command);
+    m_doc->setModified(true);
+}
+
+void ProjectList::slotAddFolder() {
+    AddFolderCommand *command = new AddFolderCommand(this, i18n("Folder"), QString::number(m_doc->clipManager()->getFreeFolderId()), true);
+    m_commandStack->push(command);
 }
 
 void ProjectList::slotAddFolder(const QString foldername, const QString &clipId, bool remove, bool edit) {
     if (remove) {
-        ProjectItem *item;
-        QTreeWidgetItemIterator it(listView);
-        while (*it) {
-            item = static_cast <ProjectItem *>(*it);
-            if (item->isGroup() && item->clipId() == clipId) {
-                delete item;
-                break;
-            }
-            ++it;
+        ProjectItem *item = getFolderItemById(clipId);
+        if (item) {
+            m_doc->clipManager()->deleteFolder(clipId);
+            delete item;
         }
     } else {
         if (edit) {
-            listView->blockSignals(true);
-            ProjectItem *item;
+            ProjectItem *item = getFolderItemById(clipId);
             QTreeWidgetItemIterator it(listView);
-            while (*it) {
-                item = static_cast <ProjectItem *>(*it);
-                if (item->isGroup() && item->clipId() == clipId) {
-                    item->setGroupName(foldername);
-                    const int children = item->childCount();
-                    for (int i = 0; i < children; i++) {
-                        ProjectItem *child = static_cast <ProjectItem *>(item->child(i));
-                        child->setProperty("groupname", foldername);
-                    }
-                    break;
+            if (item) {
+                listView->blockSignals(true);
+                item->setGroupName(foldername);
+                listView->blockSignals(false);
+                m_doc->clipManager()->addFolder(clipId, foldername);
+                const int children = item->childCount();
+                for (int i = 0; i < children; i++) {
+                    ProjectItem *child = static_cast <ProjectItem *>(item->child(i));
+                    child->setProperty("groupname", foldername);
                 }
-                ++it;
             }
-            listView->blockSignals(false);
         } else {
             QStringList text;
             text << QString() << foldername;
+            listView->blockSignals(true);
             (void) new ProjectItem(listView, text, clipId);
+            m_doc->clipManager()->addFolder(clipId, foldername);
+            listView->blockSignals(false);
         }
     }
 }
 
+
+
+void ProjectList::deleteProjectFolder(QMap <QString, QString> map) {
+    QMapIterator<QString, QString> i(map);
+    QUndoCommand *delCommand = new QUndoCommand();
+    delCommand->setText(i18n("Delete Folder"));
+    while (i.hasNext()) {
+        i.next();
+        new AddFolderCommand(this, i.key(), i.value(), false, delCommand);
+    }
+    m_commandStack->push(delCommand);
+    m_doc->setModified(true);
+}
+
 void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties) {
     if (getProperties) listView->setEnabled(false);
+    listView->blockSignals(true);
     const QString parent = clip->getProperty("groupid");
     //kDebug() << "Adding clip with groupid: " << parent;
     ProjectItem *item = NULL;
     if (!parent.isEmpty()) {
-        ProjectItem *parentitem = getItemById(parent);
+        ProjectItem *parentitem = getFolderItemById(parent);
         if (!parentitem) {
             QStringList text;
             QString groupName = clip->getProperty("groupname");
             //kDebug() << "Adding clip to new group: " << groupName;
             if (groupName.isEmpty()) groupName = i18n("Folder");
             text << QString() << groupName;
-            listView->blockSignals(true);
             parentitem = new ProjectItem(listView, text, parent);
-            listView->blockSignals(false);
         } else {
             //kDebug() << "Adding clip to existing group: " << parentitem->groupName();
         }
@@ -350,6 +391,7 @@ void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties) {
         }
         if (!annotation.isEmpty()) item->setText(2, annotation);
     }
+    listView->blockSignals(false);
 }
 
 void ProjectList::requestClipInfo(const QDomElement xml, const QString id) {
@@ -376,7 +418,9 @@ void ProjectList::slotProcessNextClipInQueue() {
 
 void ProjectList::slotUpdateClip(const QString &id) {
     ProjectItem *item = getItemById(id);
+    listView->blockSignals(true);
     if (item) item->setData(1, UsageRole, QString::number(item->numReferences()));
+    listView->blockSignals(false);
 }
 
 void ProjectList::updateAllClips() {
@@ -401,11 +445,17 @@ void ProjectList::updateAllClips() {
                 QString cachedPixmap = m_doc->projectFolder().path() + "/thumbs/" + item->getClipHash() + ".png";
                 if (QFile::exists(cachedPixmap)) {
                     //kDebug()<<"// USING CACHED PIX: "<<cachedPixmap;
+                    listView->blockSignals(true);
                     item->setIcon(0, QPixmap(cachedPixmap));
+                    listView->blockSignals(false);
                 } else requestClipThumbnail(item->clipId());
+                listView->blockSignals(true);
                 item->changeDuration(item->referencedClip()->producer()->get_playtime());
+                listView->blockSignals(false);
             }
+            listView->blockSignals(true);
             item->setData(1, UsageRole, QString::number(item->numReferences()));
+            listView->blockSignals(false);
             qApp->processEvents();
         }
         ++it;
@@ -531,6 +581,13 @@ void ProjectList::setDocument(KdenliveDoc *doc) {
     m_thumbnailQueue.clear();
     m_infoQueue.clear();
     m_refreshed = false;
+    QMap <QString, QString> flist = doc->clipManager()->documentFolderList();
+    QMapIterator<QString, QString> f(flist);
+    while (f.hasNext()) {
+        f.next();
+        (void) new ProjectItem(listView, QStringList() << QString() << f.value(), f.key());
+    }
+
     QList <DocClipBase*> list = doc->clipManager()->documentClipList();
     for (int i = 0; i < list.count(); i++) {
         slotAddClip(list.at(i), false);
@@ -595,7 +652,9 @@ void ProjectList::slotRefreshClipThumbnail(ProjectItem *item, bool update) {
         QPixmap pix;
         if (clip->clipType() == AUDIO) pix = KIcon("audio-x-generic").pixmap(QSize(width, height));
         else pix = item->referencedClip()->thumbProducer()->extractImage(item->referencedClip()->getClipThumbFrame(), width, height);
+        listView->blockSignals(true);
         item->setIcon(0, pix);
+        listView->blockSignals(false);
         m_doc->cachePixmap(item->getClipHash(), pix);
         if (update) emit projectModified();
         if (!m_thumbnailQueue.isEmpty()) QTimer::singleShot(300, this, SLOT(slotProcessNextThumbnail()));
@@ -605,9 +664,11 @@ void ProjectList::slotRefreshClipThumbnail(ProjectItem *item, bool update) {
 void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Producer *producer, const QMap < QString, QString > &properties, const QMap < QString, QString > &metadata) {
     ProjectItem *item = getItemById(clipId);
     if (item && producer) {
+        listView->blockSignals(true);
         item->setProperties(properties, metadata);
         item->referencedClip()->setProducer(producer);
         emit receivedClipDuration(clipId, item->clipMaxDuration());
+        listView->blockSignals(false);
     } else kDebug() << "////////  COULD NOT FIND CLIP TO UPDATE PRPS...";
     if (!m_infoQueue.isEmpty()) QTimer::singleShot(300, this, SLOT(slotProcessNextClipInQueue()));
     else listView->setEnabled(true);
@@ -616,28 +677,35 @@ void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Produce
 void ProjectList::slotReplyGetImage(const QString &clipId, int pos, const QPixmap &pix, int w, int h) {
     ProjectItem *item = getItemById(clipId);
     if (item) {
+        listView->blockSignals(true);
         item->setIcon(0, pix);
         m_doc->cachePixmap(item->getClipHash(), pix);
+        listView->blockSignals(false);
     }
 }
 
 ProjectItem *ProjectList::getItemById(const QString &id) {
+    ProjectItem *item;
     QTreeWidgetItemIterator it(listView);
     while (*it) {
-        if (((ProjectItem *)(*it))->clipId() == id)
-            return static_cast<ProjectItem *>(*it);
+        item = static_cast<ProjectItem *>(*it);
+        if (item->clipId() == id && item->clipType() != FOLDER)
+            return item;
         ++it;
     }
     return NULL;
-#ifdef USED_TO_BE_THIS
+}
+
+ProjectItem *ProjectList::getFolderItemById(const QString &id) {
+    ProjectItem *item;
+    QTreeWidgetItemIterator it(listView);
     while (*it) {
-        if (((ProjectItem *)(*it))->clipId() == id)
-            break;
+        item = static_cast<ProjectItem *>(*it);
+        if (item->clipId() == id && item->clipType() == FOLDER)
+            return item;
         ++it;
     }
-    if (*it) return ((ProjectItem *)(*it));
     return NULL;
-#endif
 }
 
 void ProjectList::slotSelectClip(const QString &ix) {