#include <KDebug>
#include <KStandardDirs>
#include <KMessageBox>
+#include <KProgressDialog>
#include <KLocale>
#include <KFileDialog>
#include <KIO/NetAccess>
#include <KIO/CopyJob>
#include <KApplication>
+#include <KGlobal>
+#include <KBookmarkManager>
+#include <KBookmark>
+#include <KStandardDirs>
#include <QCryptographicHash>
#include <QFile>
const double DOCUMENTVERSION = 0.85;
-KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup *undoGroup, QString profileName, const QPoint tracks, Render *render, KTextEdit *notes, MainWindow *parent) :
+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),
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) {
+ if (m_document.documentElement().attribute("modified") == "1") setModified(true);
parent->slotGotProgressInfo(i18n("Loading"), 0);
QDomElement mlt = m_document.firstChildElement("mlt");
QDomElement infoXml = mlt.firstChildElement("kdenlivedoc");
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();
}
mlt.removeChild(tracksinfo);
}
- QDomNodeList folders = m_document.elementsByTagName("folder");
+ QDomNodeList folders = m_document.elementsByTagName("folder");
for (int i = 0; i < folders.count(); i++) {
e = folders.item(i).cloneNode().toElement();
m_clipManager->addFolder(e.attribute("id"), e.attribute("name"));
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;
}
}
+ if (i % 10 == 0)
+ progressDialog->progressBar()->setValue(i);
}
if (success) {
for (int i = 0; i < props.count(); i++)
m_documentProperties.insert(props.item(i).nodeName(), props.item(i).nodeValue());
setProfilePath(infoXml.attribute("profile"));
- setModified(validator.isModified());
+ if (validator.isModified()) setModified(true);
kDebug() << "Reading file: " << url.path() << ", found clips: " << producers.count();
}
}
KStandardDirs::makeDir(m_projectFolder.path(KUrl::AddTrailingSlash) + "thumbs/");
KStandardDirs::makeDir(m_projectFolder.path(KUrl::AddTrailingSlash) + "ladspa/");
+ updateProjectFolderPlacesEntry();
+
//kDebug() << "// SETTING SCENE LIST:\n\n" << m_document.toString();
connect(m_autoSaveTimer, SIGNAL(timeout()), this, SLOT(slotAutoSave()));
}
kDebug() << "ERROR; CANNOT CREATE AUTOSAVE FILE";
}
kDebug() << "// AUTOSAVE FILE: " << m_autosave->fileName();
- QString doc;
- if (KdenliveSettings::dropbframes()) {
- KdenliveSettings::setDropbframes(false);
- m_clipManager->updatePreviewSettings();
- doc = m_render->sceneList();
- KdenliveSettings::setDropbframes(true);
- m_clipManager->updatePreviewSettings();
- } else doc = m_render->sceneList();
- saveSceneList(m_autosave->fileName(), doc);
+ saveSceneList(m_autosave->fileName(), m_render->sceneList());
}
}
KStandardDirs::makeDir(url.path(KUrl::AddTrailingSlash) + "thumbs/");
if (KMessageBox::questionYesNo(kapp->activeWindow(), i18n("You have changed the project folder. Do you want to copy the cached data from %1 to the new folder %2?").arg(m_projectFolder.path(), url.path())) == KMessageBox::Yes) moveProjectData(url);
m_projectFolder = url;
+
+ updateProjectFolderPlacesEntry();
}
void KdenliveDoc::moveProjectData(KUrl url)
m_clipManager->resetProducersList(m_render->producersList());
}
-void KdenliveDoc::updatePreviewSettings()
-{
- m_clipManager->updatePreviewSettings();
- m_render->updatePreviewSettings();
- QList <Mlt::Producer *> prods = m_render->producersList();
- m_clipManager->resetProducersList(m_render->producersList());
- qDeleteAll(prods);
- prods.clear();
-}
-
Render *KdenliveDoc::renderer()
{
return m_render;
{
QString titlesFolder = projectFolder().path(KUrl::AddTrailingSlash) + "titles/";
if (path.isEmpty()) {
- path = KFileDialog::getOpenUrl(KUrl(titlesFolder), "*.kdenlivetitle", kapp->activeWindow(), i18n("Enter Template Path"));
+ path = KFileDialog::getOpenUrl(KUrl(titlesFolder), "application/x-kdenlivetitle", kapp->activeWindow(), i18n("Enter Template Path"));
}
if (path.isEmpty()) return;
return (!importedEffects.isEmpty());
}
+void KdenliveDoc::updateProjectFolderPlacesEntry()
+{
+ /*
+ * For similar and more code have a look at kfileplacesmodel.cpp and the included files:
+ * http://websvn.kde.org/trunk/KDE/kdelibs/kfile/kfileplacesmodel.cpp?view=markup
+ */
+
+ const QString file = KStandardDirs::locateLocal("data", "kfileplaces/bookmarks.xml");
+ KBookmarkManager *bookmarkManager = KBookmarkManager::managerForFile(file, "kfilePlaces");
+ KBookmarkGroup root = bookmarkManager->root();
+ KBookmark bookmark = root.first();
+
+ QString kdenliveName = KGlobal::mainComponent().componentName();
+ KUrl documentLocation = m_projectFolder;
+
+ bool exists = false;
+
+ while (!bookmark.isNull()) {
+ // UDI not empty indicates a device
+ QString udi = bookmark.metaDataItem("UDI");
+ QString appName = bookmark.metaDataItem("OnlyInApp");
+
+ if (udi.isEmpty() && appName == kdenliveName && bookmark.text() == i18n("Project Folder")) {
+ if (bookmark.url() != documentLocation) {
+ bookmark.setUrl(documentLocation);
+ bookmarkManager->emitChanged(root);
+ }
+ exists = true;
+ break;
+ }
+
+ bookmark = root.next(bookmark);
+ }
+
+ // if entry does not exist yet (was not found), well, create it then
+ if (!exists) {
+ bookmark = root.addBookmark(i18n("Project Folder"), documentLocation, "folder-favorites");
+ // Make this user selectable ?
+ bookmark.setMetaDataItem("OnlyInApp", kdenliveName);
+ bookmarkManager->emitChanged(root);
+ }
+}
+
#include "kdenlivedoc.moc"