]> git.sesse.net Git - kdenlive/commitdiff
First step for implementation of proxy editing (for testing purpose only)
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 17 Jan 2011 23:58:55 +0000 (23:58 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 17 Jan 2011 23:58:55 +0000 (23:58 +0000)
svn path=/trunk/kdenlive/; revision=5329

16 files changed:
src/docclipbase.cpp
src/docclipbase.h
src/kdenlivesettings.kcfg
src/kdenlivesettingsdialog.cpp
src/kdenlivesettingsdialog.h
src/mainwindow.cpp
src/mainwindow.h
src/projectitem.cpp
src/projectitem.h
src/projectlist.cpp
src/projectlist.h
src/renderer.cpp
src/renderwidget.cpp
src/renderwidget.h
src/widgets/configproject_ui.ui
src/widgets/renderwidget_ui.ui

index 485fe907627cd4aabd8dd53992e4f2504d6c0a3a..df2a4ec9ac108583ac41722501234acdf07dd51e 100644 (file)
@@ -34,6 +34,7 @@
 #include <KDebug>
 
 #include <QCryptographicHash>
+#include <QtConcurrentRun>
 
 #include <cstdio>
 
@@ -1079,3 +1080,34 @@ bool DocClipBase::hasAudioCodec(const QString &codec) const
     return prod->get(property) == codec;
 }
 
+void DocClipBase::generateProxy(KUrl proxyFolder)
+{
+    if (m_proxyThread.isRunning()) return;
+    QStringList parameters;
+    parameters << "-i" << m_properties.value("resource");
+    QString params = KdenliveSettings::proxyparams().simplified();
+    foreach(QString s, params.split(' '))
+    parameters << s;
+    // Make sure we don't block when proxy file already exists
+    parameters << "-y";
+    if (m_properties.value("file_hash").isEmpty()) getFileHash(m_properties.value("resource"));
+    QString path = proxyFolder.path(KUrl::AddTrailingSlash) + "proxy/" + m_properties.value("file_hash") + ".avi";
+    setProperty("proxy", path.toUtf8().data());
+    if (QFile::exists(path)) {
+        emit proxyReady(m_id, true);
+        return;
+    }
+    parameters << path;
+    m_proxyThread = QtConcurrent::run(this, &DocClipBase::slotGenerateProxy, parameters);
+}
+
+void DocClipBase::slotGenerateProxy(QStringList parameters)
+{
+    int result = QProcess::execute("ffmpeg", parameters);
+    if (result == 0) emit proxyReady(m_id, true);
+    else {
+        resetProducerProperty("proxy");
+        emit proxyReady(m_id, false);
+    }
+}
+
index 60e1402baa9fd3d1c6ce3205e09a1625b451be04..a17d554f1ba45f8286aa74d8a33fd115a9e853c5 100644 (file)
@@ -26,6 +26,8 @@
 #include <QPixmap>
 #include <QObject>
 #include <QTimer>
+#include <QProcess>
+#include <QFuture>
 
 #include <KUrl>
 
@@ -202,6 +204,8 @@ Q_OBJECT public:
     bool hasAudioCodec(const QString &codec) const;
     bool checkHash() const;
     void setPlaceHolder(bool place);
+    /** @brief Generate a proxy clip (lower resolution copy) named like the clip's hash. */
+    void generateProxy(KUrl proxyFolder);
 
 private:   // Private attributes
 
@@ -231,6 +235,8 @@ private:   // Private attributes
     bool m_placeHolder;
 
     QList <CutZoneInfo> m_cutZones;
+    
+    QFuture<void> m_proxyThread;
 
     void setAudioThumbCreated(bool isDone);
     /** Holds clip infos like fps, size,... */
@@ -263,9 +269,12 @@ public slots:
     QMap <QString, QString> properties() const;
     QMap <QString, QString> metadata() const;
 
+private slots:
+    void slotGenerateProxy(QStringList parameters);
 
 signals:
     void gotAudioData();
+    void proxyReady(const QString, bool success);
 };
 
 #endif
index f5d83b06fa455b6078d642cd5c67b7d9160fd32f..904d1162238dc0728fcdba7398089ef75554aaf0 100644 (file)
     </entry>
 
     <entry name="profiles_list" type="UInt">
-      <label>active project format.</label>
+      <label>Active project format.</label>
       <default></default>
     </entry>
+
+    <entry name="enableproxy" type="Bool">
+      <label>Enable proxy clips.</label>
+      <default>false</default>
+    </entry>
+
+    <entry name="autoproxy" type="Bool">
+      <label>Automatically create proxy clips.</label>
+      <default>true</default>
+    </entry>
+    
+    <entry name="proxyparams" type="String">
+      <label>Proxy clips transcoding parameters.</label>
+      <default>-f avi -acodec libmp3lame -ac 2 -ab 92k -ar 48000 -vcodec mpeg2video -g 5 -deinterlace -s 480x270 -b 150k</default>
+    </entry>
+
   </group>
 
   <group name="timeline">
index d2ba47fad5ffa08453891c2f14c92be4fee7f1b1..dcf15cf873773afd1ccd1c12271864d856561ee2 100644 (file)
@@ -614,6 +614,10 @@ void KdenliveSettingsDialog::updateSettings()
         KdenliveSettings::setVolume(m_configSdl.kcfg_volume->value());
         resetProfile = true;
     }
+    
+    if (m_configProject.kcfg_enableproxy->isChecked() != KdenliveSettings::enableproxy()) {
+        emit updateProxySettings();
+    }
 
     if (m_modified) {
         // The transcoding profiles were modified, save.
index 1f06efc7648ee845c9adcfed6aab66b6890aa1f5..6ffa99b9937979ba3f436cf6b020f27b14c54db1 100644 (file)
@@ -104,6 +104,7 @@ signals:
     void customChanged();
     void doResetProfile();
     void updateCaptureFolder();
+    void updateProxySettings();
 };
 
 
index 1d3240c9ad5da9a950e83a223ea6c43a69cb8089..84859d96767de2646bd6cde5dcf288ff38bba3ef 100644 (file)
@@ -2572,7 +2572,7 @@ void MainWindow::slotPreferences(int page, int option)
     
     KdenliveSettingsDialog* dialog = new KdenliveSettingsDialog(actions, this);
     connect(dialog, SIGNAL(settingsChanged(const QString&)), this, SLOT(updateConfiguration()));
-    //connect(dialog, SIGNAL(doResetProfile()), this, SLOT(slotDetectAudioDriver()));
+    connect(dialog, SIGNAL(updateProxySettings()), this, SLOT(slotUpdateProxySettings()));
     connect(dialog, SIGNAL(doResetProfile()), m_monitorManager, SLOT(slotResetProfiles()));
 #ifndef Q_WS_MAC
     connect(dialog, SIGNAL(updateCaptureFolder()), this, SLOT(slotUpdateCaptureFolder()));
@@ -3740,16 +3740,14 @@ void MainWindow::slotPrepareRendering(bool scriptExport, bool zoneOnly, const QS
                 return;
         }
         playlistPath = scriptPath + ".mlt";
-        m_projectMonitor->saveSceneList(playlistPath);
     } else {
         KTemporaryFile temp;
         temp.setAutoRemove(false);
         temp.setSuffix(".mlt");
         temp.open();
         playlistPath = temp.fileName();
-        m_projectMonitor->saveSceneList(playlistPath);
     }
-
+    QString playlistContent = m_projectMonitor->sceneList();
     if (!chapterFile.isEmpty()) {
         int in = 0;
         int out;
@@ -3804,6 +3802,32 @@ void MainWindow::slotPrepareRendering(bool scriptExport, bool zoneOnly, const QS
     if (m_renderWidget->automaticAudioExport()) {
         exportAudio = m_activeTimeline->checkProjectAudio();
     } else exportAudio = m_renderWidget->selectedAudioExport();
+    
+    // Do we want proxy rendering
+    if (KdenliveSettings::enableproxy() && !m_renderWidget->proxyRendering()) {
+        // replace proxy clips with originals
+        QMap <QString, QString> proxies = m_projectList->getProxies();
+        QMapIterator<QString, QString> i(proxies);
+        while (i.hasNext()) {
+            i.next();
+            // Replace all keys with their values (proxy path with original path)
+            playlistContent.replace(i.key(), i.value());
+        }
+    }
+    
+    // Do save scenelist
+    QFile file(playlistPath);
+    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
+        m_messageLabel->setMessage(i18n("Cannot write to file %1").arg(playlistPath), ErrorMessage);
+        return;
+    }
+    file.write(playlistContent.toUtf8());
+    if (file.error() != QFile::NoError) {
+        m_messageLabel->setMessage(i18n("Cannot write to file %1").arg(playlistPath), ErrorMessage);
+        file.close();
+        return;
+    }
+    file.close();
     m_renderWidget->slotExport(scriptExport, m_activeTimeline->inPoint(), m_activeTimeline->outPoint(), playlistPath, scriptPath, exportAudio);
 }
 
@@ -4112,6 +4136,12 @@ void MainWindow::slotDeleteClip(const QString &id)
     m_projectList->slotDeleteClip(id);
 }
 
+void MainWindow::slotUpdateProxySettings()
+{
+    if (m_renderWidget) m_renderWidget->updateProxyConfig();
+    //TODO: update proxy in project tree
+}
+
 #include "mainwindow.moc"
 
 #ifdef DEBUG_MAINW
index 1e2e3ab59bd60bbf3b5603e36e5990329b567998..34e24d1a408cfb2f006cae2527a96dd5f249a077 100644 (file)
@@ -534,6 +534,8 @@ private slots:
     void slotOpenStopmotion();
     /** @brief Implements all the actions that are int he ActionsCollection. */
     void slotDoAction(const QString& action_name);
+    /** @brief Update project because the use of proxy clips was enabled / disabled. */
+    void slotUpdateProxySettings();
  
 signals:
     Q_SCRIPTABLE void abortRenderJob(const QString &url);
index 1f26d0f7ceb88ef2c9b68d05e1f57b7dac4908eb..ac2a52568d113d30846f0f03433aaacc9b95e83a 100644 (file)
@@ -28,6 +28,7 @@
 #include <KIcon>
 
 const int DurationRole = Qt::UserRole + 1;
+const int ProxyRole = Qt::UserRole + 5;
 const int itemHeight = 38;
 
 ProjectItem::ProjectItem(QTreeWidget * parent, DocClipBase *clip) :
@@ -238,3 +239,8 @@ void ProjectItem::setProperties(const QMap < QString, QString > &attributes, con
     }
 }
 
+void ProjectItem::setProxyStatus(int status)
+{
+    setData(0, ProxyRole, status);
+}
+
index 0ed280211ba20de6764e89678d373fef38337346..06ff6979e0f8b452fa89627517277472da101169 100644 (file)
@@ -24,6 +24,7 @@
 #include <QTreeWidgetItem>
 #include <QTreeWidget>
 #include <QDomElement>
+#include <QProcess>
 
 #include <KUrl>
 
@@ -62,6 +63,8 @@ public:
     QString getClipHash() const;
     static int itemDefaultHeight();
     void slotSetToolTip();
+    /** \brief Set the status of proxy clip creation. 0 = no proxy, 1 = creating proxy, 2 = proxy created. */
+    void setProxyStatus(int status);
 
     virtual bool operator<(const QTreeWidgetItem &other)const {
         int column = treeWidget()->sortColumn();
@@ -74,6 +77,7 @@ private:
     CLIPTYPE m_clipType;
     QString m_clipId;
     DocClipBase *m_clip;
+
 };
 
 #endif
index ff3b6acc350078275dbbd188647b3e5145277e65..b2837a206950e25ffc1cd7b044bc69ccc319871e 100644 (file)
@@ -913,16 +913,7 @@ void ProjectList::deleteProjectFolder(QMap <QString, QString> map)
 void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties)
 {
     m_listView->setEnabled(false);
-    if (getProperties) {
-        m_listView->blockSignals(true);
-        m_refreshed = false;
-        // remove file_hash so that we load all properties for the clip
-        QDomElement e = clip->toXML().cloneNode().toElement();
-        e.removeAttribute("file_hash");
-        m_infoQueue.insert(clip->getId(), e);
-        //m_render->getFileProperties(clip->toXML(), clip->getId(), true);
-    }
-    clip->askForAudioThumbs();
+    if (getProperties) m_listView->blockSignals(true);
     const QString parent = clip->getProperty("groupid");
     ProjectItem *item = NULL;
     if (!parent.isEmpty()) {
@@ -941,8 +932,40 @@ void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties)
     }
     if (item == NULL)
         item = new ProjectItem(m_listView, clip);
+    if (item->data(0, DurationRole).isNull()) item->setData(0, DurationRole, i18n("Loading"));
+    if (getProperties) {
+        m_listView->blockSignals(true);
+        m_refreshed = false;
+        
+        // Proxy clips
+        CLIPTYPE t = clip->clipType();
+        if ((t == VIDEO || t == AV || t == UNKNOWN) && KdenliveSettings::enableproxy()) {
+            if (clip->getProperty("proxy").isEmpty()) {
+                connect(clip, SIGNAL(proxyReady(const QString, bool)), this, SLOT(slotGotProxy(const QString, bool)));
+                item->setProxyStatus(1);
+                clip->generateProxy(m_doc->projectFolder());
+            }
+            else {
+                // Proxy clip already created
+                item->setProxyStatus(2);
+                QDomElement e = clip->toXML().cloneNode().toElement();
+                e.removeAttribute("file_hash");
+                m_infoQueue.insert(clip->getId(), e);
+                
+            }
+        }
+        else {
+            // We don't use proxies
+            // remove file_hash so that we load all properties for the clip
+            QDomElement e = clip->toXML().cloneNode().toElement();
+            e.removeAttribute("file_hash");
+            m_infoQueue.insert(clip->getId(), e);
+        }
+        //m_render->getFileProperties(clip->toXML(), clip->getId(), true);
+    }
+    clip->askForAudioThumbs();
+    
     KUrl url = clip->fileURL();
-
     if (getProperties == false && !clip->getClipHash().isEmpty()) {
         QString cachedPixmap = m_doc->projectFolder().path(KUrl::AddTrailingSlash) + "thumbs/" + clip->getClipHash() + ".png";
         if (QFile::exists(cachedPixmap)) {
@@ -982,10 +1005,30 @@ void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties)
         if (getProperties)
             m_listView->blockSignals(false);
     }
+    
     if (getProperties && !m_queueTimer.isActive())
         slotProcessNextClipInQueue();
 }
 
+void ProjectList::slotGotProxy(const QString id, bool success)
+{
+    ProjectItem *item = getItemById(id);
+    if (item) {
+        disconnect(m_listView, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotItemEdited(QTreeWidgetItem *, int)));
+        if (success) {
+            // Proxy clip successfully created
+            item->setProxyStatus(2);
+            QDomElement e = item->referencedClip()->toXML().cloneNode().toElement();  
+            e.removeAttribute("file_hash");
+            m_infoQueue.insert(id, e);
+            if (!m_queueTimer.isActive()) slotProcessNextClipInQueue();
+        }
+        else item->setProxyStatus(0);
+        connect(m_listView, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotItemEdited(QTreeWidgetItem *, int)));
+        update();
+    }
+}
+
 void ProjectList::slotResetProjectList()
 {
     m_listView->clear();
@@ -1366,7 +1409,6 @@ void ProjectList::slotCheckForEmptyQueue()
 
 void ProjectList::reloadClipThumbnails()
 {
-    kDebug() << "//////////////  RELOAD CLIPS THUMBNAILS!!!";
     m_thumbnailQueue.clear();
     QTreeWidgetItemIterator it(m_listView);
     while (*it) {
@@ -1889,4 +1931,25 @@ void ProjectList::slotAddOrUpdateSequence(const QString frameName)
     } else emit displayMessage(i18n("Sequence not found"), -2);
 }
 
+QMap <QString, QString> ProjectList::getProxies()
+{
+    QMap <QString, QString> list;
+    ProjectItem *item;
+    QTreeWidgetItemIterator it(m_listView);
+    while (*it) {
+        if ((*it)->type() != PROJECTCLIPTYPE) {
+            // subitem
+            ++it;
+            continue;
+        }
+        item = static_cast<ProjectItem *>(*it);
+        if (item && item->referencedClip() != NULL) {
+            QString proxy = item->referencedClip()->getProperty("proxy");
+            if (!proxy.isEmpty()) list.insert(proxy, item->clipUrl().path());
+        }
+        ++it;
+    }
+    return list;
+}
+
 #include "projectlist.moc"
index 00ab5263f6f64d426d94d54115a6541dbd72f46d..186ce3a2c73498c1020d312c8a45e51a173dd3fa 100644 (file)
@@ -107,7 +107,33 @@ public:
             int usage = index.data(UsageRole).toInt();
             if (usage != 0) subText.append(QString(" (%1)").arg(usage));
             if (option.state & (QStyle::State_Selected)) painter->setPen(option.palette.color(QPalette::Mid));
-            painter->drawText(r2, Qt::AlignLeft | Qt::AlignVCenter , subText);
+            QRectF bounding;
+            painter->drawText(r2, Qt::AlignLeft | Qt::AlignVCenter , subText, &bounding);
+            
+            int proxy = index.data(Qt::UserRole + 5).toInt();
+            if (proxy > 0) {
+                QRectF txtBounding;
+                QString proxyText;
+                QBrush brush;
+                QColor color;
+                if (proxy == 1) {
+                    proxyText = i18n("Generating proxy...");
+                    brush = option.palette.highlight();
+                    color = option.palette.color(QPalette::HighlightedText);
+                }
+                else {
+                    proxyText = i18n("Proxy");
+                    brush = option.palette.mid();
+                    color = option.palette.color(QPalette::WindowText);
+                }
+                txtBounding = painter->boundingRect(r2, Qt::AlignRight | Qt::AlignVCenter, " " + proxyText + " ");
+                painter->setPen(Qt::NoPen);
+                painter->setBrush(brush);
+                painter->drawRoundedRect(txtBounding, 2, 2);
+                painter->setPen(option.palette.highlightedText().color());
+                painter->drawText(txtBounding, Qt::AlignHCenter | Qt::AlignVCenter , proxyText);
+            }
+            
             painter->restore();
         } else if (index.column() == 2 && KdenliveSettings::activate_nepomuk()) {
             if (index.data().toString().isEmpty()) {
@@ -161,6 +187,8 @@ public:
 
     /** @brief Returns a string list of all supported mime extensions. */
     static QString getExtensions();
+    /** @brief Returns a list of urls containing original and proxy urls. */
+    QMap <QString, QString> getProxies();
 
 public slots:
     void setDocument(KdenliveDoc *doc);
@@ -264,7 +292,8 @@ private slots:
     bool adjustProjectProfileToItem(ProjectItem *item = NULL);
     /** @brief Add a sequence from the stopmotion widget. */
     void slotAddOrUpdateSequence(const QString frameName);
-    //void slotShowMenu(const QPoint &pos);
+    /** @brief A proxy clip was created, update display. */
+    void slotGotProxy(const QString id, bool success);
 
 signals:
     void clipSelected(DocClipBase *, QPoint zone = QPoint());
@@ -286,3 +315,4 @@ signals:
 };
 
 #endif
+
index 37316771e6fdefc5f71b9ccafc0a661ddf85b9fb..22873c4dcb1f7b740c9a9c843e18b233c9a99957 100644 (file)
@@ -522,10 +522,12 @@ void Render::slotSplitView(bool doit)
 
 void Render::getFileProperties(const QDomElement xml, const QString &clipId, int imageHeight, bool replaceProducer)
 {
-    KUrl url = KUrl(xml.attribute("resource", QString()));
+    QString path;
+    if (KdenliveSettings::enableproxy() && xml.hasAttribute("proxy")) path = xml.attribute("proxy");
+    else path = xml.attribute("resource");
+    KUrl url = KUrl(path);
     Mlt::Producer *producer = NULL;
     CLIPTYPE type = (CLIPTYPE)xml.attribute("type").toInt();
-
     //kDebug() << "PROFILE WIDT: "<< xml.attribute("mlt_service") << ": "<< m_mltProfile->width() << "\n...................\n\n";
     /*if (xml.attribute("type").toInt() == TEXT && !QFile::exists(url.path())) {
         emit replyGetFileProperties(clipId, producer, QMap < QString, QString >(), QMap < QString, QString >(), replaceProducer);
index 5dc6e2099fdcb7d449d5f60f1c9c310b12ed2803..2535ced859d8c2524a60319996cf918902979bb0 100644 (file)
@@ -86,6 +86,8 @@ RenderWidget::RenderWidget(const QString &projectfolder, QWidget * parent) :
     if (KdenliveSettings::showrenderparams()) {
         m_view.buttonInfo->setDown(true);
     } else m_view.advanced_params->hide();
+    
+    m_view.proxy_render->setHidden(!KdenliveSettings::enableproxy());
 
     m_view.rescale_keep->setChecked(KdenliveSettings::rescalekeepratio());
     connect(m_view.rescale_width, SIGNAL(valueChanged(int)), this, SLOT(slotUpdateRescaleWidth(int)));
@@ -1901,3 +1903,12 @@ bool RenderWidget::selectedAudioExport() const
     return (m_view.export_audio->checkState() != Qt::Unchecked);
 }
 
+void RenderWidget::updateProxyConfig()
+{
+    m_view.proxy_render->setHidden(!KdenliveSettings::enableproxy());
+}
+
+bool RenderWidget::proxyRendering()
+{
+    return m_view.proxy_render->isChecked();
+}
index f8958a670f50e28b5ea108e48c43c80cbc3ffa31..7b1c20d82d3095d5379cb79a1200d92c076bd0a0 100644 (file)
@@ -127,6 +127,10 @@ public:
     bool automaticAudioExport() const;
     /** @brief Returns true if user wants audio export. */
     bool selectedAudioExport() const;
+    /** @brief Show / hide proxy settings. */
+    void updateProxyConfig();
+    /** @brief Should we render using proxy clips. */
+    bool proxyRendering();
 
 public slots:
     void slotExport(bool scriptExport, int zoneIn, int zoneOut, const QString &playlistPath, const QString &scriptPath, bool exportAudio);
index 33da0fea30e8bdf6397088e7c24917893f4a54a9..398dac0db15c7f963d0fc26e4ca6027e229ec669 100644 (file)
@@ -6,14 +6,14 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>262</width>
-    <height>155</height>
+    <width>268</width>
+    <height>333</height>
    </rect>
   </property>
   <property name="windowTitle">
    <string>Form</string>
   </property>
-  <layout class="QGridLayout" name="gridLayout">
+  <layout class="QGridLayout" name="gridLayout_4">
    <property name="leftMargin">
     <number>0</number>
    </property>
      </property>
     </spacer>
    </item>
-   <item row="2" column="0">
+   <item row="2" column="0" colspan="5">
+    <widget class="QGroupBox" name="groupBox">
+     <property name="title">
+      <string>Proxy clips</string>
+     </property>
+     <property name="checked">
+      <bool>false</bool>
+     </property>
+     <layout class="QGridLayout" name="gridLayout">
+      <item row="0" column="0">
+       <widget class="QCheckBox" name="kcfg_enableproxy">
+        <property name="text">
+         <string>Enable proxy clips for HD</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="0">
+       <widget class="QCheckBox" name="kcfg_autoproxy">
+        <property name="text">
+         <string>Generate automatically</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="0">
+       <widget class="QLabel" name="label">
+        <property name="text">
+         <string>Transcoding parameters</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="0">
+       <widget class="QPlainTextEdit" name="kcfg_proxyparams">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item row="3" column="0">
     <spacer name="verticalSpacer">
      <property name="orientation">
       <enum>Qt::Vertical</enum>
index 7dfc60046662e6b1751f3279989976cf42f77911..be71963d581e09ed909c81107b3d862a7255eb61 100644 (file)
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>362</width>
-    <height>554</height>
+    <width>391</width>
+    <height>575</height>
    </rect>
   </property>
   <property name="windowTitle">
          </layout>
         </widget>
        </item>
-       <item row="13" column="0" colspan="3">
+       <item row="14" column="0" colspan="3">
         <widget class="QPushButton" name="buttonRender">
          <property name="text">
           <string>Render to File</string>
          </property>
         </widget>
        </item>
-       <item row="13" column="3" colspan="4">
+       <item row="14" column="3" colspan="4">
         <widget class="QPushButton" name="buttonGenerateScript">
          <property name="text">
           <string>Generate Script</string>
          </property>
         </widget>
        </item>
-       <item row="13" column="7" colspan="2">
+       <item row="14" column="7" colspan="2">
         <spacer name="horizontalSpacer">
          <property name="orientation">
           <enum>Qt::Horizontal</enum>
          </property>
         </spacer>
        </item>
-       <item row="13" column="9">
+       <item row="14" column="9">
         <widget class="KPushButton" name="buttonClose">
          <property name="text">
           <string>Close</string>
          </property>
         </widget>
        </item>
-       <item row="14" column="0" colspan="10">
+       <item row="15" column="0" colspan="10">
         <widget class="QGroupBox" name="errorBox">
          <property name="title">
           <string/>
          </layout>
         </widget>
        </item>
+       <item row="13" column="0" colspan="10">
+        <widget class="QCheckBox" name="proxy_render">
+         <property name="text">
+          <string>Render using proxy clips</string>
+         </property>
+        </widget>
+       </item>
       </layout>
      </widget>
      <widget class="QWidget" name="tab_2">