X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Frenderwidget.cpp;h=8937fd0aea19d2900def432a5e0a458f765b1b13;hb=e7102ceb7ba04fc3bdea118b7c957570dc882d66;hp=9a9f1aa2e823b44a515786f8450cf5a814e494b1;hpb=3689ca2874624a10dc00efbbf143bfeff811c579;p=kdenlive diff --git a/src/renderwidget.cpp b/src/renderwidget.cpp index 9a9f1aa2..8937fd0a 100644 --- a/src/renderwidget.cpp +++ b/src/renderwidget.cpp @@ -65,8 +65,11 @@ const int DefaultAudioBitrateRole = GroupRole + 11; // Render job roles const int ParametersRole = Qt::UserRole + 1; const int TimeRole = Qt::UserRole + 2; +const int ProgressRole = Qt::UserRole + 3; +const int ExtraInfoRole = Qt::UserRole + 5; -const int ScriptType = QTreeWidgetItem::UserType; +const int DirectRenderType = QTreeWidgetItem::Type; +const int ScriptRenderType = QTreeWidgetItem::UserType; // Running job status @@ -80,7 +83,7 @@ const int ABORTEDJOB = 4; RenderJobItem::RenderJobItem(QTreeWidget * parent, const QStringList & strings, int type) : QTreeWidgetItem(parent, strings, type), m_status(-1) { - setSizeHint(1, QSize(parent->columnWidth(1), parent->fontMetrics().height() * 2)); + setSizeHint(1, QSize(parent->columnWidth(1), parent->fontMetrics().height() * 3)); setStatus(WAITINGJOB); } @@ -96,17 +99,17 @@ void RenderJobItem::setStatus(int status) case FINISHEDJOB: setData(1, Qt::UserRole, i18n("Rendering finished")); setIcon(0, KIcon("dialog-ok")); - setData(2, Qt::UserRole, 100); + setData(1, ProgressRole, 100); break; case FAILEDJOB: setData(1, Qt::UserRole, i18n("Rendering crashed")); setIcon(0, KIcon("dialog-close")); - setData(2, Qt::UserRole, 100); + setData(1, ProgressRole, 100); break; case ABORTEDJOB: setData(1, Qt::UserRole, i18n("Rendering aborted")); setIcon(0, KIcon("dialog-cancel")); - setData(2, Qt::UserRole, 100); + setData(1, ProgressRole, 100); default: break; @@ -269,7 +272,7 @@ RenderWidget::RenderWidget(const QString &projectfolder, bool enableProxy, MltVi m_view.out_file->setMode(KFile::File); - m_view.running_jobs->setHeaderLabels(QStringList() << QString() << i18n("File") << i18n("Progress")); + m_view.running_jobs->setHeaderLabels(QStringList() << QString() << i18n("File")); m_jobsDelegate = new RenderViewDelegate(this); m_view.running_jobs->setItemDelegate(m_jobsDelegate); @@ -277,11 +280,6 @@ RenderWidget::RenderWidget(const QString &projectfolder, bool enableProxy, MltVi header->setResizeMode(0, QHeaderView::Fixed); header->resizeSection(0, 30); header->setResizeMode(1, QHeaderView::Interactive); - header->setResizeMode(2, QHeaderView::Fixed); - header->resizeSection(1, width() * 2 / 3 - 15); - header->setResizeMode(2, QHeaderView::Interactive); - //header->setResizeMode(1, QHeaderView::Fixed); - m_view.scripts_list->setHeaderLabels(QStringList() << QString() << i18n("Script Files")); m_scriptsDelegate = new RenderViewDelegate(this); @@ -827,7 +825,7 @@ void RenderWidget::slotPrepareExport(bool scriptExport) } -void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const QString &playlistPath, const QString &scriptPath, bool exportAudio) +void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const QMap metadata, const QString &playlistPath, const QString &scriptPath, bool exportAudio) { QListWidgetItem *item = m_view.size_list->currentItem(); if (!item) return; @@ -893,6 +891,15 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const else render_process_args << "-"; QString renderArgs = m_view.advanced_params->toPlainText().simplified(); + + // Project metadata + if (m_view.export_meta->isChecked()) { + QMap::const_iterator i = metadata.constBegin(); + while (i != metadata.constEnd()) { + renderArgs.append(QString(" %1=\"%2\"").arg(i.key()).arg(i.value())); + ++i; + } + } // Adjust frame scale int width; @@ -1028,19 +1035,27 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const emit selectedRenderProfile(renderProps); // insert item in running jobs list - RenderJobItem *renderItem; + RenderJobItem *renderItem = NULL; QList existing = m_view.running_jobs->findItems(dest, Qt::MatchExactly, 1); if (!existing.isEmpty()) { renderItem = static_cast (existing.at(0)); - if (renderItem->status() == RUNNINGJOB) { + if (renderItem->status() == RUNNINGJOB || renderItem->status() == WAITINGJOB) { KMessageBox::information(this, i18n("There is already a job writing file:
%1
Abort the job if you want to overwrite it...", dest), i18n("Already running")); return; } - renderItem->setData(2, Qt::UserRole, 0); - renderItem->setStatus(WAITINGJOB); - } else { - renderItem = new RenderJobItem(m_view.running_jobs, QStringList() << QString() << dest << QString()); - } + if (renderItem->type() != DirectRenderType) { + delete renderItem; + renderItem = NULL; + } + else { + renderItem->setData(1, ProgressRole, 0); + renderItem->setStatus(WAITINGJOB); + renderItem->setIcon(0, KIcon("media-playback-pause")); + renderItem->setData(1, Qt::UserRole, i18n("Waiting...")); + renderItem->setData(1, ParametersRole, dest); + } + } + if (!renderItem) renderItem = new RenderJobItem(m_view.running_jobs, QStringList() << QString() << dest); renderItem->setData(1, TimeRole, QTime::currentTime()); // Set rendering type @@ -1065,8 +1080,8 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const } } renderItem->setData(1, ParametersRole, render_process_args); - if (exportAudio == false) renderItem->setData(1, Qt::UserRole + 5, i18n("Video without audio track")); - else renderItem->setData(1, Qt::UserRole + 5, QString()); + if (exportAudio == false) renderItem->setData(1, ExtraInfoRole, i18n("Video without audio track")); + else renderItem->setData(1, ExtraInfoRole, QString()); m_view.running_jobs->setCurrentItem(renderItem); m_view.tabWidget->setCurrentIndex(1); checkRenderStatus(); @@ -1077,12 +1092,16 @@ void RenderWidget::checkRenderStatus() // check if we have a job waiting to render if (m_blockProcessing) return; RenderJobItem* item = static_cast (m_view.running_jobs->topLevelItem(0)); + + // Make sure no other rendering is running while (item) { if (item->status() == RUNNINGJOB) return; item = static_cast (m_view.running_jobs->itemBelow(item)); } item = static_cast (m_view.running_jobs->topLevelItem(0)); bool waitingJob = false; + + // Find first aiting job while (item) { if (item->status() == WAITINGJOB) { item->setData(1, TimeRole, QTime::currentTime()); @@ -1097,15 +1116,17 @@ void RenderWidget::checkRenderStatus() void RenderWidget::startRendering(RenderJobItem *item) { - if (item->type() == QTreeWidgetItem::Type) { + if (item->type() == DirectRenderType) { // Normal render process + kDebug()<<"// Normal process"; if (QProcess::startDetached(m_renderer, item->data(1, ParametersRole).toStringList()) == false) { item->setStatus(FAILEDJOB); } else { KNotification::event("RenderStarted", i18n("Rendering %1 started", item->text(1)), QPixmap(), this); } - } else if (item->type() == ScriptType){ + } else if (item->type() == ScriptRenderType){ // Script item + kDebug()<<"// SCRIPT process: "<data(1, ParametersRole).toString(); if (QProcess::startDetached(item->data(1, ParametersRole).toString()) == false) { item->setStatus(FAILEDJOB); } @@ -1731,12 +1752,12 @@ void RenderWidget::setRenderJob(const QString &dest, int progress) QList existing = m_view.running_jobs->findItems(dest, Qt::MatchExactly, 1); if (!existing.isEmpty()) item = static_cast (existing.at(0)); else { - item = new RenderJobItem(m_view.running_jobs, QStringList() << QString() << dest << QString()); + item = new RenderJobItem(m_view.running_jobs, QStringList() << QString() << dest); if (progress == 0) { item->setStatus(WAITINGJOB); } } - item->setData(2, Qt::UserRole, progress); + item->setData(1, ProgressRole, progress); item->setStatus(RUNNINGJOB); if (progress == 0) { item->setIcon(0, KIcon("system-run")); @@ -1756,8 +1777,7 @@ void RenderWidget::setRenderStatus(const QString &dest, int status, const QStrin QList existing = m_view.running_jobs->findItems(dest, Qt::MatchExactly, 1); if (!existing.isEmpty()) item = static_cast (existing.at(0)); else { - item = new RenderJobItem(m_view.running_jobs, QStringList() << QString() << dest << QString()); - item->setSizeHint(1, QSize(m_view.running_jobs->columnWidth(1), fontMetrics().height() * 2)); + item = new RenderJobItem(m_view.running_jobs, QStringList() << QString() << dest); } if (status == -1) { // Job finished successfully @@ -1826,12 +1846,13 @@ void RenderWidget::slotCheckJob() activate = true; } m_view.abort_job->setEnabled(activate); + /* for (int i = 0; i < m_view.running_jobs->topLevelItemCount(); i++) { current = static_cast(m_view.running_jobs->topLevelItem(i)); if (current == static_cast (m_view.running_jobs->currentItem())) { current->setSizeHint(1, QSize(m_view.running_jobs->columnWidth(1), fontMetrics().height() * 3)); } else current->setSizeHint(1, QSize(m_view.running_jobs->columnWidth(1), fontMetrics().height() * 2)); - } + }*/ } void RenderWidget::slotCLeanUpJobs() @@ -1926,24 +1947,29 @@ void RenderWidget::slotStartScript() { RenderJobItem* item = static_cast (m_view.scripts_list->currentItem()); if (item) { + kDebug() << "// STARTING SCRIPT: "<text(1); QString destination = item->data(1, Qt::UserRole).toString(); QString path = item->data(1, Qt::UserRole + 1).toString(); // Insert new job in queue - RenderJobItem *renderItem; + RenderJobItem *renderItem = NULL; QList existing = m_view.running_jobs->findItems(destination, Qt::MatchExactly, 1); kDebug() << "------ START SCRIPT"; if (!existing.isEmpty()) { renderItem = static_cast (existing.at(0)); - if (renderItem->status() == RUNNINGJOB) { + if (renderItem->status() == RUNNINGJOB || renderItem->status() == WAITINGJOB) { KMessageBox::information(this, i18n("There is already a job writing file:
%1
Abort the job if you want to overwrite it...", destination), i18n("Already running")); return; } - } else renderItem = new RenderJobItem(m_view.running_jobs, QStringList() << QString() << destination << QString(), ScriptType); - renderItem->setData(2, Qt::UserRole, 0); + else if (renderItem->type() != ScriptRenderType) { + delete renderItem; + renderItem = NULL; + } + } + if (!renderItem) renderItem = new RenderJobItem(m_view.running_jobs, QStringList() << QString() << destination, ScriptRenderType); + renderItem->setData(1, ProgressRole, 0); renderItem->setStatus(WAITINGJOB); renderItem->setIcon(0, KIcon("media-playback-pause")); renderItem->setData(1, Qt::UserRole, i18n("Waiting...")); - renderItem->setSizeHint(1, QSize(m_view.running_jobs->columnWidth(1), fontMetrics().height() * 2)); renderItem->setData(1, TimeRole, QTime::currentTime()); renderItem->setData(1, ParametersRole, path); checkRenderStatus(); @@ -2056,11 +2082,11 @@ bool RenderWidget::startWaitingRenderJobs() RenderJobItem *item = static_cast (m_view.running_jobs->topLevelItem(0)); while (item) { if (item->status() == WAITINGJOB) { - if (item->type() == QTreeWidgetItem::Type) { + if (item->type() == DirectRenderType) { // Add render process for item const QString params = item->data(1, ParametersRole).toStringList().join(" "); outStream << m_renderer << " " << params << "\n"; - } else if (item->type() == ScriptType){ + } else if (item->type() == ScriptRenderType){ // Script item outStream << item->data(1, ParametersRole).toString() << "\n"; }