From: Jean-Baptiste Mardelle Date: Sun, 25 Jan 2009 19:38:10 +0000 (+0000) Subject: * Cleanup folder creation X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=49bda928236824dd6b0b350ab0d1468b2af28f67;p=kdenlive * Cleanup folder creation * save & restore all folders (including empty ones): http://www.kdenlive.org:80/mantis/view.php?id=611 svn path=/branches/KDE4/; revision=2961 --- diff --git a/src/addfoldercommand.cpp b/src/addfoldercommand.cpp index 7b881c5d..3d7d98a3 100644 --- a/src/addfoldercommand.cpp +++ b/src/addfoldercommand.cpp @@ -20,23 +20,22 @@ #include #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); } diff --git a/src/addfoldercommand.h b/src/addfoldercommand.h index b7d4cc96..0e4860e1 100644 --- a/src/addfoldercommand.h +++ b/src/addfoldercommand.h @@ -23,17 +23,17 @@ #include -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; diff --git a/src/clipmanager.cpp b/src/clipmanager.cpp index 379eaaba..f0f3a1fc 100644 --- a/src/clipmanager.cpp +++ b/src/clipmanager.cpp @@ -95,10 +95,14 @@ void ClipManager::setThumbsProgress(const QString &message, int progress) { m_doc->setThumbsProgress(message, progress); } -QList ClipManager::documentClipList() { +QList ClipManager::documentClipList() const { return m_clipList; } +QMap 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 diff --git a/src/clipmanager.h b/src/clipmanager.h index d84a5bc5..2b224521 100644 --- a/src/clipmanager.h +++ b/src/clipmanager.h @@ -62,7 +62,8 @@ Q_OBJECT public: void slotDeleteClip(const QString & clipId); void setThumbsProgress(const QString &message, int progress); void checkAudioThumbs(); - QList documentClipList(); + QList documentClipList() const; + QMap 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 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 m_clipList; + QMap m_folderList; QList m_audioThumbsQueue; /** the document undo stack*/ KdenliveDoc *m_doc; diff --git a/src/editfoldercommand.cpp b/src/editfoldercommand.cpp index d54af57e..ffc3b877 100644 --- a/src/editfoldercommand.cpp +++ b/src/editfoldercommand.cpp @@ -20,20 +20,19 @@ #include #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; } diff --git a/src/editfoldercommand.h b/src/editfoldercommand.h index a264df57..17889558 100644 --- a/src/editfoldercommand.h +++ b/src/editfoldercommand.h @@ -23,17 +23,17 @@ #include -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; diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index bc7d7e4e..b88cedae 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -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 folderlist = m_clipManager->documentFolderList(); + + QMapIterator 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 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 ids) { for (int i = 0; i < ids.size(); ++i) { emit deleteTimelineClip(ids.at(i)); @@ -1365,15 +1374,6 @@ void KdenliveDoc::deleteProjectClip(QList ids) { setModified(true); } -void KdenliveDoc::deleteProjectFolder(QMap map) { - QMapIterator 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()); } diff --git a/src/kdenlivedoc.h b/src/kdenlivedoc.h index ccc4ba60..29cd402b 100644 --- a/src/kdenlivedoc.h +++ b/src/kdenlivedoc.h @@ -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 ids); - void deleteProjectFolder(QMap 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&); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index cde2f9d4..b74b6c19 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -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 &))); diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 5d119f54..82f6aa31 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -38,12 +38,11 @@ #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 ()), m_thumbnailQueue(QList ()), 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 (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 (*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 (*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 (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 (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 map) { + QMapIterator 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 flist = doc->clipManager()->documentFolderList(); + QMapIterator f(flist); + while (f.hasNext()) { + f.next(); + (void) new ProjectItem(listView, QStringList() << QString() << f.value(), f.key()); + } + QList list = doc->clipManager()->documentClipList(); for (int i = 0; i < list.count(); i++) { slotAddClip(list.at(i), false); diff --git a/src/projectlist.h b/src/projectlist.h index edbbd13a..9e4452be 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -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 m_thumbnailQueue; void requestClipThumbnail(const QString &id); + void deleteProjectFolder(QMap 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 properties);