From: Jean-Baptiste Mardelle Date: Fri, 19 Jun 2009 09:28:57 +0000 (+0000) Subject: Add new dialog for template clips, fix thumbs & monitors not updating when clip is... X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=edf2e497b4361db1bce089b0ef58dd566bf1d997;p=kdenlive Add new dialog for template clips, fix thumbs & monitors not updating when clip is changed svn path=/trunk/kdenlive/; revision=3592 --- diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e01ea473..8b47796d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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 diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index 549807b4..ef3d2369 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -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; diff --git a/src/kdenlivedoc.h b/src/kdenlivedoc.h index b1b353bc..095e8d50 100644 --- a/src/kdenlivedoc.h +++ b/src/kdenlivedoc.h @@ -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(); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index fe9f0a89..67b669d3 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -51,6 +51,7 @@ #include "interfaces.h" #include "kdenlive-config.h" #include "cliptranscode.h" +#include "ui_templateclip_ui.h" #include #include @@ -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 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 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; diff --git a/src/monitor.h b/src/monitor.h index accd3aac..1b73d755 100644 --- a/src/monitor.h +++ b/src/monitor.h @@ -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(); diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 79612ca9..db61f504 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -33,7 +33,7 @@ #include "projectlistview.h" #include "editclipcommand.h" #include "editfoldercommand.h" - +#include "ui_templateclip_ui.h" #include #include @@ -264,7 +264,10 @@ void ProjectList::slotUpdateClipProperties(const QString &id, QMap changeDuration(properties.value("out").toInt()); } } @@ -273,6 +276,7 @@ void ProjectList::slotUpdateClipProperties(ProjectItem *clip, QMap 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 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" diff --git a/src/projectlist.h b/src/projectlist.h index fedfaf21..bcbcb33a 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -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 diff --git a/src/titlewidget.cpp b/src/titlewidget.cpp index 2882b9a7..5313acdf 100644 --- a/src/titlewidget.cpp +++ b/src/titlewidget.cpp @@ -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); diff --git a/src/titlewidget.h b/src/titlewidget.h index 53d2dc6d..611dad41 100644 --- a/src/titlewidget.h +++ b/src/titlewidget.h @@ -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);