]> git.sesse.net Git - kdenlive/commitdiff
Add new dialog for template clips, fix thumbs & monitors not updating when clip is...
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Fri, 19 Jun 2009 09:28:57 +0000 (09:28 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Fri, 19 Jun 2009 09:28:57 +0000 (09:28 +0000)
svn path=/trunk/kdenlive/; revision=3592

src/CMakeLists.txt
src/kdenlivedoc.cpp
src/kdenlivedoc.h
src/mainwindow.cpp
src/monitor.h
src/projectlist.cpp
src/projectlist.h
src/titlewidget.cpp
src/titlewidget.h

index e01ea473ee94c3dca1c6de97c9c0d1176d64b149..8b47796dea251d5ef57b065dc13f870a4ce39e21 100644 (file)
@@ -75,6 +75,7 @@ kde4_add_ui_files(kdenlive_UI
   widgets/missingclips_ui.ui
   widgets/cliptranscode_ui.ui
   widgets/geometryposition_ui.ui
+  widgets/templateclip_ui.ui
 )
 
 set(kdenlive_SRCS
index 549807b4155def56fa87b3f24b1d89cc4040088e..ef3d2369a49b41c71327dc61bf94cb4c5053d1fa 100644 (file)
@@ -1046,11 +1046,11 @@ DocClipBase *KdenliveDoc::getBaseClip(const QString &clipId)
     return m_clipManager->getClipById(clipId);
 }
 
-void KdenliveDoc::slotCreateTextClip(QString group, const QString &groupId)
+void KdenliveDoc::slotCreateTextClip(QString group, const QString &groupId, const QString &templatePath)
 {
     QString titlesFolder = projectFolder().path() + "/titles/";
     KStandardDirs::makeDir(titlesFolder);
-    TitleWidget *dia_ui = new TitleWidget(KUrl(), titlesFolder, m_render, kapp->activeWindow());
+    TitleWidget *dia_ui = new TitleWidget(templatePath, titlesFolder, m_render, kapp->activeWindow());
     if (dia_ui->exec() == QDialog::Accepted) {
         QStringList titleInfo = TitleWidget::getFreeTitleInfo(projectFolder());
         QImage pix = dia_ui->renderedPixmap();
@@ -1062,15 +1062,18 @@ void KdenliveDoc::slotCreateTextClip(QString group, const QString &groupId)
     delete dia_ui;
 }
 
-void KdenliveDoc::slotCreateTextTemplateClip(QString group, const QString &groupId)
+void KdenliveDoc::slotCreateTextTemplateClip(QString group, const QString &groupId, KUrl path)
 {
-    KUrl titlesFolder = KUrl(projectFolder().path() + "/titles/");
-    KUrl path = KFileDialog::getOpenUrl(titlesFolder, "*.kdenlivetitle", kapp->activeWindow(), i18n("Enter Template Path"));
+    QString titlesFolder = projectFolder().path() + "/titles/";
+    if (path.isEmpty()) {
+        path = KFileDialog::getOpenUrl(KUrl(titlesFolder), "*.kdenlivetitle", kapp->activeWindow(), i18n("Enter Template Path"));
+    }
+
     if (path.isEmpty()) return;
 
     QStringList titleInfo = TitleWidget::getFreeTitleInfo(projectFolder());
 
-    TitleWidget *dia_ui = new TitleWidget(path, titlesFolder.path(), m_render, kapp->activeWindow());
+    TitleWidget *dia_ui = new TitleWidget(path, titlesFolder, m_render, kapp->activeWindow());
     QImage pix = dia_ui->renderedPixmap();
     pix.save(titleInfo.at(1));
     delete dia_ui;
index b1b353bc68a74e5a2005880b5a6258c4a5f29b8b..095e8d50d67f5ce2022a5a0a746d570837103409 100644 (file)
@@ -150,8 +150,8 @@ private:
     bool checkDocumentClips(QDomNodeList infoproducers);
 
 public slots:
-    void slotCreateTextClip(QString group, const QString &groupId);
-    void slotCreateTextTemplateClip(QString group, const QString &groupId);
+    void slotCreateTextClip(QString group, const QString &groupId, const QString &templatePath = QString());
+    void slotCreateTextTemplateClip(QString group, const QString &groupId, KUrl path);
     /** Set to true if document needs saving, false otherwise */
     void setModified(bool mod = true);
     void checkProjectClips();
index fe9f0a89d44c0f73b4175ee2b36ee2ccdd5fda4a..67b669d319bbbe5961e98d8cca545ddecbcafef3 100644 (file)
@@ -51,6 +51,7 @@
 #include "interfaces.h"
 #include "kdenlive-config.h"
 #include "cliptranscode.h"
+#include "ui_templateclip_ui.h"
 
 #include <KApplication>
 #include <KAction>
@@ -1848,6 +1849,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
         }
         //m_activeDocument->setRenderer(NULL);
         disconnect(m_projectList, SIGNAL(clipSelected(DocClipBase *)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *)));
+        disconnect(m_projectList, SIGNAL(refreshClip()), m_clipMonitor, SLOT(refreshMonitor()));
         m_clipMonitor->stop();
     }
     KdenliveSettings::setCurrent_profile(doc->profilePath());
@@ -1857,6 +1859,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
     m_transitionConfig->updateProjectFormat(doc->mltProfile(), doc->timecode(), trackView->tracksNumber());
     m_effectStack->updateProjectFormat(doc->mltProfile(), doc->timecode());
     connect(m_projectList, SIGNAL(clipSelected(DocClipBase *)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *)));
+    connect(m_projectList, SIGNAL(refreshClip()), m_clipMonitor, SLOT(refreshMonitor()));
     connect(m_projectList, SIGNAL(projectModified()), doc, SLOT(setModified()));
     connect(m_projectList, SIGNAL(clipNameChanged(const QString, const QString)), trackView->projectView(), SLOT(clipNameChanged(const QString, const QString)));
 
@@ -2326,10 +2329,57 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip)
         QString titlepath = m_activeDocument->projectFolder().path() + "/titles/";
         if (!clip->getProperty("xmltemplate").isEmpty()) {
             // template text clip
-            KUrl path = KUrlRequesterDialog::getUrl(clip->getProperty("xmltemplate"), this, i18n("Change template path"));
-            if (!path.isEmpty() && (path.path() != clip->getProperty("xmltemplate"))) {
-                // Clip template modified, update
-                m_projectList->regenerateTemplate(clip->getId());
+
+            // Get the list of existing templates
+            QStringList filter;
+            filter << "*.kdenlivetitle";
+            QStringList templateFiles = QDir(titlepath).entryList(filter, QDir::Files);
+
+            QDialog *dia = new QDialog(this);
+            Ui::TemplateClip_UI dia_ui;
+            dia_ui.setupUi(dia);
+            int ix = -1;
+            const QString templatePath = clip->getProperty("xmltemplate");
+            for (int i = 0; i < templateFiles.size(); ++i) {
+                dia_ui.template_list->comboBox()->addItem(templateFiles.at(i), titlepath + templateFiles.at(i));
+                if (templatePath == KUrl(titlepath + templateFiles.at(i)).path()) ix = i;
+            }
+            if (ix != -1) dia_ui.template_list->comboBox()->setCurrentIndex(ix);
+            else dia_ui.template_list->comboBox()->insertItem(0, templatePath);
+            dia_ui.template_list->fileDialog()->setFilter("*.kdenlivetitle");
+            //warning: setting base directory doesn't work??
+            KUrl startDir(titlepath);
+            dia_ui.template_list->fileDialog()->setUrl(startDir);
+            dia_ui.description->setText(clip->getProperty("description"));
+            dia_ui.clone_clip->setChecked(true);
+            if (dia->exec() == QDialog::Accepted) {
+                QString textTemplate = dia_ui.template_list->comboBox()->itemData(dia_ui.template_list->comboBox()->currentIndex()).toString();
+                if (textTemplate.isEmpty()) textTemplate = dia_ui.template_list->comboBox()->currentText();
+
+                QMap <QString, QString> newprops;
+
+                if (KUrl(textTemplate).path() != templatePath) {
+                    // The template was changed
+                    newprops.insert("xmltemplate", textTemplate);
+                }
+
+                if (dia_ui.description->toPlainText() != clip->getProperty("description")) {
+                    newprops.insert("description", dia_ui.description->toPlainText());
+                }
+
+                QString newtemplate = newprops.value("xmltemplate");
+                if (newtemplate.isEmpty()) newtemplate = templatePath;
+
+                // template modified we need to update xmldata
+                QString description = newprops.value("description");
+                if (description.isEmpty()) description = clip->getProperty("description");
+                newprops.insert("xmldata", m_projectList->generateTemplateXml(newtemplate, description).toString());
+                if (dia_ui.normal_clip->isChecked()) {
+                    // Switch clip to normal clip
+                    newprops.insert("xmltemplate", QString());
+                }
+                EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newprops, true);
+                m_activeDocument->commandStack()->push(command);
             }
             return;
         }
@@ -2339,16 +2389,12 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip)
         doc.setContent(clip->getProperty("xmldata"));
         dia_ui->setXml(doc);
         if (dia_ui->exec() == QDialog::Accepted) {
-            QImage pix = dia_ui->renderedPixmap();
-            pix.save(path);
-            //slotAddClipFile(KUrl("/tmp/kdenlivetitle.png"), QString(), -1);
-            //m_clipManager->slotEditTextClipFile(id, dia_ui->xml().toString());
+            QRect rect = dia_ui->renderedRect();
             QMap <QString, QString> newprops;
             newprops.insert("xmldata", dia_ui->xml().toString());
-            newprops.insert("frame_size", QString::number(pix.width()) + 'x' + QString::number(pix.height()));
+            newprops.insert("frame_size", QString::number(rect.width()) + 'x' + QString::number(rect.height()));
             EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newprops, true);
             m_activeDocument->commandStack()->push(command);
-            m_clipMonitor->refreshMonitor(true);
             m_activeDocument->setModified(true);
         }
         delete dia_ui;
index accd3aac0a6b8eb9eeb8977d45b6963511fba48e..1b73d75518d7dfa8620c667fc39916fd6c906b15 100644 (file)
@@ -131,7 +131,7 @@ public slots:
     void slotOpenFile(const QString &);
     void slotSetXml(DocClipBase *clip, const int position = -1);
     void initMonitor();
-    void refreshMonitor(bool visible);
+    void refreshMonitor(bool visible = true);
     void slotSeek(int pos);
     void stop();
     void start();
index 79612ca94d29ce93076a478e840a43e43f3f1caa..db61f5042a4065f375d08f8e9b692e8aa1a859d3 100644 (file)
@@ -33,7 +33,7 @@
 #include "projectlistview.h"
 #include "editclipcommand.h"
 #include "editfoldercommand.h"
-
+#include "ui_templateclip_ui.h"
 
 #include <KDebug>
 #include <KAction>
@@ -264,7 +264,10 @@ void ProjectList::slotUpdateClipProperties(const QString &id, QMap <QString, QSt
     ProjectItem *item = getItemById(id);
     if (item) {
         slotUpdateClipProperties(item, properties);
-        if (properties.contains("colour") || properties.contains("resource") || properties.contains("xmldata") || properties.contains("force_aspect_ratio")) slotRefreshClipThumbnail(item);
+        if (properties.contains("colour") || properties.contains("resource") || properties.contains("xmldata") || properties.contains("force_aspect_ratio")) {
+            slotRefreshClipThumbnail(item);
+            emit refreshClip();
+        }
         if (properties.contains("out")) item->changeDuration(properties.value("out").toInt());
     }
 }
@@ -273,6 +276,7 @@ void ProjectList::slotUpdateClipProperties(ProjectItem *clip, QMap <QString, QSt
 {
     if (!clip) return;
     if (!clip->isGroup()) clip->setProperties(properties);
+    if (properties.contains("xmldata")) regenerateTemplateImage(clip);
     if (properties.contains("name")) {
         m_listView->blockSignals(true);
         clip->setText(1, properties.value("name"));
@@ -302,13 +306,16 @@ void ProjectList::slotItemEdited(QTreeWidgetItem *item, int column)
             QMap <QString, QString> newprops;
             oldprops["description"] = clip->referencedClip()->getProperty("description");
             newprops["description"] = item->text(2);
-            slotUpdateClipProperties(clip, newprops);
-            EditClipCommand *command = new EditClipCommand(this, clip->clipId(), oldprops, newprops, false);
-            m_commandStack->push(command);
-            if (!clip->referencedClip()->getProperty("xmltemplate").isEmpty()) {
+
+            if (clip->clipType() == TEXT && !clip->referencedClip()->getProperty("xmltemplate").isEmpty()) {
                 // This is a text template clip, update the image
-                regenerateTemplate(clip);
+                oldprops.insert("xmldata", clip->referencedClip()->getProperty("xmldata"));
+                newprops.insert("xmldata", generateTemplateXml(clip->referencedClip()->getProperty("xmltemplate"), item->text(2)).toString());
             }
+
+            slotUpdateClipProperties(clip->clipId(), newprops);
+            EditClipCommand *command = new EditClipCommand(this, clip->clipId(), oldprops, newprops, false);
+            m_commandStack->push(command);
         }
     } else if (column == 1) {
         if (clip->isGroup()) {
@@ -644,18 +651,17 @@ void ProjectList::slotAddColorClip()
 {
     if (!m_commandStack) kDebug() << "!!!!!!!!!!!!!!!! NO CMD STK";
     QDialog *dia = new QDialog(this);
-    Ui::ColorClip_UI *dia_ui = new Ui::ColorClip_UI();
-    dia_ui->setupUi(dia);
-    dia_ui->clip_name->setText(i18n("Color Clip"));
-    dia_ui->clip_duration->setText(KdenliveSettings::color_duration());
+    Ui::ColorClip_UI dia_ui;
+    dia_ui.setupUi(dia);
+    dia_ui.clip_name->setText(i18n("Color Clip"));
+    dia_ui.clip_duration->setText(KdenliveSettings::color_duration());
     if (dia->exec() == QDialog::Accepted) {
-        QString color = dia_ui->clip_color->color().name();
+        QString color = dia_ui.clip_color->color().name();
         color = color.replace(0, 1, "0x") + "ff";
         QStringList groupInfo = getGroup();
-        m_doc->clipManager()->slotAddColorClipFile(dia_ui->clip_name->text(), color, dia_ui->clip_duration->text(), groupInfo.at(0), groupInfo.at(1));
+        m_doc->clipManager()->slotAddColorClipFile(dia_ui.clip_name->text(), color, dia_ui.clip_duration->text(), groupInfo.at(0), groupInfo.at(1));
         m_doc->setModified(true);
     }
-    delete dia_ui;
     delete dia;
 }
 
@@ -682,7 +688,37 @@ void ProjectList::slotAddTitleClip()
 void ProjectList::slotAddTitleTemplateClip()
 {
     QStringList groupInfo = getGroup();
-    m_doc->slotCreateTextTemplateClip(groupInfo.at(0), groupInfo.at(1));
+    if (!m_commandStack) kDebug() << "!!!!!!!!!!!!!!!! NO CMD STK";
+
+    // Get the list of existing templates
+    QStringList filter;
+    filter << "*.kdenlivetitle";
+    const QString path = m_doc->projectFolder().path() + "/titles/";
+    QStringList templateFiles = QDir(path).entryList(filter, QDir::Files);
+
+    QDialog *dia = new QDialog(this);
+    Ui::TemplateClip_UI dia_ui;
+    dia_ui.setupUi(dia);
+    for (int i = 0; i < templateFiles.size(); ++i) {
+        dia_ui.template_list->comboBox()->addItem(templateFiles.at(i), path + templateFiles.at(i));
+    }
+    dia_ui.template_list->fileDialog()->setFilter("*.kdenlivetitle");
+    //warning: setting base directory doesn't work??
+    KUrl startDir(path);
+    dia_ui.template_list->fileDialog()->setUrl(startDir);
+    dia_ui.description->setHidden(true);
+    if (dia->exec() == QDialog::Accepted) {
+        QString textTemplate = dia_ui.template_list->comboBox()->itemData(dia_ui.template_list->comboBox()->currentIndex()).toString();
+        if (textTemplate.isEmpty()) textTemplate = dia_ui.template_list->comboBox()->currentText();
+        if (dia_ui.normal_clip->isChecked()) {
+            // Create a normal title clip
+            m_doc->slotCreateTextClip(groupInfo.at(0), groupInfo.at(1), textTemplate);
+        } else {
+            // Create a cloned template clip
+            m_doc->slotCreateTextTemplateClip(groupInfo.at(0), groupInfo.at(1), KUrl(textTemplate));
+        }
+    }
+    delete dia;
 }
 
 QStringList ProjectList::getGroup() const
@@ -907,27 +943,48 @@ void ProjectList::regenerateTemplate(ProjectItem *clip)
     // Generate image for template clip
     const QString comment = clip->referencedClip()->getProperty("description");
     const QString path = clip->referencedClip()->getProperty("xmltemplate");
+    QDomDocument doc = generateTemplateXml(path, comment);
+    TitleWidget *dia_ui = new TitleWidget(KUrl(), QString(), m_render, this);
+    dia_ui->setXml(doc);
+    QImage pix = dia_ui->renderedPixmap();
+    pix.save(clip->clipUrl().path());
+    delete dia_ui;
+    clip->referencedClip()->producer()->set("force_reload", 1);
+}
+
+void ProjectList::regenerateTemplateImage(ProjectItem *clip)
+{
+    // Generate image for template clip
+    TitleWidget *dia_ui = new TitleWidget(KUrl(), QString(), m_render, this);
+    QDomDocument doc;
+    doc.setContent(clip->referencedClip()->getProperty("xmldata"));
+    dia_ui->setXml(doc);
+    QImage pix = dia_ui->renderedPixmap();
+    pix.save(clip->clipUrl().path());
+    delete dia_ui;
+}
+
+QDomDocument ProjectList::generateTemplateXml(QString path, const QString &replaceString)
+{
     QDomDocument doc;
     QFile file(path);
-    if (!file.open(QIODevice::ReadOnly))
-        return;
+    if (!file.open(QIODevice::ReadOnly)) {
+        kWarning() << "ERROR, CANNOT READ: " << path;
+        return doc;
+    }
     if (!doc.setContent(&file)) {
+        kWarning() << "ERROR, CANNOT READ: " << path;
         file.close();
-        return;
+        return doc;
     }
     file.close();
     QDomNodeList texts = doc.elementsByTagName("content");
     for (int i = 0; i < texts.count(); i++) {
         QString data = texts.item(i).firstChild().nodeValue();
-        data.replace("%s", comment);
+        data.replace("%s", replaceString);
         texts.item(i).firstChild().setNodeValue(data);
     }
-    TitleWidget *dia_ui = new TitleWidget(KUrl(), QString(), m_render, this);
-    dia_ui->setXml(doc);
-    QImage pix = dia_ui->renderedPixmap();
-    pix.save(clip->clipUrl().path());
-    delete dia_ui;
-    clip->referencedClip()->producer()->set("force_reload", 1);
+    return doc;
 }
 
 #include "projectlist.moc"
index fedfaf21cc741c9c6da2731e43a8cf571c8a39f9..bcbcb33a577a6eb7ff203c35395b3850b47e99d3 100644 (file)
@@ -130,6 +130,7 @@ public:
     void setupGeneratorMenu(QMenu *addMenu, QMenu *transcodeMenu);
     QString currentClipUrl() const;
     void reloadClipThumbnails();
+    QDomDocument generateTemplateXml(QString data, const QString &replaceString);
 
 public slots:
     void setDocument(KdenliveDoc *doc);
@@ -179,6 +180,7 @@ private:
     void editFolder(const QString folderName, const QString oldfolderName, const QString &clipId);
     QStringList getGroup() const;
     void regenerateTemplate(ProjectItem *clip);
+    void regenerateTemplateImage(ProjectItem *clip);
 
 private slots:
     void slotClipSelected();
@@ -204,6 +206,7 @@ signals:
     void projectModified();
     void loadingIsOver();
     void clipNameChanged(const QString, const QString);
+    void refreshClip();
 };
 
 #endif
index 2882b9a71e7fa96b6c8c9ce55ec6a904b59d6ec8..5313acdf381e73f21a53bb3b52ba1ec00a31ee4a 100644 (file)
@@ -1145,7 +1145,7 @@ void TitleWidget::setXml(QDomDocument doc)
     slotSelectTool();
 }
 
-QImage TitleWidget::renderedPixmap()
+const QRect TitleWidget::renderedRect()
 {
     int minX = 0;
     int minY = 0;
@@ -1166,8 +1166,14 @@ QImage TitleWidget::renderedPixmap()
             maxY = maxY - minY;
         }
     }
+    QRect rect(minX, minY, maxX, maxY);
+    return rect;
+}
 
-    QImage pix(maxX, maxY, QImage::Format_ARGB32);
+QImage TitleWidget::renderedPixmap()
+{
+    QRect rect = renderedRect();
+    QImage pix(rect.width(), rect.height(), QImage::Format_ARGB32);
     pix.fill(Qt::transparent);
     QPainter painter(&pix);
     painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing | QPainter::HighQualityAntialiasing);
@@ -1178,7 +1184,7 @@ QImage TitleWidget::renderedPixmap()
     m_endViewport->setVisible(false);
     m_frameImage->setVisible(false);
 
-    m_scene->render(&painter, QRectF(), QRectF(minX, minY, maxX - minX, maxY - minY));
+    m_scene->render(&painter, QRectF(), rect); //QRectF(minX, minY, maxX - minX, maxY - minY));
     painter.end();
     m_frameBorder->setPen(framepen);
     m_startViewport->setVisible(true);
index 53d2dc6dd3314314332771f0b423c5b1eec64f5b..611dad413d9679f605782276f40c57b2f0631981 100644 (file)
@@ -69,6 +69,11 @@ public:
      * returned. */
     static QString getTitleResourceFromName(const KUrl &projectUrl, const QString &titleName);
 
+    /** \brief returns the size of the rendered pixmap
+    *
+    */
+    const QRect renderedRect();
+
 protected:
     virtual void resizeEvent(QResizeEvent * event);