X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Frenderwidget.cpp;h=355c632064fbf8edb7749ac48e4c87ea21f073ed;hb=982e28b36ad958735f227c4fb29dcbe447f1abb0;hp=92e4c61417023b1f975a097fccd29d6f10996524;hpb=cd85961a9520f2f3c909e889dacd8de539468b89;p=kdenlive diff --git a/src/renderwidget.cpp b/src/renderwidget.cpp index 92e4c614..355c6320 100644 --- a/src/renderwidget.cpp +++ b/src/renderwidget.cpp @@ -48,7 +48,10 @@ const int EditableRole = GroupRole + 5; const int MetaGroupRole = GroupRole + 6; const int ExtraRole = GroupRole + 7; -RenderWidget::RenderWidget(const QString &projectfolder, QWidget * parent): QDialog(parent), m_projectFolder(projectfolder) { +RenderWidget::RenderWidget(const QString &projectfolder, QWidget * parent) : + QDialog(parent), + m_projectFolder(projectfolder) +{ m_view.setupUi(this); setWindowTitle(i18n("Rendering")); m_view.buttonDelete->setIcon(KIcon("trash-empty")); @@ -158,13 +161,15 @@ RenderWidget::RenderWidget(const QString &projectfolder, QWidget * parent): QDia focusFirstVisibleItem(); } -void RenderWidget::slotEditItem(QListWidgetItem *item) { +void RenderWidget::slotEditItem(QListWidgetItem *item) +{ QString edit = item->data(EditableRole).toString(); if (edit.isEmpty() || !edit.endsWith("customprofiles.xml")) slotSaveProfile(); else slotEditProfile(); } -void RenderWidget::showInfoPanel() { +void RenderWidget::showInfoPanel() +{ if (m_view.advanced_params->isVisible()) { m_view.advanced_params->setVisible(false); m_view.buttonInfo->setDown(false); @@ -176,28 +181,33 @@ void RenderWidget::showInfoPanel() { } } -void RenderWidget::setDocumentPath(const QString path) { +void RenderWidget::setDocumentPath(const QString path) +{ m_projectFolder = path; const QString fileName = m_view.out_file->url().fileName(); m_view.out_file->setUrl(KUrl(m_projectFolder + '/' + fileName)); parseScriptFiles(); } -void RenderWidget::slotUpdateGuideBox() { +void RenderWidget::slotUpdateGuideBox() +{ m_view.guides_box->setVisible(m_view.render_guide->isChecked()); } -void RenderWidget::slotCheckStartGuidePosition() { +void RenderWidget::slotCheckStartGuidePosition() +{ if (m_view.guide_start->currentIndex() > m_view.guide_end->currentIndex()) m_view.guide_start->setCurrentIndex(m_view.guide_end->currentIndex()); } -void RenderWidget::slotCheckEndGuidePosition() { +void RenderWidget::slotCheckEndGuidePosition() +{ if (m_view.guide_end->currentIndex() < m_view.guide_start->currentIndex()) m_view.guide_end->setCurrentIndex(m_view.guide_start->currentIndex()); } -void RenderWidget::setGuides(QDomElement guidesxml, double duration) { +void RenderWidget::setGuides(QDomElement guidesxml, double duration) +{ m_view.guide_start->clear(); m_view.guide_end->clear(); QDomNodeList nodes = guidesxml.elementsByTagName("guide"); @@ -218,7 +228,8 @@ void RenderWidget::setGuides(QDomElement guidesxml, double duration) { // Will be called when the user selects an output file via the file dialog. // File extension will be added automatically. -void RenderWidget::slotUpdateButtons(KUrl url) { +void RenderWidget::slotUpdateButtons(KUrl url) +{ if (m_view.out_file->url().isEmpty()) m_view.buttonStart->setEnabled(false); else m_view.buttonStart->setEnabled(true); if (url != 0) { @@ -231,12 +242,14 @@ void RenderWidget::slotUpdateButtons(KUrl url) { // Will be called when the user changes the output file path in the text line. // File extension must NOT be added, would make editing impossible! -void RenderWidget::slotUpdateButtons() { +void RenderWidget::slotUpdateButtons() +{ if (m_view.out_file->url().isEmpty()) m_view.buttonStart->setEnabled(false); else m_view.buttonStart->setEnabled(true); } -void RenderWidget::slotSaveProfile() { +void RenderWidget::slotSaveProfile() +{ //TODO: update to correctly use metagroups Ui::SaveProfile_UI ui; QDialog *d = new QDialog(this); @@ -318,13 +331,20 @@ void RenderWidget::slotSaveProfile() { } QTextStream out(&file); out << doc.toString(); + if (file.error() != QFile::NoError) { + KMessageBox::error(this, i18n("Cannot write to file %1", exportFile)); + file.close(); + delete d; + return; + } file.close(); parseProfiles(newMetaGroupId, newGroupName, newProfileName); } delete d; } -void RenderWidget::slotEditProfile() { +void RenderWidget::slotEditProfile() +{ QListWidgetItem *item = m_view.size_list->currentItem(); if (!item) return; QString currentGroup = m_view.format_list->currentItem()->text(); @@ -410,21 +430,25 @@ void RenderWidget::slotEditProfile() { profiles.appendChild(profileElement); //QCString save = doc.toString().utf8(); - + delete d; if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - KMessageBox::sorry(this, i18n("Unable to write to file %1", exportFile)); - delete d; + KMessageBox::error(this, i18n("Cannot write to file %1", exportFile)); return; } QTextStream out(&file); out << doc.toString(); + if (file.error() != QFile::NoError) { + KMessageBox::error(this, i18n("Cannot write to file %1", exportFile)); + file.close(); + return; + } file.close(); parseProfiles(newMetaGroupId, newGroupName, newProfileName); - } - delete d; + } else delete d; } -void RenderWidget::slotDeleteProfile(bool refresh) { +void RenderWidget::slotDeleteProfile(bool refresh) +{ //TODO: delete a profile installed by KNewStuff the easy way /* QString edit = m_view.size_list->currentItem()->data(EditableRole).toString(); @@ -473,6 +497,11 @@ void RenderWidget::slotDeleteProfile(bool refresh) { } QTextStream out(&file); out << doc.toString(); + if (file.error() != QFile::NoError) { + KMessageBox::error(this, i18n("Cannot write to file %1", exportFile)); + file.close(); + return; + } file.close(); if (refresh) { parseProfiles(metaGroupId, currentGroup); @@ -480,7 +509,8 @@ void RenderWidget::slotDeleteProfile(bool refresh) { } } -void RenderWidget::updateButtons() { +void RenderWidget::updateButtons() +{ if (!m_view.size_list->currentItem() || m_view.size_list->currentItem()->isHidden()) { m_view.buttonSave->setEnabled(false); m_view.buttonDelete->setEnabled(false); @@ -501,12 +531,13 @@ void RenderWidget::updateButtons() { } -void RenderWidget::focusFirstVisibleItem() { +void RenderWidget::focusFirstVisibleItem() +{ if (m_view.size_list->currentItem() && !m_view.size_list->currentItem()->isHidden()) { updateButtons(); return; } - for (uint ix = 0; ix < m_view.size_list->count(); ix++) { + for (int ix = 0; ix < m_view.size_list->count(); ix++) { QListWidgetItem *item = m_view.size_list->item(ix); if (item && !item->isHidden()) { m_view.size_list->setCurrentRow(ix); @@ -517,7 +548,8 @@ void RenderWidget::focusFirstVisibleItem() { updateButtons(); } -void RenderWidget::slotExport(bool scriptExport) { +void RenderWidget::slotExport(bool scriptExport) +{ QListWidgetItem *item = m_view.size_list->currentItem(); if (!item) return; @@ -563,7 +595,7 @@ void RenderWidget::slotExport(bool scriptExport) { startPos = m_view.guide_start->itemData(m_view.guide_start->currentIndex()).toDouble(); endPos = m_view.guide_end->itemData(m_view.guide_end->currentIndex()).toDouble(); } - QString renderArgs = m_view.advanced_params->toPlainText(); + QString renderArgs = m_view.advanced_params->toPlainText().simplified(); // Adjust frame scale int width; @@ -591,7 +623,12 @@ void RenderWidget::slotExport(bool scriptExport) { QString std = renderArgs; QString destination = m_view.destination_list->itemData(m_view.destination_list->currentIndex()).toString(); - if (std.contains(" s=")) { + if (std.startsWith("s=")) { + QString subsize = std.section(' ', 0, 0).toLower(); + subsize = subsize.section("=", 1, 1); + const QString currentSize = QString::number(width) + 'x' + QString::number(height); + if (subsize != currentSize) resizeProfile = true; + } else if (std.contains(" s=")) { QString subsize = std.section(" s=", 1, 1); subsize = subsize.section(' ', 0, 0).toLower(); const QString currentSize = QString::number(width) + 'x' + QString::number(height); @@ -635,7 +672,8 @@ void RenderWidget::slotExport(bool scriptExport) { } } -void RenderWidget::setProfile(MltVideoProfile profile) { +void RenderWidget::setProfile(MltVideoProfile profile) +{ m_profile = profile; //WARNING: this way to tell the video standard is a bit hackish... if (m_profile.description.contains("pal", Qt::CaseInsensitive) || m_profile.description.contains("25", Qt::CaseInsensitive) || m_profile.description.contains("50", Qt::CaseInsensitive)) m_view.format_selection->setCurrentIndex(0); @@ -644,7 +682,8 @@ void RenderWidget::setProfile(MltVideoProfile profile) { refreshView(); } -void RenderWidget::refreshView() { +void RenderWidget::refreshView() +{ m_view.size_list->blockSignals(true); QListWidgetItem *sizeItem; @@ -772,7 +811,8 @@ void RenderWidget::refreshView() { refreshParams(); } -KUrl RenderWidget::filenameWithExtension(KUrl url, QString extension) { +KUrl RenderWidget::filenameWithExtension(KUrl url, QString extension) +{ QString path; if (!url.isEmpty()) { path = url.path(); @@ -787,7 +827,8 @@ KUrl RenderWidget::filenameWithExtension(KUrl url, QString extension) { } -void RenderWidget::refreshParams() { +void RenderWidget::refreshParams() +{ QListWidgetItem *item = m_view.size_list->currentItem(); if (!item || item->isHidden()) { m_view.advanced_params->clear(); @@ -830,11 +871,13 @@ void RenderWidget::refreshParams() { m_view.buttonStart->setEnabled(m_view.size_list->currentItem()->flags() & Qt::ItemIsEnabled); } -void RenderWidget::reloadProfiles() { +void RenderWidget::reloadProfiles() +{ parseProfiles(); } -void RenderWidget::parseProfiles(QString meta, QString group, QString profile) { +void RenderWidget::parseProfiles(QString meta, QString group, QString profile) +{ m_view.size_list->clear(); m_view.format_list->clear(); m_view.destination_list->clear(); @@ -859,7 +902,7 @@ void RenderWidget::parseProfiles(QString meta, QString group, QString profile) { // can also override profiles installed by KNewStuff fileList.removeAll("customprofiles.xml"); foreach(const QString &filename, fileList) - parseFile(exportFolder + '/' + filename, true); + parseFile(exportFolder + '/' + filename, true); if (QFile::exists(exportFolder + "/customprofiles.xml")) parseFile(exportFolder + "/customprofiles.xml", true); if (!meta.isEmpty()) { @@ -883,7 +926,8 @@ void RenderWidget::parseProfiles(QString meta, QString group, QString profile) { if (!child.isEmpty()) m_view.size_list->setCurrentItem(child.at(0)); } -void RenderWidget::parseFile(QString exportFile, bool editable) { +void RenderWidget::parseFile(QString exportFile, bool editable) +{ kDebug() << "// Parsing file: " << exportFile; kDebug() << "------------------------------"; QDomDocument doc; @@ -1065,7 +1109,8 @@ void RenderWidget::parseFile(QString exportFile, bool editable) { } } -void RenderWidget::setRenderJob(const QString &dest, int progress) { +void RenderWidget::setRenderJob(const QString &dest, int progress) +{ QTreeWidgetItem *item; QList existing = m_view.running_jobs->findItems(dest, Qt::MatchExactly, 1); if (!existing.isEmpty()) item = existing.at(0); @@ -1084,7 +1129,8 @@ void RenderWidget::setRenderJob(const QString &dest, int progress) { } } -void RenderWidget::setRenderStatus(const QString &dest, int status, const QString &error) { +void RenderWidget::setRenderStatus(const QString &dest, int status, const QString &error) +{ QTreeWidgetItem *item; QList existing = m_view.running_jobs->findItems(dest, Qt::MatchExactly, 1); if (!existing.isEmpty()) item = existing.at(0); @@ -1103,7 +1149,7 @@ void RenderWidget::setRenderStatus(const QString &dest, int status, const QStrin emit openDvdWizard(item->text(1), item->data(0, Qt::UserRole + 1).toString()); } else if (itemGroup == "websites") { QString url = item->data(0, Qt::UserRole + 1).toString(); - if (!url.isEmpty()) KRun *openBrowser = new KRun(url, this); + if (!url.isEmpty()) new KRun(url, this); } } else if (status == -2) { // Rendering crashed @@ -1123,12 +1169,14 @@ void RenderWidget::setRenderStatus(const QString &dest, int status, const QStrin slotCheckJob(); } -void RenderWidget::slotAbortCurrentJob() { +void RenderWidget::slotAbortCurrentJob() +{ QTreeWidgetItem *current = m_view.running_jobs->currentItem(); if (current) emit abortProcess(current->text(1)); } -void RenderWidget::slotCheckJob() { +void RenderWidget::slotCheckJob() +{ bool activate = false; QTreeWidgetItem *current = m_view.running_jobs->currentItem(); if (current) { @@ -1138,7 +1186,8 @@ void RenderWidget::slotCheckJob() { m_view.abort_job->setEnabled(activate); } -void RenderWidget::parseScriptFiles() { +void RenderWidget::parseScriptFiles() +{ QStringList scriptsFilter; scriptsFilter << "*.sh"; m_view.scripts_list->clear(); @@ -1180,7 +1229,8 @@ void RenderWidget::parseScriptFiles() { m_view.delete_script->setEnabled(activate); } -void RenderWidget::slotCheckScript() { +void RenderWidget::slotCheckScript() +{ bool activate = false; QTreeWidgetItemIterator it(m_view.scripts_list); if (*it) activate = true; @@ -1188,7 +1238,8 @@ void RenderWidget::slotCheckScript() { m_view.delete_script->setEnabled(activate); } -void RenderWidget::slotStartScript() { +void RenderWidget::slotStartScript() +{ QTreeWidgetItem *item = m_view.scripts_list->currentItem(); if (item) { QString path = item->data(0, Qt::UserRole + 1).toString(); @@ -1197,7 +1248,8 @@ void RenderWidget::slotStartScript() { } } -void RenderWidget::slotDeleteScript() { +void RenderWidget::slotDeleteScript() +{ QTreeWidgetItem *item = m_view.scripts_list->currentItem(); if (item) { QString path = item->data(0, Qt::UserRole + 1).toString(); @@ -1207,7 +1259,8 @@ void RenderWidget::slotDeleteScript() { } } -void RenderWidget::slotGenerateScript() { +void RenderWidget::slotGenerateScript() +{ slotExport(true); }