X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fprojectitem.cpp;h=6b5f573e6e0b711d368e85193d3cb42086364c1d;hb=b6d6c25f1bd07f11a0ceaf32a3a5bcaeab367336;hp=d3f1d247f461db668e12be5e45987fa72808f425;hpb=5ee798aed90c5a3a50024e6b5bd26753e03ec7cc;p=kdenlive diff --git a/src/projectitem.cpp b/src/projectitem.cpp index d3f1d247..6b5f573e 100644 --- a/src/projectitem.cpp +++ b/src/projectitem.cpp @@ -27,69 +27,90 @@ #include #include +#include + +const int DurationRole = Qt::UserRole + 1; +const int JobProgressRole = Qt::UserRole + 5; +const int JobTypeRole = Qt::UserRole + 6; +const int JobStatusMessage = Qt::UserRole + 7; +const int itemHeight = 38; + +ProjectItem::ProjectItem(QTreeWidget * parent, DocClipBase *clip, const QSize &pixmapSize) : + QTreeWidgetItem(parent, PROJECTCLIPTYPE), + m_clip(clip), + m_clipId(clip->getId()), + m_pixmapSet(false) +{ + buildItem(pixmapSize); +} -const int NameRole = Qt::UserRole; -const int DurationRole = NameRole + 1; -const int UsageRole = NameRole + 2; - - -// folder -ProjectItem::ProjectItem(QTreeWidget * parent, const QStringList & strings, const QString &clipId) : - QTreeWidgetItem(parent, strings), - m_clipType(FOLDER), - m_clipId(clipId), - m_clip(NULL), - m_groupname(strings.at(1)) +ProjectItem::ProjectItem(QTreeWidgetItem * parent, DocClipBase *clip, const QSize &pixmapSize) : + QTreeWidgetItem(parent, PROJECTCLIPTYPE), + m_clip(clip), + m_clipId(clip->getId()), + m_pixmapSet(false) + { - setSizeHint(0, QSize(65, 45)); - setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable); - setIcon(0, KIcon("folder")); - setToolTip(1, "" + i18n("Folder")); - //kDebug() << "Constructed as folder, with clipId: " << m_clipId << ", and groupname: " << m_groupname; + buildItem(pixmapSize); } -ProjectItem::ProjectItem(QTreeWidget * parent, DocClipBase *clip) : - QTreeWidgetItem(parent) +void ProjectItem::buildItem(const QSize &pixmapSize) { - setSizeHint(0, QSize(65, 45)); - setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable); - m_clip = clip; - m_clipId = clip->getId(); + setSizeHint(0, QSize(itemHeight * 3, itemHeight)); + if (m_clip->isPlaceHolder()) setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled); + else setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsDropEnabled); QString name = m_clip->getProperty("name"); if (name.isEmpty()) name = KUrl(m_clip->getProperty("resource")).fileName(); m_clipType = (CLIPTYPE) m_clip->getProperty("type").toInt(); + switch(m_clipType) { + case AUDIO: + setData(0, Qt::DecorationRole, KIcon("audio-x-generic").pixmap(pixmapSize)); + m_pixmapSet = true; + break; + case IMAGE: + case SLIDESHOW: + setData(0, Qt::DecorationRole, KIcon("image-x-generic").pixmap(pixmapSize)); + break; + default: + setData(0, Qt::DecorationRole, KIcon("video-x-generic").pixmap(pixmapSize)); + } if (m_clipType != UNKNOWN) slotSetToolTip(); - setText(1, name); - setText(2, m_clip->description()); - if ((m_clip->clipType() == AV || m_clip->clipType() == AUDIO) && KdenliveSettings::audiothumbnails()) m_clip->askForAudioThumbs(); + + setText(0, name); + setText(1, m_clip->description()); GenTime duration = m_clip->duration(); - if (duration != GenTime()) setData(1, DurationRole, Timecode::getEasyTimecode(duration, KdenliveSettings::project_fps())); - //setFlags(Qt::NoItemFlags); - //kDebug() << "Constructed with clipId: " << m_clipId; + QString durationText; + if (duration != GenTime()) { + durationText = Timecode::getEasyTimecode(duration, KdenliveSettings::project_fps()); + } + if (m_clipType == PLAYLIST) { + // Check if the playlist xml contains a proxy inside, and inform user + if (playlistHasProxies(m_clip->fileURL().path())) { + durationText.prepend(i18n("Contains proxies") + " / "); + } + } + if (!durationText.isEmpty()) setData(0, DurationRole, durationText); } -ProjectItem::ProjectItem(QTreeWidgetItem * parent, DocClipBase *clip) : - QTreeWidgetItem(parent) +ProjectItem::~ProjectItem() { - setSizeHint(0, QSize(65, 45)); - setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable); - m_clip = clip; - m_clipId = clip->getId(); - QString name = m_clip->getProperty("name"); - if (name.isEmpty()) name = KUrl(m_clip->getProperty("resource")).fileName(); - m_clipType = (CLIPTYPE) m_clip->getProperty("type").toInt(); - setText(1, name); - setText(2, m_clip->description()); - if ((m_clip->clipType() == AV || m_clip->clipType() == AUDIO) && KdenliveSettings::audiothumbnails()) m_clip->askForAudioThumbs(); - GenTime duration = m_clip->duration(); - if (duration != GenTime()) setData(1, DurationRole, Timecode::getEasyTimecode(duration, KdenliveSettings::project_fps())); - //setFlags(Qt::NoItemFlags); - //kDebug() << "Constructed with clipId: " << m_clipId; } +bool ProjectItem::hasPixmap() const +{ + return m_pixmapSet; +} + +void ProjectItem::setPixmap(const QPixmap& p) +{ + m_pixmapSet = true; + setData(0, Qt::DecorationRole, p); +} -ProjectItem::~ProjectItem() +//static +int ProjectItem::itemDefaultHeight() { + return itemHeight; } int ProjectItem::numReferences() const @@ -113,20 +134,6 @@ int ProjectItem::clipMaxDuration() const return m_clip->getProperty("duration").toInt(); } -bool ProjectItem::isGroup() const -{ - return m_clipType == FOLDER; -} - -QStringList ProjectItem::names() const -{ - QStringList result; - result.append(text(0)); - result.append(text(1)); - result.append(text(2)); - return result; -} - QDomElement ProjectItem::toXml() const { return m_clip->toXML(); @@ -134,17 +141,20 @@ QDomElement ProjectItem::toXml() const const KUrl ProjectItem::clipUrl() const { - if (m_clipType != COLOR && m_clipType != VIRTUAL && m_clipType != UNKNOWN && m_clipType != FOLDER) + if (m_clipType != COLOR && m_clipType != VIRTUAL && m_clipType != UNKNOWN) return KUrl(m_clip->getProperty("resource")); else return KUrl(); } void ProjectItem::changeDuration(int frames) { - setData(1, DurationRole, Timecode::getEasyTimecode(GenTime(frames, KdenliveSettings::project_fps()), KdenliveSettings::project_fps())); + QString itemdata = data(0, DurationRole).toString(); + if (itemdata.contains('/')) itemdata = itemdata.section('/', 0, 0) + "/ "; + else itemdata.clear(); + setData(0, DurationRole, itemdata + Timecode::getEasyTimecode(GenTime(frames, KdenliveSettings::project_fps()), KdenliveSettings::project_fps())); } -void ProjectItem::setProperties(QMap props) +void ProjectItem::setProperties(const QMap &props) { if (m_clip == NULL) return; m_clip->setProperties(props); @@ -168,17 +178,6 @@ void ProjectItem::clearProperty(const QString &key) m_clip->clearProperty(key); } -const QString ProjectItem::groupName() const -{ - return m_groupname; -} - -void ProjectItem::setGroupName(const QString name) -{ - m_groupname = name; - setText(1, name); -} - DocClipBase *ProjectItem::referencedClip() { return m_clip; @@ -186,60 +185,29 @@ DocClipBase *ProjectItem::referencedClip() void ProjectItem::slotSetToolTip() { - QString tip = ""; - switch (m_clipType) { - case AUDIO: - tip.append(i18n("Audio clip") + "
" + clipUrl().path()); - break; - case VIDEO: - tip.append(i18n("Mute video clip") + "

" + clipUrl().path()); - break; - case AV: - tip.append(i18n("Video clip") + "
" + clipUrl().path()); - break; - case COLOR: - tip.append(i18n("Color clip")); - break; - case IMAGE: - tip.append(i18n("Image clip") + "
" + clipUrl().path()); - break; - case TEXT: - tip.append(i18n("Text clip") + "
" + clipUrl().path()); - break; - case SLIDESHOW: - tip.append(i18n("Slideshow clip")); - break; - case VIRTUAL: - tip.append(i18n("Virtual clip")); - break; - case PLAYLIST: - tip.append(i18n("Playlist clip") + "
" + clipUrl().path()); - break; - default: - tip.append(i18n("Unknown clip")); - break; + QString tip; + if (m_clip->isPlaceHolder()) tip.append(i18n("Missing") + " | "); + QString jobInfo = data(0, JobStatusMessage).toString(); + if (!jobInfo.isEmpty()) { + tip.append(jobInfo + " | "); } - - setToolTip(1, tip); + if (hasProxy() && data(0, JobTypeRole).toInt() != PROXYJOB) { + tip.append(i18n("Proxy clip") + " | "); + } + tip.append(m_clip->shortInfo()); + setToolTip(0, tip); } void ProjectItem::setProperties(const QMap < QString, QString > &attributes, const QMap < QString, QString > &metadata) { if (m_clip == NULL) return; - //setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled); - if (attributes.contains("duration")) { - GenTime duration = GenTime(attributes.value("duration").toInt(), KdenliveSettings::project_fps()); - setData(1, DurationRole, Timecode::getEasyTimecode(duration, KdenliveSettings::project_fps())); - m_clip->setDuration(duration); - //kDebug() << "//// LOADED CLIP, DURATION SET TO: " << duration.frames(KdenliveSettings::project_fps()); - } else { - // No duration known, use an arbitrary one until it is. - } - - //extend attributes -reh + QString prefix; + m_clip->setProperties(attributes); + m_clip->setMetadata(metadata); + if (m_clipType == UNKNOWN) { QString cliptype = attributes.value("type"); if (cliptype == "audio") m_clipType = AUDIO; @@ -250,19 +218,103 @@ void ProjectItem::setProperties(const QMap < QString, QString > &attributes, con m_clip->setClipType(m_clipType); slotSetToolTip(); + if (m_clipType == PLAYLIST) { + // Check if the playlist xml contains a proxy inside, and inform user + if (playlistHasProxies(m_clip->fileURL().path())) { + prefix = i18n("Contains proxies") + " / "; + } + } + } + else if (attributes.contains("frame_size")) slotSetToolTip(); + + if (attributes.contains("duration")) { + GenTime duration = GenTime(attributes.value("duration").toInt(), KdenliveSettings::project_fps()); + QString itemdata = data(0, DurationRole).toString(); + if (itemdata.contains('/')) itemdata = itemdata.section('/', 0, 0) + "/ "; + else itemdata.clear(); + if (prefix.isEmpty()) prefix = itemdata; + setData(0, DurationRole, prefix + Timecode::getEasyTimecode(duration, KdenliveSettings::project_fps())); + m_clip->setDuration(duration); + } else { + // No duration known, use an arbitrary one until it is. } - m_clip->setProperties(attributes); - m_clip->setMetadata(metadata); - if ((m_clipType == AV || m_clipType == AUDIO) && KdenliveSettings::audiothumbnails()) m_clip->askForAudioThumbs(); if (m_clip->description().isEmpty()) { if (metadata.contains("description")) { m_clip->setProperty("description", metadata.value("description")); - setText(2, m_clip->description()); + setText(1, m_clip->description()); } else if (metadata.contains("comment")) { m_clip->setProperty("description", metadata.value("comment")); - setText(2, m_clip->description()); + setText(1, m_clip->description()); } } } +void ProjectItem::setJobStatus(JOBTYPE jobType, CLIPJOBSTATUS status, int progress, const QString &statusMessage) +{ + setData(0, JobTypeRole, jobType); + if (progress > 0) setData(0, JobProgressRole, qMin(100, progress)); + else { + setData(0, JobProgressRole, status); + if ((status == JOBABORTED || status == JOBCRASHED || status == JOBDONE) || !statusMessage.isEmpty()) + setData(0, JobStatusMessage, statusMessage); + slotSetToolTip(); + } +} + +void ProjectItem::setConditionalJobStatus(CLIPJOBSTATUS status, JOBTYPE requestedJobType) +{ + if (data(0, JobTypeRole).toInt() == requestedJobType) { + setData(0, JobProgressRole, status); + } +} + +bool ProjectItem::hasProxy() const +{ + if (m_clip == NULL) return false; + if (m_clip->getProperty("proxy").size() < 2 || data(0, JobProgressRole).toInt() == JOBCRASHED) return false; + return true; +} + +bool ProjectItem::isProxyReady() const +{ + return (data(0, JobProgressRole).toInt() == JOBDONE); +} + +bool ProjectItem::isJobRunning() const +{ + int s = data(0, JobProgressRole).toInt(); + if (s == JOBWAITING || s == JOBWORKING || s > 0) return true; + return false; +} + +bool ProjectItem::isProxyRunning() const +{ + int s = data(0, JobProgressRole).toInt(); + if ((s == JOBWORKING || s > 0) && data(0, JobTypeRole).toInt() == (int) PROXYJOB) return true; + return false; +} + +bool ProjectItem::playlistHasProxies(const QString& path) +{ + kDebug()<<"// CHECKING FOR PROXIES"; + QFile file(path); + QDomDocument doc; + if (!file.open(QIODevice::ReadOnly)) + return false; + if (!doc.setContent(&file)) { + file.close(); + return false; + } + file.close(); + QString root = doc.documentElement().attribute("root"); + QDomNodeList kdenliveProducers = doc.elementsByTagName("kdenlive_producer"); + for (int i = 0; i < kdenliveProducers.count(); ++i) { + QString proxy = kdenliveProducers.at(i).toElement().attribute("proxy"); + if (!proxy.isEmpty() && proxy != "-") return true; + } + return false; +} + + +