***************************************************************************/
-#include <QDomDocument>
-#include <QItemDelegate>
-#include <QTreeWidgetItem>
-#include <QListWidgetItem>
-#include <QHeaderView>
-#include <QMenu>
-#include <QProcess>
-#include <QInputDialog>
+#include "renderwidget.h"
+#include "kdenlivesettings.h"
+#include "ui_saveprofile_ui.h"
#include <KStandardDirs>
#include <KDebug>
#include <KIO/NetAccess>
// #include <knewstuff2/engine.h>
-#include "kdenlivesettings.h"
-#include "renderwidget.h"
-#include "ui_saveprofile_ui.h"
+#include <QDomDocument>
+#include <QItemDelegate>
+#include <QTreeWidgetItem>
+#include <QListWidgetItem>
+#include <QHeaderView>
+#include <QMenu>
+#include <QProcess>
+#include <QInputDialog>
const int GroupRole = Qt::UserRole;
const int ExtensionRole = GroupRole + 1;
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"));
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);
}
}
-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");
// 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) {
// 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);
}
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;
}
-void RenderWidget::slotEditProfile() {
+void RenderWidget::slotEditProfile()
+{
QListWidgetItem *item = m_view.size_list->currentItem();
if (!item) return;
QString currentGroup = m_view.format_list->currentItem()->text();
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();
}
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);
}
}
-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);
}
-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);
updateButtons();
}
-void RenderWidget::slotExport(bool scriptExport) {
+void RenderWidget::slotExport(bool scriptExport)
+{
QListWidgetItem *item = m_view.size_list->currentItem();
if (!item) return;
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;
width = m_profile.width;
height = m_profile.height;
}
- renderArgs.replace("%dar", "@" + QString::number(m_profile.display_aspect_num) + "/" + QString::number(m_profile.display_aspect_den));
+ renderArgs.replace("%dar", '@' + QString::number(m_profile.display_aspect_num) + '/' + QString::number(m_profile.display_aspect_den));
// Adjust scanning
if (m_view.scanning_list->currentIndex() == 1) renderArgs.append(" progressive=1");
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);
if (group == "dvd" && m_view.open_dvd->isChecked()) {
renderItem->setData(0, Qt::UserRole, group);
if (renderArgs.contains("profile=")) {
- // rendering profile contains an MLT profile, so pass it to the running jog item, usefull for dvd
+ // rendering profile contains an MLT profile, so pass it to the running jog item, useful for dvd
QString prof = renderArgs.section("profile=", 1, 1);
prof = prof.section(' ', 0, 0);
kDebug() << "// render profile: " << prof;
}
}
-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);
refreshView();
}
-void RenderWidget::refreshView() {
+void RenderWidget::refreshView()
+{
m_view.size_list->blockSignals(true);
QListWidgetItem *sizeItem;
refreshParams();
}
-KUrl RenderWidget::filenameWithExtension(KUrl url, QString extension) {
+KUrl RenderWidget::filenameWithExtension(KUrl url, QString extension)
+{
QString path;
if (!url.isEmpty()) {
path = url.path();
}
-void RenderWidget::refreshParams() {
+void RenderWidget::refreshParams()
+{
QListWidgetItem *item = m_view.size_list->currentItem();
if (!item || item->isHidden()) {
m_view.advanced_params->clear();
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();
QDir directory = QDir(exportFolder);
QStringList filter;
filter << "*.xml";
- const QStringList fileList = directory.entryList(filter, QDir::Files);
- foreach(const QString filename, fileList)
- parseFile(exportFolder + '/' + filename, true); //filename == "customprofiles.xml");
+ QStringList fileList = directory.entryList(filter, QDir::Files);
+ // We should parse customprofiles.xml in last position, so that user profiles
+ // can also override profiles installed by KNewStuff
+ fileList.removeAll("customprofiles.xml");
+ foreach(const QString &filename, fileList)
+ parseFile(exportFolder + '/' + filename, true);
+ if (QFile::exists(exportFolder + "/customprofiles.xml")) parseFile(exportFolder + "/customprofiles.xml", true);
if (!meta.isEmpty()) {
m_view.destination_list->blockSignals(true);
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;
}
}
groupName = documentElement.attribute("name", i18n("Custom"));
- extension = documentElement.attribute("extension", QString::null);
- renderer = documentElement.attribute("renderer", QString::null);
+ extension = documentElement.attribute("extension", QString());
+ renderer = documentElement.attribute("renderer", QString());
QList <QListWidgetItem *> list = m_view.format_list->findItems(groupName, Qt::MatchExactly);
bool exists = false;
for (int j = 0; j < list.count(); j++) {
}
}
-void RenderWidget::setRenderJob(const QString &dest, int progress) {
+void RenderWidget::setRenderJob(const QString &dest, int progress)
+{
QTreeWidgetItem *item;
QList<QTreeWidgetItem *> existing = m_view.running_jobs->findItems(dest, Qt::MatchExactly, 1);
if (!existing.isEmpty()) item = existing.at(0);
}
}
-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<QTreeWidgetItem *> existing = m_view.running_jobs->findItems(dest, Qt::MatchExactly, 1);
if (!existing.isEmpty()) item = existing.at(0);
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
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) {
m_view.abort_job->setEnabled(activate);
}
-void RenderWidget::parseScriptFiles() {
+void RenderWidget::parseScriptFiles()
+{
QStringList scriptsFilter;
scriptsFilter << "*.sh";
m_view.scripts_list->clear();
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;
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();
}
}
-void RenderWidget::slotDeleteScript() {
+void RenderWidget::slotDeleteScript()
+{
QTreeWidgetItem *item = m_view.scripts_list->currentItem();
if (item) {
QString path = item->data(0, Qt::UserRole + 1).toString();
}
}
-void RenderWidget::slotGenerateScript() {
+void RenderWidget::slotGenerateScript()
+{
slotExport(true);
-}
\ No newline at end of file
+}
+