From d585bb6a24cdc320185e67eda9924ee09c8a8927 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Mon, 24 Mar 2008 12:44:56 +0000 Subject: [PATCH] improved communication between project tree and docclipbase svn path=/branches/KDE4/; revision=2114 --- src/clipproperties.cpp | 10 +++++++ src/clipproperties.h | 3 +- src/docclipbase.cpp | 65 +++++++++++++++++++++++------------------ src/docclipbase.h | 11 ++----- src/mainwindow.cpp | 4 ++- src/projectitem.cpp | 8 ++--- src/projectitem.h | 3 +- src/projectlist.cpp | 32 ++++++++++++++------ src/projectlist.h | 4 ++- src/projectlistview.cpp | 5 +++- 10 files changed, 87 insertions(+), 58 deletions(-) diff --git a/src/clipproperties.cpp b/src/clipproperties.cpp index 10227527..9118efc5 100644 --- a/src/clipproperties.cpp +++ b/src/clipproperties.cpp @@ -68,6 +68,16 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg adjustSize(); } +int ClipProperties::clipId() { + return m_clip->getId(); +} + +QMap ClipProperties::properties() { + QMap props; + props["description"] = m_view.clip_description->text(); + return props; +} + #include "clipproperties.moc" diff --git a/src/clipproperties.h b/src/clipproperties.h index a02d5db4..c49f8b1f 100644 --- a/src/clipproperties.h +++ b/src/clipproperties.h @@ -33,7 +33,8 @@ class ClipProperties : public QDialog { public: ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidget * parent = 0); - + QMap properties(); + int clipId(); private slots: diff --git a/src/docclipbase.cpp b/src/docclipbase.cpp index 344d692d..b96cdf58 100644 --- a/src/docclipbase.cpp +++ b/src/docclipbase.cpp @@ -23,14 +23,23 @@ #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 i(m_properties); + while (i.hasNext()) { + i.next(); + if (!i.value().isEmpty()) clip.setAttribute(i.key(), i.value()); + } + //doc.appendChild(clip); + //kDebug()<<"/// CLIP XML: "<setDescription(description); + QMap 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 properties) { - m_properties = properties; + QMapIterator i(properties); + while (i.hasNext()) { + i.next(); + m_properties.insert(i.key(), i.value()); + } } -QMap DocClipBase::properties() { +QMap DocClipBase::properties() const { return m_properties; } diff --git a/src/docclipbase.h b/src/docclipbase.h index 693d8caa..230b3d4b 100644 --- a/src/docclipbase.h +++ b/src/docclipbase.h @@ -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 properties); - QMap properties(); + QMap properties() const; signals: void getAudioThumbs(); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 9301dd63..51ee70b0 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -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) { diff --git a/src/projectitem.cpp b/src/projectitem.cpp index 54fed84c..3d7a98fe 100644 --- a/src/projectitem.cpp +++ b/src/projectitem.cpp @@ -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 props) { + m_clip->setProperties(props); } DocClipBase *ProjectItem::referencedClip() { diff --git a/src/projectitem.h b/src/projectitem.h index f08ac5f2..cffb513c 100644 --- a/src/projectitem.h +++ b/src/projectitem.h @@ -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 props); private: QDomElement m_element; diff --git a/src/projectlist.cpp b/src/projectlist.cpp index f9279782..db1528d7 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -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 (item); - CLIPTYPE type = clip->clipType(); - if (column == 2) { +void ProjectList::slotUpdateClipProperties(int id, QMap properties) { + ProjectItem *item = getItemById(id); + if (item) slotUpdateClipProperties(item, properties); +} + +void ProjectList::slotUpdateClipProperties(ProjectItem *clip, QMap 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 (item); + if (column == 2) { + QMap 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()); } } diff --git a/src/projectlist.h b/src/projectlist.h index 998ae510..80498cb6 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -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 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 properties); //void slotShowMenu(const QPoint &pos); diff --git a/src/projectlistview.cpp b/src/projectlistview.cpp index f51c0b23..78721e5e 100644 --- a/src/projectlistview.cpp +++ b/src/projectlistview.cpp @@ -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 props; + props.insert("groupname", item->groupName()); + props.insert("groupid", QString::number(parentId)); + clone->setProperties(props); } } } -- 2.39.2