]> git.sesse.net Git - kdenlive/commitdiff
* Cleanup folder creation
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 25 Jan 2009 19:38:10 +0000 (19:38 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 25 Jan 2009 19:38:10 +0000 (19:38 +0000)
* save & restore all folders (including empty ones):
http://www.kdenlive.org:80/mantis/view.php?id=611

svn path=/branches/KDE4/; revision=2961

src/addfoldercommand.cpp
src/addfoldercommand.h
src/clipmanager.cpp
src/clipmanager.h
src/editfoldercommand.cpp
src/editfoldercommand.h
src/kdenlivedoc.cpp
src/kdenlivedoc.h
src/mainwindow.cpp
src/projectlist.cpp
src/projectlist.h

index 7b881c5daf3c7dd87b6b6fe81fe0e3763d171eeb..3d7d98a343e92238ad7c8d559e02c0b5e8a0590b 100644 (file)
 #include <KLocale>
 
 #include "addfoldercommand.h"
-#include "kdenlivedoc.h"
+#include "projectlist.h"
 
-AddFolderCommand::AddFolderCommand(KdenliveDoc *doc, const QString folderName, const QString &clipId, bool doIt)
-        : m_doc(doc), m_name(folderName), m_id(clipId), m_doIt(doIt) {
+AddFolderCommand::AddFolderCommand(ProjectList *view, const QString folderName, const QString &clipId, bool doIt, QUndoCommand *parent) : QUndoCommand(parent), m_view(view), m_name(folderName), m_id(clipId), m_doIt(doIt) {
     if (doIt) setText(i18n("Add folder"));
     else setText(i18n("Delete folder"));
 }
 
 // virtual
 void AddFolderCommand::undo() {
-    if (m_doIt) m_doc->deleteFolder(m_name, m_id);
-    else m_doc->addFolder(m_name, m_id, false);
+    if (m_doIt) m_view->slotAddFolder(m_name, m_id, true);
+    else m_view->slotAddFolder(m_name, m_id, false);
 }
 // virtual
 void AddFolderCommand::redo() {
-    if (m_doIt) m_doc->addFolder(m_name, m_id, false);
-    else m_doc->deleteFolder(m_name, m_id);
+    if (m_doIt) m_view->slotAddFolder(m_name, m_id, false);
+    else m_view->slotAddFolder(m_name, m_id, true);
 }
 
 
index b7d4cc966a11ba4d66f82a84471a3aae5e9b1fd6..0e4860e1d79d566b44a6483459e66a9d53378e07 100644 (file)
 
 #include <QUndoCommand>
 
-class KdenliveDoc;
+class ProjectList;
 
 class AddFolderCommand : public QUndoCommand {
 public:
-    AddFolderCommand(KdenliveDoc *doc, const QString folderName, const QString &clipId, bool doIt);
+    AddFolderCommand(ProjectList *view, const QString folderName, const QString &clipId, bool doIt, QUndoCommand *parent = 0);
 
     virtual void undo();
     virtual void redo();
 
 private:
-    KdenliveDoc *m_doc;
+    ProjectList *m_view;
     QString m_name;
     QString m_id;
     bool m_doIt;
index 379eaaba5835116a24a20bd06df25bede15558ee..f0f3a1fc25ace03f188c3bc3156fe534121bf4af 100644 (file)
@@ -95,10 +95,14 @@ void ClipManager::setThumbsProgress(const QString &message, int progress) {
     m_doc->setThumbsProgress(message, progress);
 }
 
-QList <DocClipBase*> ClipManager::documentClipList() {
+QList <DocClipBase*> ClipManager::documentClipList() const {
     return m_clipList;
 }
 
+QMap <QString, QString> ClipManager::documentFolderList() const {
+    return m_folderList;
+}
+
 void ClipManager::addClip(DocClipBase *clip) {
     m_clipList.append(clip);
     const QString id = clip->getId();
@@ -316,5 +320,10 @@ QString ClipManager::projectFolder() const {
     return m_doc->projectFolder().path();
 }
 
+void ClipManager::addFolder(const QString &id, const QString &name) {
+    m_folderList.insert(id, name);
+}
 
-
+void ClipManager::deleteFolder(const QString &id) {
+    m_folderList.remove(id);
+}
\ No newline at end of file
index d84a5bc58101b16004f598cfbccc0792bbff66b5..2b224521a0941488aaa1c578a368a0c4ffcee83f 100644 (file)
@@ -62,7 +62,8 @@ Q_OBJECT public:
     void slotDeleteClip(const QString & clipId);
     void setThumbsProgress(const QString &message, int progress);
     void checkAudioThumbs();
-    QList <DocClipBase*> documentClipList();
+    QList <DocClipBase*> documentClipList() const;
+    QMap <QString, QString> documentFolderList() const;
     int getFreeClipId();
     int getFreeFolderId();
     int lastClipId() const;
@@ -71,6 +72,8 @@ Q_OBJECT public:
     void askForAudioThumb(const QString &id);
     QString projectFolder() const;
     void resetProducersList(QList <Mlt::Producer *> prods);
+    void addFolder(const QString&, const QString&);
+    void deleteFolder(const QString&);
 
 public slots:
     void updatePreviewSettings();
@@ -78,6 +81,7 @@ public slots:
 private:   // Private attributes
     /** the list of clips in the document */
     QList <DocClipBase*> m_clipList;
+    QMap <QString, QString> m_folderList;
     QList <QString> m_audioThumbsQueue;
     /** the document undo stack*/
     KdenliveDoc *m_doc;
index d54af57e47c540702449bf9d84d0064e92eb95e8..ffc3b877fbc09659bdde5ee408eb013e5a23ca54 100644 (file)
 #include <KLocale>
 
 #include "editfoldercommand.h"
-#include "kdenlivedoc.h"
+#include "projectlist.h"
 
-EditFolderCommand::EditFolderCommand(KdenliveDoc *doc, const QString newfolderName, const QString oldfolderName, const QString &clipId, bool doIt)
-        : m_doc(doc), m_name(newfolderName), m_oldname(oldfolderName), m_id(clipId), m_doIt(doIt) {
+EditFolderCommand::EditFolderCommand(ProjectList *view, const QString newfolderName, const QString oldfolderName, const QString &clipId, bool doIt, QUndoCommand *parent) : QUndoCommand(parent), m_view(view), m_name(newfolderName), m_oldname(oldfolderName), m_id(clipId), m_doIt(doIt) {
     setText(i18n("Rename folder"));
 }
 
 // virtual
 void EditFolderCommand::undo() {
-    m_doc->addFolder(m_oldname, m_id, true);
+    m_view->slotAddFolder(m_oldname, m_id, false, true);
 }
 // virtual
 void EditFolderCommand::redo() {
-    if (m_doIt) m_doc->addFolder(m_name, m_id, true);
+    if (m_doIt) m_view->slotAddFolder(m_name, m_id, false, true);
     m_doIt = true;
 }
 
index a264df57a7e48f31992b86217c65669f60e49c9f..17889558f2437aebbf7cebf4e9637098f4eb7fbc 100644 (file)
 
 #include <QUndoCommand>
 
-class KdenliveDoc;
+class ProjectList;
 
 class EditFolderCommand : public QUndoCommand {
 public:
-    EditFolderCommand(KdenliveDoc *doc, const QString newfolderName, const QString oldfolderName, const QString &clipId, bool doIt);
+    EditFolderCommand(ProjectList *view, const QString newfolderName, const QString oldfolderName, const QString &clipId, bool doIt, QUndoCommand *parent = 0);
 
     virtual void undo();
     virtual void redo();
 
 private:
-    KdenliveDoc *m_doc;
+    ProjectList *m_view;
     QString m_name;
     QString m_oldname;
     QString m_id;
index bc7d7e4ef48ca798fd0aa7364cc6687f5aa847fe..b88cedae952a436af71ce1ae571b14b555b65313 100644 (file)
@@ -38,8 +38,6 @@
 #include "kdenlivesettings.h"
 #include "renderer.h"
 #include "clipmanager.h"
-#include "addfoldercommand.h"
-#include "editfoldercommand.h"
 #include "titlewidget.h"
 #include "mainwindow.h"
 
@@ -117,6 +115,12 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup
                     const int max = producers.count();
                     const int infomax = infoproducers.count();
 
+                    QDomNodeList folders = m_document.elementsByTagName("folder");
+                    for (int i = 0; i < folders.count(); i++) {
+                        e = folders.item(i).cloneNode().toElement();
+                        m_clipManager->addFolder(e.attribute("id"), e.attribute("name"));
+                    }
+
                     if (max > 0) {
                         m_documentLoadingStep = 100.0 / (max + infomax + m_document.elementsByTagName("entry").count());
                         parent->slotGotProgressInfo(i18n("Loading project clips"), (int) m_documentLoadingProgress);
@@ -881,6 +885,19 @@ bool KdenliveDoc::saveSceneList(const QString &path, QDomDocument sceneList) {
     addedXml.setAttribute("tracks", getTracksInfo());
     addedXml.setAttribute("zoom", m_zoom);
 
+    // save project folders
+    QMap <QString, QString> folderlist = m_clipManager->documentFolderList();
+
+    QMapIterator<QString, QString> f(folderlist);
+    while (f.hasNext()) {
+        f.next();
+        QDomElement folder = sceneList.createElement("folder");
+        folder.setAttribute("id", f.key());
+        folder.setAttribute("name", f.value());
+        addedXml.appendChild(folder);
+    }
+
+    // Save project clips
     QDomElement e;
     QList <DocClipBase*> list = m_clipManager->documentClipList();
     for (int i = 0; i < list.count(); i++) {
@@ -1349,14 +1366,6 @@ void KdenliveDoc::addClipInfo(QDomElement elem, QDomElement orig, QString clipId
     }
 }
 
-void KdenliveDoc::addFolder(const QString foldername, const QString &clipId, bool edit) {
-    emit addProjectFolder(foldername, clipId, false, edit);
-}
-
-void KdenliveDoc::deleteFolder(const QString foldername, const QString &clipId) {
-    emit addProjectFolder(foldername, clipId, true);
-}
-
 void KdenliveDoc::deleteProjectClip(QList <QString> ids) {
     for (int i = 0; i < ids.size(); ++i) {
         emit deleteTimelineClip(ids.at(i));
@@ -1365,15 +1374,6 @@ void KdenliveDoc::deleteProjectClip(QList <QString> ids) {
     setModified(true);
 }
 
-void KdenliveDoc::deleteProjectFolder(QMap <QString, QString> map) {
-    QMapIterator<QString, QString> i(map);
-    while (i.hasNext()) {
-        i.next();
-        slotDeleteFolder(i.key(), i.value());
-    }
-    setModified(true);
-}
-
 void KdenliveDoc::deleteClip(const QString &clipId) {
     emit signalDeleteProjectClip(clipId);
     m_clipManager->deleteClip(clipId);
@@ -1393,24 +1393,6 @@ void KdenliveDoc::slotAddClipFile(const KUrl url, const QString group, const QSt
     setModified(true);
 }
 
-void KdenliveDoc::slotAddFolder(const QString folderName) {
-    AddFolderCommand *command = new AddFolderCommand(this, folderName, QString::number(m_clipManager->getFreeFolderId()), true);
-    commandStack()->push(command);
-    setModified(true);
-}
-
-void KdenliveDoc::slotDeleteFolder(const QString folderName, const QString &id) {
-    AddFolderCommand *command = new AddFolderCommand(this, folderName, id, false);
-    commandStack()->push(command);
-    setModified(true);
-}
-
-void KdenliveDoc::slotEditFolder(const QString newfolderName, const QString oldfolderName, const QString &clipId) {
-    EditFolderCommand *command = new EditFolderCommand(this, newfolderName, oldfolderName, clipId, false);
-    commandStack()->push(command);
-    setModified(true);
-}
-
 const QString&KdenliveDoc::getFreeClipId() {
     return QString::number(m_clipManager->getFreeClipId());
 }
index ccc4ba6072c9d4f26765ad682a4acf92bf7d87bb..29cd402b7e6954975511f7057a12006edcbefb03 100644 (file)
@@ -70,13 +70,8 @@ Q_OBJECT public:
     ClipManager *clipManager();
     void addClip(QDomElement elem, QString clipId, bool createClipItem = true);
     void addClipInfo(QDomElement elem, QDomElement orig, QString clipId);
-    void addFolder(const QString foldername, const QString &clipId, bool edit);
-    void deleteFolder(const QString foldername, const QString &clipId);
     void slotAddClipFile(const KUrl url, const QString group, const QString &groupId = QString());
     void slotAddClipList(const KUrl::List urls, const QString group, const QString &groupId = QString());
-    void slotAddFolder(const QString folderName);
-    void slotDeleteFolder(const QString folderName, const QString &id);
-    void slotEditFolder(const QString folderName, const QString oldfolderName, const QString &clipId);
     void slotAddColorClipFile(const QString name, const QString color, QString duration, const QString group, const QString &groupId = QString());
     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 = QString());
     void deleteClip(const QString &clipId);
@@ -84,7 +79,6 @@ Q_OBJECT public:
     DocClipBase *getBaseClip(const QString &clipId);
     void updateClip(const QString &id);
     void deleteProjectClip(QList <QString> ids);
-    void deleteProjectFolder(QMap <QString, QString> map);
     /** Inform application of the audio thumbnails generation progress */
     void setThumbsProgress(const QString &message, int progress);
     QString profilePath() const;
@@ -171,7 +165,6 @@ private slots:
 
 signals:
     void addProjectClip(DocClipBase *, bool getInfo = true);
-    void addProjectFolder(const QString, const QString &, bool, bool edit = false);
     void signalDeleteProjectClip(const QString &);
     void updateClipDisplay(const QString&);
     void deleteTimelineClip(const QString&);
index cde2f9d47d6a9c2b80ef3abb18e1e2458fee6ec4..b74b6c19995d25d1cf2b552aa6f7d117fc61b09d 100644 (file)
@@ -1528,7 +1528,6 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) { //cha
 
             disconnect(m_activeDocument, SIGNAL(guidesUpdated()), this, SLOT(slotGuidesUpdated()));
             disconnect(m_activeDocument, SIGNAL(addProjectClip(DocClipBase *, bool)), m_projectList, SLOT(slotAddClip(DocClipBase *, bool)));
-            disconnect(m_activeDocument, SIGNAL(addProjectFolder(const QString, const QString &, bool, bool)), m_projectList, SLOT(slotAddFolder(const QString, const QString &, bool, bool)));
             disconnect(m_activeDocument, SIGNAL(signalDeleteProjectClip(const QString &)), m_projectList, SLOT(slotDeleteClip(const QString &)));
             disconnect(m_activeDocument, SIGNAL(updateClipDisplay(const QString &)), m_projectList, SLOT(slotUpdateClip(const QString &)));
             disconnect(m_activeDocument, SIGNAL(selectLastAddedClip(const QString &)), m_projectList, SLOT(slotSelectClip(const QString &)));
@@ -1583,7 +1582,6 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) { //cha
     connect(m_projectMonitor, SIGNAL(zoneUpdated(QPoint)), trackView, SLOT(slotSetZone(QPoint)));
     connect(m_projectMonitor, SIGNAL(durationChanged(int)), trackView, SLOT(setDuration(int)));
     connect(doc, SIGNAL(addProjectClip(DocClipBase *, bool)), m_projectList, SLOT(slotAddClip(DocClipBase *, bool)));
-    connect(doc, SIGNAL(addProjectFolder(const QString, const QString &, bool, bool)), m_projectList, SLOT(slotAddFolder(const QString, const QString &, bool, bool)));
     connect(doc, SIGNAL(signalDeleteProjectClip(const QString &)), m_projectList, SLOT(slotDeleteClip(const QString &)));
     connect(doc, SIGNAL(updateClipDisplay(const QString &)), m_projectList, SLOT(slotUpdateClip(const QString &)));
     connect(doc, SIGNAL(selectLastAddedClip(const QString &)), m_projectList, SLOT(slotSelectClip(const QString &)));
index 5d119f54850c2833734d97bd1022daeb831c7d4a..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"
@@ -52,6 +51,7 @@
 #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) {
@@ -215,8 +215,9 @@ void ProjectList::slotItemEdited(QTreeWidgetItem *item, int column) {
         }
     } else if (column == 1) {
         if (clip->isGroup()) {
-            m_doc->slotEditFolder(item->text(1), clip->groupName(), clip->clipId());
+            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));
@@ -269,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);
@@ -293,52 +294,65 @@ 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) {
-            ProjectItem *item;
+            ProjectItem *item = getFolderItemById(clipId);
             QTreeWidgetItemIterator it(listView);
-            while (*it) {
-                item = static_cast <ProjectItem *>(*it);
-                if (item->isGroup() && item->clipId() == clipId) {
-                    listView->blockSignals(true);
-                    item->setGroupName(foldername);
-                    listView->blockSignals(false);
-                    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;
             }
         } 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);
@@ -567,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);
index edbbd13ae8abcfaf6a30772e5cbd2f841485607a..9e4452bebb322791891a7d34be1603ad5f9d2a2c 100644 (file)
@@ -129,6 +129,7 @@ public slots:
     void slotSelectClip(const QString &ix);
     void slotRemoveClip();
     void slotAddClip(KUrl givenUrl = KUrl(), QString group = QString());
+    void slotAddFolder(const QString foldername, const QString &clipId, bool remove, bool edit = false);
 
 private:
     ProjectListView *listView;
@@ -153,6 +154,8 @@ private:
     void requestClipInfo(const QDomElement xml, const QString id);
     QList <QString> m_thumbnailQueue;
     void requestClipThumbnail(const QString &id);
+    void deleteProjectFolder(QMap <QString, QString> map);
+    void editFolder(const QString folderName, const QString oldfolderName, const QString &clipId);
 
 private slots:
     void slotEditClip();
@@ -162,7 +165,6 @@ private slots:
     void slotAddTitleClip();
     void slotContextMenu(const QPoint &pos, QTreeWidgetItem *);
     void slotAddFolder();
-    void slotAddFolder(const QString foldername, const QString &clipId, bool remove, bool edit);
     /** This is triggered when a clip description has been modified */
     void slotItemEdited(QTreeWidgetItem *item, int column);
     void slotUpdateClipProperties(ProjectItem *item, QMap <QString, QString> properties);