From 9aad78d75990fd8fd7002ed8f96d095bc7174ee9 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Fri, 19 Jun 2009 00:44:56 +0000 Subject: [PATCH] Introducing template based title clips svn path=/trunk/kdenlive/; revision=3586 --- src/clipmanager.cpp | 22 +++++++++ src/clipmanager.h | 1 + src/kdenlivedoc.cpp | 20 +++++++- src/kdenlivedoc.h | 1 + src/kdenliveui.rc | 3 +- src/mainwindow.cpp | 14 ++++++ src/projectlist.cpp | 117 ++++++++++++++++++++++++-------------------- src/projectlist.h | 4 ++ 8 files changed, 126 insertions(+), 56 deletions(-) diff --git a/src/clipmanager.cpp b/src/clipmanager.cpp index afac6ef5..c4436777 100644 --- a/src/clipmanager.cpp +++ b/src/clipmanager.cpp @@ -351,6 +351,28 @@ void ClipManager::slotAddTextClipFile(const QString titleName, const QString ima m_doc->commandStack()->push(command); } +void ClipManager::slotAddTextTemplateClip(QString titleName, const QString imagePath, const KUrl path, const QString group, const QString &groupId) +{ + QDomDocument doc; + QDomElement prod = doc.createElement("producer"); + doc.appendChild(prod); + prod.setAttribute("resource", imagePath); + prod.setAttribute("name", titleName); + prod.setAttribute("xmltemplate", path.path()); + uint id = m_clipIdCounter++; + prod.setAttribute("id", QString::number(id)); + if (!group.isEmpty()) { + prod.setAttribute("groupname", group); + prod.setAttribute("groupid", groupId); + } + prod.setAttribute("type", (int) TEXT); + prod.setAttribute("transparency", "1"); + prod.setAttribute("in", "0"); + prod.setAttribute("out", m_doc->getFramePos(KdenliveSettings::image_duration()) - 1); + AddClipCommand *command = new AddClipCommand(m_doc, doc.documentElement(), QString::number(id), true); + m_doc->commandStack()->push(command); +} + int ClipManager::getFreeClipId() { return m_clipIdCounter++; diff --git a/src/clipmanager.h b/src/clipmanager.h index ee0e91dc..272016dd 100644 --- a/src/clipmanager.h +++ b/src/clipmanager.h @@ -57,6 +57,7 @@ Q_OBJECT public: void slotAddClipFile(const KUrl url, const QString group, const QString &groupId); void slotAddClipList(const KUrl::List urls, const QString group, const QString &groupId); void slotAddTextClipFile(const QString titleName, const QString imagePath, const QString xml, const QString group, const QString &groupId); + void slotAddTextTemplateClip(QString titleName, const QString imagePath, const KUrl path, const QString group, const QString &groupId); void slotAddColorClipFile(const QString name, const QString color, QString duration, const QString group, const QString &groupId); void slotAddSlideshowClipFile(const QString name, const QString path, int count, const QString duration, const bool loop, const bool fade, const QString &luma_duration, const QString &luma_file, const int softness, const QString group, const QString &groupId); DocClipBase *getClipById(QString clipId); diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index 34286682..549807b4 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -1046,7 +1046,7 @@ 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) { QString titlesFolder = projectFolder().path() + "/titles/"; KStandardDirs::makeDir(titlesFolder); @@ -1056,12 +1056,28 @@ void KdenliveDoc::slotCreateTextClip(QString /*group*/, const QString &/*groupId QImage pix = dia_ui->renderedPixmap(); pix.save(titleInfo.at(1)); //dia_ui->saveTitle(path + ".kdenlivetitle"); - m_clipManager->slotAddTextClipFile(titleInfo.at(0), titleInfo.at(1), dia_ui->xml().toString(), QString(), QString()); + m_clipManager->slotAddTextClipFile(titleInfo.at(0), titleInfo.at(1), dia_ui->xml().toString(), group, groupId); setModified(true); } delete dia_ui; } +void KdenliveDoc::slotCreateTextTemplateClip(QString group, const QString &groupId) +{ + KUrl titlesFolder = KUrl(projectFolder().path() + "/titles/"); + KUrl path = KFileDialog::getOpenUrl(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()); + QImage pix = dia_ui->renderedPixmap(); + pix.save(titleInfo.at(1)); + delete dia_ui; + m_clipManager->slotAddTextTemplateClip(titleInfo.at(0), titleInfo.at(1), path, group, groupId); + setModified(true); +} + int KdenliveDoc::tracksCount() const { return m_tracksList.count(); diff --git a/src/kdenlivedoc.h b/src/kdenlivedoc.h index 197fc614..b1b353bc 100644 --- a/src/kdenlivedoc.h +++ b/src/kdenlivedoc.h @@ -151,6 +151,7 @@ private: public slots: void slotCreateTextClip(QString group, const QString &groupId); + void slotCreateTextTemplateClip(QString group, const QString &groupId); /** Set to true if document needs saving, false otherwise */ void setModified(bool mod = true); void checkProjectClips(); diff --git a/src/kdenliveui.rc b/src/kdenliveui.rc index 55576391..e36ca100 100644 --- a/src/kdenliveui.rc +++ b/src/kdenliveui.rc @@ -1,6 +1,6 @@ - + Extra Toolbar @@ -23,6 +23,7 @@ + Transcode diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 7477b95d..fe9f0a89 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1101,6 +1101,10 @@ void MainWindow::setupActions() collection->addAction("add_text_clip", addTitleClip); connect(addTitleClip , SIGNAL(triggered()), m_projectList, SLOT(slotAddTitleClip())); + QAction *addTitleTemplateClip = new KAction(KIcon("kdenlive-add-text-clip"), i18n("Add Template Title"), this); + collection->addAction("add_text_template_clip", addTitleTemplateClip); + connect(addTitleTemplateClip , SIGNAL(triggered()), m_projectList, SLOT(slotAddTitleTemplateClip())); + QAction *addFolderButton = new KAction(KIcon("folder-new"), i18n("Create Folder"), this); collection->addAction("add_folder", addFolderButton); connect(addFolderButton , SIGNAL(triggered()), m_projectList, SLOT(slotAddFolder())); @@ -1134,6 +1138,7 @@ void MainWindow::setupActions() addClips->addAction(addColorClip); addClips->addAction(addSlideClip); addClips->addAction(addTitleClip); + addClips->addAction(addTitleTemplateClip); addClips->addAction(addFolderButton); addClips->addAction(reloadClip); @@ -2319,6 +2324,15 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip) { if (clip->clipType() == TEXT) { 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()); + } + return; + } QString path = clip->getProperty("resource"); TitleWidget *dia_ui = new TitleWidget(KUrl(), titlepath, m_projectMonitor->render, this); QDomDocument doc; diff --git a/src/projectlist.cpp b/src/projectlist.cpp index ccb1599a..d393a286 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -203,6 +203,8 @@ void ProjectList::slotOpenClip() } } + + void ProjectList::slotReloadClip() { ProjectItem *item = static_cast (m_listView->currentItem()); @@ -298,6 +300,10 @@ void ProjectList::slotItemEdited(QTreeWidgetItem *item, int column) slotUpdateClipProperties(clip, newprops); EditClipCommand *command = new EditClipCommand(this, clip->clipId(), oldprops, newprops, false); m_commandStack->push(command); + if (!clip->referencedClip()->getProperty("xmltemplate").isEmpty()) { + // This is a text template clip, update the image + regenerateTemplate(clip); + } } } else if (column == 1) { if (clip->isGroup()) { @@ -604,21 +610,10 @@ void ProjectList::slotAddClip(const QList givenList, QString group) } if (list.isEmpty()) return; - QString groupId; if (group.isEmpty()) { - ProjectItem *item = static_cast (m_listView->currentItem()); - if (item && !item->isGroup()) { - while (item->parent()) { - item = static_cast (item->parent()); - if (item->isGroup()) break; - } - } - if (item && item->isGroup()) { - group = item->groupName(); - groupId = item->clipId(); - } - } - m_doc->slotAddClipList(list, group, groupId); + QStringList groupInfo = getGroup(); + m_doc->slotAddClipList(list, groupInfo.at(0), groupInfo.at(1)); + } else m_doc->slotAddClipList(list, group, QString()); } void ProjectList::slotRemoveInvalidClip(const QString &id, bool replace) @@ -651,22 +646,8 @@ void ProjectList::slotAddColorClip() if (dia->exec() == QDialog::Accepted) { QString color = dia_ui->clip_color->color().name(); color = color.replace(0, 1, "0x") + "ff"; - - QString group; - QString groupId; - ProjectItem *item = static_cast (m_listView->currentItem()); - if (item && !item->isGroup()) { - while (item->parent()) { - item = static_cast (item->parent()); - if (item->isGroup()) break; - } - } - if (item && item->isGroup()) { - group = item->groupName(); - groupId = item->clipId(); - } - - m_doc->clipManager()->slotAddColorClipFile(dia_ui->clip_name->text(), color, dia_ui->clip_duration->text(), group, groupId); + 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->setModified(true); } delete dia_ui; @@ -680,22 +661,8 @@ void ProjectList::slotAddSlideshowClip() SlideshowClip *dia = new SlideshowClip(m_timecode, this); if (dia->exec() == QDialog::Accepted) { - - QString group; - QString groupId; - ProjectItem *item = static_cast (m_listView->currentItem()); - if (item && !item->isGroup()) { - while (item->parent()) { - item = static_cast (item->parent()); - if (item->isGroup()) break; - } - } - if (item && item->isGroup()) { - group = item->groupName(); - groupId = item->clipId(); - } - - m_doc->clipManager()->slotAddSlideshowClipFile(dia->clipName(), dia->selectedPath(), dia->imageCount(), dia->clipDuration(), dia->loop(), dia->fade(), dia->lumaDuration(), dia->lumaFile(), dia->softness(), group, groupId); + QStringList groupInfo = getGroup(); + m_doc->clipManager()->slotAddSlideshowClipFile(dia->clipName(), dia->selectedPath(), dia->imageCount(), dia->clipDuration(), dia->loop(), dia->fade(), dia->lumaDuration(), dia->lumaFile(), dia->softness(), groupInfo.at(0), groupInfo.at(1)); m_doc->setModified(true); } delete dia; @@ -703,8 +670,19 @@ void ProjectList::slotAddSlideshowClip() void ProjectList::slotAddTitleClip() { - QString group; - QString groupId; + QStringList groupInfo = getGroup(); + m_doc->slotCreateTextClip(groupInfo.at(0), groupInfo.at(1)); +} + +void ProjectList::slotAddTitleTemplateClip() +{ + QStringList groupInfo = getGroup(); + m_doc->slotCreateTextTemplateClip(groupInfo.at(0), groupInfo.at(1)); +} + +QStringList ProjectList::getGroup() const +{ + QStringList result; ProjectItem *item = static_cast (m_listView->currentItem()); if (item && !item->isGroup()) { while (item->parent()) { @@ -713,11 +691,10 @@ void ProjectList::slotAddTitleClip() } } if (item && item->isGroup()) { - group = item->groupName(); - groupId = item->clipId(); - } - - m_doc->slotCreateTextClip(group, groupId); + result << item->groupName(); + result << item->clipId(); + } else result << QString() << QString(); + return result; } void ProjectList::setDocument(KdenliveDoc *doc) @@ -914,4 +891,38 @@ QString ProjectList::currentClipUrl() const return item->clipUrl().path(); } +void ProjectList::regenerateTemplate(const QString &id) +{ + ProjectItem *clip = getItemById(ix); + if (clip) regenerateTemplate(clip); +} + +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; + QFile file(path); + if (!file.open(QIODevice::ReadOnly)) + return; + if (!doc.setContent(&file)) { + file.close(); + return; + } + 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); + 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); +} + #include "projectlist.moc" diff --git a/src/projectlist.h b/src/projectlist.h index 1352cd71..fedfaf21 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -150,6 +150,7 @@ public slots: void slotEditClip(); void slotReloadClip(); void slotAddColorClip(); + void regenerateTemplate(const QString &id); private: ProjectListView *m_listView; @@ -176,11 +177,14 @@ private: void requestClipThumbnail(const QString &id); void deleteProjectFolder(QMap map); void editFolder(const QString folderName, const QString oldfolderName, const QString &clipId); + QStringList getGroup() const; + void regenerateTemplate(ProjectItem *clip); private slots: void slotClipSelected(); void slotAddSlideshowClip(); void slotAddTitleClip(); + void slotAddTitleTemplateClip(); void slotContextMenu(const QPoint &pos, QTreeWidgetItem *); void slotAddFolder(); /** This is triggered when a clip description has been modified */ -- 2.39.2