X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fprojectitem.cpp;h=c42252376c2427d987d09037cb7979d2200e6b78;hb=f19daa7ce1724885a0cd248823e422a8b2360747;hp=bf02065b2d8a4be2169d661b0b26d1e246c7c55b;hpb=281d050daa40b9ac3387580cfdd62c55bd1db980;p=kdenlive diff --git a/src/projectitem.cpp b/src/projectitem.cpp index bf02065b..c4225237 100644 --- a/src/projectitem.cpp +++ b/src/projectitem.cpp @@ -27,22 +27,26 @@ #include #include +#include + const int DurationRole = Qt::UserRole + 1; -const int ProxyRole = Qt::UserRole + 5; +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) : + QTreeWidgetItem(parent, PROJECTCLIPTYPE), m_clip(clip), - m_clipId(clip->getId()), - QTreeWidgetItem(parent, PROJECTCLIPTYPE) + m_clipId(clip->getId()) { buildItem(); } ProjectItem::ProjectItem(QTreeWidgetItem * parent, DocClipBase *clip) : + QTreeWidgetItem(parent, PROJECTCLIPTYPE), m_clip(clip), - m_clipId(clip->getId()), - QTreeWidgetItem(parent, PROJECTCLIPTYPE) + m_clipId(clip->getId()) { buildItem(); @@ -59,7 +63,17 @@ void ProjectItem::buildItem() setText(0, name); setText(1, m_clip->description()); GenTime duration = m_clip->duration(); - if (duration != GenTime()) setData(0, DurationRole, Timecode::getEasyTimecode(duration, KdenliveSettings::project_fps())); + 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() @@ -93,15 +107,6 @@ int ProjectItem::clipMaxDuration() const return m_clip->getProperty("duration").toInt(); } -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(); @@ -116,7 +121,10 @@ const KUrl ProjectItem::clipUrl() const void ProjectItem::changeDuration(int frames) { - setData(0, 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) @@ -150,8 +158,16 @@ DocClipBase *ProjectItem::referencedClip() void ProjectItem::slotSetToolTip() { - QString tip = ""; + QString tip; if (m_clip->isPlaceHolder()) tip.append(i18n("Missing") + " | "); + QString jobInfo = data(0, JobStatusMessage).toString(); + if (!jobInfo.isEmpty()) { + tip.append(jobInfo + " | "); + } + if (hasProxy() && data(0, JobTypeRole).toInt() != PROXYJOB) { + tip.append(i18n("Proxy clip") + " | "); + } + tip.append(""); switch (m_clipType) { case AUDIO: tip.append(i18n("Audio clip") + "
" + clipUrl().path()); @@ -185,7 +201,6 @@ void ProjectItem::slotSetToolTip() tip.append(i18n("Unknown clip")); break; } - setToolTip(0, tip); } @@ -193,18 +208,8 @@ void ProjectItem::slotSetToolTip() 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(0, DurationRole, Timecode::getEasyTimecode(duration, KdenliveSettings::project_fps())); - m_clip->setDuration(duration); - } else { - // No duration known, use an arbitrary one until it is. - } - - - //extend attributes -reh + QString prefix; if (m_clipType == UNKNOWN) { QString cliptype = attributes.value("type"); if (cliptype == "audio") m_clipType = AUDIO; @@ -215,7 +220,25 @@ 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") + " / "; + } + } } + 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); @@ -230,21 +253,71 @@ void ProjectItem::setProperties(const QMap < QString, QString > &attributes, con } } -void ProjectItem::setProxyStatus(int status) +void ProjectItem::setJobStatus(JOBTYPE jobType, CLIPJOBSTATUS status, int progress, const QString &statusMessage) { - if (status == data(0, ProxyRole).toInt()) return; - setData(0, ProxyRole, status); - if (m_clip && status == 0) m_clip->abortProxy(); + setData(0, JobTypeRole, jobType); + if (progress > 0) setData(0, JobProgressRole, 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; - return !m_clip->getProperty("proxy").isEmpty(); + 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 { - return (data(0, ProxyRole).toInt() == 1); + 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; +} + + +