]> git.sesse.net Git - kdenlive/commitdiff
improved communication between project tree and docclipbase
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 24 Mar 2008 12:44:56 +0000 (12:44 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 24 Mar 2008 12:44:56 +0000 (12:44 +0000)
svn path=/branches/KDE4/; revision=2114

src/clipproperties.cpp
src/clipproperties.h
src/docclipbase.cpp
src/docclipbase.h
src/mainwindow.cpp
src/projectitem.cpp
src/projectitem.h
src/projectlist.cpp
src/projectlist.h
src/projectlistview.cpp

index 10227527b173e9106df53996c72fe0404c4f50ea..9118efc54a0fc99b91f78ee084d6ee79267bb267 100644 (file)
@@ -68,6 +68,16 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg
     adjustSize();
 }
 
+int ClipProperties::clipId() {
+    return m_clip->getId();
+}
+
+QMap <QString, QString> ClipProperties::properties() {
+    QMap <QString, QString> props;
+    props["description"] = m_view.clip_description->text();
+    return props;
+}
+
 #include "clipproperties.moc"
 
 
index a02d5db41bb7fdb75a4f5d60e10bdfbdf3bca01e..c49f8b1f084075a13967db26d8ad412bececde21 100644 (file)
@@ -33,7 +33,8 @@ class ClipProperties : public QDialog {
 
 public:
     ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidget * parent = 0);
-
+    QMap <QString, QString> properties();
+    int clipId();
 
 private slots:
 
index 344d692df825c29012c0f1701b5c82fc6f34093a..b96cdf58359c510063226a96398b15a9cb8df76d 100644 (file)
 #include "clipmanager.h"
 
 DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, uint id):
-        m_xml(xml), m_id(id), m_description(""), m_refcount(0), m_projectThumbFrame(0), m_audioThumbCreated(false), m_duration(GenTime()), m_thumbProd(NULL), m_audioTimer(NULL) {
+        m_id(id), m_description(QString()), m_refcount(0), m_projectThumbFrame(0), m_audioThumbCreated(false), m_duration(GenTime()), m_thumbProd(NULL), m_audioTimer(NULL) {
     int type = xml.attribute("type").toInt();
     m_clipType = (CLIPTYPE) type;
     m_name = xml.attribute("name");
-    m_xml.setAttribute("id", QString::number(id));
+    m_id = id;
+
+    QDomNamedNodeMap attributes = xml.attributes();
+    for (unsigned int i = 0; i < attributes.count(); i++) {
+        m_properties.insert(attributes.item(i).nodeName(), attributes.item(i).nodeValue());
+    }
+
     KUrl url = KUrl(xml.attribute("resource"));
     int out = xml.attribute("out").toInt();
-    if (out != 0) setDuration(GenTime(out, 25));
+    if (out != 0) {
+        setDuration(GenTime(out, 25));
+        //m_properties.insert("out", QString::number(out));
+    }
     if (m_name.isEmpty()) m_name = url.fileName();
 
     if (!url.isEmpty()) {
@@ -43,22 +52,22 @@ DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, uint id):
 
 
 DocClipBase::DocClipBase(const DocClipBase& clip) {
-    m_xml = clip.toXML();
     m_id = clip.getId();
     m_clipType = clip.clipType();
     m_name = clip.name();
     m_duration = clip.duration();
     m_audioThumbCreated = clip.audioThumbCreated();
+    m_properties = clip.properties();
 }
 
 DocClipBase & DocClipBase::operator=(const DocClipBase & clip) {
     DocClipBase::operator=(clip);
-    m_xml = clip.toXML();
     m_id = clip.getId();
     m_clipType = clip.clipType();
     m_name = clip.name();
     m_duration = clip.duration();
     m_audioThumbCreated = clip.audioThumbCreated();
+    m_properties = clip.properties();
     return *this;
 }
 
@@ -82,11 +91,6 @@ void DocClipBase::slotClearAudioCache() {
     m_audioThumbCreated = false;
 }
 
-void DocClipBase::setGroup(const QString name, const QString id) {
-    m_xml.setAttribute("groupname", name);
-    m_xml.setAttribute("groupid", id);
-}
-
 KThumb *DocClipBase::thumbProducer() {
     return m_thumbProd;
 }
@@ -123,7 +127,7 @@ void DocClipBase::setClipType(CLIPTYPE type) {
 }
 
 KUrl DocClipBase::fileURL() const {
-    QString res = m_xml.attribute("resource");
+    QString res = m_properties.value("resource");
     if (m_clipType != COLOR && !res.isEmpty()) return KUrl(res);
     return KUrl();
 }
@@ -136,12 +140,8 @@ uint DocClipBase::getProjectThumbFrame() const {
     return m_projectThumbFrame;
 }
 
-void DocClipBase::setDescription(const QString & description) {
-    m_description = description;
-}
-
-const QString & DocClipBase::description() const {
-    return m_description;
+const QString DocClipBase::description() const {
+    return m_properties.value("description");
 }
 
 void DocClipBase::setDuration(GenTime dur) {
@@ -159,15 +159,18 @@ bool DocClipBase::hasFileSize() const {
 
 // virtual
 QDomElement DocClipBase::toXML() const {
-    /*
-        QDomDocument doc;
+    QDomDocument doc;
+
+    QDomElement clip = doc.createElement("producer");
 
-        QDomElement clip = doc.createElement("kdenliveclip");
-        QDomText text = doc.createTextNode(description());
-        clip.appendChild(text);
-        doc.appendChild(clip);
-    */
-    return m_xml;
+    QMapIterator<QString, QString> i(m_properties);
+    while (i.hasNext()) {
+        i.next();
+        if (!i.value().isEmpty()) clip.setAttribute(i.key(), i.value());
+    }
+    //doc.appendChild(clip);
+    //kDebug()<<"/// CLIP XML: "<<doc.toString();
+    return clip;
 }
 
 DocClipBase *DocClipBase::
@@ -208,7 +211,9 @@ createClip(KdenliveDoc *doc, const QDomElement & element) {
         endl;
     } else {
         // setup DocClipBase specifics of the clip.
-        clip->setDescription(description);
+        QMap <QString, QString> props;
+        props.insert("description", description);
+        clip->setProperties(props);
         clip->setAudioThumbCreated(false);
     }
     return clip;
@@ -351,10 +356,14 @@ QString DocClipBase::markerComment(GenTime t) {
 }
 
 void DocClipBase::setProperties(QMap <QString, QString> properties) {
-    m_properties = properties;
+    QMapIterator<QString, QString> i(properties);
+    while (i.hasNext()) {
+        i.next();
+        m_properties.insert(i.key(), i.value());
+    }
 }
 
-QMap <QString, QString> DocClipBase::properties() {
+QMap <QString, QString> DocClipBase::properties() const {
     return m_properties;
 }
 
index 693d8caa7b04a86fd6b06a2db59bc8600932b933..230b3d4baa398b52e0ed46b3e005f3b974fbbc2f 100644 (file)
@@ -82,11 +82,8 @@ Q_OBJECT public:
     /** returns the name of this clip. */
     const QString & name() const;
 
-    /** Sets the description for this clip. */
-    void setDescription(const QString & descripton);
-
     /** Returns the description of this clip. */
-    const QString description() const;
+    const QString description() const;
 
     /** Returns the internal unique id of the clip. */
     uint getId() const;
@@ -199,9 +196,6 @@ Q_OBJECT public:
     void slotRequestAudioThumbs();
     /** Free cache data */
     void slotClearAudioCache();
-    /** puts the clip in a group (used for folder grouping) */
-    void setGroup(const QString name, const QString id);
-
 
 private:   // Private attributes
     /** The name of this clip */
@@ -216,7 +210,6 @@ private:   // Private attributes
 
     /** A list of snap markers; these markers are added to a clips snap-to points, and are displayed as necessary. */
     QList < CommentedTime > m_snapMarkers;
-    QDomElement m_xml;
 
     /** A thumbnail for this clip */
     QPixmap m_thumbnail;
@@ -251,7 +244,7 @@ public slots:
     void setProjectThumbFrame(const uint &ix);
     uint getProjectThumbFrame() const;
     void setProperties(QMap <QString, QString> properties);
-    QMap <QString, QString> properties();
+    QMap <QString, QString> properties() const;
 
 signals:
     void getAudioThumbs();
index 9301dd634b06c31745ff364c6cd75aed25617813..51ee70b00f81000a2d0371bfba6103ddff67b4db 100644 (file)
@@ -894,7 +894,9 @@ void MainWindow::slotGotProgressInfo(KUrl url, int progress) {
 
 void MainWindow::slotShowClipProperties(DocClipBase *clip) {
     ClipProperties dia(clip, m_activeDocument->timecode(), m_activeDocument->fps(), this);
-    dia.exec();
+    if (dia.exec() == QDialog::Accepted) {
+        m_projectList->slotUpdateClipProperties(dia.clipId(), dia.properties());
+    }
 }
 
 void MainWindow::customEvent(QEvent* e) {
index 54fed84c178f1d233b491d0ba168bc1b27b2d288..3d7a98fee7a94ca1b5c15562b3e36d2a812fcfee 100644 (file)
@@ -143,10 +143,6 @@ void ProjectItem::setGroupName(const QString name) {
     m_groupName = name;
 }
 
-void ProjectItem::setGroup(const QString name, const QString id) {
-    if (m_clip) m_clip->setGroup(name, id);
-}
-
 QStringList ProjectItem::names() const {
     QStringList result;
     result.append(text(0));
@@ -173,8 +169,8 @@ void ProjectItem::changeDuration(int frames) {
     m_clip->setDuration(m_duration);
 }
 
-void ProjectItem::setDescription(const QString &desc) {
-    m_clip->setDescription(desc);
+void ProjectItem::setProperties(QMap <QString, QString> props) {
+    m_clip->setProperties(props);
 }
 
 DocClipBase *ProjectItem::referencedClip() {
index f08ac5f2849232ca14ce6d684c03c910c71cd70c..cffb513c225735489d443982ca57801664da5909 100644 (file)
@@ -52,10 +52,9 @@ public:
     const KUrl clipUrl() const;
     int clipMaxDuration() const;
     CLIPTYPE clipType() const;
-    void setGroup(const QString name, const QString id);
     void changeDuration(int frames);
     DocClipBase *referencedClip();
-    void setDescription(const QString &desc);
+    void setProperties(QMap <QString, QString> props);
 
 private:
     QDomElement m_element;
index f9279782fa2df545a890aec54bc12607359647f6..db1528d7aaa4344e5fb1923dcc221f8e6c3a7214 100644 (file)
@@ -109,7 +109,7 @@ ProjectList::ProjectList(QWidget *parent)
     connect(listView, SIGNAL(requestMenu(const QPoint &, QTreeWidgetItem *)), this, SLOT(slotContextMenu(const QPoint &, QTreeWidgetItem *)));
     connect(listView, SIGNAL(addClip()), this, SLOT(slotAddClip()));
     connect(listView, SIGNAL(addClip(QUrl, const QString &)), this, SLOT(slotAddClip(QUrl, const QString &)));
-    connect(listView, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotUpdateItemDescription(QTreeWidgetItem *, int)));
+    connect(listView, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotItemEdited(QTreeWidgetItem *, int)));
     connect(listView, SIGNAL(showProperties(DocClipBase *)), this, SIGNAL(showClipProperties(DocClipBase *)));
 
     m_listViewDelegate = new ItemDelegate(listView);
@@ -132,18 +132,32 @@ void ProjectList::slotClipSelected() {
     if (item && !item->isGroup()) emit clipSelected(item->toXml());
 }
 
-void ProjectList::slotUpdateItemDescription(QTreeWidgetItem *item, int column) {
-    ProjectItem *clip = static_cast <ProjectItem*>(item);
-    CLIPTYPE type = clip->clipType();
-    if (column == 2) {
+void ProjectList::slotUpdateClipProperties(int id, QMap <QString, QString> properties) {
+    ProjectItem *item = getItemById(id);
+    if (item) slotUpdateClipProperties(item, properties);
+}
+
+void ProjectList::slotUpdateClipProperties(ProjectItem *clip, QMap <QString, QString> properties) {
+    if (!clip) return;
+    clip->setProperties(properties);
+    if (properties.contains("description")) {
+        CLIPTYPE type = clip->clipType();
+        clip->setText(2, properties.value("description"));
         if (type == AUDIO || type == VIDEO || type == AV || type == IMAGE || type == PLAYLIST) {
             // Use Nepomuk system to store clip description
             Nepomuk::Resource f(clip->clipUrl().path());
-            if (f.isValid()) f.setDescription(item->text(2));
-            clip->setDescription(item->text(2));
-            kDebug() << "NEPOMUK, SETTING CLIP: " << clip->clipUrl().path() << ", TO TEXT: " << item->text(2);
+            if (f.isValid()) f.setDescription(properties.value("description"));
         }
-    } else if (column == 1 && type == FOLDER) {
+    }
+}
+
+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->clipType() == FOLDER) {
         m_doc->slotEditFolder(item->text(1), clip->groupName(), clip->clipId());
     }
 }
index 998ae510ff11e58adba0e462635a929535f9c7d6..80498cb6bf436e23561c06d0a68dffc8ec345f79 100644 (file)
@@ -106,6 +106,7 @@ public:
     void setRenderer(Render *projectRender);
 
     void addClip(const QStringList &name, const QDomElement &elem, const int clipId, const KUrl &url = KUrl(), const QString &group = QString::null, int parentId = -1);
+    void slotUpdateClipProperties(int id, QMap <QString, QString> properties);
 
 public slots:
     void setDocument(KdenliveDoc *doc);
@@ -144,7 +145,8 @@ private slots:
     void slotAddFolder();
     void slotAddFolder(const QString foldername, int clipId, bool remove, bool edit);
     /** This is triggered when a clip description has been modified */
-    void slotUpdateItemDescription(QTreeWidgetItem *item, int column);
+    void slotItemEdited(QTreeWidgetItem *item, int column);
+    void slotUpdateClipProperties(ProjectItem *item, QMap <QString, QString> properties);
     //void slotShowMenu(const QPoint &pos);
 
 
index f51c0b2330e5f9e4f0434aebec754b5d9cec639d..78721e5ea7ed7c29890a5a28b4c219781022f6d0 100644 (file)
@@ -159,7 +159,10 @@ void ProjectListView::dropEvent(QDropEvent *event) {
                         else clone = (ProjectItem*) takeTopLevelItem(indexOfTopLevelItem(it));
                         if (clone) {
                             item->addChild(clone);
-                            clone->setGroup(item->groupName(), QString::number(parentId));
+                            QMap <QString, QString> props;
+                            props.insert("groupname", item->groupName());
+                            props.insert("groupid", QString::number(parentId));
+                            clone->setProperties(props);
                         }
                     }
                 }