X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Frenderwidget.cpp;h=538483459558b5e4dc34825f16dd102fdfa56c56;hb=56bef60dc0a1e741f6c9afb4e4e2cc725f1aee78;hp=9a9f1aa2e823b44a515786f8450cf5a814e494b1;hpb=3689ca2874624a10dc00efbbf143bfeff811c579;p=kdenlive diff --git a/src/renderwidget.cpp b/src/renderwidget.cpp index 9a9f1aa2..53848345 100644 --- a/src/renderwidget.cpp +++ b/src/renderwidget.cpp @@ -47,6 +47,8 @@ #include #include +#include "locale.h" + // Render profiles roles const int GroupRole = Qt::UserRole; @@ -65,8 +67,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 +85,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 +101,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; @@ -163,6 +168,8 @@ RenderWidget::RenderWidget(const QString &projectfolder, bool enableProxy, MltVi m_view.buttonFavorite->setIcon(KIcon("favorites")); m_view.buttonFavorite->setToolTip(i18n("Copy profile to favorites")); + m_view.show_all_profiles->setToolTip(i18n("Show profiles with different framerate")); + m_view.advanced_params->setMaximumHeight(QFontMetrics(font()).lineSpacing() * 5); m_view.buttonRender->setEnabled(false); @@ -252,6 +259,7 @@ RenderWidget::RenderWidget(const QString &projectfolder, bool enableProxy, MltVi connect(m_view.out_file, SIGNAL(urlSelected(const KUrl &)), this, SLOT(slotUpdateButtons(const KUrl &))); connect(m_view.format_list, SIGNAL(currentRowChanged(int)), this, SLOT(refreshView())); connect(m_view.size_list, SIGNAL(currentRowChanged(int)), this, SLOT(refreshParams())); + connect(m_view.show_all_profiles, SIGNAL(stateChanged(int)), this, SLOT(refreshView())); connect(m_view.size_list, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(slotEditItem(QListWidgetItem *))); @@ -268,8 +276,9 @@ RenderWidget::RenderWidget(const QString &projectfolder, bool enableProxy, MltVi m_view.splitter->setStretchFactor(0, 2); m_view.out_file->setMode(KFile::File); + m_view.out_file->setFocusPolicy(Qt::ClickFocus); - 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 +286,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); @@ -456,7 +460,7 @@ void RenderWidget::slotSaveProfile() if (customGroup.isEmpty()) customGroup = i18nc("Group Name", "Custom"); ui.group_name->setText(customGroup); - QStringList arguments = m_view.advanced_params->toPlainText().split(" ", QString::SkipEmptyParts); + QStringList arguments = m_view.advanced_params->toPlainText().split(' ', QString::SkipEmptyParts); ui.parameters->setText(arguments.join(" ")); ui.extension->setText(m_view.size_list->currentItem()->data(ExtensionRole).toString()); ui.profile_name->setFocus(); @@ -827,7 +831,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; @@ -840,7 +844,7 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const QString extension = item->data(ExtensionRole).toString(); if (!dest.endsWith(extension, Qt::CaseInsensitive)) { if (KMessageBox::questionYesNo(this, i18n("File has no extension. Add extension (%1)?", extension)) == KMessageBox::Yes) { - dest.append("." + extension); + dest.append('.' + extension); } } @@ -868,7 +872,8 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const // Set locale for render process if required if (QLocale().decimalPoint() != QLocale::system().decimalPoint()) { - render_process_args << QString("-locale:%1").arg(QLocale().name()); + const QString currentLocale = setlocale(LC_NUMERIC, NULL); + render_process_args << QString("-locale:%1").arg(currentLocale); } double guideStart = 0; @@ -893,6 +898,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; @@ -939,7 +953,7 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const renderArgs.append(subsize); } bool resizeProfile = (subsize != currentSize); - QStringList paramsList = renderArgs.split(" ", QString::SkipEmptyParts); + QStringList paramsList = renderArgs.split(' ', QString::SkipEmptyParts); QScriptEngine sEngine; sEngine.globalObject().setProperty("bitrate", m_view.comboBitrates->currentText()); @@ -981,8 +995,8 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const } QTextStream outStream(&file); outStream << "#! /bin/sh" << "\n" << "\n"; - outStream << "SOURCE=" << "\"" + playlistPath + "\"" << "\n"; - outStream << "TARGET=" << "\"" + KUrl(dest).url() + "\"" << "\n"; + outStream << "SOURCE=" << "\"" + QUrl(playlistPath).toEncoded() + "\"" << "\n"; + outStream << "TARGET=" << "\"" + QUrl(dest).toEncoded() + "\"" << "\n"; outStream << "RENDERER=" << "\"" + m_renderer + "\"" << "\n"; outStream << "MELT=" << "\"" + KdenliveSettings::rendererpath() + "\"" << "\n"; outStream << "PARAMETERS=" << "\"" + render_process_args.join(" ") + "\"" << "\n"; @@ -1028,19 +1042,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 @@ -1064,9 +1086,10 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const renderItem->setMetadata(url); } } + 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 +1100,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 waiting job while (item) { if (item->status() == WAITINGJOB) { item->setData(1, TimeRole, QTime::currentTime()); @@ -1097,16 +1124,18 @@ 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 - if (QProcess::startDetached(item->data(1, ParametersRole).toString()) == false) { + kDebug()<<"// SCRIPT process: "<data(1, ParametersRole).toString(); + if (QProcess::startDetached('"' + item->data(1, ParametersRole).toString() + '"') == false) { item->setStatus(FAILEDJOB); } } @@ -1226,7 +1255,7 @@ void RenderWidget::refreshView() QListWidgetItem *dupItem = NULL; if ((sizeItem->data(GroupRole).toString() == group || sizeItem->data(GroupRole).toString().isEmpty()) && sizeItem->data(MetaGroupRole).toString() == destination) { std = sizeItem->data(StandardRole).toString(); - if (!std.isEmpty()) { + if (!m_view.show_all_profiles->isChecked() && !std.isEmpty()) { if ((std.contains("PAL", Qt::CaseInsensitive) && m_profile.frame_rate_num == 25 && m_profile.frame_rate_den == 1) || (std.contains("NTSC", Qt::CaseInsensitive) && m_profile.frame_rate_num == 30000 && m_profile.frame_rate_den == 1001)) dupItem = sizeItem->clone(); @@ -1238,7 +1267,7 @@ void RenderWidget::refreshView() m_view.size_list->addItem(dupItem); std = dupItem->data(ParamsRole).toString(); // Make sure the selected profile uses the same frame rate as project profile - if (std.contains("mlt_profile=")) { + if (!m_view.show_all_profiles->isChecked() && std.contains("mlt_profile=")) { QString profile = std.section("mlt_profile=", 1, 1).section(' ', 0, 0); MltVideoProfile p = ProfilesDialog::getVideoProfile(profile); if (p.frame_rate_den > 0) { @@ -1310,9 +1339,7 @@ void RenderWidget::refreshView() } } } - // m_view.size_list->sortItems(); focusFirstVisibleItem(); - 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) { @@ -1400,7 +1427,7 @@ void RenderWidget::refreshParams() m_view.bitrateLabel->setEnabled(true); if ( item->data(BitratesRole).canConvert(QVariant::StringList) && item->data(BitratesRole).toStringList().count()) { QStringList bitrates = item->data(BitratesRole).toStringList(); - foreach (QString bitrate, bitrates) + foreach (const QString &bitrate, bitrates) m_view.comboBitrates->addItem(bitrate); if (item->data(DefaultBitrateRole).canConvert(QVariant::String)) m_view.comboBitrates->setCurrentIndex(bitrates.indexOf(item->data(DefaultBitrateRole).toString())); @@ -1417,7 +1444,7 @@ void RenderWidget::refreshParams() m_view.audiobitrateLabel->setEnabled(true); if ( item->data(AudioBitratesRole).canConvert(QVariant::StringList) && item->data(AudioBitratesRole).toStringList().count()) { QStringList audiobitrates = item->data(AudioBitratesRole).toStringList(); - foreach (QString bitrate, audiobitrates) + foreach (const QString &bitrate, audiobitrates) m_view.comboAudioBitrates->addItem(bitrate); if (item->data(DefaultAudioBitrateRole).canConvert(QVariant::String)) m_view.comboAudioBitrates->setCurrentIndex(audiobitrates.indexOf(item->data(DefaultAudioBitrateRole).toString())); @@ -1731,12 +1758,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 +1783,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 +1852,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() @@ -1894,18 +1921,14 @@ void RenderWidget::parseScriptFiles() item->setData(0, Qt::UserRole, '1'); } else item->setIcon(0, KIcon("application-x-executable-script")); item->setSizeHint(0, QSize(m_view.scripts_list->columnWidth(0), fontMetrics().height() * 2)); - item->setData(1, Qt::UserRole, KUrl(target).path()); + item->setData(1, Qt::UserRole, KUrl(QUrl::fromEncoded(target.toUtf8())).pathOrUrl()); item->setData(1, Qt::UserRole + 1, scriptpath.path()); } -// bool activate = false; QTreeWidgetItem *script = m_view.scripts_list->topLevelItem(0); if (script) { m_view.scripts_list->setCurrentItem(script); script->setSelected(true); -// activate = true; } -// m_view.start_script->setEnabled(activate); -// m_view.delete_script->setEnabled(activate); } void RenderWidget::slotCheckScript() @@ -1926,24 +1949,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 +2084,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"; } @@ -2201,3 +2229,20 @@ void RenderWidget::setRescaleEnabled(bool enable) } } +void RenderWidget::keyPressEvent(QKeyEvent *e) { + if(e->key()==Qt::Key_Return || e->key()==Qt::Key_Enter) { + switch (m_view.tabWidget->currentIndex()) { + case 1: + if (m_view.start_job->isEnabled()) slotStartCurrentJob(); + break; + case 2: + if (m_view.start_script->isEnabled()) slotStartScript(); + break; + default: + if (m_view.buttonRender->isEnabled()) slotPrepareExport(); + break; + } + } + else QDialog::keyPressEvent(e); +} +