X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fprojectitem.cpp;h=d0b9999ec99b11dbc1fd9cdf2803d3d4535d8e68;hb=848304cd283eb5a6c13cecc57b696e91bb92f729;hp=b0c525e49e9d0b9064e34c72a96bd42806021372;hpb=cfb1c21baeae84b6cf51851305c30fa890c6b4a6;p=kdenlive diff --git a/src/projectitem.cpp b/src/projectitem.cpp index b0c525e4..d0b9999e 100644 --- a/src/projectitem.cpp +++ b/src/projectitem.cpp @@ -27,52 +27,63 @@ #include #include +#include + const int DurationRole = Qt::UserRole + 1; +const int ProxyRole = Qt::UserRole + 5; +const int itemHeight = 38; ProjectItem::ProjectItem(QTreeWidget * parent, DocClipBase *clip) : - QTreeWidgetItem(parent, PROJECTCLIPTYPE) + QTreeWidgetItem(parent, PROJECTCLIPTYPE), + m_clip(clip), + m_clipId(clip->getId()) { - 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(); - if (m_clipType != UNKNOWN) slotSetToolTip(); - setText(1, name); - setText(2, m_clip->description()); - 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; + buildItem(); } ProjectItem::ProjectItem(QTreeWidgetItem * parent, DocClipBase *clip) : - QTreeWidgetItem(parent, PROJECTCLIPTYPE) + QTreeWidgetItem(parent, PROJECTCLIPTYPE), + m_clip(clip), + m_clipId(clip->getId()) + { - setSizeHint(0, QSize(65, 45)); - setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable); - m_clip = clip; - m_clipId = clip->getId(); + buildItem(); +} + +void ProjectItem::buildItem() +{ + 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(); - setText(1, name); - setText(2, m_clip->description()); - 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() { } +//static +int ProjectItem::itemDefaultHeight() +{ + return itemHeight; +} + int ProjectItem::numReferences() const { if (!m_clip) return 0; @@ -117,7 +128,10 @@ const KUrl ProjectItem::clipUrl() const 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) @@ -152,6 +166,7 @@ DocClipBase *ProjectItem::referencedClip() void ProjectItem::slotSetToolTip() { QString tip = ""; + if (m_clip->isPlaceHolder()) tip.append(i18n("Missing") + " | "); switch (m_clipType) { case AUDIO: tip.append(i18n("Audio clip") + "
" + clipUrl().path()); @@ -186,25 +201,15 @@ void ProjectItem::slotSetToolTip() break; } - setToolTip(1, tip); + 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); - } 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,19 +220,84 @@ 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); - 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::setProxyStatus(PROXYSTATUS status, int progress) +{ + if (progress > 0) setData(0, ProxyRole, progress); + else setData(0, ProxyRole, status); +} + +bool ProjectItem::hasProxy() const +{ + if (m_clip == NULL) return false; + if (m_clip->getProperty("proxy").isEmpty() || m_clip->getProperty("proxy") == "-" || data(0, ProxyRole).toInt() == PROXYCRASHED) return false; + return true; +} + +bool ProjectItem::isProxyReady() const +{ + return (data(0, ProxyRole).toInt() == PROXYDONE); +} + +bool ProjectItem::isProxyRunning() const +{ + int s = data(0, ProxyRole).toInt(); + if (s == PROXYWAITING || s == CREATINGPROXY || s > 0) 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; +} + + +