#include <KLocale>
#include <KIcon>
+#include <QFile>
+
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) :
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()
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 <QString, QString> props)
void ProjectItem::slotSetToolTip()
{
- QString tip = "<b>";
+ 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("<b>");
switch (m_clipType) {
case AUDIO:
tip.append(i18n("Audio clip") + "</b><br />" + clipUrl().path());
tip.append(i18n("Unknown clip"));
break;
}
-
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(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;
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);
}
}
-void ProjectItem::setProxyStatus(PROXYSTATUS status)
+void ProjectItem::setJobStatus(JOBTYPE jobType, CLIPJOBSTATUS status, int progress, const QString &statusMessage)
{
- setData(0, ProxyRole, status);
+ setData(0, JobTypeRole, jobType);
+ if (progress > 0) setData(0, JobProgressRole, progress);
+ else {
+ setData(0, JobProgressRole, status);
+ 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").isEmpty() || m_clip->getProperty("proxy") == "-" || data(0, ProxyRole).toInt() == PROXYCRASHED) 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, ProxyRole).toInt() == PROXYDONE);
+ 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
{
- PROXYSTATUS s = (PROXYSTATUS) data(0, ProxyRole).toInt();
- if (s == PROXYWAITING || s == CREATINGPROXY) return true;
+ 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;
}
+
+