From: Jean-Baptiste Mardelle Date: Mon, 23 Nov 2009 21:56:41 +0000 (+0000) Subject: * Fix project tree icons: X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=af778b8ed425f9477ca0d6647194b57bee5d141a;p=kdenlive * Fix project tree icons: http://kdenlive.org/mantis/view.php?id=1306 * Allow description on sub clips svn path=/trunk/kdenlive/; revision=4141 --- diff --git a/src/docclipbase.cpp b/src/docclipbase.cpp index 8b83045f..87b6dfa9 100644 --- a/src/docclipbase.cpp +++ b/src/docclipbase.cpp @@ -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 DocClipBase::cutZones() const +QList DocClipBase::cutZones() const { return m_cutZones; } diff --git a/src/docclipbase.h b/src/docclipbase.h index 288b3d45..a206818c 100644 --- a/src/docclipbase.h +++ b/src/docclipbase.h @@ -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 cutZones() const; - void updateCutZone(int oldin, int oldout, int in, int out); + QList 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 m_cutZones; + QList m_cutZones; void setAudioThumbCreated(bool isDone); /** Holds clip infos like fps, size,... */ diff --git a/src/folderprojectitem.cpp b/src/folderprojectitem.cpp index 8a016c60..b9b33b11 100644 --- a/src/folderprojectitem.cpp +++ b/src/folderprojectitem.cpp @@ -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, "" + i18n("Folder")); //setFlags(Qt::NoItemFlags); //kDebug() << "Constructed with clipId: " << m_clipId; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 951094a3..c3fb809c 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -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))); diff --git a/src/projectlist.cpp b/src/projectlist.cpp index f150cb99..683ace78 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -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 (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 cuts = clip->cutZones(); + QList 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 (*it); - if (sub->icon(0).isNull()) { + if (sub->data(0, Qt::DecorationRole).isNull()) { item = static_cast ((*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); } diff --git a/src/projectlist.h b/src/projectlist.h index f24ab481..6e56e115 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -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(); diff --git a/src/projectlistview.cpp b/src/projectlistview.cpp index 30e0f435..ccedd98a 100644 --- a/src/projectlistview.cpp +++ b/src/projectlistview.cpp @@ -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 (it->parent()); } else item = static_cast (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()); 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()); drag->setHotSpot(QPoint(0, 50)); drag->exec(); } diff --git a/src/renderer.cpp b/src/renderer.cpp index 2744f661..ac7d9ed2 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -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--; } diff --git a/src/renderer.h b/src/renderer.h index 1ad5e5bf..f390d6ef 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -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 diff --git a/src/subprojectitem.cpp b/src/subprojectitem.cpp index 02c49705..081cfeaf 100644 --- a/src/subprojectitem.cpp +++ b/src/subprojectitem.cpp @@ -30,13 +30,14 @@ 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); diff --git a/src/subprojectitem.h b/src/subprojectitem.h index d689c6e9..4dcb216d 100644 --- a/src/subprojectitem.h +++ b/src/subprojectitem.h @@ -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;