#include "documentchecker.h"
#include "documentvalidator.h"
#include "kdenlive-config.h"
+#include "initeffects.h"
#include <KDebug>
#include <KStandardDirs>
#include <KMessageBox>
+#include <KProgressDialog>
#include <KLocale>
#include <KFileDialog>
#include <KIO/NetAccess>
const double DOCUMENTVERSION = 0.85;
-KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup *undoGroup, QString profileName, const QPoint tracks, Render *render, MainWindow *parent) :
- QObject(parent),
- m_autosave(NULL),
- m_url(url),
- m_render(render),
- m_commandStack(new QUndoStack(undoGroup)),
- m_modified(false),
- m_projectFolder(projectFolder)
+KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup *undoGroup, QString profileName, const QPoint tracks, Render *render, KTextEdit *notes, MainWindow *parent, KProgressDialog *progressDialog) :
+ QObject(parent),
+ m_autosave(NULL),
+ m_url(url),
+ m_render(render),
+ m_notesWidget(notes),
+ m_commandStack(new QUndoStack(undoGroup)),
+ m_modified(false),
+ m_projectFolder(projectFolder)
{
m_clipManager = new ClipManager(this);
m_autoSaveTimer = new QTimer(this);
KMessageBox::error(parent, errorMsg);
else {
parent->slotGotProgressInfo(i18n("Validating"), 0);
+ qApp->processEvents();
DocumentValidator validator(m_document);
success = validator.isProject();
if (!success) {
success = validator.validate(DOCUMENTVERSION);
if (success) { // Let the validator handle error messages
parent->slotGotProgressInfo(i18n("Check missing clips"), 0);
+ qApp->processEvents();
QDomNodeList infoproducers = m_document.elementsByTagName("kdenlive_producer");
success = checkDocumentClips(infoproducers);
if (success) {
parent->slotGotProgressInfo(i18n("Loading"), 0);
QDomElement mlt = m_document.firstChildElement("mlt");
QDomElement infoXml = mlt.firstChildElement("kdenlivedoc");
+
+ // Check embedded effects
+ QDomElement customeffects = infoXml.firstChildElement("customeffects");
+ if (!customeffects.isNull() && customeffects.hasChildNodes()) {
+ parent->slotGotProgressInfo(i18n("Importing project effects"), 0);
+ qApp->processEvents();
+ if (saveCustomEffects(customeffects.childNodes())) parent->slotReloadEffects();
+ }
+
QDomElement e;
+ // Read notes
+ QDomElement notesxml = infoXml.firstChildElement("documentnotes");
+ if (!notesxml.isNull()) m_notesWidget->setText(notesxml.firstChild().nodeValue());
// Build tracks
QDomElement tracksinfo = infoXml.firstChildElement("tracksinfo");
QDomNodeList producers = m_document.elementsByTagName("producer");
const int max = producers.count();
+ if (!progressDialog) {
+ progressDialog = new KProgressDialog(parent, i18n("Loading project"), i18n("Adding clips"));
+ progressDialog->setAllowCancel(false);
+ } else {
+ progressDialog->setLabelText(i18n("Adding clips"));
+ }
+ progressDialog->progressBar()->setMaximum(infomax);
+ progressDialog->show();
+ qApp->processEvents();
+
for (int i = 0; i < infomax; i++) {
e = infoproducers.item(i).cloneNode().toElement();
QString prodId = e.attribute("id");
// Get MLT's original producer properties
QDomElement orig;
for (int j = 0; j < max; j++) {
- QDomElement o = producers.item(j).cloneNode().toElement();
- QString origId = o.attribute("id").section('_', 0, 0);
+ QDomNode o = producers.item(j);
+ QString origId = o.attributes().namedItem("id").nodeValue().section('_', 0, 0);
if (origId == prodId) {
- orig = o;
+ orig = o.cloneNode().toElement();
break;
}
}
+
if (!addClipInfo(e, orig, prodId)) {
// The user manually aborted the loading.
success = false;
break;
}
}
+ progressDialog->progressBar()->setValue(i);
}
if (success) {
KMessageBox::error(kapp->activeWindow(), i18n("Cannot write to file %1, scene list is corrupted.", path));
return false;
}
+
QDomElement addedXml = sceneList.createElement("kdenlivedoc");
mlt.appendChild(addedXml);
+ // check if project contains custom effects to embed them in project file
+ QDomNodeList effects = mlt.elementsByTagName("filter");
+ int maxEffects = effects.count();
+ kDebug() << "// FOUD " << maxEffects << " EFFECTS+++++++++++++++++++++";
+ QMap <QString, QString> effectIds;
+ for (int i = 0; i < maxEffects; i++) {
+ QDomNode m = effects.at(i);
+ QDomNodeList params = m.childNodes();
+ QString id;
+ QString tag;
+ for (int j = 0; j < params.count(); j++) {
+ QDomElement e = params.item(j).toElement();
+ if (e.attribute("name") == "kdenlive_id") {
+ id = e.firstChild().nodeValue();
+ }
+ if (e.attribute("name") == "tag") {
+ tag = e.firstChild().nodeValue();
+ }
+ if (!id.isEmpty() && !tag.isEmpty()) effectIds.insert(id, tag);
+ }
+ }
+ QDomDocument customeffects = initEffects::getUsedCustomEffects(effectIds);
+ addedXml.appendChild(sceneList.importNode(customeffects.documentElement(), true));
+
QDomElement markers = sceneList.createElement("markers");
addedXml.setAttribute("version", DOCUMENTVERSION);
addedXml.setAttribute("kdenliveversion", VERSION);
docproperties.setAttribute("position", m_render->seekPosition().frames(m_fps));
addedXml.appendChild(docproperties);
+ QDomElement docnotes = sceneList.createElement("documentnotes");
+ QDomText value = sceneList.createTextNode(m_notesWidget->toPlainText());
+ docnotes.appendChild(value);
+ addedXml.appendChild(docnotes);
+
// Add profile info
QDomElement profileinfo = sceneList.createElement("profileinfo");
profileinfo.setAttribute("description", m_profile.description);
return (current_fps != m_fps);
}
-double KdenliveDoc::dar()
+double KdenliveDoc::dar() const
{
return (double) m_profile.display_aspect_num / m_profile.display_aspect_den;
}
}
void KdenliveDoc::slotCreateSlideshowClipFile(const QString name, const QString path, int count, const QString duration,
- const bool loop, const bool crop, const bool fade,
- const QString &luma_duration, const QString &luma_file, const int softness,
- const QString &animation, QString group, const QString &groupId)
+ const bool loop, const bool crop, const bool fade,
+ const QString &luma_duration, const QString &luma_file, const int softness,
+ const QString &animation, QString group, const QString &groupId)
{
m_clipManager->slotAddSlideshowClipFile(name, path, count, duration, loop,
crop, fade, luma_duration,
return list.at(effectIndex).cloneNode().toElement();
}
+bool KdenliveDoc::saveCustomEffects(QDomNodeList customeffects)
+{
+ QDomElement e;
+ QStringList importedEffects;
+ int maxchild = customeffects.count();
+ for (int i = 0; i < maxchild; i++) {
+ e = customeffects.at(i).toElement();
+ QString id = e.attribute("id");
+ QString tag = e.attribute("tag");
+ if (!id.isEmpty()) {
+ // Check if effect exists or save it
+ if (MainWindow::customEffects.hasEffect(tag, id) == -1) {
+ QDomDocument doc;
+ doc.appendChild(doc.importNode(e, true));
+ QString path = KStandardDirs::locateLocal("appdata", "effects/", true);
+ path += id + ".xml";
+ if (!QFile::exists(path)) {
+ importedEffects << id;
+ QFile file(path);
+ if (file.open(QFile::WriteOnly | QFile::Truncate)) {
+ QTextStream out(&file);
+ out << doc.toString();
+ }
+ }
+ }
+ }
+ }
+ if (!importedEffects.isEmpty()) KMessageBox::informationList(kapp->activeWindow(), i18n("The following effects were imported from the project:"), importedEffects);
+ return (!importedEffects.isEmpty());
+}
+
#include "kdenlivedoc.moc"