]> git.sesse.net Git - kdenlive/commitdiff
* Fix project tree icons:
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 23 Nov 2009 21:56:41 +0000 (21:56 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 23 Nov 2009 21:56:41 +0000 (21:56 +0000)
http://kdenlive.org/mantis/view.php?id=1306
* Allow description on sub clips

svn path=/trunk/kdenlive/; revision=4141

src/docclipbase.cpp
src/docclipbase.h
src/folderprojectitem.cpp
src/mainwindow.cpp
src/projectlist.cpp
src/projectlist.h
src/projectlistview.cpp
src/renderer.cpp
src/renderer.h
src/subprojectitem.cpp
src/subprojectitem.h

index 8b83045f76d6faf3c0b9acf77022084835ef239b..87b6dfa96327c54dfe1e7591748f31b4ad5afc2d 100644 (file)
@@ -62,7 +62,7 @@ DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, const QStrin
         QStringList cuts = xml.attribute("cutzones").split(";", QString::SkipEmptyParts);
         for (int i = 0; i < cuts.count(); i++) {
             QString z = cuts.at(i);
-            addCutZone(z.section('-', 0, 0).toInt(), z.section('-', 1, 1).toInt());
+            addCutZone(z.section('-', 0, 0).toInt(), z.section('-', 1, 1).toInt(), z.section('-', 2, 2));
         }
     }
 
@@ -273,7 +273,7 @@ QDomElement DocClipBase::toXML() const
     if (!m_cutZones.isEmpty()) {
         QStringList cuts;
         for (int i = 0; i < m_cutZones.size(); i++) {
-            cuts << QString::number(m_cutZones.at(i).x()) + "-" + QString::number(m_cutZones.at(i).y());
+            cuts << QString::number(m_cutZones.at(i).zone.x()) + "-" + QString::number(m_cutZones.at(i).zone.y()) + "-" + m_cutZones.at(i).description;
         }
         clip.setAttribute("cutzones", cuts.join(";"));
     }
@@ -855,36 +855,50 @@ bool DocClipBase::isPlaceHolder() const
     return m_placeHolder;
 }
 
-void DocClipBase::addCutZone(int in, int out)
+void DocClipBase::addCutZone(int in, int out, QString desc)
 {
-    if (!m_cutZones.contains(QPoint(in, out))) {
-        m_cutZones.append(QPoint(in, out));
-    }
+    CutZoneInfo info;
+    info.zone = QPoint(in, out);
+    info.description = desc;
+    for (int i = 0; i < m_cutZones.count(); i++)
+       if (m_cutZones.at(i).zone == info.zone) {
+           return;
+       }
+    m_cutZones.append(info);
 }
 
 bool DocClipBase::hasCutZone(QPoint p) const
 {
-    return m_cutZones.contains(p);
+    for (int i = 0; i < m_cutZones.count(); i++)
+       if (m_cutZones.at(i).zone == p) return true;
+    return false;
 }
 
 
 void DocClipBase::removeCutZone(int in, int out)
 {
-    m_cutZones.removeAll(QPoint(in, out));
+    QPoint p(in, out);
+    for (int i = 0; i < m_cutZones.count(); i++) {
+       if (m_cutZones.at(i).zone == p) m_cutZones.removeAt(i);
+       i--;
+    }
 }
 
-void DocClipBase::updateCutZone(int oldin, int oldout, int in, int out)
+void DocClipBase::updateCutZone(int oldin, int oldout, int in, int out, QString desc)
 {
     QPoint old(oldin, oldout);
     for (int i = 0; i < m_cutZones.size(); ++i) {
-        if (m_cutZones.at(i) == old) {
-            m_cutZones.replace(i, QPoint(in, out));
+        if (m_cutZones.at(i).zone == old) {
+           CutZoneInfo info;
+           info.zone = QPoint(in, out);
+           info.description = desc;
+            m_cutZones.replace(i, info);
             break;
         }
     }
 }
 
-QList <QPoint> DocClipBase::cutZones() const
+QList <CutZoneInfo> DocClipBase::cutZones() const
 {
     return m_cutZones;
 }
index 288b3d453a6697133f34be271da0471303b1b4d9..a206818c91431ed8d996f834bed91106d359584c 100644 (file)
@@ -47,6 +47,11 @@ namespace Mlt
 class Producer;
 };
 
+struct CutZoneInfo {
+    QPoint zone;
+    QString description;
+};
+
 
 class DocClipBase: public QObject
 {
@@ -185,11 +190,11 @@ Q_OBJECT public:
     bool isPlaceHolder() const;
     static QString getHash(const QString &path);
 
-    void addCutZone(int in, int out);
+    void addCutZone(int in, int out, QString desc = QString());
     bool hasCutZone(QPoint p) const;
     void removeCutZone(int in, int out);
-    QList <QPoint> cutZones() const;
-    void updateCutZone(int oldin, int oldout, int in, int out);
+    QList <CutZoneInfo> cutZones() const;
+    void updateCutZone(int oldin, int oldout, int in, int out, QString desc = QString());
 
 private:   // Private attributes
 
@@ -218,7 +223,7 @@ private:   // Private attributes
     /** Wheter the clip is a placeholder (clip missing but user wants to see it) */
     bool m_placeHolder;
 
-    QList <QPoint> m_cutZones;
+    QList <CutZoneInfo> m_cutZones;
 
     void setAudioThumbCreated(bool isDone);
     /** Holds clip infos like fps, size,... */
index 8a016c6048a3de9f8d669c7c6eb059d330c6f19c..b9b33b11d0a32e4dcc4b88db27a07610f5c87af3 100644 (file)
@@ -32,7 +32,8 @@ FolderProjectItem::FolderProjectItem(QTreeWidget * parent, const QStringList & s
 {
     setSizeHint(0, QSize(65, QFontInfo(font(1)).pixelSize() * 2));
     setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable);
-    setIcon(0, KIcon("folder").pixmap(sizeHint(0)));
+    setData(0, Qt::DecorationRole, KIcon("folder").pixmap(sizeHint(0)));
+    //setIcon(0, KIcon("folder").pixmap(sizeHint(0)));
     setToolTip(0, "<b>" + i18n("Folder"));
     //setFlags(Qt::NoItemFlags);
     //kDebug() << "Constructed with clipId: " << m_clipId;
index 951094a3959d4aca17feb44aa155ba6f7ee98f3e..c3fb809c66d8f5c37bf368b09037b19ef082acb4 100644 (file)
@@ -692,7 +692,7 @@ void MainWindow::slotConnectMonitors()
     m_projectList->setRenderer(m_projectMonitor->render);
     //connect(m_projectList, SIGNAL(receivedClipDuration(const QString &)), this, SLOT(slotUpdateClip(const QString &)));
     connect(m_projectList, SIGNAL(showClipProperties(DocClipBase *)), this, SLOT(slotShowClipProperties(DocClipBase *)));
-    connect(m_projectList, SIGNAL(getFileProperties(const QDomElement, const QString &, bool)), m_projectMonitor->render, SLOT(getFileProperties(const QDomElement, const QString &, bool)));
+    connect(m_projectList, SIGNAL(getFileProperties(const QDomElement, const QString &, int, bool)), m_projectMonitor->render, SLOT(getFileProperties(const QDomElement, const QString &, int, bool)));
     connect(m_projectMonitor->render, SIGNAL(replyGetImage(const QString &, const QPixmap &)), m_projectList, SLOT(slotReplyGetImage(const QString &, const QPixmap &)));
     connect(m_projectMonitor->render, SIGNAL(replyGetFileProperties(const QString &, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &, bool)), m_projectList, SLOT(slotReplyGetFileProperties(const QString &, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &, bool)));
 
index f150cb9961e273dca5d07979cbff8f215f16f026..683ace78c12d8ad4d458d4fee278757714a57b18 100644 (file)
@@ -310,7 +310,7 @@ void ProjectList::slotReloadClip(const QString &id)
             }
             //requestClipInfo(item->toXml(), item->clipId(), true);
             // Clear the file_hash value, which will cause a complete reload of the clip
-            emit getFileProperties(item->toXml(), item->clipId(), true);
+            emit getFileProperties(item->toXml(), item->clipId(), m_listView->iconSize().height(), true);
         }
     }
 }
@@ -414,6 +414,11 @@ void ProjectList::slotItemEdited(QTreeWidgetItem *item, int column)
 {
     if (item->type() == PROJECTSUBCLIPTYPE) {
         // this is a sub-item
+       if (column == 1) {
+           // user edited description
+           SubProjectItem *sub = static_cast <SubProjectItem*>(item);
+           //slotUpdateCutClipProperties(sub->clipId(), sub->zone(), sub->text(1), sub->text(1));
+       }
         return;
     }
     if (item->type() == PROJECTFOLDERTYPE) {
@@ -658,7 +663,7 @@ void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties)
     if (getProperties == false && !clip->getClipHash().isEmpty()) {
         QString cachedPixmap = m_doc->projectFolder().path(KUrl::AddTrailingSlash) + "thumbs/" + clip->getClipHash() + ".png";
         if (QFile::exists(cachedPixmap)) {
-            item->setIcon(0, QPixmap(cachedPixmap));
+           item->setData(0, Qt::DecorationRole, QPixmap(cachedPixmap));
         }
     }
 #ifdef NEPOMUK
@@ -671,14 +676,14 @@ void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties)
     }
 #endif
     // Add cut zones
-    QList <QPoint> cuts = clip->cutZones();
+    QList <CutZoneInfo> cuts = clip->cutZones();
     if (!cuts.isEmpty()) {
         for (int i = 0; i < cuts.count(); i++) {
-            SubProjectItem *sub = new SubProjectItem(item, cuts.at(i).x(), cuts.at(i).y());
+            SubProjectItem *sub = new SubProjectItem(item, cuts.at(i).zone.x(), cuts.at(i).zone.y(), cuts.at(i).description);
             if (!clip->getClipHash().isEmpty()) {
-                QString cachedPixmap = m_doc->projectFolder().path(KUrl::AddTrailingSlash) + "thumbs/" + clip->getClipHash() + '#' + QString::number(cuts.at(i).x()) + ".png";
+                QString cachedPixmap = m_doc->projectFolder().path(KUrl::AddTrailingSlash) + "thumbs/" + clip->getClipHash() + '#' + QString::number(cuts.at(i).zone.x()) + ".png";
                 if (QFile::exists(cachedPixmap)) {
-                    sub->setIcon(0, QPixmap(cachedPixmap));
+                   sub->setData(0, Qt::DecorationRole, QPixmap(cachedPixmap));
                 }
             }
         }
@@ -716,7 +721,7 @@ void ProjectList::slotProcessNextClipInQueue()
         const QDomElement dom = j.value();
         const QString id = j.key();
         m_infoQueue.remove(j.key());
-        emit getFileProperties(dom, id, false);
+        emit getFileProperties(dom, id, m_listView->iconSize().height(), false);
     }
 }
 
@@ -740,7 +745,7 @@ void ProjectList::updateAllClips()
         if ((*it)->type() == PROJECTSUBCLIPTYPE) {
             // subitem
             SubProjectItem *sub = static_cast <SubProjectItem *>(*it);
-            if (sub->icon(0).isNull()) {
+            if (sub->data(0, Qt::DecorationRole).isNull()) {
                 item = static_cast <ProjectItem *>((*it)->parent());
                 requestClipThumbnail(item->clipId() + '#' + QString::number(sub->zone().x()));
             }
@@ -758,7 +763,7 @@ void ProjectList::updateAllClips()
                 requestClipInfo(clip->toXML(), clip->getId());
             } else item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
         } else {
-            if (item->icon(0).isNull()) {
+            if (item->data(0, Qt::DecorationRole).isNull()) {
                 requestClipThumbnail(clip->getId());
             }
             if (item->data(0, DurationRole).toString().isEmpty()) {
@@ -1064,7 +1069,7 @@ void ProjectList::slotRefreshClipThumbnail(QTreeWidgetItem *it, bool update)
             return;
         }
         QPixmap pix;
-        int height = it->sizeHint(0).height();
+        int height = m_listView->iconSize().height();
         int width = (int)(height  * m_render->dar());
         if (clip->clipType() == AUDIO) pix = KIcon("audio-x-generic").pixmap(QSize(width, height));
         else if (clip->clipType() == IMAGE) pix = QPixmap::fromImage(KThumb::getFrame(item->referencedClip()->producer(), 0, width, height));
@@ -1072,7 +1077,7 @@ void ProjectList::slotRefreshClipThumbnail(QTreeWidgetItem *it, bool update)
 
         if (!pix.isNull()) {
             m_listView->blockSignals(true);
-            it->setIcon(0, pix);
+           it->setData(0, Qt::DecorationRole, pix);
             if (m_listView->isEnabled()) m_listView->blockSignals(false);
             if (!isSubItem) m_doc->cachePixmap(item->getClipHash(), pix);
             else m_doc->cachePixmap(item->getClipHash() + '#' + QString::number(frame), pix);
@@ -1102,9 +1107,9 @@ void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Produce
             delete producer;
         }*/
         if (m_listView->isEnabled()) m_listView->blockSignals(false);
-        if (item->icon(0).isNull()) {
+        /*if (item->icon(0).isNull()) {
             requestClipThumbnail(clipId);
-        }
+        }*/
     } else kDebug() << "////////  COULD NOT FIND CLIP TO UPDATE PRPS...";
     int max = m_doc->clipManager()->clipsCount();
     emit displayMessage(i18n("Loading clips"), (int)(100 *(max - m_infoQueue.count()) / max));
@@ -1121,7 +1126,7 @@ void ProjectList::slotReplyGetImage(const QString &clipId, const QPixmap &pix)
     ProjectItem *item = getItemById(clipId);
     if (item && !pix.isNull()) {
         m_listView->blockSignals(true);
-        item->setIcon(0, pix);
+       item->setData(0, Qt::DecorationRole, pix);
         m_doc->cachePixmap(item->getClipHash(), pix);
         if (m_listView->isEnabled()) m_listView->blockSignals(false);
     }
@@ -1280,7 +1285,7 @@ void ProjectList::addClipCut(const QString &id, int in, int out)
         SubProjectItem *sub = new SubProjectItem(clip, in, out);
 
         QPixmap p = clip->referencedClip()->thumbProducer()->extractImage(in, (int)(sub->sizeHint(0).height()  * m_render->dar()), sub->sizeHint(0).height() - 2);
-        sub->setIcon(0, p);
+       sub->setData(0, Qt::DecorationRole, p);
         m_doc->cachePixmap(clip->getClipHash() + '#' + QString::number(in), p);
         m_listView->blockSignals(false);
     }
index f24ab481b9e29385b949b6b4584022f6041582db..6e56e115054e117c7fb9e5f31b2d66c7b780cec2 100644 (file)
@@ -215,7 +215,7 @@ private slots:
 
 signals:
     void clipSelected(DocClipBase *, QPoint zone = QPoint());
-    void getFileProperties(const QDomElement, const QString &, bool);
+    void getFileProperties(const QDomElement, const QString &, int pixHeight, bool);
     void receivedClipDuration(const QString &);
     void showClipProperties(DocClipBase *);
     void projectModified();
index 30e0f4355795e2db9058f61b808fc5dfc70fdb75..ccedd98aff0ddc72cf71201e869cdc1d33d8a3d4 100644 (file)
@@ -128,6 +128,10 @@ void ProjectListView::mouseDoubleClickEvent(QMouseEvent * event)
     }
     if (it->type() == PROJECTSUBCLIPTYPE) {
         // subitem
+       if ((columnAt(event->pos().x()) == 1)) {
+           QTreeWidget::mouseDoubleClickEvent(event);
+           return;
+       }
         item = static_cast <ProjectItem *>(it->parent());
     } else item = static_cast <ProjectItem *>(it);
 
@@ -259,7 +263,7 @@ void ProjectListView::mouseMoveEvent(QMouseEvent *event)
             data.append(list.join(";").toUtf8());
             mimeData->setData("kdenlive/clip", data);
             drag->setMimeData(mimeData);
-            drag->setPixmap(clickItem->icon(0).pixmap(iconSize()));
+            drag->setPixmap(clickItem->data(0, Qt::DecorationRole).value<QPixmap>());
             drag->setHotSpot(QPoint(0, 50));
             drag->exec();
         }
@@ -287,7 +291,7 @@ void ProjectListView::mouseMoveEvent(QMouseEvent *event)
             //mimeData->setText(ids.join(";")); //doc.toString());
             //mimeData->setImageData(image);
             drag->setMimeData(mimeData);
-            drag->setPixmap(it->icon(0).pixmap(iconSize()));
+           drag->setPixmap(it->data(0, Qt::DecorationRole).value<QPixmap>());
             drag->setHotSpot(QPoint(0, 50));
             drag->exec();
         }
index 2744f6619f57fd19282b2572ca417e86bd1926b7..ac7d9ed29c671c8de8d7fafb1e5ad7002bcea193 100644 (file)
@@ -148,6 +148,11 @@ void Render::closeMlt()
     //delete m_osdInfo;
 }
 
+void Render::slotSwitchFullscreen()
+{
+    if (m_mltConsumer) m_mltConsumer->set("full_screen", 1);
+}
+
 void Render::buildConsumer(const QString profileName)
 {
     char *tmp;
@@ -574,7 +579,7 @@ void Render::slotSplitView(bool doit)
     }
 }
 
-void Render::getFileProperties(const QDomElement xml, const QString &clipId, bool replaceProducer)
+void Render::getFileProperties(const QDomElement xml, const QString &clipId, int imageHeight, bool replaceProducer)
 {
     KUrl url = KUrl(xml.attribute("resource", QString()));
     Mlt::Producer *producer = NULL;
@@ -654,8 +659,7 @@ void Render::getFileProperties(const QDomElement xml, const QString &clipId, boo
         return;
     }
 
-    int height = 50;
-    int width = (int)(height  * m_mltProfile->dar());
+    int width = (int)(imageHeight  * m_mltProfile->dar());
     QMap < QString, QString > filePropertyMap;
     QMap < QString, QString > metadataPropertyMap;
 
@@ -710,8 +714,8 @@ void Render::getFileProperties(const QDomElement xml, const QString &clipId, boo
 
             mlt_image_format format = mlt_image_rgb24a;
             int frame_width = width;
-            int frame_height = height;
-            QPixmap pix(width, height);
+            int frame_height = imageHeight;
+            QPixmap pix(width, imageHeight);
             uint8_t *data = frame->get_image(format, frame_width, frame_height, 0);
             QImage image((uchar *)data, frame_width, frame_height, QImage::Format_ARGB32);
 
@@ -723,7 +727,7 @@ void Render::getFileProperties(const QDomElement xml, const QString &clipId, boo
             emit replyGetImage(clipId, pix);
 
         } else if (frame->get_int("test_audio") == 0) {
-            QPixmap pixmap = KIcon("audio-x-generic").pixmap(QSize(width, height));
+            QPixmap pixmap = KIcon("audio-x-generic").pixmap(QSize(width, imageHeight));
             emit replyGetImage(clipId, pixmap);
             filePropertyMap["type"] = "audio";
         }
@@ -1497,7 +1501,7 @@ void Render::mltCheckLength(Mlt::Tractor *tractor)
     while (trackNb > 1) {
         Mlt::Producer trackProducer(tractor->track(trackNb - 1));
         trackDuration = trackProducer.get_playtime() - 1;
-        //kDebug() << " / / /DURATON FOR TRACK " << trackNb - 1 << " = " << trackDuration;
+        // kDebug() << " / / /DURATON FOR TRACK " << trackNb - 1 << " = " << trackDuration;
         if (trackDuration > duration) duration = trackDuration;
         trackNb--;
     }
index 1ad5e5bfe51c997c414957bbfe98e64959c5e7a1..f390d6ef652f0836b3407847383a1bc4d1c34e82 100644 (file)
@@ -310,12 +310,13 @@ public slots:  // Public slots
     /** Wraps the VEML command of the same name. Requests the file properties
     for the specified url from the renderer. Upon return, the result will be emitted
     via replyGetFileProperties(). */
-    void getFileProperties(const QDomElement xml, const QString &clipId, bool replaceProducer = true);
+    void getFileProperties(const QDomElement xml, const QString &clipId, int imageHeight, bool replaceProducer = true);
 
     void exportFileToFirewire(QString srcFileName, int port, GenTime startTime, GenTime endTime);
     static char *decodedString(QString str);
     void mltSavePlaylist();
     void slotSplitView(bool doit);
+    void slotSwitchFullscreen();
 };
 
 #endif
index 02c4970514a8502890370d43cfb2daab5a4caeb5..081cfeaf948f1d10a02d2cf38eeada7b070f9291 100644 (file)
 
 const int DurationRole = Qt::UserRole + 1;
 
-SubProjectItem::SubProjectItem(QTreeWidgetItem * parent, int in, int out) :
+SubProjectItem::SubProjectItem(QTreeWidgetItem * parent, int in, int out, QString description) :
         QTreeWidgetItem(parent, PROJECTSUBCLIPTYPE), m_in(in), m_out(out)
 {
     setSizeHint(0, QSize(65, 30));
     setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable);
     QString name = Timecode::getStringTimecode(in, KdenliveSettings::project_fps());
     setText(0, name);
+    setText(1, description);
     GenTime duration = GenTime(out - in, KdenliveSettings::project_fps());
     if (duration != GenTime()) setData(0, DurationRole, Timecode::getEasyTimecode(duration, KdenliveSettings::project_fps()));
     //setFlags(Qt::NoItemFlags);
index d689c6e959d828134d22ef9aa7a9bcfaf4119d91..4dcb216de38154fb7b6933f210a7f8c4c081fcd3 100644 (file)
@@ -38,7 +38,7 @@ class DocClipBase;
 class SubProjectItem : public QTreeWidgetItem
 {
 public:
-    SubProjectItem(QTreeWidgetItem * parent, int in, int out);
+    SubProjectItem(QTreeWidgetItem * parent, int in, int out, QString description = QString());
     virtual ~SubProjectItem();
     QDomElement toXml() const;
     int numReferences() const;