X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Frenderwidget.cpp;h=9a9f1aa2e823b44a515786f8450cf5a814e494b1;hb=3689ca2874624a10dc00efbbf143bfeff811c579;hp=121a1d8bcd038212debc99a367e532b41dd57ce2;hpb=46dd1d9556af7e415adcc204c621f4cadc638d4c;p=kdenlive diff --git a/src/renderwidget.cpp b/src/renderwidget.cpp index 121a1d8b..9a9f1aa2 100644 --- a/src/renderwidget.cpp +++ b/src/renderwidget.cpp @@ -47,6 +47,8 @@ #include #include + +// Render profiles roles const int GroupRole = Qt::UserRole; const int ExtensionRole = GroupRole + 1; const int StandardRole = GroupRole + 2; @@ -60,19 +62,90 @@ const int DefaultBitrateRole = GroupRole + 9; const int AudioBitratesRole = GroupRole + 10; const int DefaultAudioBitrateRole = GroupRole + 11; +// Render job roles +const int ParametersRole = Qt::UserRole + 1; +const int TimeRole = Qt::UserRole + 2; + +const int ScriptType = QTreeWidgetItem::UserType; + + // Running job status const int WAITINGJOB = 0; const int RUNNINGJOB = 1; const int FINISHEDJOB = 2; +const int FAILEDJOB = 3; +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)); + setStatus(WAITINGJOB); +} + +void RenderJobItem::setStatus(int status) +{ + if (m_status == status) return; + m_status = status; + switch (status) { + case WAITINGJOB: + setIcon(0, KIcon("media-playback-pause")); + setData(1, Qt::UserRole, i18n("Waiting...")); + break; + case FINISHEDJOB: + setData(1, Qt::UserRole, i18n("Rendering finished")); + setIcon(0, KIcon("dialog-ok")); + setData(2, Qt::UserRole, 100); + break; + case FAILEDJOB: + setData(1, Qt::UserRole, i18n("Rendering crashed")); + setIcon(0, KIcon("dialog-close")); + setData(2, Qt::UserRole, 100); + break; + case ABORTEDJOB: + setData(1, Qt::UserRole, i18n("Rendering aborted")); + setIcon(0, KIcon("dialog-cancel")); + setData(2, Qt::UserRole, 100); + + default: + break; + } +} +int RenderJobItem::status() const +{ + return m_status; +} -RenderWidget::RenderWidget(const QString &projectfolder, bool enableProxy, QWidget * parent) : +void RenderJobItem::setMetadata(const QString &data) +{ + m_data = data; +} + +const QString RenderJobItem::metadata() const +{ + return m_data; +} + + +RenderWidget::RenderWidget(const QString &projectfolder, bool enableProxy, MltVideoProfile profile, QWidget * parent) : QDialog(parent), m_projectFolder(projectfolder), + m_profile(profile), m_blockProcessing(false) { m_view.setupUi(this); + int size = style()->pixelMetric(QStyle::PM_SmallIconSize); + QSize iconSize(size, size); + setWindowTitle(i18n("Rendering")); + m_view.buttonDelete->setIconSize(iconSize); + m_view.buttonEdit->setIconSize(iconSize); + m_view.buttonSave->setIconSize(iconSize); + m_view.buttonInfo->setIconSize(iconSize); + m_view.buttonFavorite->setIconSize(iconSize); + m_view.buttonDelete->setIcon(KIcon("trash-empty")); m_view.buttonDelete->setToolTip(i18n("Delete profile")); m_view.buttonDelete->setEnabled(false); @@ -94,7 +167,7 @@ RenderWidget::RenderWidget(const QString &projectfolder, bool enableProxy, QWidg m_view.buttonRender->setEnabled(false); m_view.buttonGenerateScript->setEnabled(false); - m_view.rescale_box->setEnabled(false); + setRescaleEnabled(false); m_view.guides_box->setVisible(false); m_view.open_dvd->setVisible(false); m_view.create_chapter->setVisible(false); @@ -173,7 +246,7 @@ RenderWidget::RenderWidget(const QString &projectfolder, bool enableProxy, QWidg connect(m_view.buttonClose, SIGNAL(clicked()), this, SLOT(hide())); connect(m_view.buttonClose2, SIGNAL(clicked()), this, SLOT(hide())); connect(m_view.buttonClose3, SIGNAL(clicked()), this, SLOT(hide())); - connect(m_view.rescale, SIGNAL(toggled(bool)), m_view.rescale_box, SLOT(setEnabled(bool))); + connect(m_view.rescale, SIGNAL(toggled(bool)), this, SLOT(setRescaleEnabled(bool))); connect(m_view.destination_list, SIGNAL(activated(int)), this, SLOT(refreshCategory())); connect(m_view.out_file, SIGNAL(textChanged(const QString &)), this, SLOT(slotUpdateButtons())); connect(m_view.out_file, SIGNAL(urlSelected(const KUrl &)), this, SLOT(slotUpdateButtons(const KUrl &))); @@ -247,6 +320,9 @@ RenderWidget::~RenderWidget() m_view.scripts_list->clear(); delete m_jobsDelegate; delete m_scriptsDelegate; +#if KDE_IS_VERSION(4,7,0) + delete m_infoMessage; +#endif } void RenderWidget::slotEditItem(QListWidgetItem *item) @@ -952,34 +1028,32 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const emit selectedRenderProfile(renderProps); // insert item in running jobs list - QTreeWidgetItem *renderItem; + RenderJobItem *renderItem; QList existing = m_view.running_jobs->findItems(dest, Qt::MatchExactly, 1); if (!existing.isEmpty()) { - renderItem = existing.at(0); - if (renderItem->data(1, Qt::UserRole + 2).toInt() == RUNNINGJOB) { + renderItem = static_cast (existing.at(0)); + if (renderItem->status() == RUNNINGJOB) { 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(1, Qt::UserRole + 4, QString()); + renderItem->setData(2, Qt::UserRole, 0); + renderItem->setStatus(WAITINGJOB); } else { - renderItem = new QTreeWidgetItem(m_view.running_jobs, QStringList() << QString() << dest << QString()); - } - renderItem->setData(1, Qt::UserRole + 2, 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, Qt::UserRole + 1, QTime::currentTime()); + renderItem = new RenderJobItem(m_view.running_jobs, QStringList() << QString() << dest << QString()); + } + renderItem->setData(1, TimeRole, QTime::currentTime()); // Set rendering type if (group == "dvd") { if (m_view.open_dvd->isChecked()) { renderItem->setData(0, Qt::UserRole, group); if (renderArgs.contains("mlt_profile=")) { + //TODO: probably not valid anymore (no more MLT profiles in args) // rendering profile contains an MLT profile, so pass it to the running jog item, useful for dvd QString prof = renderArgs.section("mlt_profile=", 1, 1); prof = prof.section(' ', 0, 0); kDebug() << "// render profile: " << prof; - renderItem->setData(0, Qt::UserRole + 1, prof); + renderItem->setMetadata(prof); } } } else { @@ -987,10 +1061,10 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const renderItem->setData(0, Qt::UserRole, group); // pass the url QString url = m_view.size_list->currentItem()->data(ExtraRole).toString(); - renderItem->setData(0, Qt::UserRole + 1, url); + renderItem->setMetadata(url); } } - renderItem->setData(1, Qt::UserRole + 3, render_process_args); + 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()); m_view.running_jobs->setCurrentItem(renderItem); @@ -1002,62 +1076,56 @@ void RenderWidget::checkRenderStatus() { // check if we have a job waiting to render if (m_blockProcessing) return; - QTreeWidgetItem *item = m_view.running_jobs->topLevelItem(0); + RenderJobItem* item = static_cast (m_view.running_jobs->topLevelItem(0)); while (item) { - if (item->data(1, Qt::UserRole + 2).toInt() == RUNNINGJOB) return; - item = m_view.running_jobs->itemBelow(item); + if (item->status() == RUNNINGJOB) return; + item = static_cast (m_view.running_jobs->itemBelow(item)); } - item = m_view.running_jobs->topLevelItem(0); + item = static_cast (m_view.running_jobs->topLevelItem(0)); bool waitingJob = false; while (item) { - if (item->data(1, Qt::UserRole + 2).toInt() == WAITINGJOB) { - item->setData(1, Qt::UserRole + 1, QTime::currentTime()); + if (item->status() == WAITINGJOB) { + item->setData(1, TimeRole, QTime::currentTime()); waitingJob = true; startRendering(item); break; } - item = m_view.running_jobs->itemBelow(item); + item = static_cast (m_view.running_jobs->itemBelow(item)); } if (waitingJob == false && m_view.shutdown->isChecked()) emit shutdown(); } -void RenderWidget::startRendering(QTreeWidgetItem *item) +void RenderWidget::startRendering(RenderJobItem *item) { - if (item->data(1, Qt::UserRole + 4).isNull()) { + if (item->type() == QTreeWidgetItem::Type) { // Normal render process - if (QProcess::startDetached(m_renderer, item->data(1, Qt::UserRole + 3).toStringList()) == false) { - item->setData(1, Qt::UserRole + 2, FINISHEDJOB); - item->setData(1, Qt::UserRole, i18n("Rendering crashed")); - item->setIcon(0, KIcon("dialog-close")); - item->setData(2, Qt::UserRole, 100); + 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 { + } else if (item->type() == ScriptType){ // Script item - if (QProcess::startDetached(item->data(1, Qt::UserRole + 3).toString()) == false) { - item->setData(1, Qt::UserRole + 2, FINISHEDJOB); - item->setData(1, Qt::UserRole, i18n("Rendering crashed")); - item->setIcon(0, KIcon("dialog-close")); - item->setData(2, Qt::UserRole, 100); + if (QProcess::startDetached(item->data(1, ParametersRole).toString()) == false) { + item->setStatus(FAILEDJOB); } } } + int RenderWidget::waitingJobsCount() const { int count = 0; - QTreeWidgetItem *item = m_view.running_jobs->topLevelItem(0); + RenderJobItem* item = static_cast (m_view.running_jobs->topLevelItem(0)); while (item) { - if (item->data(1, Qt::UserRole + 2).toInt() == WAITINGJOB) count++; - item = m_view.running_jobs->itemBelow(item); + if (item->status() == WAITINGJOB) count++; + item = static_cast(m_view.running_jobs->itemBelow(item)); } return count; } void RenderWidget::setProfile(MltVideoProfile profile) { - m_profile = profile; m_view.scanning_list->setCurrentIndex(0); m_view.rescale_width->setValue(KdenliveSettings::defaultrescalewidth()); if (!m_view.rescale_keep->isChecked()) { @@ -1065,7 +1133,10 @@ void RenderWidget::setProfile(MltVideoProfile profile) m_view.rescale_height->setValue(KdenliveSettings::defaultrescaleheight()); m_view.rescale_height->blockSignals(false); } - refreshView(); + if (m_profile != profile) { + m_profile = profile; + refreshView(); + } } void RenderWidget::refreshCategory() @@ -1244,10 +1315,14 @@ void RenderWidget::refreshView() m_view.size_list->setVisible(m_view.size_list->count() > 1 || m_view.format_list->count() <= 1); m_view.size_list->blockSignals(false); m_view.format_list->blockSignals(false); - if (m_view.size_list->count() > 0) + if (m_view.size_list->count() > 0) { refreshParams(); - else + } + else { + // No matching profile + errorMessage(i18n("No matching profile")); m_view.advanced_params->clear(); + } } KUrl RenderWidget::filenameWithExtension(KUrl url, QString extension) @@ -1278,6 +1353,7 @@ void RenderWidget::refreshParams() // Format not available (e.g. codec not installed); Disable start button QListWidgetItem *item = m_view.size_list->currentItem(); if (!item || item->isHidden()) { + if (!item) errorMessage(i18n("No matching profile")); m_view.advanced_params->clear(); m_view.buttonRender->setEnabled(false); m_view.buttonGenerateScript->setEnabled(false); @@ -1291,10 +1367,10 @@ void RenderWidget::refreshParams() if (params.contains(" s=") || params.startsWith("s=") || destination == "audioonly") { // profile has a fixed size, do not allow resize m_view.rescale->setEnabled(false); - m_view.rescale_box->setEnabled(false); + setRescaleEnabled(false); } else { m_view.rescale->setEnabled(true); - m_view.rescale_box->setEnabled(m_view.rescale->isChecked()); + setRescaleEnabled(m_view.rescale->isChecked()); } KUrl url = filenameWithExtension(m_view.out_file->url(), extension); m_view.out_file->setUrl(url); @@ -1647,29 +1723,27 @@ void RenderWidget::parseFile(QString exportFile, bool editable) } } + + void RenderWidget::setRenderJob(const QString &dest, int progress) { - QTreeWidgetItem *item; + RenderJobItem *item; QList existing = m_view.running_jobs->findItems(dest, Qt::MatchExactly, 1); - if (!existing.isEmpty()) item = existing.at(0); + if (!existing.isEmpty()) item = static_cast (existing.at(0)); else { - item = new QTreeWidgetItem(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 << QString()); if (progress == 0) { - item->setData(1, Qt::UserRole + 2, WAITINGJOB); - item->setIcon(0, KIcon("media-playback-pause")); - item->setData(1, Qt::UserRole, i18n("Waiting...")); + item->setStatus(WAITINGJOB); } } item->setData(2, Qt::UserRole, progress); - item->setData(1, Qt::UserRole + 2, RUNNINGJOB); + item->setStatus(RUNNINGJOB); if (progress == 0) { item->setIcon(0, KIcon("system-run")); - item->setSizeHint(1, QSize(m_view.running_jobs->columnWidth(1), fontMetrics().height() * 2)); - item->setData(1, Qt::UserRole + 1, QTime::currentTime()); + item->setData(1, TimeRole, QTime::currentTime()); slotCheckJob(); } else { - QTime startTime = item->data(1, Qt::UserRole + 1).toTime(); + QTime startTime = item->data(1, TimeRole).toTime(); int seconds = startTime.secsTo(QTime::currentTime());; const QString t = i18n("Estimated time %1", QTime().addSecs(seconds * (100 - progress) / progress).toString("hh:mm:ss")); item->setData(1, Qt::UserRole, t); @@ -1678,44 +1752,38 @@ void RenderWidget::setRenderJob(const QString &dest, int progress) void RenderWidget::setRenderStatus(const QString &dest, int status, const QString &error) { - QTreeWidgetItem *item; + RenderJobItem *item; QList existing = m_view.running_jobs->findItems(dest, Qt::MatchExactly, 1); - if (!existing.isEmpty()) item = existing.at(0); + if (!existing.isEmpty()) item = static_cast (existing.at(0)); else { - item = new QTreeWidgetItem(m_view.running_jobs, QStringList() << QString() << dest << QString()); + 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->setData(1, Qt::UserRole + 2, FINISHEDJOB); if (status == -1) { // Job finished successfully - item->setIcon(0, KIcon("dialog-ok")); - item->setData(2, Qt::UserRole, 100); - QTime startTime = item->data(1, Qt::UserRole + 1).toTime(); + item->setStatus(FINISHEDJOB); + QTime startTime = item->data(1, TimeRole).toTime(); int seconds = startTime.secsTo(QTime::currentTime()); const QTime tm = QTime().addSecs(seconds); const QString t = i18n("Rendering finished in %1", tm.toString("hh:mm:ss")); item->setData(1, Qt::UserRole, t); QString itemGroup = item->data(0, Qt::UserRole).toString(); if (itemGroup == "dvd") { - emit openDvdWizard(item->text(1), item->data(0, Qt::UserRole + 1).toString()); + emit openDvdWizard(item->text(1), item->metadata()); } else if (itemGroup == "websites") { - QString url = item->data(0, Qt::UserRole + 1).toString(); + QString url = item->metadata(); if (!url.isEmpty()) new KRun(url, this); } } else if (status == -2) { // Rendering crashed - item->setData(1, Qt::UserRole, i18n("Rendering crashed")); - item->setIcon(0, KIcon("dialog-close")); - item->setData(2, Qt::UserRole, 100); + item->setStatus(FAILEDJOB); m_view.error_log->append(i18n("Rendering of %1 crashed
", dest)); m_view.error_log->append(error); m_view.error_log->append("
"); m_view.error_box->setVisible(true); } else if (status == -3) { // User aborted job - item->setData(1, Qt::UserRole, i18n("Rendering aborted")); - item->setIcon(0, KIcon("dialog-cancel")); - item->setData(2, Qt::UserRole, 100); + item->setStatus(ABORTEDJOB); } slotCheckJob(); checkRenderStatus(); @@ -1723,9 +1791,9 @@ void RenderWidget::setRenderStatus(const QString &dest, int status, const QStrin void RenderWidget::slotAbortCurrentJob() { - QTreeWidgetItem *current = m_view.running_jobs->currentItem(); + RenderJobItem *current = static_cast (m_view.running_jobs->currentItem()); if (current) { - if (current->data(1, Qt::UserRole + 2).toInt() == RUNNINGJOB) + if (current->status() == RUNNINGJOB) emit abortProcess(current->text(1)); else { delete current; @@ -1737,8 +1805,8 @@ void RenderWidget::slotAbortCurrentJob() void RenderWidget::slotStartCurrentJob() { - QTreeWidgetItem *current = m_view.running_jobs->currentItem(); - if (current && current->data(1, Qt::UserRole + 2).toInt() == WAITINGJOB) + RenderJobItem *current = static_cast (m_view.running_jobs->currentItem()); + if (current && current->status() == WAITINGJOB) startRendering(current); m_view.start_job->setEnabled(false); } @@ -1746,21 +1814,21 @@ void RenderWidget::slotStartCurrentJob() void RenderWidget::slotCheckJob() { bool activate = false; - QTreeWidgetItem *current = m_view.running_jobs->currentItem(); + RenderJobItem *current = static_cast (m_view.running_jobs->currentItem()); if (current) { - if (current->data(1, Qt::UserRole + 2).toInt() == RUNNINGJOB) { + if (current->status() == RUNNINGJOB) { m_view.abort_job->setText(i18n("Abort Job")); m_view.start_job->setEnabled(false); } else { m_view.abort_job->setText(i18n("Remove Job")); - m_view.start_job->setEnabled(current->data(1, Qt::UserRole + 2).toInt() == WAITINGJOB); + m_view.start_job->setEnabled(current->status() == WAITINGJOB); } activate = true; } m_view.abort_job->setEnabled(activate); for (int i = 0; i < m_view.running_jobs->topLevelItemCount(); i++) { - current = m_view.running_jobs->topLevelItem(i); - if (current == m_view.running_jobs->currentItem()) { + 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)); } @@ -1769,12 +1837,12 @@ void RenderWidget::slotCheckJob() void RenderWidget::slotCLeanUpJobs() { int ix = 0; - QTreeWidgetItem *current = m_view.running_jobs->topLevelItem(ix); + RenderJobItem *current = static_cast (m_view.running_jobs->topLevelItem(ix)); while (current) { - if (current->data(1, Qt::UserRole + 2).toInt() == FINISHEDJOB) + if (current->status() == FINISHEDJOB) delete current; else ix++; - current = m_view.running_jobs->topLevelItem(ix); + current = static_cast(m_view.running_jobs->topLevelItem(ix)); } slotCheckJob(); } @@ -1794,24 +1862,27 @@ void RenderWidget::parseScriptFiles() QString renderer; QString melt; QFile file(scriptpath.path()); + kDebug()<<"------------------\n"<setIcon(0, KIcon("dialog-cancel")); @@ -1853,30 +1924,28 @@ void RenderWidget::slotCheckScript() void RenderWidget::slotStartScript() { - QTreeWidgetItem *item = m_view.scripts_list->currentItem(); + RenderJobItem* item = static_cast (m_view.scripts_list->currentItem()); if (item) { QString destination = item->data(1, Qt::UserRole).toString(); QString path = item->data(1, Qt::UserRole + 1).toString(); // Insert new job in queue - QTreeWidgetItem *renderItem; + RenderJobItem *renderItem; QList existing = m_view.running_jobs->findItems(destination, Qt::MatchExactly, 1); kDebug() << "------ START SCRIPT"; if (!existing.isEmpty()) { - renderItem = existing.at(0); - if (renderItem->data(1, Qt::UserRole + 2).toInt() == RUNNINGJOB) { + renderItem = static_cast (existing.at(0)); + if (renderItem->status() == RUNNINGJOB) { 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 QTreeWidgetItem(m_view.running_jobs, QStringList() << QString() << destination << QString()); - kDebug() << "------ START SCRIPT 2"; + } else renderItem = new RenderJobItem(m_view.running_jobs, QStringList() << QString() << destination << QString(), ScriptType); renderItem->setData(2, Qt::UserRole, 0); - renderItem->setData(1, Qt::UserRole + 2, WAITINGJOB); + 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, Qt::UserRole + 1, QTime::currentTime()); - renderItem->setData(1, Qt::UserRole + 3, path); - renderItem->setData(1, Qt::UserRole + 4, '1'); + renderItem->setData(1, TimeRole, QTime::currentTime()); + renderItem->setData(1, ParametersRole, path); checkRenderStatus(); m_view.tabWidget->setCurrentIndex(1); } @@ -1984,19 +2053,19 @@ bool RenderWidget::startWaitingRenderJobs() QTextStream outStream(&file); outStream << "#! /bin/sh" << "\n" << "\n"; - QTreeWidgetItem *item = m_view.running_jobs->topLevelItem(0); + RenderJobItem *item = static_cast (m_view.running_jobs->topLevelItem(0)); while (item) { - if (item->data(1, Qt::UserRole + 2).toInt() == WAITINGJOB) { - if (item->data(1, Qt::UserRole + 4).isNull()) { + if (item->status() == WAITINGJOB) { + if (item->type() == QTreeWidgetItem::Type) { // Add render process for item - const QString params = item->data(1, Qt::UserRole + 3).toStringList().join(" "); + const QString params = item->data(1, ParametersRole).toStringList().join(" "); outStream << m_renderer << " " << params << "\n"; - } else { + } else if (item->type() == ScriptType){ // Script item - outStream << item->data(1, Qt::UserRole + 3).toString() << "\n"; + outStream << item->data(1, ParametersRole).toString() << "\n"; } } - item = m_view.running_jobs->itemBelow(item); + item = static_cast(m_view.running_jobs->itemBelow(item)); } // erase itself when rendering is finished outStream << "rm " << autoscriptFile << "\n" << "\n"; @@ -2027,7 +2096,8 @@ QString RenderWidget::getFreeScriptName(const QString &prefix) void RenderWidget::slotPlayRendering(QTreeWidgetItem *item, int) { - if (KdenliveSettings::defaultplayerapp().isEmpty() || item->data(1, Qt::UserRole + 2).toInt() != FINISHEDJOB) return; + RenderJobItem *renderItem = static_cast (item); + if (KdenliveSettings::defaultplayerapp().isEmpty() || renderItem->status() != FINISHEDJOB) return; KUrl::List urls; urls.append(KUrl(item->text(1))); KRun::run(KdenliveSettings::defaultplayerapp(), urls, this); @@ -2123,3 +2193,11 @@ bool RenderWidget::proxyRendering() { return m_view.proxy_render->isChecked(); } + +void RenderWidget::setRescaleEnabled(bool enable) +{ + for (int i = 0; i < m_view.rescale_box->layout()->count(); i++) { + if (m_view.rescale_box->itemAt(i)->widget()) m_view.rescale_box->itemAt(i)->widget()->setEnabled(enable); + } +} +