]> git.sesse.net Git - kdenlive/commitdiff
Rendering scripts can now be generated from the render dialog:
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 9 Feb 2009 21:54:07 +0000 (21:54 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 9 Feb 2009 21:54:07 +0000 (21:54 +0000)
http://www.kdenlive.org:80/mantis/view.php?id=649

svn path=/branches/KDE4/; revision=3040

src/mainwindow.cpp
src/mainwindow.h
src/renderwidget.cpp
src/renderwidget.h
src/widgets/renderwidget_ui.ui

index d8e068bb91720f2a3c397c11a5cc5066bab2c624..012649d347c1f67e7853e882b7c35f79ffdc7abb 100644 (file)
@@ -1399,7 +1399,7 @@ void MainWindow::slotRenderProject() {
     if (!m_renderWidget) {
         QString projectfolder = m_activeDocument ? m_activeDocument->projectFolder().path() : KdenliveSettings::defaultprojectfolder();
         m_renderWidget = new RenderWidget(projectfolder, this);
-        connect(m_renderWidget, SIGNAL(doRender(const QString&, const QString&, const QStringList &, const QStringList &, bool, bool, double, double, bool)), this, SLOT(slotDoRender(const QString&, const QString&, const QStringList &, const QStringList &, bool, bool, double, double, bool)));
+        connect(m_renderWidget, SIGNAL(doRender(const QString&, const QString&, const QStringList &, const QStringList &, bool, bool, double, double, bool, const QString &)), this, SLOT(slotDoRender(const QString&, const QString&, const QStringList &, const QStringList &, bool, bool, double, double, bool, const QString &)));
         connect(m_renderWidget, SIGNAL(abortProcess(const QString &)), this, SIGNAL(abortRenderJob(const QString &)));
         connect(m_renderWidget, SIGNAL(openDvdWizard(const QString &, const QString &)), this, SLOT(slotDvdWizard(const QString &, const QString &)));
         if (m_activeDocument) {
@@ -1413,7 +1413,8 @@ void MainWindow::slotRenderProject() {
     m_renderWidget->show();
 }
 
-void MainWindow::slotDoRender(const QString &dest, const QString &render, const QStringList &overlay_args, const QStringList &avformat_args, bool zoneOnly, bool playAfter, double guideStart, double guideEnd, bool resizeProfile) {
+void MainWindow::slotDoRender(const QString &dest, const QString &render, const QStringList &overlay_args, const QStringList &avformat_args, bool zoneOnly, bool playAfter, double guideStart, double guideEnd, bool resizeProfile, const QString &scriptExport) {
+    kDebug() << "// SCRIPT EXPORT: " << scriptExport;
     if (dest.isEmpty()) return;
     int in;
     int out;
@@ -1425,18 +1426,21 @@ void MainWindow::slotDoRender(const QString &dest, const QString &render, const
     KTemporaryFile temp;
     temp.setAutoRemove(false);
     temp.setSuffix(".westley");
-    if (temp.open()) {
-
+    if (!scriptExport.isEmpty() || temp.open()) {
         if (KdenliveSettings::dropbframes()) {
             KdenliveSettings::setDropbframes(false);
             m_activeDocument->clipManager()->updatePreviewSettings();
-            m_projectMonitor->saveSceneList(temp.fileName());
+            if (!scriptExport.isEmpty()) m_projectMonitor->saveSceneList(scriptExport + ".westley");
+            else m_projectMonitor->saveSceneList(temp.fileName());
             KdenliveSettings::setDropbframes(true);
             m_activeDocument->clipManager()->updatePreviewSettings();
-        } else m_projectMonitor->saveSceneList(temp.fileName());
+        } else {
+            if (!scriptExport.isEmpty()) m_projectMonitor->saveSceneList(scriptExport + ".westley");
+            else m_projectMonitor->saveSceneList(temp.fileName());
+        }
 
         QStringList args;
-        args << "-erase";
+        if (scriptExport.isEmpty()) args << "-erase";
         if (KdenliveSettings::usekuiserver()) args << "-kuiserver";
         if (zoneOnly) args << "in=" + QString::number(in) << "out=" + QString::number(out);
         else if (guideStart != -1) {
@@ -1464,14 +1468,36 @@ void MainWindow::slotDoRender(const QString &dest, const QString &render, const
 
         if (resizeProfile) {
             // The rendering profile is different from project profile, so use MLT's special producer_consumer
-            args << "consumer:" + temp.fileName();
-        } else args << temp.fileName();
-        args << dest << avformat_args;
+            if (scriptExport.isEmpty()) args << "consumer:" + temp.fileName();
+            else args << "consumer:$SOURCE";
+        } else {
+            if (scriptExport.isEmpty()) args << temp.fileName();
+            else args << "$SOURCE";
+        }
+        if (scriptExport.isEmpty()) args << dest;
+        else args << "$TARGET";
+        args << avformat_args;
         QString renderer = QCoreApplication::applicationDirPath() + QString("/kdenlive_render");
         if (!QFile::exists(renderer)) renderer = "kdenlive_render";
-        QProcess::startDetached(renderer, args);
+        if (scriptExport.isEmpty()) {
+            QProcess::startDetached(renderer, args);
+            KNotification::event("RenderStarted", i18n("Rendering <i>%1</i> started", dest), QPixmap(), this);
+        } else {
+            // Generate script file
+            QFile file(scriptExport);
+            if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
+                m_messageLabel->setMessage(i18n("Cannot write to file %1", scriptExport), ErrorMessage);
+                return;
+            }
 
-        KNotification::event("RenderStarted", i18n("Rendering <i>%1</i> started", dest), QPixmap(), this);
+            QTextStream out(&file);
+            out << "#! /bin/sh" << "\n" << "\n";
+            out << "SOURCE=" << "\"" + scriptExport + ".westley\"" << "\n";
+            out << "TARGET=" << "\"" + dest + "\"" << "\n";
+            out << renderer << " " << args.join(" ") << "\n" << "\n";
+            file.close();
+            QFile::setPermissions(scriptExport, file.permissions() | QFile::ExeUser);
+        }
     }
 }
 
index f522bb40101bb786623ca1a22a59b8b7c3bc1788..95a532e2c7bfd0949eb7afec62aeef041c81c5e1 100644 (file)
@@ -225,7 +225,7 @@ private slots:
     void slotSwitchMarkersComments();
     void slotSwitchSnap();
     void slotRenderProject();
-    void slotDoRender(const QString &dest, const QString &render, const QStringList &overlay_args, const QStringList &avformat_args, bool zoneOnly, bool playAfter, double guideStart, double guideEnd, bool resizeProfile);
+    void slotDoRender(const QString &dest, const QString &render, const QStringList &overlay_args, const QStringList &avformat_args, bool zoneOnly, bool playAfter, double guideStart, double guideEnd, bool resizeProfile, const QString &scriptExport);
     void slotFullScreen();
     void slotUpdateDocumentState(bool modified);
     void slotZoomIn();
index 57a2638eb1905c5e1de6d24bcd9b7462feca8beb..175f0f2f91d03a0e2bffade17a34e95cf356ec2d 100644 (file)
 #include <QItemDelegate>
 #include <QTreeWidgetItem>
 #include <QHeaderView>
+#include <QMenu>
+#include <QProcess>
+#include <QInputDialog>
 
 #include <KStandardDirs>
 #include <KDebug>
 #include <KMessageBox>
 #include <KComboBox>
 #include <KRun>
+#include <KIO/NetAccess>
 
 #include "kdenlivesettings.h"
 #include "renderwidget.h"
@@ -65,17 +69,39 @@ RenderWidget::RenderWidget(const QString &projectfolder, QWidget * parent): QDia
     m_view.rescale_size->setInputMask("0099\\x0099");
     m_view.rescale_size->setText("320x240");
 
+
+    QMenu *renderMenu = new QMenu(i18n("Start Rendering"), this);
+    QAction *renderAction = renderMenu->addAction(KIcon("file-new"), i18n("Render to File"));
+    connect(renderAction, SIGNAL(triggered()), this, SLOT(slotExport()));
+    QAction *scriptAction = renderMenu->addAction(KIcon("file-new"), i18n("Generate Script"));
+    connect(scriptAction, SIGNAL(triggered()), this, SLOT(slotGenerateScript()));
+
+    m_view.buttonStart->setMenu(renderMenu);
+    m_view.buttonStart->setPopupMode(QToolButton::MenuButtonPopup);
+    m_view.buttonStart->setDefaultAction(renderAction);
+    m_view.buttonStart->setToolButtonStyle(Qt::ToolButtonTextOnly);
+    m_view.abort_job->setEnabled(false);
+    m_view.start_script->setEnabled(false);
+    m_view.delete_script->setEnabled(false);
+
+
     parseProfiles();
+    parseScriptFiles();
+
+    connect(m_view.start_script, SIGNAL(clicked()), this, SLOT(slotStartScript()));
+    connect(m_view.delete_script, SIGNAL(clicked()), this, SLOT(slotDeleteScript()));
+    connect(m_view.scripts_list, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(slotCheckScript()));
+    connect(m_view.running_jobs, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(slotCheckJob()));
 
     connect(m_view.buttonInfo, SIGNAL(clicked()), this, SLOT(showInfoPanel()));
 
     connect(m_view.buttonSave, SIGNAL(clicked()), this, SLOT(slotSaveProfile()));
     connect(m_view.buttonEdit, SIGNAL(clicked()), this, SLOT(slotEditProfile()));
     connect(m_view.buttonDelete, SIGNAL(clicked()), this, SLOT(slotDeleteProfile()));
-    connect(m_view.buttonStart, SIGNAL(clicked()), this, SLOT(slotExport()));
     connect(m_view.abort_job, SIGNAL(clicked()), this, SLOT(slotAbortCurrentJob()));
     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_size, SLOT(setEnabled(bool)));
     connect(m_view.destination_list, SIGNAL(activated(int)), this, SLOT(refreshView()));
     connect(m_view.out_file, SIGNAL(textChanged(const QString &)), this, SLOT(slotUpdateButtons()));
@@ -106,6 +132,7 @@ RenderWidget::RenderWidget(const QString &projectfolder, QWidget * parent): QDia
 
     m_view.running_jobs->setHeaderLabels(QStringList() << QString() << i18n("File") << i18n("Progress"));
     m_view.running_jobs->setItemDelegate(new RenderViewDelegate(this));
+
     QHeaderView *header = m_view.running_jobs->header();
     QFontMetrics fm = fontMetrics();
     //header->resizeSection(0, fm.width("typical-name-for-a-torrent.torrent"));
@@ -118,6 +145,10 @@ RenderWidget::RenderWidget(const QString &projectfolder, QWidget * parent): QDia
     header->setResizeMode(2, QHeaderView::Interactive);
     //header->setResizeMode(1, QHeaderView::Fixed);
 
+    m_view.scripts_list->setHeaderLabels(QStringList() << i18n("Script Files"));
+    m_view.scripts_list->setItemDelegate(new RenderScriptDelegate(this));
+
+
     focusFirstVisibleItem();
 }
 
@@ -137,6 +168,7 @@ 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() {
@@ -421,16 +453,39 @@ void RenderWidget::focusFirstVisibleItem() {
     updateButtons();
 }
 
-void RenderWidget::slotExport() {
+void RenderWidget::slotExport(bool scriptExport) {
     QListWidgetItem *item = m_view.size_list->currentItem();
     if (!item) return;
+
     const QString dest = m_view.out_file->url().path();
     if (dest.isEmpty()) return;
     QFile f(dest);
     if (f.exists()) {
-        if (KMessageBox::warningYesNo(this, i18n("File already exists. Do you want to overwrite it ?")) != KMessageBox::Yes)
+        if (KMessageBox::warningYesNo(this, i18n("Output file already exists. Do you want to overwrite it ?")) != KMessageBox::Yes)
             return;
     }
+
+    QString scriptName;
+    if (scriptExport) {
+        bool ok;
+        int ix = 0;
+        QString scriptsFolder = m_projectFolder + "/scripts/";
+        KStandardDirs::makeDir(scriptsFolder);
+        QString path = scriptsFolder + i18n("script") + QString::number(ix).rightJustified(3, '0', false) + ".sh";
+        while (QFile::exists(path)) {
+            ix++;
+            path = scriptsFolder + i18n("script") + QString::number(ix).rightJustified(3, '0', false) + ".sh";
+        }
+        scriptName = QInputDialog::getText(this, i18n("Create Render Script"), i18n("Script name (will be saved in: %1)", scriptsFolder), QLineEdit::Normal, KUrl(path).fileName(), &ok);
+        if (!ok || scriptName.isEmpty()) return;
+        scriptName.prepend(scriptsFolder);
+        QFile f(scriptName);
+        if (f.exists()) {
+            if (KMessageBox::warningYesNo(this, i18n("Script file already exists. Do you want to overwrite it ?")) != KMessageBox::Yes)
+                return;
+        }
+    }
+
     QStringList overlayargs;
     if (m_view.tc_overlay->isChecked()) {
         QString filterFile = KStandardDirs::locate("appdata", "metadata.properties");
@@ -508,8 +563,12 @@ void RenderWidget::slotExport() {
         renderItem->setData(0, Qt::UserRole + 1, url);
     }
 
-    emit doRender(dest, item->data(RenderRole).toString(), overlayargs, renderArgs.simplified().split(' '), m_view.render_zone->isChecked(), m_view.play_after->isChecked(), startPos, endPos, resizeProfile);
-    m_view.tabWidget->setCurrentIndex(1);
+    emit doRender(dest, item->data(RenderRole).toString(), overlayargs, renderArgs.simplified().split(' '), m_view.render_zone->isChecked(), m_view.play_after->isChecked(), startPos, endPos, resizeProfile, scriptName);
+    if (scriptName.isEmpty()) m_view.tabWidget->setCurrentIndex(1);
+    else {
+        QTimer::singleShot(400, this, SLOT(parseScriptFiles()));
+        m_view.tabWidget->setCurrentIndex(2);
+    }
 }
 
 void RenderWidget::setProfile(MltVideoProfile profile) {
@@ -791,6 +850,7 @@ void RenderWidget::setRenderJob(const QString &dest, int progress) {
         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());
+        slotCheckJob();
     } else {
         QTime startTime = item->data(1, Qt::UserRole + 1).toTime();
         int seconds = startTime.secsTo(QTime::currentTime());;
@@ -824,7 +884,7 @@ void RenderWidget::setRenderStatus(const QString &dest, int status, const QStrin
         // Rendering crashed
         item->setData(1, Qt::UserRole, i18n("Rendering crashed"));
         item->setIcon(0, KIcon("dialog-close"));
-        item->setData(2, Qt::UserRole, 0);
+        item->setData(2, Qt::UserRole, 100);
         m_view.error_log->append(i18n("<strong>Rendering of %1 crashed</strong><br />", dest));
         m_view.error_log->append(error);
         m_view.error_log->append("<hr />");
@@ -835,6 +895,7 @@ void RenderWidget::setRenderStatus(const QString &dest, int status, const QStrin
         item->setIcon(0, KIcon("dialog-cancel"));
         item->setData(2, Qt::UserRole, 100);
     }
+    slotCheckJob();
 }
 
 void RenderWidget::slotAbortCurrentJob() {
@@ -842,4 +903,85 @@ void RenderWidget::slotAbortCurrentJob() {
     if (current) emit abortProcess(current->text(1));
 }
 
-#include "renderwidget.moc"
+void RenderWidget::slotCheckJob() {
+    bool activate = false;
+    QTreeWidgetItem *current = m_view.running_jobs->currentItem();
+    if (current) {
+        int percent = current->data(2, Qt::UserRole).toInt();
+        if (percent < 100) activate = true;
+    }
+    m_view.abort_job->setEnabled(activate);
+}
+
+void RenderWidget::parseScriptFiles() {
+    QStringList scriptsFilter;
+    scriptsFilter << "*.sh";
+    m_view.scripts_list->clear();
+
+    QTreeWidgetItem *item;
+    // List the project scripts
+    QStringList scriptFiles = QDir(m_projectFolder + "/scripts").entryList(scriptsFilter, QDir::Files);
+    for (int i = 0; i < scriptFiles.size(); ++i) {
+        KUrl scriptpath(m_projectFolder + "/scripts/" + scriptFiles.at(i));
+        item = new QTreeWidgetItem(m_view.scripts_list, QStringList() << scriptpath.fileName());
+        QString target;
+        QFile file(scriptpath.path());
+        if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+            while (!file.atEnd()) {
+                QByteArray line = file.readLine();
+                if (line.startsWith("TARGET=")) {
+                    target = QString(line).section("TARGET=", 1);
+                    target.remove(QChar('"'));
+                    break;
+                }
+            }
+            file.close();
+        }
+        item->setSizeHint(0, QSize(m_view.scripts_list->columnWidth(0), fontMetrics().height() * 2));
+        item->setData(0, Qt::UserRole, target);
+        item->setData(0, Qt::UserRole + 1, scriptpath.path());
+    }
+    bool activate = false;
+    QTreeWidgetItemIterator it(m_view.scripts_list);
+    if (*it) {
+        kDebug() << "// FOUND SCRIPT ITEM:" << (*it)->text(0);
+        // Selecting item does not work, why ???
+        m_view.scripts_list->setCurrentItem(*it);
+        (*it)->setSelected(true);
+        activate = true;
+    }
+    kDebug() << "SELECTED SCRIPTS: " << m_view.scripts_list->selectedItems().count();
+    m_view.start_script->setEnabled(activate);
+    m_view.delete_script->setEnabled(activate);
+}
+
+void RenderWidget::slotCheckScript() {
+    bool activate = false;
+    QTreeWidgetItemIterator it(m_view.scripts_list);
+    if (*it) activate = true;
+    m_view.start_script->setEnabled(activate);
+    m_view.delete_script->setEnabled(activate);
+}
+
+void RenderWidget::slotStartScript() {
+    QTreeWidgetItem *item = m_view.scripts_list->currentItem();
+    if (item) {
+        QString path = item->data(0, Qt::UserRole + 1).toString();
+        QProcess::startDetached(path);
+        m_view.tabWidget->setCurrentIndex(1);
+    }
+}
+
+void RenderWidget::slotDeleteScript() {
+    QTreeWidgetItem *item = m_view.scripts_list->currentItem();
+    if (item) {
+        QString path = item->data(0, Qt::UserRole + 1).toString();
+        KIO::NetAccess::del(path + ".westley", this);
+        KIO::NetAccess::del(path, this);
+        parseScriptFiles();
+    }
+}
+
+void RenderWidget::slotGenerateScript() {
+    slotExport(true);
+}
\ No newline at end of file
index f903f07bee20cae42e4e43644b8c972db29be23a..5fbc3b64b208a614ec60a205df3672a7eefe850d 100644 (file)
@@ -94,6 +94,41 @@ public:
 };
 
 
+// RenderScriptDelegate is used to draw the script items.
+class RenderScriptDelegate : public QItemDelegate {
+    Q_OBJECT
+public:
+    RenderScriptDelegate(QWidget *parent) : QItemDelegate(parent) {}
+
+    void paint(QPainter *painter, const QStyleOptionViewItem &option,
+               const QModelIndex &index) const {
+        if (index.column() == 0) {
+            QRect r1 = option.rect;
+            painter->save();
+            if (option.state & (QStyle::State_Selected)) {
+                painter->setPen(option.palette.color(QPalette::HighlightedText));
+                painter->fillRect(r1, option.palette.highlight());
+            } else painter->setPen(option.palette.color(QPalette::Text));
+            QFont font = painter->font();
+            font.setBold(true);
+            painter->setFont(font);
+            int mid = (int)((r1.height() / 2));
+            r1.setBottom(r1.y() + mid);
+            r1.setLeft(r1.left() + 3);
+            QRect r2 = option.rect;
+            r2.setTop(r2.y() + mid);
+            r2.setLeft(r2.left() + 3);
+            painter->drawText(r1, Qt::AlignLeft | Qt::AlignBottom , index.data().toString());
+            font.setBold(false);
+            painter->setFont(font);
+            painter->setPen(option.palette.color(QPalette::Mid));
+            painter->drawText(r2, Qt::AlignLeft | Qt::AlignVCenter , index.data(Qt::UserRole).toString());
+            painter->restore();
+            return;
+        } else QItemDelegate::paint(painter, option, index);
+    }
+};
+
 class RenderWidget : public QDialog {
     Q_OBJECT
 
@@ -109,7 +144,7 @@ public:
 private slots:
     void slotUpdateButtons(KUrl url);
     void slotUpdateButtons();
-    void slotExport();
+    void slotExport(bool scriptExport = false);
     void refreshView();
     void refreshParams();
     void slotSaveProfile();
@@ -120,6 +155,12 @@ private slots:
     void slotCheckEndGuidePosition();
     void showInfoPanel();
     void slotAbortCurrentJob();
+    void slotStartScript();
+    void slotDeleteScript();
+    void slotGenerateScript();
+    void parseScriptFiles();
+    void slotCheckScript();
+    void slotCheckJob();
 
 private:
     Ui::RenderWidget_UI m_view;
@@ -131,7 +172,7 @@ private:
     KUrl filenameWithExtension(KUrl url, QString extension);
 
 signals:
-    void doRender(const QString&, const QString&, const QStringList &, const QStringList &, bool, bool, double, double, bool);
+    void doRender(const QString&, const QString&, const QStringList &, const QStringList &, bool, bool, double, double, bool, const QString &);
     void abortProcess(const QString &url);
     void openDvdWizard(const QString &url, const QString &profile);
 };
index a6ca280e81017dde23210a29007e2c3b7b0e3ff8..f13ceb2ac889ac9be7ff42b0284f44ee82202600 100644 (file)
@@ -5,7 +5,7 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>474</width>
+    <width>421</width>
     <height>504</height>
    </rect>
   </property>
        <string>Render Project</string>
       </attribute>
       <layout class="QGridLayout" name="gridLayout" >
-       <item row="2" column="2" colspan="3" >
-        <spacer name="horizontalSpacer_2" >
-         <property name="orientation" >
-          <enum>Qt::Horizontal</enum>
-         </property>
-         <property name="sizeHint" stdset="0" >
-          <size>
-           <width>124</width>
-           <height>23</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-       <item row="9" column="0" colspan="10" >
-        <layout class="QHBoxLayout" name="horizontalLayout" >
-         <item>
-          <widget class="QRadioButton" name="render_full" >
-           <property name="text" >
-            <string>Full project</string>
-           </property>
-           <property name="checked" >
-            <bool>true</bool>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QRadioButton" name="render_zone" >
-           <property name="text" >
-            <string>Selected zone</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QRadioButton" name="render_guide" >
-           <property name="text" >
-            <string>Guide zone</string>
-           </property>
-          </widget>
-         </item>
-        </layout>
-       </item>
-       <item row="11" column="4" colspan="4" >
-        <spacer name="horizontalSpacer" >
-         <property name="orientation" >
-          <enum>Qt::Horizontal</enum>
-         </property>
-         <property name="sizeHint" stdset="0" >
-          <size>
-           <width>221</width>
-           <height>24</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
        <item row="0" column="0" colspan="2" >
         <widget class="QLabel" name="label_6" >
          <property name="text" >
@@ -87,7 +33,7 @@
          </property>
         </widget>
        </item>
-       <item row="0" column="2" colspan="8" >
+       <item row="0" column="2" colspan="7" >
         <widget class="KComboBox" name="destination_list" />
        </item>
        <item row="1" column="0" colspan="2" >
@@ -97,7 +43,7 @@
          </property>
         </widget>
        </item>
-       <item row="1" column="2" colspan="8" >
+       <item row="1" column="2" colspan="7" >
         <widget class="KUrlRequester" name="out_file" />
        </item>
        <item row="2" column="0" >
          </property>
         </widget>
        </item>
-       <item row="2" column="5" colspan="2" >
+       <item row="2" column="2" colspan="2" >
+        <spacer name="horizontalSpacer_2" >
+         <property name="orientation" >
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0" >
+          <size>
+           <width>124</width>
+           <height>23</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item row="2" column="4" colspan="2" >
         <widget class="KComboBox" name="format_selection" >
          <item>
           <property name="text" >
          </item>
         </widget>
        </item>
-       <item row="2" column="7" >
+       <item row="2" column="6" >
         <widget class="QToolButton" name="buttonEdit" >
          <property name="text" >
           <string>E</string>
          </property>
         </widget>
        </item>
-       <item row="2" column="8" >
+       <item row="2" column="7" >
         <widget class="QToolButton" name="buttonSave" >
          <property name="text" >
           <string>S</string>
          </property>
         </widget>
        </item>
-       <item row="2" column="9" >
+       <item row="2" column="8" >
         <widget class="QToolButton" name="buttonDelete" >
          <property name="text" >
           <string>D</string>
          </property>
         </widget>
        </item>
+       <item row="3" column="0" colspan="9" >
+        <widget class="QSplitter" name="splitter_3" >
+         <property name="orientation" >
+          <enum>Qt::Vertical</enum>
+         </property>
+         <widget class="QSplitter" name="splitter" >
+          <property name="orientation" >
+           <enum>Qt::Horizontal</enum>
+          </property>
+          <widget class="KListWidget" name="format_list" >
+           <property name="sizePolicy" >
+            <sizepolicy vsizetype="Expanding" hsizetype="Preferred" >
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+          </widget>
+          <widget class="KListWidget" name="size_list" >
+           <property name="sizePolicy" >
+            <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+          </widget>
+         </widget>
+         <widget class="KTextEdit" name="advanced_params" >
+          <property name="readOnly" >
+           <bool>true</bool>
+          </property>
+          <property name="acceptRichText" >
+           <bool>false</bool>
+          </property>
+         </widget>
+        </widget>
+       </item>
        <item row="4" column="0" colspan="2" >
         <widget class="QLabel" name="label_5" >
          <property name="text" >
          </property>
         </widget>
        </item>
-       <item row="4" column="2" colspan="4" >
+       <item row="4" column="2" colspan="3" >
         <widget class="KComboBox" name="scanning_list" >
          <item>
           <property name="text" >
          </item>
         </widget>
        </item>
-       <item row="4" column="6" colspan="4" >
+       <item row="4" column="5" colspan="4" >
         <widget class="QCheckBox" name="export_audio" >
          <property name="text" >
           <string>Export audio</string>
          </property>
         </widget>
        </item>
-       <item row="5" column="2" colspan="4" >
+       <item row="5" column="2" colspan="3" >
         <widget class="KRestrictedLine" name="rescale_size" >
          <property name="text" >
           <string/>
          </property>
         </widget>
        </item>
-       <item row="5" column="6" colspan="4" >
+       <item row="5" column="5" colspan="4" >
         <widget class="QCheckBox" name="tc_overlay" >
          <property name="text" >
           <string>Timecode overlay</string>
          </property>
         </widget>
        </item>
-       <item row="6" column="0" colspan="10" >
+       <item row="6" column="0" colspan="9" >
         <widget class="QCheckBox" name="open_dvd" >
          <property name="text" >
           <string>Open Dvd wizard after rendering</string>
          </property>
         </widget>
        </item>
-       <item row="7" column="0" colspan="10" >
+       <item row="7" column="0" colspan="9" >
         <widget class="QCheckBox" name="open_browser" >
          <property name="text" >
           <string>Open browser window after export</string>
          </property>
         </widget>
        </item>
-       <item row="8" column="0" colspan="10" >
+       <item row="8" column="0" colspan="9" >
         <widget class="QCheckBox" name="play_after" >
          <property name="text" >
           <string>Play after render</string>
          </property>
         </widget>
        </item>
-       <item row="10" column="0" colspan="10" >
+       <item row="9" column="0" colspan="9" >
+        <layout class="QHBoxLayout" name="horizontalLayout" >
+         <item>
+          <widget class="QRadioButton" name="render_full" >
+           <property name="text" >
+            <string>Full project</string>
+           </property>
+           <property name="checked" >
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QRadioButton" name="render_zone" >
+           <property name="text" >
+            <string>Selected zone</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QRadioButton" name="render_guide" >
+           <property name="text" >
+            <string>Guide zone</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+       <item row="10" column="0" colspan="9" >
         <widget class="QGroupBox" name="guides_box" >
          <property name="title" >
           <string/>
          </layout>
         </widget>
        </item>
-       <item row="11" column="0" colspan="4" >
-        <widget class="KPushButton" name="buttonStart" >
-         <property name="text" >
-          <string>Start Rendering</string>
+       <item row="11" column="0" colspan="3" >
+        <widget class="QToolButton" name="buttonStart" >
+         <property name="popupMode" >
+          <enum>QToolButton::MenuButtonPopup</enum>
          </property>
         </widget>
        </item>
-       <item row="11" column="8" colspan="2" >
+       <item row="11" column="3" colspan="4" >
+        <spacer name="horizontalSpacer" >
+         <property name="orientation" >
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0" >
+          <size>
+           <width>221</width>
+           <height>24</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item row="11" column="7" colspan="2" >
         <widget class="KPushButton" name="buttonClose" >
          <property name="text" >
           <string>Close</string>
          </property>
         </widget>
        </item>
-       <item row="3" column="0" colspan="10" >
-        <widget class="QSplitter" name="splitter_3" >
-         <property name="orientation" >
-          <enum>Qt::Vertical</enum>
-         </property>
-         <widget class="QSplitter" name="splitter" >
-          <property name="orientation" >
-           <enum>Qt::Horizontal</enum>
-          </property>
-          <widget class="KListWidget" name="format_list" >
-           <property name="sizePolicy" >
-            <sizepolicy vsizetype="Expanding" hsizetype="Preferred" >
-             <horstretch>0</horstretch>
-             <verstretch>0</verstretch>
-            </sizepolicy>
-           </property>
-          </widget>
-          <widget class="KListWidget" name="size_list" >
-           <property name="sizePolicy" >
-            <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
-             <horstretch>0</horstretch>
-             <verstretch>0</verstretch>
-            </sizepolicy>
-           </property>
-          </widget>
-         </widget>
-         <widget class="KTextEdit" name="advanced_params" >
-          <property name="readOnly" >
-           <bool>true</bool>
-          </property>
-          <property name="acceptRichText" >
-           <bool>false</bool>
-          </property>
-         </widget>
-        </widget>
-       </item>
       </layout>
      </widget>
      <widget class="QWidget" name="tab_2" >
        </item>
       </layout>
      </widget>
+     <widget class="QWidget" name="tab_3" >
+      <attribute name="title" >
+       <string>Scripts</string>
+      </attribute>
+      <layout class="QGridLayout" name="gridLayout_6" >
+       <item row="0" column="0" colspan="4" >
+        <widget class="QTreeWidget" name="scripts_list" >
+         <property name="sizePolicy" >
+          <sizepolicy vsizetype="MinimumExpanding" hsizetype="Expanding" >
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="rootIsDecorated" >
+          <bool>false</bool>
+         </property>
+         <property name="allColumnsShowFocus" >
+          <bool>true</bool>
+         </property>
+         <property name="columnCount" >
+          <number>0</number>
+         </property>
+        </widget>
+       </item>
+       <item row="1" column="0" >
+        <widget class="QPushButton" name="start_script" >
+         <property name="text" >
+          <string>Start Script</string>
+         </property>
+        </widget>
+       </item>
+       <item row="1" column="1" >
+        <widget class="QPushButton" name="delete_script" >
+         <property name="text" >
+          <string>Delete Script</string>
+         </property>
+        </widget>
+       </item>
+       <item row="1" column="2" >
+        <spacer name="horizontalSpacer_4" >
+         <property name="orientation" >
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0" >
+          <size>
+           <width>85</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item row="1" column="3" >
+        <widget class="KPushButton" name="buttonClose3" >
+         <property name="text" >
+          <string>Close</string>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </widget>
     </widget>
    </item>
   </layout>