]> git.sesse.net Git - kdenlive/commitdiff
Allow editing of clip names again (for color, titles & slideshows), fix saving issue:
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 21 Jan 2009 21:50:28 +0000 (21:50 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 21 Jan 2009 21:50:28 +0000 (21:50 +0000)
http://www.kdenlive.org:80/mantis/view.php?id=589

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

src/clipitem.cpp
src/clipitem.h
src/customtrackview.cpp
src/customtrackview.h
src/docclipbase.cpp
src/docclipbase.h
src/mainwindow.cpp
src/projectlist.cpp
src/projectlist.h
src/projectlistview.cpp

index 361b0f14ca74a8010d0459db1a1c795164dd3f03..7a2e6e6ff0c13fb9cda9f6878bbd0cf7c9c97a90 100644 (file)
@@ -479,6 +479,10 @@ QString ClipItem::clipName() const {
     return m_clipName;
 }
 
+void ClipItem::setClipName(const QString &name) {
+    m_clipName = name;
+}
+
 const QString &ClipItem::clipProducer() const {
     return m_producer;
 }
index 7aa29fec23ada183c49c04061bcc6071d4a3d781..42c654cf51545cda01ba38be08eb15e2dc72143a 100644 (file)
@@ -53,6 +53,7 @@ public:
     int clipType() const;
     DocClipBase *baseClip() const;
     QString clipName() const;
+    void setClipName(const QString &name);
     QDomElement xml() const;
     ClipItem *clone(ItemInfo info) const;
     const EffectsList effectList();
index 7ba002bb220b099a4e401f6a5ec3d97d49155238..712500a94416f7d284aa22cba23d54a59203c199 100644 (file)
@@ -3365,4 +3365,18 @@ QStringList CustomTrackView::getLadspaParams(QDomElement effect) const {
     return result;
 }
 
+void CustomTrackView::clipNameChanged(const QString id, const QString name) {
+    QList<QGraphicsItem *> list = scene()->items();
+    ClipItem *clip = NULL;
+    for (int i = 0; i < list.size(); ++i) {
+        if (list.at(i)->type() == AVWIDGET) {
+            clip = static_cast <ClipItem *>(list.at(i));
+            if (clip->clipProducer() == id) {
+                clip->setClipName(name);
+            }
+        }
+    }
+    viewport()->update();
+}
+
 #include "customtrackview.moc"
index 046ef36e38d1c6c8e08cbecb0d2ab06e396881ae..f4bc7090c84776ec449b3fb2bc05a550f11aabc2 100644 (file)
@@ -142,6 +142,7 @@ public slots:
     void slotInsertTrack(int ix);
     void slotDeleteTrack(int ix);
     void slotChangeTrack(int ix);
+    void clipNameChanged(const QString id, const QString name);
 
 protected:
     virtual void drawBackground(QPainter * painter, const QRectF & rect);
index ddd2f32b36b2cbc0e34cf11356d8befe14a3815e..b2b26de81dc6c4e785cd650d7769b525ba1357eb 100644 (file)
@@ -28,7 +28,6 @@ DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, const QStrin
         m_id(id), m_description(QString()), m_refcount(0), m_audioThumbCreated(false), m_duration(GenTime()), m_thumbProd(NULL), m_audioTimer(NULL), m_properties(QMap <QString, QString> ()), audioFrameChache(QMap<int, QMap<int, QByteArray> > ()), m_baseTrackProducers(QList <Mlt::Producer *>()), m_snapMarkers(QList < CommentedTime > ())  {
     int type = xml.attribute("type").toInt();
     m_clipType = (CLIPTYPE) type;
-    m_name = xml.attribute("name");
 
     QDomNamedNodeMap attributes = xml.attributes();
     for (unsigned int i = 0; i < attributes.count(); i++) {
@@ -44,7 +43,7 @@ DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, const QStrin
         out = xml.attribute("duration").toInt();
         if (out != 0) setDuration(GenTime(out, KdenliveSettings::project_fps()));
     }
-    if (m_name.isEmpty()) m_name = url.fileName();
+    if (!m_properties.contains("name")) m_properties.insert("name", url.fileName());
 
     //if (!url.isEmpty() && QFile::exists(url.path()))
     {
@@ -107,13 +106,9 @@ bool DocClipBase::audioThumbCreated() const {
     return m_audioThumbCreated;
 }
 
-void DocClipBase::setName(const QString name) {
-    m_name = name;
-}
-
 const QString & DocClipBase::name() const {
 
-    return m_name;
+    return m_properties.value("name");
 }
 
 const QString &DocClipBase::getId() const {
index 4d68744f30d2e68273a1828b2bd8138ba2b418f4..5171bc5a3c5aa66187ca0cfcc844f7b996a018c6 100644 (file)
@@ -58,9 +58,6 @@ Q_OBJECT public:
 //    DocClipBase & operator=(const DocClipBase & clip);
     virtual ~ DocClipBase();
 
-    /** sets the name of this clip. */
-    void setName(const QString name);
-
     /** returns the name of this clip. */
     const QString & name() const;
 
@@ -172,8 +169,7 @@ Q_OBJECT public:
     void deleteProducers();
 
 private:   // Private attributes
-    /** The name of this clip */
-    QString m_name;
+
     /** A description of this clip */
     QString m_description;
     /** The number of times this clip is used in the project - the number of references to this clip
index e397d31469c0df5eb62b6fec6a3b04674347858d..cde2f9d47d6a9c2b80ef3abb18e1e2458fee6ec4 100644 (file)
@@ -1571,6 +1571,9 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) { //cha
     effectStack->updateProjectFormat(doc->mltProfile(), doc->timecode());
     connect(m_projectList, SIGNAL(clipSelected(DocClipBase *)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *)));
     connect(m_projectList, SIGNAL(projectModified()), doc, SLOT(setModified()));
+    connect(m_projectList, SIGNAL(clipNameChanged(const QString, const QString)), trackView->projectView(), SLOT(clipNameChanged(const QString, const QString)));
+
+
     connect(trackView, SIGNAL(cursorMoved()), m_projectMonitor, SLOT(activateMonitor()));
     connect(trackView, SIGNAL(insertTrack(int)), this, SLOT(slotInsertTrack(int)));
     connect(trackView, SIGNAL(deleteTrack(int)), this, SLOT(slotDeleteTrack(int)));
index a249d8e530494f17d0a1d8f55c41cc3f54b197e7..5d119f54850c2833734d97bd1022daeb831c7d4a 100644 (file)
@@ -51,6 +51,7 @@
 #include "renderer.h"
 #include "kthumb.h"
 #include "projectlistview.h"
+#include "editclipcommand.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,35 @@ 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()) {
+            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));
+            }
+        } 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);
+            }
         }
     }
 }
@@ -286,13 +314,14 @@ void ProjectList::slotAddFolder(const QString foldername, const QString &clipId,
         }
     } else {
         if (edit) {
-            listView->blockSignals(true);
             ProjectItem *item;
             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));
@@ -302,7 +331,6 @@ void ProjectList::slotAddFolder(const QString foldername, const QString &clipId,
                 }
                 ++it;
             }
-            listView->blockSignals(false);
         } else {
             QStringList text;
             text << QString() << foldername;
@@ -313,6 +341,7 @@ void ProjectList::slotAddFolder(const QString foldername, const QString &clipId,
 
 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;
@@ -324,9 +353,7 @@ void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties) {
             //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 +377,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 +404,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 +431,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;
@@ -595,7 +631,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 +643,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,8 +656,10 @@ 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);
     }
 }
 
index fb65403b84f96bb60ddfbeba6ad47abf6b0cd24c..edbbd13ae8abcfaf6a30772e5cbd2f841485607a 100644 (file)
@@ -179,6 +179,7 @@ signals:
     void showClipProperties(DocClipBase *);
     void projectModified();
     void loadingIsOver();
+    void clipNameChanged(const QString, const QString);
 };
 
 #endif
index 74cafd6cb8b6c537fb00443290c5bd572ced7ae2..4e041938456a754c132e0b7b637a519020802c77 100644 (file)
@@ -115,7 +115,8 @@ void ProjectListView::mouseDoubleClickEvent(QMouseEvent * event) {
     else if (item->isGroup()) {
         if ((columnAt(event->pos().x()) == 1)) QTreeWidget::mouseDoubleClickEvent(event);
     } else {
-        if ((columnAt(event->pos().x()) == 2)) QTreeWidget::mouseDoubleClickEvent(event);
+        if ((columnAt(event->pos().x()) == 1) && (item->clipType() == SLIDESHOW || item->clipType() == TEXT || item->clipType() == COLOR)) QTreeWidget::mouseDoubleClickEvent(event);
+        else if ((columnAt(event->pos().x()) == 2)) QTreeWidget::mouseDoubleClickEvent(event);
         else emit showProperties(item->referencedClip());
     }
 }