]> git.sesse.net Git - kdenlive/commitdiff
User can now save & delete custom export profiles
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 10 Mar 2008 23:19:14 +0000 (23:19 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 10 Mar 2008 23:19:14 +0000 (23:19 +0000)
svn path=/branches/KDE4/; revision=2045

src/CMakeLists.txt
src/kdenlivedoc.cpp
src/kdenlivedoc.h
src/renderwidget.cpp
src/renderwidget.h
src/widgets/renderwidget_ui.ui
src/widgets/saveprofile_ui.ui [new file with mode: 0644]

index 0efc4b97f7f0c48f9f91d0cb96d919552ad47c97..0e4f61f1959bd736ab06ec1ff902aed11891e0c2 100644 (file)
@@ -38,6 +38,7 @@ kde4_add_ui_files(kdenlive_UI
   widgets/titlewidget_ui.ui
   widgets/timelinebuttons_ui.ui
   widgets/renderwidget_ui.ui
+  widgets/saveprofile_ui.ui
 )
  
 set(kdenlive_SRCS 
index 7f93841be66f646c13e0d4ecce46a5d7b6a98c94..fa83913fd818ddc12af6190fa8a5d46a5add3917 100644 (file)
@@ -114,6 +114,12 @@ ClipManager *KdenliveDoc::clipManager() {
     return m_clipManager;
 }
 
+QString KdenliveDoc::getDocumentStandard() {
+    //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)) return "PAL";
+    return "NTSC";
+}
+
 QString KdenliveDoc::profilePath() const {
     return m_profile.path;
 }
index af970bb22ac0bf7483149adf2f6996e7e1b21938..738e3898d815255a1b68c05e1350425e67a64659 100644 (file)
@@ -69,6 +69,8 @@ Q_OBJECT public:
     void setThumbsProgress(KUrl url, int progress);
     QString profilePath() const;
     QString description() const;
+    /** Returns the document format: PAL or NTSC */
+    QString getDocumentStandard();
 
 private:
     KUrl m_url;
index 8cb2cfc1acf39d6c1c208762b9069b148f40f91f..bdccc0eb36878148ba6f093f150ee79d8843979b 100644 (file)
 #include <KStandardDirs>
 #include <KDebug>
 #include <KMessageBox>
+#include <KComboBox>
 
 #include "kdenlivesettings.h"
 #include "renderwidget.h"
+#include "ui_saveprofile_ui.h"
 
 const int GroupRole = Qt::UserRole;
 const int ExtensionRole = GroupRole + 1;
 const int StandardRole = GroupRole + 2;
 const int RenderRole = GroupRole + 3;
 const int ParamsRole = GroupRole + 4;
+const int EditableRole = GroupRole + 5;
 
 RenderWidget::RenderWidget(QWidget * parent): QDialog(parent), m_standard("PAL") {
     m_view.setupUi(this);
+    m_view.buttonDelete->setIcon(KIcon("trash-empty"));
+    m_view.buttonDelete->setToolTip(i18n("Delete profile"));
+    m_view.buttonDelete->setEnabled(false);
+
+    m_view.buttonSave->setIcon(KIcon("document-new"));
+    m_view.buttonSave->setToolTip(i18n("Create new profile"));
+
+    connect(m_view.buttonSave, SIGNAL(clicked()), this, SLOT(slotSaveProfile()));
+    connect(m_view.buttonDelete, SIGNAL(clicked()), this, SLOT(slotDeleteProfile()));
     connect(m_view.buttonStart, SIGNAL(clicked()), this, SLOT(slotExport()));
     connect(m_view.out_file, SIGNAL(textChanged(const QString &)), this, SLOT(slotUpdateButtons()));
     connect(m_view.format_list, SIGNAL(currentRowChanged(int)), this, SLOT(refreshView()));
     connect(m_view.size_list, SIGNAL(currentRowChanged(int)), this, SLOT(refreshParams()));
+
     m_view.buttonStart->setEnabled(false);
     parseProfiles();
 }
@@ -48,6 +61,121 @@ void RenderWidget::slotUpdateButtons() {
     else m_view.buttonStart->setEnabled(true);
 }
 
+void RenderWidget::slotSaveProfile() {
+    Ui::SaveProfile_UI ui;
+    QDialog *d = new QDialog(this);
+    ui.setupUi(d);
+    QString customGroup = i18n("Custom");
+    QStringList groupNames;
+    for (int i = 0; i < m_view.format_list->count(); i++)
+        groupNames.append(m_view.format_list->item(i)->text());
+    if (!groupNames.contains(customGroup)) groupNames.prepend(customGroup);
+    ui.group_name->addItems(groupNames);
+    int pos = ui.group_name->findText(customGroup);
+    ui.group_name->setCurrentIndex(pos);
+
+    ui.parameters->setText(m_view.advanced_params->text());
+    ui.extension->setText(m_view.size_list->currentItem()->data(ExtensionRole).toString());
+    ui.profile_name->setFocus();
+    if (d->exec() == QDialog::Accepted) {
+        QString exportFile = KStandardDirs::locateLocal("data", "kdenlive/export/customprofiles.xml");
+        QDomDocument doc;
+        QFile file(exportFile);
+        doc.setContent(&file, false);
+        file.close();
+
+        QDomElement documentElement;
+        bool groupExists = false;
+        QString groupName;
+        QString newProfileName = ui.profile_name->text();
+        QString newGroupName = ui.group_name->currentText();
+        QDomNodeList groups = doc.elementsByTagName("group");
+        int i = 0;
+        if (groups.count() == 0) {
+            QDomElement profiles = doc.createElement("profiles");
+            doc.appendChild(profiles);
+        } else while (!groups.item(i).isNull()) {
+                documentElement = groups.item(i).toElement();
+                groupName = documentElement.attribute("name");
+                kDebug() << "// SAVE, PARSING FROUP: " << i << ", name: " << groupName << ", LOOK FR: " << newGroupName;
+                if (groupName == newGroupName) {
+                    groupExists = true;
+                    break;
+                }
+                i++;
+            }
+        if (!groupExists) {
+            documentElement = doc.createElement("group");
+            documentElement.setAttribute("name", ui.group_name->currentText());
+            documentElement.setAttribute("renderer", "avformat");
+            doc.documentElement().appendChild(documentElement);
+        }
+        QDomElement profileElement = doc.createElement("profile");
+        profileElement.setAttribute("name", newProfileName);
+        profileElement.setAttribute("extension", ui.extension->text().simplified());
+        profileElement.setAttribute("args", ui.parameters->text().simplified());
+        documentElement.appendChild(profileElement);
+
+        //QCString save = doc.toString().utf8();
+
+        if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
+            KMessageBox::sorry(this, i18n("Unable to write to file %1", exportFile));
+            delete d;
+            return;
+        }
+        QTextStream out(&file);
+        out << doc.toString();
+        file.close();
+        parseProfiles();
+    }
+    delete d;
+}
+
+void RenderWidget::slotDeleteProfile() {
+    QString currentGroup = m_view.format_list->currentItem()->text();
+    QString currentProfile = m_view.size_list->currentItem()->text();
+
+    QString exportFile = KStandardDirs::locateLocal("data", "kdenlive/export/customprofiles.xml");
+    QDomDocument doc;
+    QFile file(exportFile);
+    doc.setContent(&file, false);
+    file.close();
+
+    QDomElement documentElement;
+    bool groupExists = false;
+    QString groupName;
+    QDomNodeList groups = doc.elementsByTagName("group");
+    int i = 0;
+
+    while (!groups.item(i).isNull()) {
+        documentElement = groups.item(i).toElement();
+        groupName = documentElement.attribute("name");
+        if (groupName == currentGroup) {
+            QDomNodeList children = documentElement.childNodes();
+            for (int j = 0; j < children.count(); j++) {
+                QDomElement pro = children.at(j).toElement();
+                if (pro.attribute("name") == currentProfile) {
+                    groups.item(i).removeChild(children.at(j));
+                    if (groups.item(i).childNodes().isEmpty())
+                        doc.documentElement().removeChild(groups.item(i));
+                    break;
+                }
+            }
+            break;
+        }
+        i++;
+    }
+
+    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
+        KMessageBox::sorry(this, i18n("Unable to write to file %1", exportFile));
+        return;
+    }
+    QTextStream out(&file);
+    out << doc.toString();
+    file.close();
+    parseProfiles();
+}
+
 void RenderWidget::slotExport() {
     QFile f(m_view.out_file->url().path());
     if (f.exists()) {
@@ -103,23 +231,35 @@ void RenderWidget::refreshParams() {
     } else {
         m_view.out_file->setUrl(KUrl(QDir::homePath() + "/untitled." + extension));
     }
+
+    if (item->data(EditableRole).toString().isEmpty()) m_view.buttonDelete->setEnabled(false);
+    else m_view.buttonDelete->setEnabled(true);
 }
 
 void RenderWidget::parseProfiles() {
+    m_view.size_list->clear();
+    m_view.format_list->clear();
     QString exportFile = KStandardDirs::locate("data", "kdenlive/export/profiles.xml");
+    parseFile(exportFile, false);
+    exportFile = KStandardDirs::locateLocal("data", "kdenlive/export/customprofiles.xml");
+    parseFile(exportFile, true);
+    refreshView();
+}
+
+void RenderWidget::parseFile(QString exportFile, bool editable) {
     QDomDocument doc;
     QFile file(exportFile);
     doc.setContent(&file, false);
+    file.close();
     QDomElement documentElement;
     QDomElement profileElement;
-
     QDomNodeList groups = doc.elementsByTagName("group");
 
     if (groups.count() == 0) {
         kDebug() << "// Export file: " << exportFile << " IS BROKEN";
         return;
     }
-    kDebug() << "// FOUND FFECT GROUP: " << groups.count() << " IS BROKEN";
+
     int i = 0;
     QString groupName;
     QString profileName;
@@ -134,7 +274,8 @@ void RenderWidget::parseProfiles() {
         groupName = documentElement.attribute("name", QString::null);
         extension = documentElement.attribute("extension", QString::null);
         renderer = documentElement.attribute("renderer", QString::null);
-        new QListWidgetItem(groupName, m_view.format_list);
+        if (m_view.format_list->findItems(groupName, Qt::MatchExactly).isEmpty())
+            new QListWidgetItem(groupName, m_view.format_list);
 
         QDomNode n = groups.item(i).firstChild();
         while (!n.isNull()) {
@@ -150,29 +291,16 @@ void RenderWidget::parseProfiles() {
             item->setData(RenderRole, renderer);
             item->setData(StandardRole, standard);
             item->setData(ParamsRole, params);
+            if (editable) item->setData(EditableRole, "true");
             n = n.nextSibling();
         }
 
         i++;
-        /*
-                bool ladspaOk = true;
-                if (tag == "ladspa") {
-                    QString library = documentElement.attribute("library", QString::null);
-                    if (KStandardDirs::locate("ladspa_plugin", library).isEmpty()) ladspaOk = false;
-                }
-
-                // Parse effect file
-                if ((filtersList.contains(tag) || producersList.contains(tag)) && ladspaOk) {
-                    bool isAudioEffect = false;
-                    QDomNode propsnode = documentElement.elementsByTagName("properties").item(0);
-                    if (!propsnode.isNull()) {
-                        QDomElement propselement = propsnode.toElement();
-        */
     }
-    refreshView();
 }
 
 
+
 #include "renderwidget.moc"
 
 
index 2bbed5ffc7c62d8fdd4d8b90f5ac4ad66f35d499..105f84d0023091bbb86f48226e7722559ccfd520 100644 (file)
@@ -32,16 +32,20 @@ class RenderWidget : public QDialog {
 public:
     RenderWidget(QWidget * parent = 0);
     void setDocumentStandard(QString std);
+
 private slots:
     void slotUpdateButtons();
     void slotExport();
     void refreshView();
     void refreshParams();
+    void slotSaveProfile();
+    void slotDeleteProfile();
 
 private:
     Ui::RenderWidget_UI m_view;
     QString m_standard;
     void parseProfiles();
+    void parseFile(QString exportFile, bool editable);
 
 signals:
     void doRender(const QString&, const QStringList &, bool, bool);
index 6566530f3ea93c886936c779a4f9c9dc0829f0d5..c4825fd2d32b44160bf52a1716fc8a66f7f4770d 100644 (file)
         </widget>
        </item>
        <item row="2" column="0" colspan="3" >
-        <widget class="KLineEdit" name="advanced_params" />
+        <widget class="KLineEdit" name="advanced_params" >
+         <property name="readOnly" >
+          <bool>true</bool>
+         </property>
+        </widget>
        </item>
        <item row="2" column="3" >
         <widget class="QToolButton" name="buttonSave" >
diff --git a/src/widgets/saveprofile_ui.ui b/src/widgets/saveprofile_ui.ui
new file mode 100644 (file)
index 0000000..205bb9e
--- /dev/null
@@ -0,0 +1,132 @@
+<ui version="4.0" >
+ <class>SaveProfile_UI</class>
+ <widget class="QDialog" name="SaveProfile_UI" >
+  <property name="geometry" >
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>400</width>
+    <height>225</height>
+   </rect>
+  </property>
+  <property name="windowTitle" >
+   <string>Save Profile</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout" >
+   <item row="0" column="0" >
+    <widget class="QLabel" name="label_2" >
+     <property name="text" >
+      <string>Group</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="1" colspan="2" >
+    <widget class="KComboBox" name="group_name" />
+   </item>
+   <item row="1" column="0" >
+    <widget class="QLabel" name="label_3" >
+     <property name="text" >
+      <string>Profile name</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="1" colspan="2" >
+    <widget class="KLineEdit" name="profile_name" />
+   </item>
+   <item row="2" column="0" >
+    <widget class="QLabel" name="label_4" >
+     <property name="text" >
+      <string>Extension</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="1" colspan="2" >
+    <widget class="KLineEdit" name="extension" >
+     <property name="maxLength" >
+      <number>4</number>
+     </property>
+    </widget>
+   </item>
+   <item row="3" column="0" colspan="2" >
+    <widget class="QLabel" name="label" >
+     <property name="text" >
+      <string>Parameters</string>
+     </property>
+    </widget>
+   </item>
+   <item row="4" column="0" colspan="3" >
+    <widget class="KLineEdit" name="parameters" />
+   </item>
+   <item row="5" column="2" >
+    <spacer name="verticalSpacer" >
+     <property name="orientation" >
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0" >
+      <size>
+       <width>20</width>
+       <height>17</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item row="6" column="0" colspan="3" >
+    <widget class="QDialogButtonBox" name="buttonBox" >
+     <property name="orientation" >
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons" >
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>KComboBox</class>
+   <extends>QComboBox</extends>
+   <header>kcombobox.h</header>
+  </customwidget>
+  <customwidget>
+   <class>KLineEdit</class>
+   <extends>QLineEdit</extends>
+   <header>klineedit.h</header>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>SaveProfile_UI</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel" >
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel" >
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>SaveProfile_UI</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel" >
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel" >
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>