m_clipManager = new ClipManager(this);
m_autoSaveTimer = new QTimer(this);
m_autoSaveTimer->setSingleShot(true);
- connect(m_clipManager, SIGNAL(displayMessage(QString, int)), parent, SLOT(slotGotProgressInfo(QString,int)));
+ connect(m_clipManager, SIGNAL(displayMessage(QString,int)), parent, SLOT(slotGotProgressInfo(QString,int)));
bool success = false;
// init default document properties
else {
QFile file(tmpFile);
QString errorMsg;
+ int line;
+ int col;
QDomImplementation::setInvalidDataPolicy(QDomImplementation::DropInvalidChars);
- success = m_document.setContent(&file, false, &errorMsg);
- file.close();
- KIO::NetAccess::removeTempFile(tmpFile);
+ success = m_document.setContent(&file, false, &errorMsg, &line, &col);
+ file.close();
if (!success) {
// It is corrupted
- if (KMessageBox::warningContinueCancel(parent, i18n("Cannot open the project file, error is:\n%1\nDo you want to open a backup file?", errorMsg), i18n("Error opening file"), KGuiItem(i18n("Open Backup"))) == KMessageBox::Continue) {
- *openBackup = true;
- }
- //KMessageBox::error(parent, errorMsg);
+ int answer = KMessageBox::warningYesNoCancel (parent, i18n("Cannot open the project file, error is:\n%1 (line %2, col %3)\nDo you want to open a backup file?", errorMsg, line, col), i18n("Error opening file"), KGuiItem(i18n("Open Backup")), KGuiItem(i18n("Recover")));
+ if (answer == KMessageBox::Yes) {
+ *openBackup = true;
+ }
+ else if (answer == KMessageBox::No) {
+ // Try to recover broken file produced by Kdenlive 0.9.4
+ if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ int correction = 0;
+ QString playlist = file.readAll();
+ while (!success && correction < 2) {
+ int errorPos = 0;
+ line--;
+ col = col - 2;
+ for (int j = 0; j < line && errorPos < playlist.length(); j++) {
+ errorPos = playlist.indexOf("\n", errorPos);
+ errorPos++;
+ }
+ errorPos += col;
+ if (errorPos >= playlist.length()) break;
+ playlist.remove(errorPos, 1);
+ line = 0;
+ col = 0;
+ success = m_document.setContent(playlist, false, &errorMsg, &line, &col);
+ correction++;
+ }
+ if (!success) {
+ KMessageBox::sorry(parent, i18n("Cannot recover this project file"));
+ }
+ else {
+ // Document was modified, ask for backup
+ QDomElement mlt = m_document.documentElement();
+ QDomElement info = mlt.firstChildElement("kdenlivedoc");
+ if (!info.isNull()) info.setAttribute("modified", 1);
+ }
+ }
+ }
}
- else {
+ if (success) {
parent->slotGotProgressInfo(i18n("Validating"), 0);
qApp->processEvents();
DocumentValidator validator(m_document, url);
int maxchild = markerslist.count();
for (int k = 0; k < maxchild; k++) {
e = markerslist.at(k).toElement();
- if (e.tagName() == "marker")
- m_clipManager->getClipById(e.attribute("id"))->addSnapMarker(GenTime(e.attribute("time").toDouble()), e.attribute("comment"));
+ if (e.tagName() == "marker") {
+ CommentedTime marker(GenTime(e.attribute("time").toDouble()), e.attribute("comment"), e.attribute("type").toInt());
+ DocClipBase *baseClip = m_clipManager->getClipById(e.attribute("id"));
+ if (baseClip) baseClip->addSnapMarker(marker);
+ else kDebug()<< " / / Warning, missing clip: "<< e.attribute("id");
+ }
}
infoXml.removeChild(markers);
}
}
}
}
+ KIO::NetAccess::removeTempFile(tmpFile);
}
}
//kDebug() << "// SETTING SCENE LIST:\n\n" << m_document.toString();
connect(m_autoSaveTimer, SIGNAL(timeout()), this, SLOT(slotAutoSave()));
+ connect(m_render, SIGNAL(addClip(KUrl,stringMap)), this, SLOT(slotAddClipFile(KUrl,stringMap)));
}
KdenliveDoc::~KdenliveDoc()
marker.setAttribute("time", marks.at(j).time().ms() / 1000);
marker.setAttribute("comment", marks.at(j).comment());
marker.setAttribute("id", e.attribute("id"));
+ marker.setAttribute("type", marks.at(j).markerType());
markers.appendChild(marker);
}
}
QDomNamedNodeMap attributes = elem.attributes();
for (int i = 0; i < attributes.count(); i++) {
QString attrname = attributes.item(i).nodeName();
- if (attrname != "resource")
+ if (attrname != "resource")
properties.insert(attrname, attributes.item(i).nodeValue());
- kDebug() << attrname << " = " << attributes.item(i).nodeValue();
+ //kDebug() << attrname << " = " << attributes.item(i).nodeValue();
}
clip->setProperties(properties);
emit addProjectClip(clip, false);
QMap<QString, QString> meta;
for (QDomNode m = orig.firstChild(); !m.isNull(); m = m.nextSibling()) {
QString name = m.toElement().attribute("name");
- if (name.startsWith("meta.attr"))
- meta.insert(name.section('.', 2, 3), m.firstChild().nodeValue());
+ if (name.startsWith("meta.attr")) {
+ if (name.endsWith(".markup")) name = name.section('.', 0, -2);
+ meta.insert(name.section('.', 2, -1), m.firstChild().nodeValue());
+ }
}
if (!meta.isEmpty()) {
if (clip == NULL)
emit signalDeleteProjectClip(clipId);
}
-void KdenliveDoc::slotAddClipList(const KUrl::List urls, const QString &group, const QString &groupId)
+void KdenliveDoc::slotAddClipList(const KUrl::List urls, stringMap data)
{
- m_clipManager->slotAddClipList(urls, group, groupId);
+ m_clipManager->slotAddClipList(urls, data);
//emit selectLastAddedClip(QString::number(m_clipManager->lastClipId()));
setModified(true);
}
-void KdenliveDoc::slotAddClipFile(const KUrl &url, const QString &group, const QString &groupId, const QString &comment)
+void KdenliveDoc::slotAddClipFile(const KUrl &url, stringMap data)
{
- m_clipManager->slotAddClipFile(url, group, groupId, comment);
+ m_clipManager->slotAddClipFile(url, data);
emit selectLastAddedClip(QString::number(m_clipManager->lastClipId()));
setModified(true);
}
KStandardDirs::makeDir(titlesFolder);
QPointer<TitleWidget> dia_ui = new TitleWidget(templatePath, m_timecode, titlesFolder, m_render, kapp->activeWindow());
if (dia_ui->exec() == QDialog::Accepted) {
- m_clipManager->slotAddTextClipFile(i18n("Title clip"), dia_ui->outPoint(), dia_ui->xml().toString(), group, groupId);
+ m_clipManager->slotAddTextClipFile(i18n("Title clip"), dia_ui->duration(), dia_ui->xml().toString(), group, groupId);
setModified(true);
emit selectLastAddedClip(QString::number(m_clipManager->lastClipId()));
}
void KdenliveDoc::setMetadata(const QMap <QString, QString> meta)
{
+ setModified(true);
m_documentMetadata = meta;
}