You can subscribe to this list here.
2008 |
Jan
|
Feb
|
Mar
(187) |
Apr
(14) |
May
(38) |
Jun
(84) |
Jul
(60) |
Aug
(35) |
Sep
(32) |
Oct
(192) |
Nov
(130) |
Dec
(124) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2009 |
Jan
(159) |
Feb
(59) |
Mar
(120) |
Apr
(136) |
May
(132) |
Jun
(244) |
Jul
(81) |
Aug
(75) |
Sep
(99) |
Oct
(114) |
Nov
(84) |
Dec
(28) |
2010 |
Jan
(73) |
Feb
(84) |
Mar
(19) |
Apr
(41) |
May
(90) |
Jun
(68) |
Jul
(115) |
Aug
(128) |
Sep
(159) |
Oct
(106) |
Nov
(62) |
Dec
(102) |
2011 |
Jan
(142) |
Feb
(93) |
Mar
(65) |
Apr
(39) |
May
(60) |
Jun
(125) |
Jul
(66) |
Aug
(31) |
Sep
(83) |
Oct
(82) |
Nov
(130) |
Dec
(85) |
2012 |
Jan
(60) |
Feb
(34) |
Mar
(63) |
Apr
(59) |
May
(82) |
Jun
(75) |
Jul
(62) |
Aug
(11) |
Sep
(79) |
Oct
(59) |
Nov
(100) |
Dec
(118) |
2013 |
Jan
(48) |
Feb
(193) |
Mar
(54) |
Apr
(41) |
May
(158) |
Jun
(167) |
Jul
(9) |
Aug
|
Sep
|
Oct
|
Nov
(1) |
Dec
(15) |
2014 |
Jan
(24) |
Feb
(14) |
Mar
(59) |
Apr
(81) |
May
(50) |
Jun
(6) |
Jul
(32) |
Aug
(78) |
Sep
(30) |
Oct
(22) |
Nov
(5) |
Dec
(128) |
2015 |
Jan
(67) |
Feb
(70) |
Mar
(54) |
Apr
(96) |
May
(91) |
Jun
(54) |
Jul
(67) |
Aug
(56) |
Sep
(128) |
Oct
(65) |
Nov
(137) |
Dec
(186) |
2016 |
Jan
(171) |
Feb
(105) |
Mar
(106) |
Apr
(139) |
May
(114) |
Jun
(154) |
Jul
(139) |
Aug
(45) |
Sep
(116) |
Oct
(38) |
Nov
(84) |
Dec
(153) |
2017 |
Jan
(154) |
Feb
(145) |
Mar
(207) |
Apr
(134) |
May
(83) |
Jun
(87) |
Jul
(108) |
Aug
(7) |
Sep
|
Oct
|
Nov
|
Dec
|
From: <j-...@us...> - 2011-05-10 09:20:36
|
Revision: 5582 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5582&view=rev Author: j-b-m Date: 2011-05-10 09:20:29 +0000 (Tue, 10 May 2011) Log Message: ----------- Show progress while extracting archived project Modified Paths: -------------- trunk/kdenlive/src/archivewidget.cpp trunk/kdenlive/src/archivewidget.h Modified: trunk/kdenlive/src/archivewidget.cpp =================================================================== --- trunk/kdenlive/src/archivewidget.cpp 2011-05-10 07:56:43 UTC (rev 5581) +++ trunk/kdenlive/src/archivewidget.cpp 2011-05-10 09:20:29 UTC (rev 5582) @@ -31,6 +31,7 @@ #include <KTar> #include <KDebug> #include <KApplication> +#include <kio/directorysizejob.h> #include <QTreeWidget> #include <QtConcurrentRun> @@ -44,7 +45,8 @@ m_name(projectName.section('.', 0, -2)), m_doc(doc), m_abortArchive(false), - m_extractMode(false) + m_extractMode(false), + m_extractArchive(NULL) { setAttribute(Qt::WA_DeleteOnClose); setupUi(this); @@ -181,12 +183,12 @@ m_extractUrl(url) { //setAttribute(Qt::WA_DeleteOnClose); - KTar archive(url.path()); - archive.open( QIODevice::ReadOnly ); + m_extractArchive = new KTar(url.path()); + m_extractArchive->open( QIODevice::ReadOnly ); // Check that it is a kdenlive project archive bool isProjectArchive = false; - QStringList files = archive.directory()->entries(); + QStringList files = m_extractArchive->directory()->entries(); for (int i = 0; i < files.count(); i++) { if (files.at(i).endsWith(".kdenlive")) { m_projectName = files.at(i); @@ -194,10 +196,10 @@ break; } } - archive.close(); if (!isProjectArchive) { KMessageBox::sorry(kapp->activeWindow(), i18n("%1 is not an archived Kdenlive project", url.path(), i18n("Cannot open file"))); + m_extractArchive->close(); hide(); //HACK: find a better way to terminate the dialog QTimer::singleShot(50, this, SLOT(reject())); @@ -219,6 +221,7 @@ ArchiveWidget::~ArchiveWidget() { + if (m_extractArchive) delete m_extractArchive; } void ArchiveWidget::done ( int r ) @@ -681,19 +684,39 @@ //TODO: abort extracting return; } + QFileInfo f(m_extractUrl.path()); + m_requestedSize = f.size(); KIO::NetAccess::mkdir(archive_url->url().path(KUrl::RemoveTrailingSlash), this); icon_info->setPixmap(KIcon("system-run").pixmap(16, 16)); text_info->setText(i18n("Extracting...")); buttonBox->button(QDialogButtonBox::Apply)->setText(i18n("Abort")); + m_progressTimer = new QTimer; + m_progressTimer->setInterval(800); + m_progressTimer->setSingleShot(false); + connect(m_progressTimer, SIGNAL(timeout()), this, SLOT(slotExtractProgress())); m_archiveThread = QtConcurrent::run(this, &ArchiveWidget::doExtracting); + m_progressTimer->start(); } +void ArchiveWidget::slotExtractProgress() +{ + KIO::DirectorySizeJob *job = KIO::directorySize(archive_url->url()); + connect(job, SIGNAL(result(KJob*)), this, SLOT(slotGotProgress(KJob*))); +} + +void ArchiveWidget::slotGotProgress(KJob* job) +{ + if (!job->error()) { + KIO::DirectorySizeJob *j = static_cast <KIO::DirectorySizeJob *>(job); + progressBar->setValue((int) 100 * j->totalSize() / m_requestedSize); + } + job->deleteLater(); +} + void ArchiveWidget::doExtracting() { - KTar archive(m_extractUrl.path()); - archive.open( QIODevice::ReadOnly ); - archive.directory()->copyTo(archive_url->url().path(KUrl::AddTrailingSlash)); - archive.close(); + m_extractArchive->directory()->copyTo(archive_url->url().path(KUrl::AddTrailingSlash)); + m_extractArchive->close(); emit extractingFinished(); } @@ -704,6 +727,8 @@ void ArchiveWidget::slotExtractingFinished() { + m_progressTimer->stop(); + delete m_progressTimer; // Process project file QFile file(extractedProjectFile()); bool error = false; Modified: trunk/kdenlive/src/archivewidget.h =================================================================== --- trunk/kdenlive/src/archivewidget.h 2011-05-10 07:56:43 UTC (rev 5581) +++ trunk/kdenlive/src/archivewidget.h 2011-05-10 09:20:29 UTC (rev 5582) @@ -29,11 +29,11 @@ #include <QLabel> #include <QDialog> #include <QList> -#include <KIO/Job> #include <KIO/CopyJob> #include <KTemporaryFile> class KJob; +class KTar; /** * @class ArchiveWidget @@ -66,6 +66,8 @@ void slotStartExtracting(); void doExtracting(); void slotExtractingFinished(); + void slotExtractProgress(); + void slotGotProgress(KJob*); protected: virtual void closeEvent ( QCloseEvent * e ); @@ -85,6 +87,8 @@ bool m_extractMode; KUrl m_extractUrl; QString m_projectName; + QTimer *m_progressTimer; + KTar *m_extractArchive; /** @brief Generate tree widget subitems from a string list of urls. */ void generateItems(QTreeWidgetItem *parentItem, QStringList items); @@ -95,7 +99,6 @@ void archivingFinished(bool); void archiveProgress(int); void extractingFinished(); - }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <j-...@us...> - 2011-05-10 07:56:50
|
Revision: 5581 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5581&view=rev Author: j-b-m Date: 2011-05-10 07:56:43 +0000 (Tue, 10 May 2011) Log Message: ----------- Notify user of extracting process Modified Paths: -------------- trunk/kdenlive/src/archivewidget.cpp Modified: trunk/kdenlive/src/archivewidget.cpp =================================================================== --- trunk/kdenlive/src/archivewidget.cpp 2011-05-10 07:47:15 UTC (rev 5580) +++ trunk/kdenlive/src/archivewidget.cpp 2011-05-10 07:56:43 UTC (rev 5581) @@ -677,7 +677,14 @@ void ArchiveWidget::slotStartExtracting() { + if (m_archiveThread.isRunning()) { + //TODO: abort extracting + return; + } KIO::NetAccess::mkdir(archive_url->url().path(KUrl::RemoveTrailingSlash), this); + icon_info->setPixmap(KIcon("system-run").pixmap(16, 16)); + text_info->setText(i18n("Extracting...")); + buttonBox->button(QDialogButtonBox::Apply)->setText(i18n("Abort")); m_archiveThread = QtConcurrent::run(this, &ArchiveWidget::doExtracting); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <j-...@us...> - 2011-05-10 07:47:21
|
Revision: 5580 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5580&view=rev Author: j-b-m Date: 2011-05-10 07:47:15 +0000 (Tue, 10 May 2011) Log Message: ----------- We can now open archived projects Modified Paths: -------------- trunk/kdenlive/src/archivewidget.cpp trunk/kdenlive/src/archivewidget.h trunk/kdenlive/src/mainwindow.cpp trunk/kdenlive/src/mainwindow.h Modified: trunk/kdenlive/src/archivewidget.cpp =================================================================== --- trunk/kdenlive/src/archivewidget.cpp 2011-05-09 23:09:06 UTC (rev 5579) +++ trunk/kdenlive/src/archivewidget.cpp 2011-05-10 07:47:15 UTC (rev 5580) @@ -29,8 +29,9 @@ #include <KGuiItem> #include <KIO/NetAccess> #include <KTar> +#include <KDebug> +#include <KApplication> -#include <KDebug> #include <QTreeWidget> #include <QtConcurrentRun> #include "projectsettings.h" @@ -42,7 +43,8 @@ m_copyJob(NULL), m_name(projectName.section('.', 0, -2)), m_doc(doc), - m_abortArchive(false) + m_abortArchive(false), + m_extractMode(false) { setAttribute(Qt::WA_DeleteOnClose); setupUi(this); @@ -172,6 +174,49 @@ slotCheckSpace(); } +// Constructor for extract widget +ArchiveWidget::ArchiveWidget(const KUrl &url, QWidget * parent): + QDialog(parent), + m_extractMode(true), + m_extractUrl(url) +{ + //setAttribute(Qt::WA_DeleteOnClose); + KTar archive(url.path()); + archive.open( QIODevice::ReadOnly ); + + // Check that it is a kdenlive project archive + bool isProjectArchive = false; + QStringList files = archive.directory()->entries(); + for (int i = 0; i < files.count(); i++) { + if (files.at(i).endsWith(".kdenlive")) { + m_projectName = files.at(i); + isProjectArchive = true; + break; + } + } + archive.close(); + + if (!isProjectArchive) { + KMessageBox::sorry(kapp->activeWindow(), i18n("%1 is not an archived Kdenlive project", url.path(), i18n("Cannot open file"))); + hide(); + //HACK: find a better way to terminate the dialog + QTimer::singleShot(50, this, SLOT(reject())); + return; + } + setupUi(this); + connect(this, SIGNAL(extractingFinished()), this, SLOT(slotExtractingFinished())); + + compressed_archive->setHidden(true); + project_files->setHidden(true); + files_list->setHidden(true); + label->setText(i18n("Extract to")); + setWindowTitle(i18n("Open Archived Project")); + archive_url->setUrl(KUrl(QDir::homePath())); + buttonBox->button(QDialogButtonBox::Apply)->setText(i18n("Extract")); + connect(buttonBox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), this, SLOT(slotStartExtracting())); +} + + ArchiveWidget::~ArchiveWidget() { } @@ -191,7 +236,7 @@ bool ArchiveWidget::closeAccepted() { - if (!archive_url->isEnabled()) { + if (!m_extractMode && !archive_url->isEnabled()) { // Archiving in progress, should we stop? if (KMessageBox::warningContinueCancel(this, i18n("Archiving in progress, do you want to stop it?"), i18n("Stop Archiving"), KGuiItem(i18n("Stop Archiving"))) != KMessageBox::Continue) { return false; @@ -450,6 +495,8 @@ { KUrl destUrl; QTreeWidgetItem *item; + bool isArchive = compressed_archive->isChecked(); + for (int i = 0; i < files_list->topLevelItemCount(); i++) { QTreeWidgetItem *parentItem = files_list->topLevelItem(i); if (parentItem->childCount() > 0) { @@ -473,10 +520,18 @@ } } - // process kdenlive producers QDomElement mlt = m_doc.documentElement(); QString root = mlt.attribute("root") + "/"; - mlt.setAttribute("root", archive_url->url().path(KUrl::RemoveTrailingSlash)); + + // Adjust global settings + QString basePath; + if (isArchive) basePath = "$CURRENTPATH"; + else basePath = archive_url->url().path(KUrl::RemoveTrailingSlash); + mlt.setAttribute("root", basePath); + QDomElement project = mlt.elementsByTagName("kdenlivedoc").at(0).toElement(); + project.setAttribute("projectfolder", basePath); + + // process kdenlive producers QDomNodeList prods = mlt.elementsByTagName("kdenlive_producer"); for (int i = 0; i < prods.count(); i++) { QDomElement e = prods.item(i).toElement(); @@ -525,11 +580,22 @@ } } - bool isArchive = compressed_archive->isChecked(); + QString playList = m_doc.toString(); if (isArchive) { + QString startString("\""); + startString.append(archive_url->url().path(KUrl::RemoveTrailingSlash)); + QString endString("\""); + endString.append(basePath); + playList.replace(startString, endString); + startString = ">" + archive_url->url().path(KUrl::RemoveTrailingSlash); + endString = ">" + basePath; + playList.replace(startString, endString); + } + + if (isArchive) { m_temp = new KTemporaryFile; if (!m_temp->open()) KMessageBox::error(this, i18n("Cannot create temporary file")); - m_temp->write(m_doc.toString().toUtf8()); + m_temp->write(playList.toUtf8()); m_temp->close(); m_archiveThread = QtConcurrent::run(this, &ArchiveWidget::createArchive); return true; @@ -608,3 +674,59 @@ { progressBar->setValue(p); } + +void ArchiveWidget::slotStartExtracting() +{ + KIO::NetAccess::mkdir(archive_url->url().path(KUrl::RemoveTrailingSlash), this); + m_archiveThread = QtConcurrent::run(this, &ArchiveWidget::doExtracting); +} + +void ArchiveWidget::doExtracting() +{ + KTar archive(m_extractUrl.path()); + archive.open( QIODevice::ReadOnly ); + archive.directory()->copyTo(archive_url->url().path(KUrl::AddTrailingSlash)); + archive.close(); + emit extractingFinished(); +} + +QString ArchiveWidget::extractedProjectFile() +{ + return archive_url->url().path(KUrl::AddTrailingSlash) + m_projectName; +} + +void ArchiveWidget::slotExtractingFinished() +{ + // Process project file + QFile file(extractedProjectFile()); + bool error = false; + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + error = true; + } + else { + QString playList = file.readAll(); + file.close(); + if (playList.isEmpty()) { + error = true; + } + else { + playList.replace("$CURRENTPATH", archive_url->url().path(KUrl::RemoveTrailingSlash)); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + kWarning() << "////// ERROR writing to file: "; + error = true; + } + else { + file.write(playList.toUtf8()); + if (file.error() != QFile::NoError) { + error = true; + } + file.close(); + } + } + } + if (error) { + KMessageBox::sorry(kapp->activeWindow(), i18n("Cannot open project file %1", extractedProjectFile()), i18n("Cannot open file")); + reject(); + } + else accept(); +} Modified: trunk/kdenlive/src/archivewidget.h =================================================================== --- trunk/kdenlive/src/archivewidget.h 2011-05-09 23:09:06 UTC (rev 5579) +++ trunk/kdenlive/src/archivewidget.h 2011-05-10 07:47:15 UTC (rev 5580) @@ -47,7 +47,11 @@ public: ArchiveWidget(QString projectName, QDomDocument doc, QList <DocClipBase*> list, QStringList luma_list, QWidget * parent = 0); + // Constructor for extracting widget + ArchiveWidget(const KUrl &url, QWidget * parent = 0); ~ArchiveWidget(); + + QString extractedProjectFile(); private slots: void slotCheckSpace(); @@ -59,6 +63,9 @@ void createArchive(); void slotArchivingProgress(int); void slotArchivingFinished(bool result); + void slotStartExtracting(); + void doExtracting(); + void slotExtractingFinished(); protected: virtual void closeEvent ( QCloseEvent * e ); @@ -75,6 +82,9 @@ QFuture<void> m_archiveThread; QStringList m_foldersList; QMap <QString, QString> m_filesList; + bool m_extractMode; + KUrl m_extractUrl; + QString m_projectName; /** @brief Generate tree widget subitems from a string list of urls. */ void generateItems(QTreeWidgetItem *parentItem, QStringList items); @@ -84,6 +94,7 @@ signals: void archivingFinished(bool); void archiveProgress(int); + void extractingFinished(); }; Modified: trunk/kdenlive/src/mainwindow.cpp =================================================================== --- trunk/kdenlive/src/mainwindow.cpp 2011-05-09 23:09:06 UTC (rev 5579) +++ trunk/kdenlive/src/mainwindow.cpp 2011-05-10 07:47:15 UTC (rev 5580) @@ -1908,7 +1908,7 @@ bool MainWindow::saveFileAs() { - QString outputFile = KFileDialog::getSaveFileName(m_activeDocument->projectFolder(), getMimeType()); + QString outputFile = KFileDialog::getSaveFileName(m_activeDocument->projectFolder(), getMimeType(false)); if (outputFile.isEmpty()) { return false; } @@ -1956,6 +1956,17 @@ void MainWindow::openFile(const KUrl &url) { + // Make sure the url is a Kdenlive project file + KMimeType::Ptr mime = KMimeType::findByUrl(url); + if (mime.data()->is("application/x-compressed-tar")) { + // Opening a compressed project file, we need to process it + kDebug()<<"Opening archive, processing"; + ArchiveWidget *ar = new ArchiveWidget(url); + if (ar->exec() == QDialog::Accepted) openFile(KUrl(ar->extractedProjectFile())); + delete ar; + return; + } + // Check if the document is already opened const int ct = m_timelineArea->count(); bool isOpened = false; @@ -4112,11 +4123,12 @@ slotShowTitleBars(!KdenliveSettings::showtitlebars()); } -QString MainWindow::getMimeType() +QString MainWindow::getMimeType(bool open) { QString mimetype = "application/x-kdenlive"; KMimeType::Ptr mime = KMimeType::mimeType(mimetype); if (!mime) mimetype = "*.kdenlive"; + if (open) mimetype.append(" application/x-compressed-tar"); return mimetype; } Modified: trunk/kdenlive/src/mainwindow.h =================================================================== --- trunk/kdenlive/src/mainwindow.h 2011-05-09 23:09:06 UTC (rev 5579) +++ trunk/kdenlive/src/mainwindow.h 2011-05-10 07:47:15 UTC (rev 5580) @@ -296,8 +296,9 @@ QPixmap createSchemePreviewIcon(const KSharedConfigPtr &config); /** @brief Checks that the Kdenlive mime type is correctly installed. + * @param open If set to true, this will return the mimetype allowed for file opening (adds .tar.gz format) * @return The mimetype */ - QString getMimeType(); + QString getMimeType(bool open = true); /** @brief Populates the "load layout" menu. */ void loadLayouts(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <j-...@us...> - 2011-05-09 23:09:13
|
Revision: 5579 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5579&view=rev Author: j-b-m Date: 2011-05-09 23:09:06 +0000 (Mon, 09 May 2011) Log Message: ----------- Show progress when archiving compressed project Modified Paths: -------------- trunk/kdenlive/src/archivewidget.cpp trunk/kdenlive/src/archivewidget.h Modified: trunk/kdenlive/src/archivewidget.cpp =================================================================== --- trunk/kdenlive/src/archivewidget.cpp 2011-05-09 22:36:42 UTC (rev 5578) +++ trunk/kdenlive/src/archivewidget.cpp 2011-05-09 23:09:06 UTC (rev 5579) @@ -50,6 +50,7 @@ archive_url->setUrl(KUrl(QDir::homePath())); connect(archive_url, SIGNAL(textChanged (const QString &)), this, SLOT(slotCheckSpace())); connect(this, SIGNAL(archivingFinished(bool)), this, SLOT(slotArchivingFinished(bool))); + connect(this, SIGNAL(archiveProgress(int)), this, SLOT(slotArchivingProgress(int))); // Setup categories QTreeWidgetItem *videos = new QTreeWidgetItem(files_list, QStringList() << i18n("Video clips")); @@ -308,10 +309,6 @@ repaint(); archive_url->setEnabled(false); compressed_archive->setEnabled(false); - m_progressTimer = new QTimer(this); - connect(m_progressTimer, SIGNAL(timeout()), this, SLOT(updateProgress())); - m_progressTimer->setSingleShot(false); - m_progressTimer->setInterval(700); } KUrl::List files; KUrl destUrl; @@ -535,7 +532,6 @@ m_temp->write(m_doc.toString().toUtf8()); m_temp->close(); m_archiveThread = QtConcurrent::run(this, &ArchiveWidget::createArchive); - m_progressTimer->start(); return true; } @@ -562,19 +558,22 @@ QFileInfo dirInfo(archive_url->url().path()); QString user = dirInfo.owner(); QString group = dirInfo.group(); - KTar archive(archive_url->url().path(KUrl::AddTrailingSlash) + m_name + ".tar.gz"); + KTar archive(archive_url->url().path(KUrl::AddTrailingSlash) + m_name + ".tar.gz", "application/x-gzip"); archive.open( QIODevice::WriteOnly ); - kDebug()<<"ARCHIVE: "<<archive.device(); + // Create folders foreach(const QString &path, m_foldersList) { archive.writeDir(path, user, group); } // Add files + int ix = 0; QMapIterator<QString, QString> i(m_filesList); while (i.hasNext()) { i.next(); archive.addLocalFile(i.key(), i.value()); + emit archiveProgress((int) 100 * ix / m_filesList.count()); + ix++; } // Add project file @@ -594,6 +593,7 @@ icon_info->setPixmap(KIcon("dialog-close").pixmap(16, 16)); text_info->setText(i18n("There was an error processing project file")); } + progressBar->setValue(100); buttonBox->button(QDialogButtonBox::Apply)->setText(i18n("Archive")); archive_url->setEnabled(true); compressed_archive->setEnabled(true); @@ -602,10 +602,9 @@ for (int j = 0; j < files_list->topLevelItem(i)->childCount(); j++) files_list->topLevelItem(i)->child(j)->setDisabled(false); } - m_progressTimer->stop(); } -void ArchiveWidget::updateProgress() +void ArchiveWidget::slotArchivingProgress(int p) { - int process = 100; + progressBar->setValue(p); } Modified: trunk/kdenlive/src/archivewidget.h =================================================================== --- trunk/kdenlive/src/archivewidget.h 2011-05-09 22:36:42 UTC (rev 5578) +++ trunk/kdenlive/src/archivewidget.h 2011-05-09 23:09:06 UTC (rev 5579) @@ -57,7 +57,7 @@ virtual void done ( int r ); bool closeAccepted(); void createArchive(); - void updateProgress(); + void slotArchivingProgress(int); void slotArchivingFinished(bool result); protected: @@ -75,7 +75,6 @@ QFuture<void> m_archiveThread; QStringList m_foldersList; QMap <QString, QString> m_filesList; - QTimer *m_progressTimer; /** @brief Generate tree widget subitems from a string list of urls. */ void generateItems(QTreeWidgetItem *parentItem, QStringList items); @@ -84,6 +83,7 @@ signals: void archivingFinished(bool); + void archiveProgress(int); }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <j-...@us...> - 2011-05-09 22:36:48
|
Revision: 5578 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5578&view=rev Author: j-b-m Date: 2011-05-09 22:36:42 +0000 (Mon, 09 May 2011) Log Message: ----------- Archive compressed project (in progress) Modified Paths: -------------- trunk/kdenlive/src/archivewidget.cpp trunk/kdenlive/src/archivewidget.h trunk/kdenlive/src/mainwindow.cpp trunk/kdenlive/src/widgets/archivewidget_ui.ui Modified: trunk/kdenlive/src/archivewidget.cpp =================================================================== --- trunk/kdenlive/src/archivewidget.cpp 2011-05-09 19:29:32 UTC (rev 5577) +++ trunk/kdenlive/src/archivewidget.cpp 2011-05-09 22:36:42 UTC (rev 5578) @@ -28,23 +28,28 @@ #include <KMessageBox> #include <KGuiItem> #include <KIO/NetAccess> +#include <KTar> #include <KDebug> #include <QTreeWidget> +#include <QtConcurrentRun> #include "projectsettings.h" -ArchiveWidget::ArchiveWidget(QDomDocument doc, QList <DocClipBase*> list, QStringList luma_list, QWidget * parent) : +ArchiveWidget::ArchiveWidget(QString projectName, QDomDocument doc, QList <DocClipBase*> list, QStringList luma_list, QWidget * parent) : QDialog(parent), m_requestedSize(0), m_copyJob(NULL), - m_doc(doc) + m_name(projectName.section('.', 0, -2)), + m_doc(doc), + m_abortArchive(false) { setAttribute(Qt::WA_DeleteOnClose); setupUi(this); setWindowTitle(i18n("Archive Project")); archive_url->setUrl(KUrl(QDir::homePath())); connect(archive_url, SIGNAL(textChanged (const QString &)), this, SLOT(slotCheckSpace())); + connect(this, SIGNAL(archivingFinished(bool)), this, SLOT(slotArchivingFinished(bool))); // Setup categories QTreeWidgetItem *videos = new QTreeWidgetItem(files_list, QStringList() << i18n("Video clips")); @@ -156,7 +161,8 @@ parentItem->setText(0, files_list->topLevelItem(i)->text(0) + " " + i18np("(%1 item)", "(%1 items)", items)); } } - + + compressed_archive->setText(compressed_archive->text() + " (" + m_name + ".tar.gz)"); project_files->setText(i18np("%1 file to archive, requires %2", "%1 files to archive, requires %2", total, KIO::convertSize(m_requestedSize))); buttonBox->button(QDialogButtonBox::Apply)->setText(i18n("Archive")); connect(buttonBox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), this, SLOT(slotStartArchiving())); @@ -282,32 +288,49 @@ bool ArchiveWidget::slotStartArchiving(bool firstPass) { - if (firstPass && m_copyJob) { + if (firstPass && (m_copyJob || m_archiveThread.isRunning())) { // archiving in progress, abort - m_copyJob->kill(KJob::EmitResult); + if (m_copyJob) m_copyJob->kill(KJob::EmitResult); + m_abortArchive = true; return true; } + bool isArchive = compressed_archive->isChecked(); if (!firstPass) m_copyJob = NULL; else { //starting archiving + m_abortArchive = false; m_duplicateFiles.clear(); m_replacementList.clear(); + m_foldersList.clear(); + m_filesList.clear(); + icon_info->setPixmap(KIcon("system-run").pixmap(16, 16)); + text_info->setText(i18n("Archiving...")); + repaint(); archive_url->setEnabled(false); + compressed_archive->setEnabled(false); + m_progressTimer = new QTimer(this); + connect(m_progressTimer, SIGNAL(timeout()), this, SLOT(updateProgress())); + m_progressTimer->setSingleShot(false); + m_progressTimer->setInterval(700); } KUrl::List files; KUrl destUrl; + QString destPath; QTreeWidgetItem *parentItem; bool isSlideshow = false; for (int i = 0; i < files_list->topLevelItemCount(); i++) { parentItem = files_list->topLevelItem(i); if (parentItem->childCount() > 0 && !parentItem->isDisabled()) { if (parentItem->data(0, Qt::UserRole).toString() == "slideshows") { - KIO::NetAccess::mkdir(KUrl(archive_url->url().path(KUrl::AddTrailingSlash) + "slideshows"), this); + KUrl slideFolder(archive_url->url().path(KUrl::AddTrailingSlash) + "slideshows"); + if (isArchive) m_foldersList.append("slideshows"); + else KIO::NetAccess::mkdir(slideFolder, this); isSlideshow = true; } files_list->setCurrentItem(parentItem); if (!isSlideshow) parentItem->setDisabled(true); - destUrl = KUrl(archive_url->url().path(KUrl::AddTrailingSlash) + parentItem->data(0, Qt::UserRole).toString()); + destPath = parentItem->data(0, Qt::UserRole).toString() + "/"; + destUrl = KUrl(archive_url->url().path(KUrl::AddTrailingSlash) + destPath); QTreeWidgetItem *item; for (int j = 0; j < parentItem->childCount(); j++) { item = parentItem->child(j); @@ -316,7 +339,8 @@ if (item->isDisabled()) { continue; } - destUrl = KUrl(destUrl.path(KUrl::AddTrailingSlash) + item->data(0, Qt::UserRole).toString() + "/"); + destPath.append(item->data(0, Qt::UserRole).toString() + "/"); + destUrl = KUrl(archive_url->url().path(KUrl::AddTrailingSlash) + destPath); QStringList srcFiles = item->data(0, Qt::UserRole + 1).toStringList(); for (int k = 0; k < srcFiles.count(); k++) { files << KUrl(srcFiles.at(k)); @@ -334,14 +358,17 @@ else { // We must rename the destination file, since another file with same name exists //TODO: monitor progress - m_duplicateFiles.insert(KUrl(item->text(0)), KUrl(destUrl.path(KUrl::AddTrailingSlash) + item->data(0, Qt::UserRole).toString())); + if (isArchive) { + m_filesList.insert(item->text(0), destPath + item->data(0, Qt::UserRole).toString()); + } + else m_duplicateFiles.insert(KUrl(item->text(0)), KUrl(destUrl.path(KUrl::AddTrailingSlash) + item->data(0, Qt::UserRole).toString())); } } break; } } - if (destUrl.isEmpty()) { + if (destPath.isEmpty()) { if (m_duplicateFiles.isEmpty()) return false; QMapIterator<KUrl, KUrl> i(m_duplicateFiles); if (i.hasNext()) { @@ -356,12 +383,22 @@ return true; } - if (files.isEmpty()) slotStartArchiving(false); - KIO::NetAccess::mkdir(destUrl, this); - m_copyJob = KIO::copy (files, destUrl, KIO::HideProgressInfo); - connect(m_copyJob, SIGNAL(result(KJob *)), this, SLOT(slotArchivingFinished(KJob *))); - connect(m_copyJob, SIGNAL(processedSize(KJob *, qulonglong)), this, SLOT(slotArchivingProgress(KJob *, qulonglong))); - + if (isArchive) { + m_foldersList.append(destPath); + for (int i = 0; i < files.count(); i++) { + m_filesList.insert(files.at(i).path(), destPath + files.at(i).fileName()); + } + slotArchivingFinished(); + } + else if (files.isEmpty()) { + slotStartArchiving(false); + } + else { + KIO::NetAccess::mkdir(destUrl, this); + m_copyJob = KIO::copy (files, destUrl, KIO::HideProgressInfo); + connect(m_copyJob, SIGNAL(result(KJob *)), this, SLOT(slotArchivingFinished(KJob *))); + connect(m_copyJob, SIGNAL(processedSize(KJob *, qulonglong)), this, SLOT(slotArchivingProgress(KJob *, qulonglong))); + } if (firstPass) { progressBar->setValue(0); buttonBox->button(QDialogButtonBox::Apply)->setText(i18n("Abort")); @@ -371,12 +408,12 @@ void ArchiveWidget::slotArchivingFinished(KJob *job) { - if (job->error() == 0) { + if (job == NULL || job->error() == 0) { if (slotStartArchiving(false)) { // We still have files to archive return; } - else { + else if (!compressed_archive->isChecked()) { // Archiving finished progressBar->setValue(100); if (processProjectFile()) { @@ -387,20 +424,22 @@ icon_info->setPixmap(KIcon("dialog-close").pixmap(16, 16)); text_info->setText(i18n("There was an error processing project file")); } - } + } else processProjectFile(); } else { m_copyJob = NULL; icon_info->setPixmap(KIcon("dialog-close").pixmap(16, 16)); text_info->setText(i18n("There was an error while copying the files: %1", job->errorString())); } - buttonBox->button(QDialogButtonBox::Apply)->setText(i18n("Archive")); - archive_url->setEnabled(true); - for (int i = 0; i < files_list->topLevelItemCount(); i++) { - files_list->topLevelItem(i)->setDisabled(false); - for (int j = 0; j < files_list->topLevelItem(i)->childCount(); j++) - files_list->topLevelItem(i)->child(j)->setDisabled(false); - + if (!compressed_archive->isChecked()) { + buttonBox->button(QDialogButtonBox::Apply)->setText(i18n("Archive")); + archive_url->setEnabled(true); + compressed_archive->setEnabled(true); + for (int i = 0; i < files_list->topLevelItemCount(); i++) { + files_list->topLevelItem(i)->setDisabled(false); + for (int j = 0; j < files_list->topLevelItem(i)->childCount(); j++) + files_list->topLevelItem(i)->child(j)->setDisabled(false); + } } } @@ -433,7 +472,6 @@ dest.addPath(item->data(0, Qt::UserRole).toString()); } m_replacementList.insert(src, dest); - kDebug()<<"___ PROCESS ITEM :"<<src << "="<<dest; } } } @@ -490,7 +528,18 @@ } } - QString path = archive_url->url().path(KUrl::AddTrailingSlash) + "project.kdenlive"; + bool isArchive = compressed_archive->isChecked(); + if (isArchive) { + m_temp = new KTemporaryFile; + if (!m_temp->open()) KMessageBox::error(this, i18n("Cannot create temporary file")); + m_temp->write(m_doc.toString().toUtf8()); + m_temp->close(); + m_archiveThread = QtConcurrent::run(this, &ArchiveWidget::createArchive); + m_progressTimer->start(); + return true; + } + + QString path = archive_url->url().path(KUrl::AddTrailingSlash) + m_name + ".kdenlive"; QFile file(path); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { kWarning() << "////// ERROR writing to file: " << path; @@ -508,3 +557,55 @@ return true; } +void ArchiveWidget::createArchive() +{ + QFileInfo dirInfo(archive_url->url().path()); + QString user = dirInfo.owner(); + QString group = dirInfo.group(); + KTar archive(archive_url->url().path(KUrl::AddTrailingSlash) + m_name + ".tar.gz"); + archive.open( QIODevice::WriteOnly ); + kDebug()<<"ARCHIVE: "<<archive.device(); + // Create folders + foreach(const QString &path, m_foldersList) { + archive.writeDir(path, user, group); + } + + // Add files + QMapIterator<QString, QString> i(m_filesList); + while (i.hasNext()) { + i.next(); + archive.addLocalFile(i.key(), i.value()); + } + + // Add project file + archive.addLocalFile(m_temp->fileName(), m_name + ".kdenlive"); + bool result = archive.close(); + delete m_temp; + emit archivingFinished(result); +} + +void ArchiveWidget::slotArchivingFinished(bool result) +{ + if (result) { + icon_info->setPixmap(KIcon("dialog-ok").pixmap(16, 16)); + text_info->setText(i18n("Project was successfully archived.")); + } + else { + icon_info->setPixmap(KIcon("dialog-close").pixmap(16, 16)); + text_info->setText(i18n("There was an error processing project file")); + } + buttonBox->button(QDialogButtonBox::Apply)->setText(i18n("Archive")); + archive_url->setEnabled(true); + compressed_archive->setEnabled(true); + for (int i = 0; i < files_list->topLevelItemCount(); i++) { + files_list->topLevelItem(i)->setDisabled(false); + for (int j = 0; j < files_list->topLevelItem(i)->childCount(); j++) + files_list->topLevelItem(i)->child(j)->setDisabled(false); + } + m_progressTimer->stop(); +} + +void ArchiveWidget::updateProgress() +{ + int process = 100; +} Modified: trunk/kdenlive/src/archivewidget.h =================================================================== --- trunk/kdenlive/src/archivewidget.h 2011-05-09 19:29:32 UTC (rev 5577) +++ trunk/kdenlive/src/archivewidget.h 2011-05-09 22:36:42 UTC (rev 5578) @@ -31,6 +31,7 @@ #include <QList> #include <KIO/Job> #include <KIO/CopyJob> +#include <KTemporaryFile> class KJob; @@ -45,16 +46,19 @@ Q_OBJECT public: - ArchiveWidget(QDomDocument doc, QList <DocClipBase*> list, QStringList luma_list, QWidget * parent = 0); + ArchiveWidget(QString projectName, QDomDocument doc, QList <DocClipBase*> list, QStringList luma_list, QWidget * parent = 0); ~ArchiveWidget(); private slots: void slotCheckSpace(); bool slotStartArchiving(bool firstPass = true); - void slotArchivingFinished(KJob *job); + void slotArchivingFinished(KJob *job = NULL); void slotArchivingProgress(KJob *, qulonglong); virtual void done ( int r ); bool closeAccepted(); + void createArchive(); + void updateProgress(); + void slotArchivingFinished(bool result); protected: virtual void closeEvent ( QCloseEvent * e ); @@ -64,7 +68,14 @@ KIO::CopyJob *m_copyJob; QMap <KUrl, KUrl> m_duplicateFiles; QMap <KUrl, KUrl> m_replacementList; + QString m_name; QDomDocument m_doc; + KTemporaryFile *m_temp; + bool m_abortArchive; + QFuture<void> m_archiveThread; + QStringList m_foldersList; + QMap <QString, QString> m_filesList; + QTimer *m_progressTimer; /** @brief Generate tree widget subitems from a string list of urls. */ void generateItems(QTreeWidgetItem *parentItem, QStringList items); @@ -72,6 +83,7 @@ bool processProjectFile(); signals: + void archivingFinished(bool); }; Modified: trunk/kdenlive/src/mainwindow.cpp =================================================================== --- trunk/kdenlive/src/mainwindow.cpp 2011-05-09 19:29:32 UTC (rev 5577) +++ trunk/kdenlive/src/mainwindow.cpp 2011-05-09 22:36:42 UTC (rev 5578) @@ -4253,7 +4253,7 @@ { QList <DocClipBase*> list = m_projectList->documentClipList(); QDomDocument doc = m_activeDocument->xmlSceneList(m_projectMonitor->sceneList(), m_projectList->expandedFolders()); - ArchiveWidget *d = new ArchiveWidget(doc, list, m_activeTimeline->projectView()->extractTransitionsLumas(), this); + ArchiveWidget *d = new ArchiveWidget(m_activeDocument->url().fileName(), doc, list, m_activeTimeline->projectView()->extractTransitionsLumas(), this); d->exec(); } Modified: trunk/kdenlive/src/widgets/archivewidget_ui.ui =================================================================== --- trunk/kdenlive/src/widgets/archivewidget_ui.ui 2011-05-09 19:29:32 UTC (rev 5577) +++ trunk/kdenlive/src/widgets/archivewidget_ui.ui 2011-05-09 22:36:42 UTC (rev 5578) @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>320</width> - <height>220</height> + <width>263</width> + <height>210</height> </rect> </property> <property name="windowTitle"> @@ -32,7 +32,7 @@ </item> </layout> </item> - <item row="1" column="0" colspan="2"> + <item row="2" column="0" colspan="2"> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QLabel" name="icon_info"> @@ -56,21 +56,21 @@ </item> </layout> </item> - <item row="2" column="0" colspan="2"> + <item row="3" column="0" colspan="2"> <widget class="QLabel" name="project_files"> <property name="text"> <string/> </property> </widget> </item> - <item row="4" column="0"> + <item row="5" column="0"> <widget class="QProgressBar" name="progressBar"> <property name="value"> <number>0</number> </property> </widget> </item> - <item row="4" column="1"> + <item row="5" column="1"> <widget class="QDialogButtonBox" name="buttonBox"> <property name="orientation"> <enum>Qt::Horizontal</enum> @@ -80,7 +80,7 @@ </property> </widget> </item> - <item row="3" column="0" colspan="2"> + <item row="4" column="0" colspan="2"> <widget class="QTreeWidget" name="files_list"> <property name="alternatingRowColors"> <bool>true</bool> @@ -98,6 +98,13 @@ </column> </widget> </item> + <item row="1" column="0" colspan="2"> + <widget class="QCheckBox" name="compressed_archive"> + <property name="text"> + <string>Compressed archive</string> + </property> + </widget> + </item> </layout> </widget> <customwidgets> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <j-...@us...> - 2011-05-09 19:29:39
|
Revision: 5577 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5577&view=rev Author: j-b-m Date: 2011-05-09 19:29:32 +0000 (Mon, 09 May 2011) Log Message: ----------- No need to work around color theme bug if KDE >= 4.6.3 Modified Paths: -------------- trunk/kdenlive/src/mainwindow.cpp Modified: trunk/kdenlive/src/mainwindow.cpp =================================================================== --- trunk/kdenlive/src/mainwindow.cpp 2011-05-09 19:20:31 UTC (rev 5576) +++ trunk/kdenlive/src/mainwindow.cpp 2011-05-09 19:29:32 UTC (rev 5577) @@ -3949,11 +3949,12 @@ plt = QApplication::desktop()->palette(); } else { KSharedConfigPtr config = KSharedConfig::openConfig(theme); - - // Since there currently is a bug (or feature change) in KGlobalSettings::createApplicationPalette, we need - // to do the palette loading stuff ourselves... - //plt = KGlobalSettings::createApplicationPalette(config); - + +#if KDE_IS_VERSION(4,6,3) + plt = KGlobalSettings::createNewApplicationPalette(config); +#else + // Since there was a bug in createApplicationPalette in KDE < 4.6.3 we need + // to do the palette loading stuff ourselves. (https://bugs.kde.org/show_bug.cgi?id=263497) QPalette::ColorGroup states[3] = { QPalette::Active, QPalette::Inactive, QPalette::Disabled }; // TT thinks tooltips shouldn't use active, so we use our active colors for all states @@ -3987,7 +3988,9 @@ plt.setBrush( state, QPalette::Link, schemeView.foreground( KColorScheme::LinkText ) ); plt.setBrush( state, QPalette::LinkVisited, schemeView.foreground( KColorScheme::VisitedText ) ); } +#endif } + kapp->setPalette(plt); const QObjectList children = statusBar()->children(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <j-...@us...> - 2011-05-09 19:20:37
|
Revision: 5576 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5576&view=rev Author: j-b-m Date: 2011-05-09 19:20:31 +0000 (Mon, 09 May 2011) Log Message: ----------- Several small fixes for project archiving Modified Paths: -------------- trunk/kdenlive/src/archivewidget.cpp trunk/kdenlive/src/archivewidget.h Modified: trunk/kdenlive/src/archivewidget.cpp =================================================================== --- trunk/kdenlive/src/archivewidget.cpp 2011-05-09 16:40:26 UTC (rev 5575) +++ trunk/kdenlive/src/archivewidget.cpp 2011-05-09 19:20:31 UTC (rev 5576) @@ -26,7 +26,7 @@ #include <KUrlRequester> #include <KFileDialog> #include <KMessageBox> -#include <KApplication> +#include <KGuiItem> #include <KIO/NetAccess> #include <KDebug> @@ -40,6 +40,7 @@ m_copyJob(NULL), m_doc(doc) { + setAttribute(Qt::WA_DeleteOnClose); setupUi(this); setWindowTitle(i18n("Archive Project")); archive_url->setUrl(KUrl(QDir::homePath())); @@ -138,17 +139,25 @@ // Hide unused categories, add item count int total = 0; for (int i = 0; i < files_list->topLevelItemCount(); i++) { - int items = files_list->topLevelItem(i)->childCount(); + QTreeWidgetItem *parentItem = files_list->topLevelItem(i); + int items = parentItem->childCount(); if (items == 0) { files_list->topLevelItem(i)->setHidden(true); } else { - total += items; - files_list->topLevelItem(i)->setText(0, files_list->topLevelItem(i)->text(0) + " " + i18np("(%1 item)", "(%1 items)", items)); + if (parentItem->data(0, Qt::UserRole).toString() == "slideshows") + { + // Special case: slideshows contain several files + for (int j = 0; j < items; j++) { + total += parentItem->child(j)->data(0, Qt::UserRole + 1).toStringList().count(); + } + } + else total += items; + parentItem->setText(0, files_list->topLevelItem(i)->text(0) + " " + i18np("(%1 item)", "(%1 items)", items)); } } - project_files->setText(i18n("%1 files to archive, requires %2", total, KIO::convertSize(m_requestedSize))); + project_files->setText(i18np("%1 file to archive, requires %2", "%1 files to archive, requires %2", total, KIO::convertSize(m_requestedSize))); buttonBox->button(QDialogButtonBox::Apply)->setText(i18n("Archive")); connect(buttonBox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), this, SLOT(slotStartArchiving())); buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false); @@ -160,6 +169,32 @@ { } +void ArchiveWidget::done ( int r ) +{ + if (closeAccepted()) QDialog::done(r); +} + +void ArchiveWidget::closeEvent ( QCloseEvent * e ) +{ + + if (closeAccepted()) e->accept(); + else e->ignore(); +} + + +bool ArchiveWidget::closeAccepted() +{ + if (!archive_url->isEnabled()) { + // Archiving in progress, should we stop? + if (KMessageBox::warningContinueCancel(this, i18n("Archiving in progress, do you want to stop it?"), i18n("Stop Archiving"), KGuiItem(i18n("Stop Archiving"))) != KMessageBox::Continue) { + return false; + } + if (m_copyJob) m_copyJob->kill(); + } + return true; +} + + void ArchiveWidget::generateItems(QTreeWidgetItem *parentItem, QStringList items) { QStringList filesList; @@ -257,6 +292,7 @@ //starting archiving m_duplicateFiles.clear(); m_replacementList.clear(); + archive_url->setEnabled(false); } KUrl::List files; KUrl destUrl; @@ -264,11 +300,11 @@ bool isSlideshow = false; for (int i = 0; i < files_list->topLevelItemCount(); i++) { parentItem = files_list->topLevelItem(i); - if (parentItem->data(0, Qt::UserRole).toString() == "slideshows") { - KIO::NetAccess::mkdir(KUrl(archive_url->url().path(KUrl::AddTrailingSlash) + "slideshows"), this); - isSlideshow = true; - } if (parentItem->childCount() > 0 && !parentItem->isDisabled()) { + if (parentItem->data(0, Qt::UserRole).toString() == "slideshows") { + KIO::NetAccess::mkdir(KUrl(archive_url->url().path(KUrl::AddTrailingSlash) + "slideshows"), this); + isSlideshow = true; + } files_list->setCurrentItem(parentItem); if (!isSlideshow) parentItem->setDisabled(true); destUrl = KUrl(archive_url->url().path(KUrl::AddTrailingSlash) + parentItem->data(0, Qt::UserRole).toString()); @@ -308,20 +344,19 @@ if (destUrl.isEmpty()) { if (m_duplicateFiles.isEmpty()) return false; QMapIterator<KUrl, KUrl> i(m_duplicateFiles); - KUrl startJob; if (i.hasNext()) { i.next(); - startJob = i.key(); - KIO::CopyJob *job = KIO::copyAs(startJob, i.value(), KIO::HideProgressInfo); + KUrl startJobSrc = i.key(); + KUrl startJobDst = i.value(); + m_duplicateFiles.remove(startJobSrc); + KIO::CopyJob *job = KIO::copyAs(startJobSrc, startJobDst, KIO::HideProgressInfo); connect(job, SIGNAL(result(KJob *)), this, SLOT(slotArchivingFinished(KJob *))); connect(job, SIGNAL(processedSize(KJob *, qulonglong)), this, SLOT(slotArchivingProgress(KJob *, qulonglong))); - m_duplicateFiles.remove(startJob); } return true; } if (files.isEmpty()) slotStartArchiving(false); - KIO::NetAccess::mkdir(destUrl, this); m_copyJob = KIO::copy (files, destUrl, KIO::HideProgressInfo); connect(m_copyJob, SIGNAL(result(KJob *)), this, SLOT(slotArchivingFinished(KJob *))); @@ -360,8 +395,12 @@ text_info->setText(i18n("There was an error while copying the files: %1", job->errorString())); } buttonBox->button(QDialogButtonBox::Apply)->setText(i18n("Archive")); + archive_url->setEnabled(true); for (int i = 0; i < files_list->topLevelItemCount(); i++) { files_list->topLevelItem(i)->setDisabled(false); + for (int j = 0; j < files_list->topLevelItem(i)->childCount(); j++) + files_list->topLevelItem(i)->child(j)->setDisabled(false); + } } @@ -402,7 +441,7 @@ // process kdenlive producers QDomElement mlt = m_doc.documentElement(); QString root = mlt.attribute("root") + "/"; - + mlt.setAttribute("root", archive_url->url().path(KUrl::RemoveTrailingSlash)); QDomNodeList prods = mlt.elementsByTagName("kdenlive_producer"); for (int i = 0; i < prods.count(); i++) { QDomElement e = prods.item(i).toElement(); @@ -455,13 +494,13 @@ QFile file(path); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { kWarning() << "////// ERROR writing to file: " << path; - KMessageBox::error(kapp->activeWindow(), i18n("Cannot write to file %1", path)); + KMessageBox::error(this, i18n("Cannot write to file %1", path)); return false; } file.write(m_doc.toString().toUtf8()); if (file.error() != QFile::NoError) { - KMessageBox::error(kapp->activeWindow(), i18n("Cannot write to file %1", path)); + KMessageBox::error(this, i18n("Cannot write to file %1", path)); file.close(); return false; } Modified: trunk/kdenlive/src/archivewidget.h =================================================================== --- trunk/kdenlive/src/archivewidget.h 2011-05-09 16:40:26 UTC (rev 5575) +++ trunk/kdenlive/src/archivewidget.h 2011-05-09 19:20:31 UTC (rev 5576) @@ -25,9 +25,9 @@ #include "ui_archivewidget_ui.h" #include "docclipbase.h" -#include <KDialog> #include <kio/global.h> #include <QLabel> +#include <QDialog> #include <QList> #include <KIO/Job> #include <KIO/CopyJob> @@ -53,7 +53,12 @@ bool slotStartArchiving(bool firstPass = true); void slotArchivingFinished(KJob *job); void slotArchivingProgress(KJob *, qulonglong); + virtual void done ( int r ); + bool closeAccepted(); +protected: + virtual void closeEvent ( QCloseEvent * e ); + private: KIO::filesize_t m_requestedSize; KIO::CopyJob *m_copyJob; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <j-...@us...> - 2011-05-09 16:40:32
|
Revision: 5575 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5575&view=rev Author: j-b-m Date: 2011-05-09 16:40:26 +0000 (Mon, 09 May 2011) Log Message: ----------- Archiving slideshows now works Modified Paths: -------------- trunk/kdenlive/src/archivewidget.cpp Modified: trunk/kdenlive/src/archivewidget.cpp =================================================================== --- trunk/kdenlive/src/archivewidget.cpp 2011-05-09 10:10:03 UTC (rev 5574) +++ trunk/kdenlive/src/archivewidget.cpp 2011-05-09 16:40:26 UTC (rev 5575) @@ -97,12 +97,9 @@ DocClipBase *clip = list.at(i); CLIPTYPE t = clip->clipType(); if (t == SLIDESHOW) { - QStringList subfiles = ProjectSettings::extractSlideshowUrls(clip->fileURL()); - foreach(const QString & file, subfiles) { - kDebug()<<"SLIDE: "<<file; - new QTreeWidgetItem(slideshows, QStringList() << file); - m_requestedSize += QFileInfo(file).size(); - } + KUrl slideUrl = clip->fileURL(); + //TODO: Slideshow files + slideUrls << slideUrl.path(); } else if (t == IMAGE) imageUrls << clip->fileURL().path(); else if (t == TEXT) { @@ -128,7 +125,7 @@ generateItems(sounds, audioUrls); generateItems(videos, videoUrls); generateItems(images, imageUrls); - //generateItems(slideshows, slideUrls); + generateItems(slideshows, slideUrls); generateItems(others, otherUrls); generateItems(proxies, proxyUrls); @@ -147,7 +144,7 @@ } else { total += items; - files_list->topLevelItem(i)->setText(0, files_list->topLevelItem(i)->text(0) + " " + i18n("(%1 items)", items)); + files_list->topLevelItem(i)->setText(0, files_list->topLevelItem(i)->text(0) + " " + i18np("(%1 item)", "(%1 items)", items)); } } @@ -167,10 +164,53 @@ { QStringList filesList; QString fileName; + int ix = 0; + bool isSlideshow = parentItem->data(0, Qt::UserRole).toString() == "slideshows"; foreach(const QString & file, items) { QTreeWidgetItem *item = new QTreeWidgetItem(parentItem, QStringList() << file); fileName = KUrl(file).fileName(); - if (filesList.contains(fileName)) { + if (isSlideshow) { + // we store each slideshow in a separate subdirectory + item->setData(0, Qt::UserRole, ix); + ix++; + KUrl slideUrl(file); + QDir dir(slideUrl.directory(KUrl::AppendTrailingSlash)); + if (slideUrl.fileName().startsWith(".all.")) { + // mimetype slideshow (for example *.png) + QStringList filters; + QString extension; + // TODO: improve jpeg image detection with extension like jpeg, requires change in MLT image producers + filters << "*." + slideUrl.fileName().section('.', -1); + dir.setNameFilters(filters); + QFileInfoList resultList = dir.entryInfoList(QDir::Files); + QStringList slideImages; + for (int i = 0; i < resultList.count(); i++) { + m_requestedSize += resultList.at(i).size(); + slideImages << resultList.at(i).absoluteFilePath(); + } + item->setData(0, Qt::UserRole + 1, slideImages); + } + else { + // pattern url (like clip%.3d.png) + QStringList result = dir.entryList(QDir::Files); + QString filter = slideUrl.fileName(); + QString ext = filter.section('.', -1); + filter = filter.section('%', 0, -2); + QString regexp = "^" + filter + "\\d+\\." + ext + "$"; + QRegExp rx(regexp); + QStringList slideImages; + QString directory = dir.absolutePath(); + if (!directory.endsWith('/')) directory.append('/'); + foreach(const QString & path, result) { + if (rx.exactMatch(path)) { + m_requestedSize += QFileInfo(directory + path).size(); + slideImages << directory + path; + } + } + item->setData(0, Qt::UserRole + 1, slideImages); + } + } + else if (filesList.contains(fileName)) { // we have 2 files with same name int ix = 0; QString newFileName = fileName.section('.', 0, -2) + "_" + QString::number(ix) + "." + fileName.section('.', -1); @@ -181,8 +221,10 @@ fileName = newFileName; item->setData(0, Qt::UserRole, fileName); } - filesList << fileName; - m_requestedSize += QFileInfo(file).size(); + if (!isSlideshow) { + m_requestedSize += QFileInfo(file).size(); + filesList << fileName; + } } } @@ -218,16 +260,39 @@ } KUrl::List files; KUrl destUrl; + QTreeWidgetItem *parentItem; + bool isSlideshow = false; for (int i = 0; i < files_list->topLevelItemCount(); i++) { - if (files_list->topLevelItem(i)->childCount() > 0 && !files_list->topLevelItem(i)->isDisabled()) { - files_list->setCurrentItem(files_list->topLevelItem(i)); - files_list->topLevelItem(i)->setDisabled(true); - destUrl = KUrl(archive_url->url().path(KUrl::AddTrailingSlash) + files_list->topLevelItem(i)->data(0, Qt::UserRole).toString()); - KIO::NetAccess::mkdir(destUrl, this); + parentItem = files_list->topLevelItem(i); + if (parentItem->data(0, Qt::UserRole).toString() == "slideshows") { + KIO::NetAccess::mkdir(KUrl(archive_url->url().path(KUrl::AddTrailingSlash) + "slideshows"), this); + isSlideshow = true; + } + if (parentItem->childCount() > 0 && !parentItem->isDisabled()) { + files_list->setCurrentItem(parentItem); + if (!isSlideshow) parentItem->setDisabled(true); + destUrl = KUrl(archive_url->url().path(KUrl::AddTrailingSlash) + parentItem->data(0, Qt::UserRole).toString()); QTreeWidgetItem *item; - for (int j = 0; j < files_list->topLevelItem(i)->childCount(); j++) { - item = files_list->topLevelItem(i)->child(j); - if (item->data(0, Qt::UserRole).isNull()) { + for (int j = 0; j < parentItem->childCount(); j++) { + item = parentItem->child(j); + // Special case: slideshows + if (isSlideshow) { + if (item->isDisabled()) { + continue; + } + destUrl = KUrl(destUrl.path(KUrl::AddTrailingSlash) + item->data(0, Qt::UserRole).toString() + "/"); + QStringList srcFiles = item->data(0, Qt::UserRole + 1).toStringList(); + for (int k = 0; k < srcFiles.count(); k++) { + files << KUrl(srcFiles.at(k)); + } + item->setDisabled(true); + if (parentItem->indexOfChild(item) == parentItem->childCount() - 1) { + // We have processed all slideshows + parentItem->setDisabled(true); + } + break; + } + else if (item->data(0, Qt::UserRole).isNull()) { files << KUrl(item->text(0)); } else { @@ -255,6 +320,9 @@ return true; } + if (files.isEmpty()) slotStartArchiving(false); + + KIO::NetAccess::mkdir(destUrl, this); m_copyJob = KIO::copy (files, destUrl, KIO::HideProgressInfo); connect(m_copyJob, SIGNAL(result(KJob *)), this, SLOT(slotArchivingFinished(KJob *))); connect(m_copyJob, SIGNAL(processedSize(KJob *, qulonglong)), this, SLOT(slotArchivingProgress(KJob *, qulonglong))); @@ -308,19 +376,25 @@ KUrl destUrl; QTreeWidgetItem *item; for (int i = 0; i < files_list->topLevelItemCount(); i++) { - if (files_list->topLevelItem(i)->childCount() > 0) { - destUrl = KUrl(archive_url->url().path(KUrl::AddTrailingSlash) + files_list->topLevelItem(i)->data(0, Qt::UserRole).toString()); - for (int j = 0; j < files_list->topLevelItem(i)->childCount(); j++) { - item = files_list->topLevelItem(i)->child(j); + QTreeWidgetItem *parentItem = files_list->topLevelItem(i); + if (parentItem->childCount() > 0) { + destUrl = KUrl(archive_url->url().path(KUrl::AddTrailingSlash) + parentItem->data(0, Qt::UserRole).toString()); + bool isSlideshow = parentItem->data(0, Qt::UserRole).toString() == "slideshows"; + for (int j = 0; j < parentItem->childCount(); j++) { + item = parentItem->child(j); KUrl src(item->text(0)); KUrl dest = destUrl; - if (item->data(0, Qt::UserRole).isNull()) { + if (isSlideshow) { + dest = KUrl(destUrl.path(KUrl::AddTrailingSlash) + item->data(0, Qt::UserRole).toString() + "/" + src.fileName()); + } + else if (item->data(0, Qt::UserRole).isNull()) { dest.addPath(src.fileName()); } else { dest.addPath(item->data(0, Qt::UserRole).toString()); } m_replacementList.insert(src, dest); + kDebug()<<"___ PROCESS ITEM :"<<src << "="<<dest; } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <g-...@us...> - 2011-05-09 10:10:09
|
Revision: 5574 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5574&view=rev Author: g-marco Date: 2011-05-09 10:10:03 +0000 (Mon, 09 May 2011) Log Message: ----------- fix bug when no vpre= is set Modified Paths: -------------- trunk/kdenlive/renderer/kdenlive_render.cpp Modified: trunk/kdenlive/renderer/kdenlive_render.cpp =================================================================== --- trunk/kdenlive/renderer/kdenlive_render.cpp 2011-05-09 09:10:57 UTC (rev 5573) +++ trunk/kdenlive/renderer/kdenlive_render.cpp 2011-05-09 10:10:03 UTC (rev 5574) @@ -63,7 +63,10 @@ QString dest = desturl.path(); bool dualpass = false; bool doerase; - QString vpre=args.at(args.indexOf(QRegExp("vpre=.*"))); + QString vpre; + int vprepos=args.indexOf(QRegExp("vpre=.*")); + if (vprepos>=0) + vpre=args.at(vprepos); QStringList vprelist=vpre.replace("vpre=","").split(","); if (vprelist.size()>0) args.replaceInStrings(QRegExp("^vpre=.*"),QString("vpre=").append(vprelist.at(0))); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <j-...@us...> - 2011-05-09 09:11:03
|
Revision: 5573 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5573&view=rev Author: j-b-m Date: 2011-05-09 09:10:57 +0000 (Mon, 09 May 2011) Log Message: ----------- progress on archive project (slideshows not implemented yet) Modified Paths: -------------- trunk/kdenlive/src/archivewidget.cpp Modified: trunk/kdenlive/src/archivewidget.cpp =================================================================== --- trunk/kdenlive/src/archivewidget.cpp 2011-05-09 08:14:13 UTC (rev 5572) +++ trunk/kdenlive/src/archivewidget.cpp 2011-05-09 09:10:57 UTC (rev 5573) @@ -45,37 +45,41 @@ archive_url->setUrl(KUrl(QDir::homePath())); connect(archive_url, SIGNAL(textChanged (const QString &)), this, SLOT(slotCheckSpace())); - // Setup categories QTreeWidgetItem *videos = new QTreeWidgetItem(files_list, QStringList() << i18n("Video clips")); videos->setIcon(0, KIcon("video-x-generic")); - videos->setData(0, Qt::UserRole, i18n("videos")); + videos->setData(0, Qt::UserRole, "videos"); videos->setExpanded(false); QTreeWidgetItem *sounds = new QTreeWidgetItem(files_list, QStringList() << i18n("Audio clips")); sounds->setIcon(0, KIcon("audio-x-generic")); - sounds->setData(0, Qt::UserRole, i18n("sounds")); + sounds->setData(0, Qt::UserRole, "sounds"); sounds->setExpanded(false); QTreeWidgetItem *images = new QTreeWidgetItem(files_list, QStringList() << i18n("Image clips")); images->setIcon(0, KIcon("image-x-generic")); - images->setData(0, Qt::UserRole, i18n("images")); + images->setData(0, Qt::UserRole, "images"); images->setExpanded(false); QTreeWidgetItem *slideshows = new QTreeWidgetItem(files_list, QStringList() << i18n("Slideshow clips")); slideshows->setIcon(0, KIcon("image-x-generic")); - slideshows->setData(0, Qt::UserRole, i18n("slideshows")); + slideshows->setData(0, Qt::UserRole, "slideshows"); slideshows->setExpanded(false); QTreeWidgetItem *texts = new QTreeWidgetItem(files_list, QStringList() << i18n("Text clips")); texts->setIcon(0, KIcon("text-plain")); - texts->setData(0, Qt::UserRole, i18n("texts")); + texts->setData(0, Qt::UserRole, "texts"); texts->setExpanded(false); QTreeWidgetItem *others = new QTreeWidgetItem(files_list, QStringList() << i18n("Other clips")); others->setIcon(0, KIcon("unknown")); - others->setData(0, Qt::UserRole, i18n("others")); + others->setData(0, Qt::UserRole, "others"); others->setExpanded(false); QTreeWidgetItem *lumas = new QTreeWidgetItem(files_list, QStringList() << i18n("Luma files")); lumas->setIcon(0, KIcon("image-x-generic")); - lumas->setData(0, Qt::UserRole, i18n("lumas")); + lumas->setData(0, Qt::UserRole, "lumas"); lumas->setExpanded(false); - + + QTreeWidgetItem *proxies = new QTreeWidgetItem(files_list, QStringList() << i18n("Proxy clips")); + proxies->setIcon(0, KIcon("video-x-generic")); + proxies->setData(0, Qt::UserRole, "proxy"); + proxies->setExpanded(false); + // process all files QStringList allFonts; KUrl::List fileUrls; @@ -87,29 +91,38 @@ QStringList videoUrls; QStringList imageUrls; QStringList otherUrls; + QStringList proxyUrls; for (int i = 0; i < list.count(); i++) { DocClipBase *clip = list.at(i); - if (clip->clipType() == SLIDESHOW) { + CLIPTYPE t = clip->clipType(); + if (t == SLIDESHOW) { QStringList subfiles = ProjectSettings::extractSlideshowUrls(clip->fileURL()); foreach(const QString & file, subfiles) { kDebug()<<"SLIDE: "<<file; new QTreeWidgetItem(slideshows, QStringList() << file); m_requestedSize += QFileInfo(file).size(); } - } else if (!clip->fileURL().isEmpty()) { - if (clip->clipType() == AUDIO) audioUrls << clip->fileURL().path(); - else videoUrls << clip->fileURL().path(); } - if (clip->clipType() == TEXT) { + else if (t == IMAGE) imageUrls << clip->fileURL().path(); + else if (t == TEXT) { QStringList imagefiles = TitleWidget::extractImageList(clip->getProperty("xmldata")); QStringList fonts = TitleWidget::extractFontList(clip->getProperty("xmldata")); imageUrls << imagefiles; allFonts << fonts; - } else if (clip->clipType() == PLAYLIST) { + } else if (t == PLAYLIST) { QStringList files = ProjectSettings::extractPlaylistUrls(clip->fileURL().path()); otherUrls << files; } + else if (!clip->fileURL().isEmpty()) { + if (t == AUDIO) audioUrls << clip->fileURL().path(); + else { + videoUrls << clip->fileURL().path(); + // Check if we have a proxy + QString proxy = clip->getProperty("proxy"); + if (!proxy.isEmpty() && proxy != "-" && QFile::exists(proxy)) proxyUrls << proxy; + } + } } generateItems(sounds, audioUrls); @@ -117,6 +130,7 @@ generateItems(images, imageUrls); //generateItems(slideshows, slideUrls); generateItems(others, otherUrls); + generateItems(proxies, proxyUrls); #if QT_VERSION >= 0x040500 allFonts.removeDuplicates(); @@ -310,9 +324,11 @@ } } } - // process kdenlive producers - + + // process kdenlive producers QDomElement mlt = m_doc.documentElement(); + QString root = mlt.attribute("root") + "/"; + QDomNodeList prods = mlt.elementsByTagName("kdenlive_producer"); for (int i = 0; i < prods.count(); i++) { QDomElement e = prods.item(i).toElement(); @@ -322,8 +338,45 @@ KUrl dest = m_replacementList.value(src); if (!dest.isEmpty()) e.setAttribute("resource", dest.path()); } + if (e.hasAttribute("proxy") && e.attribute("proxy") != "-") { + KUrl src(e.attribute("proxy")); + KUrl dest = m_replacementList.value(src); + if (!dest.isEmpty()) e.setAttribute("proxy", dest.path()); + } } + // process mlt producers + prods = mlt.elementsByTagName("producer"); + for (int i = 0; i < prods.count(); i++) { + QDomElement e = prods.item(i).toElement(); + if (e.isNull()) continue; + QString src = EffectsList::property(e, "resource"); + if (!src.isEmpty()) { + if (!src.startsWith('/')) src.prepend(root); + KUrl srcUrl(src); + KUrl dest = m_replacementList.value(src); + if (!dest.isEmpty()) EffectsList::setProperty(e, "resource", dest.path()); + } + } + + // process mlt transitions (for luma files) + prods = mlt.elementsByTagName("transition"); + QString attribute; + for (int i = 0; i < prods.count(); i++) { + QDomElement e = prods.item(i).toElement(); + if (e.isNull()) continue; + attribute = "resource"; + QString src = EffectsList::property(e, attribute); + if (src.isEmpty()) attribute = "luma"; + src = EffectsList::property(e, attribute); + if (!src.isEmpty()) { + if (!src.startsWith('/')) src.prepend(root); + KUrl srcUrl(src); + KUrl dest = m_replacementList.value(src); + if (!dest.isEmpty()) EffectsList::setProperty(e, attribute, dest.path()); + } + } + QString path = archive_url->url().path(KUrl::AddTrailingSlash) + "project.kdenlive"; QFile file(path); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <j-...@us...> - 2011-05-09 08:14:20
|
Revision: 5572 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5572&view=rev Author: j-b-m Date: 2011-05-09 08:14:13 +0000 (Mon, 09 May 2011) Log Message: ----------- Some progress on archiving feature Modified Paths: -------------- trunk/kdenlive/src/archivewidget.cpp trunk/kdenlive/src/archivewidget.h trunk/kdenlive/src/kdenlivedoc.cpp trunk/kdenlive/src/kdenlivedoc.h trunk/kdenlive/src/mainwindow.cpp trunk/kdenlive/src/widgets/archivewidget_ui.ui Modified: trunk/kdenlive/src/archivewidget.cpp =================================================================== --- trunk/kdenlive/src/archivewidget.cpp 2011-05-08 09:21:53 UTC (rev 5571) +++ trunk/kdenlive/src/archivewidget.cpp 2011-05-09 08:14:13 UTC (rev 5572) @@ -25,65 +25,119 @@ #include <KDiskFreeSpaceInfo> #include <KUrlRequester> #include <KFileDialog> +#include <KMessageBox> +#include <KApplication> +#include <KIO/NetAccess> #include <KDebug> -#include <QListWidget> +#include <QTreeWidget> #include "projectsettings.h" -ArchiveWidget::ArchiveWidget(QList <DocClipBase*> list, QStringList lumas, QWidget * parent) : +ArchiveWidget::ArchiveWidget(QDomDocument doc, QList <DocClipBase*> list, QStringList luma_list, QWidget * parent) : QDialog(parent), m_requestedSize(0), - m_copyJob(NULL) + m_copyJob(NULL), + m_doc(doc) { setupUi(this); setWindowTitle(i18n("Archive Project")); archive_url->setUrl(KUrl(QDir::homePath())); connect(archive_url, SIGNAL(textChanged (const QString &)), this, SLOT(slotCheckSpace())); + + // Setup categories + QTreeWidgetItem *videos = new QTreeWidgetItem(files_list, QStringList() << i18n("Video clips")); + videos->setIcon(0, KIcon("video-x-generic")); + videos->setData(0, Qt::UserRole, i18n("videos")); + videos->setExpanded(false); + QTreeWidgetItem *sounds = new QTreeWidgetItem(files_list, QStringList() << i18n("Audio clips")); + sounds->setIcon(0, KIcon("audio-x-generic")); + sounds->setData(0, Qt::UserRole, i18n("sounds")); + sounds->setExpanded(false); + QTreeWidgetItem *images = new QTreeWidgetItem(files_list, QStringList() << i18n("Image clips")); + images->setIcon(0, KIcon("image-x-generic")); + images->setData(0, Qt::UserRole, i18n("images")); + images->setExpanded(false); + QTreeWidgetItem *slideshows = new QTreeWidgetItem(files_list, QStringList() << i18n("Slideshow clips")); + slideshows->setIcon(0, KIcon("image-x-generic")); + slideshows->setData(0, Qt::UserRole, i18n("slideshows")); + slideshows->setExpanded(false); + QTreeWidgetItem *texts = new QTreeWidgetItem(files_list, QStringList() << i18n("Text clips")); + texts->setIcon(0, KIcon("text-plain")); + texts->setData(0, Qt::UserRole, i18n("texts")); + texts->setExpanded(false); + QTreeWidgetItem *others = new QTreeWidgetItem(files_list, QStringList() << i18n("Other clips")); + others->setIcon(0, KIcon("unknown")); + others->setData(0, Qt::UserRole, i18n("others")); + others->setExpanded(false); + QTreeWidgetItem *lumas = new QTreeWidgetItem(files_list, QStringList() << i18n("Luma files")); + lumas->setIcon(0, KIcon("image-x-generic")); + lumas->setData(0, Qt::UserRole, i18n("lumas")); + lumas->setExpanded(false); + // process all files QStringList allFonts; - foreach(const QString & file, lumas) { - kDebug()<<"LUMA: "<<file; - files_list->addItem(file); - m_requestedSize += QFileInfo(file).size(); - } + KUrl::List fileUrls; + QStringList fileNames; + generateItems(lumas, luma_list); + QStringList slideUrls; + QStringList audioUrls; + QStringList videoUrls; + QStringList imageUrls; + QStringList otherUrls; + for (int i = 0; i < list.count(); i++) { DocClipBase *clip = list.at(i); if (clip->clipType() == SLIDESHOW) { QStringList subfiles = ProjectSettings::extractSlideshowUrls(clip->fileURL()); foreach(const QString & file, subfiles) { kDebug()<<"SLIDE: "<<file; - files_list->addItem(file); + new QTreeWidgetItem(slideshows, QStringList() << file); m_requestedSize += QFileInfo(file).size(); } } else if (!clip->fileURL().isEmpty()) { - files_list->addItem(clip->fileURL().path()); - m_requestedSize += QFileInfo(clip->fileURL().path()).size(); + if (clip->clipType() == AUDIO) audioUrls << clip->fileURL().path(); + else videoUrls << clip->fileURL().path(); } if (clip->clipType() == TEXT) { QStringList imagefiles = TitleWidget::extractImageList(clip->getProperty("xmldata")); QStringList fonts = TitleWidget::extractFontList(clip->getProperty("xmldata")); - foreach(const QString & file, imagefiles) { - kDebug()<<"TXT IMAGE: "<<file; - files_list->addItem(file); - m_requestedSize += QFileInfo(file).size(); - } + imageUrls << imagefiles; allFonts << fonts; } else if (clip->clipType() == PLAYLIST) { QStringList files = ProjectSettings::extractPlaylistUrls(clip->fileURL().path()); - foreach(const QString & file, files) { - kDebug()<<"PLAYLIST: "<<file; - files_list->addItem(file); - m_requestedSize += QFileInfo(file).size(); - } + otherUrls << files; } } + + generateItems(sounds, audioUrls); + generateItems(videos, videoUrls); + generateItems(images, imageUrls); + //generateItems(slideshows, slideUrls); + generateItems(others, otherUrls); + #if QT_VERSION >= 0x040500 allFonts.removeDuplicates(); #endif - project_files->setText(i18n("%1 files to archive, requires %2", files_list->count(), KIO::convertSize(m_requestedSize))); + + //TODO: fonts + + // Hide unused categories, add item count + int total = 0; + for (int i = 0; i < files_list->topLevelItemCount(); i++) { + int items = files_list->topLevelItem(i)->childCount(); + if (items == 0) { + files_list->topLevelItem(i)->setHidden(true); + } + else { + total += items; + files_list->topLevelItem(i)->setText(0, files_list->topLevelItem(i)->text(0) + " " + i18n("(%1 items)", items)); + } + } + + project_files->setText(i18n("%1 files to archive, requires %2", total, KIO::convertSize(m_requestedSize))); buttonBox->button(QDialogButtonBox::Apply)->setText(i18n("Archive")); connect(buttonBox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), this, SLOT(slotStartArchiving())); buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false); @@ -95,6 +149,29 @@ { } +void ArchiveWidget::generateItems(QTreeWidgetItem *parentItem, QStringList items) +{ + QStringList filesList; + QString fileName; + foreach(const QString & file, items) { + QTreeWidgetItem *item = new QTreeWidgetItem(parentItem, QStringList() << file); + fileName = KUrl(file).fileName(); + if (filesList.contains(fileName)) { + // we have 2 files with same name + int ix = 0; + QString newFileName = fileName.section('.', 0, -2) + "_" + QString::number(ix) + "." + fileName.section('.', -1); + while (filesList.contains(newFileName)) { + ix ++; + newFileName = fileName.section('.', 0, -2) + "_" + QString::number(ix) + "." + fileName.section('.', -1); + } + fileName = newFileName; + item->setData(0, Qt::UserRole, fileName); + } + filesList << fileName; + m_requestedSize += QFileInfo(file).size(); + } +} + void ArchiveWidget::slotCheckSpace() { KDiskFreeSpaceInfo inf = KDiskFreeSpaceInfo::freeSpaceInfo( archive_url->url().path()); @@ -112,36 +189,98 @@ } } -void ArchiveWidget::slotStartArchiving() +bool ArchiveWidget::slotStartArchiving(bool firstPass) { - if (m_copyJob) { + if (firstPass && m_copyJob) { // archiving in progress, abort m_copyJob->kill(KJob::EmitResult); - return; + return true; } + if (!firstPass) m_copyJob = NULL; + else { + //starting archiving + m_duplicateFiles.clear(); + m_replacementList.clear(); + } KUrl::List files; - for (int i = 0; i < files_list->count(); i++) { - if (files_list->item(i)) - files << KUrl(files_list->item(i)->text()); + KUrl destUrl; + for (int i = 0; i < files_list->topLevelItemCount(); i++) { + if (files_list->topLevelItem(i)->childCount() > 0 && !files_list->topLevelItem(i)->isDisabled()) { + files_list->setCurrentItem(files_list->topLevelItem(i)); + files_list->topLevelItem(i)->setDisabled(true); + destUrl = KUrl(archive_url->url().path(KUrl::AddTrailingSlash) + files_list->topLevelItem(i)->data(0, Qt::UserRole).toString()); + KIO::NetAccess::mkdir(destUrl, this); + QTreeWidgetItem *item; + for (int j = 0; j < files_list->topLevelItem(i)->childCount(); j++) { + item = files_list->topLevelItem(i)->child(j); + if (item->data(0, Qt::UserRole).isNull()) { + files << KUrl(item->text(0)); + } + else { + // We must rename the destination file, since another file with same name exists + //TODO: monitor progress + m_duplicateFiles.insert(KUrl(item->text(0)), KUrl(destUrl.path(KUrl::AddTrailingSlash) + item->data(0, Qt::UserRole).toString())); + } + } + break; + } } - - progressBar->setValue(0); - buttonBox->button(QDialogButtonBox::Apply)->setText(i18n("Abort")); - m_copyJob = KIO::copy (files, archive_url->url(), KIO::HideProgressInfo); + + if (destUrl.isEmpty()) { + if (m_duplicateFiles.isEmpty()) return false; + QMapIterator<KUrl, KUrl> i(m_duplicateFiles); + KUrl startJob; + if (i.hasNext()) { + i.next(); + startJob = i.key(); + KIO::CopyJob *job = KIO::copyAs(startJob, i.value(), KIO::HideProgressInfo); + connect(job, SIGNAL(result(KJob *)), this, SLOT(slotArchivingFinished(KJob *))); + connect(job, SIGNAL(processedSize(KJob *, qulonglong)), this, SLOT(slotArchivingProgress(KJob *, qulonglong))); + m_duplicateFiles.remove(startJob); + } + return true; + } + + m_copyJob = KIO::copy (files, destUrl, KIO::HideProgressInfo); connect(m_copyJob, SIGNAL(result(KJob *)), this, SLOT(slotArchivingFinished(KJob *))); connect(m_copyJob, SIGNAL(processedSize(KJob *, qulonglong)), this, SLOT(slotArchivingProgress(KJob *, qulonglong))); + + if (firstPass) { + progressBar->setValue(0); + buttonBox->button(QDialogButtonBox::Apply)->setText(i18n("Abort")); + } + return true; } void ArchiveWidget::slotArchivingFinished(KJob *job) { - progressBar->setValue(100); - buttonBox->button(QDialogButtonBox::Apply)->setText(i18n("Archive")); - if (job->error() == 0) text_info->setText(i18n("Project was successfully archived.")); + if (job->error() == 0) { + if (slotStartArchiving(false)) { + // We still have files to archive + return; + } + else { + // Archiving finished + progressBar->setValue(100); + if (processProjectFile()) { + icon_info->setPixmap(KIcon("dialog-ok").pixmap(16, 16)); + text_info->setText(i18n("Project was successfully archived.")); + } + else { + icon_info->setPixmap(KIcon("dialog-close").pixmap(16, 16)); + text_info->setText(i18n("There was an error processing project file")); + } + } + } else { + m_copyJob = NULL; icon_info->setPixmap(KIcon("dialog-close").pixmap(16, 16)); text_info->setText(i18n("There was an error while copying the files: %1", job->errorString())); } - m_copyJob = NULL; + buttonBox->button(QDialogButtonBox::Apply)->setText(i18n("Archive")); + for (int i = 0; i < files_list->topLevelItemCount(); i++) { + files_list->topLevelItem(i)->setDisabled(false); + } } void ArchiveWidget::slotArchivingProgress(KJob *, qulonglong size) @@ -149,3 +288,57 @@ progressBar->setValue((int) 100 * size / m_requestedSize); } + +bool ArchiveWidget::processProjectFile() +{ + KUrl destUrl; + QTreeWidgetItem *item; + for (int i = 0; i < files_list->topLevelItemCount(); i++) { + if (files_list->topLevelItem(i)->childCount() > 0) { + destUrl = KUrl(archive_url->url().path(KUrl::AddTrailingSlash) + files_list->topLevelItem(i)->data(0, Qt::UserRole).toString()); + for (int j = 0; j < files_list->topLevelItem(i)->childCount(); j++) { + item = files_list->topLevelItem(i)->child(j); + KUrl src(item->text(0)); + KUrl dest = destUrl; + if (item->data(0, Qt::UserRole).isNull()) { + dest.addPath(src.fileName()); + } + else { + dest.addPath(item->data(0, Qt::UserRole).toString()); + } + m_replacementList.insert(src, dest); + } + } + } + // process kdenlive producers + + QDomElement mlt = m_doc.documentElement(); + QDomNodeList prods = mlt.elementsByTagName("kdenlive_producer"); + for (int i = 0; i < prods.count(); i++) { + QDomElement e = prods.item(i).toElement(); + if (e.isNull()) continue; + if (e.hasAttribute("resource")) { + KUrl src(e.attribute("resource")); + KUrl dest = m_replacementList.value(src); + if (!dest.isEmpty()) e.setAttribute("resource", dest.path()); + } + } + + QString path = archive_url->url().path(KUrl::AddTrailingSlash) + "project.kdenlive"; + QFile file(path); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + kWarning() << "////// ERROR writing to file: " << path; + KMessageBox::error(kapp->activeWindow(), i18n("Cannot write to file %1", path)); + return false; + } + + file.write(m_doc.toString().toUtf8()); + if (file.error() != QFile::NoError) { + KMessageBox::error(kapp->activeWindow(), i18n("Cannot write to file %1", path)); + file.close(); + return false; + } + file.close(); + return true; +} + Modified: trunk/kdenlive/src/archivewidget.h =================================================================== --- trunk/kdenlive/src/archivewidget.h 2011-05-08 09:21:53 UTC (rev 5571) +++ trunk/kdenlive/src/archivewidget.h 2011-05-09 08:14:13 UTC (rev 5572) @@ -45,19 +45,27 @@ Q_OBJECT public: - ArchiveWidget(QList <DocClipBase*> list, QStringList lumas, QWidget * parent = 0); + ArchiveWidget(QDomDocument doc, QList <DocClipBase*> list, QStringList luma_list, QWidget * parent = 0); ~ArchiveWidget(); private slots: void slotCheckSpace(); - void slotStartArchiving(); + bool slotStartArchiving(bool firstPass = true); void slotArchivingFinished(KJob *job); void slotArchivingProgress(KJob *, qulonglong); private: KIO::filesize_t m_requestedSize; KIO::CopyJob *m_copyJob; + QMap <KUrl, KUrl> m_duplicateFiles; + QMap <KUrl, KUrl> m_replacementList; + QDomDocument m_doc; + /** @brief Generate tree widget subitems from a string list of urls. */ + void generateItems(QTreeWidgetItem *parentItem, QStringList items); + /** @brief Replace urls in project file. */ + bool processProjectFile(); + signals: }; Modified: trunk/kdenlive/src/kdenlivedoc.cpp =================================================================== --- trunk/kdenlive/src/kdenlivedoc.cpp 2011-05-08 09:21:53 UTC (rev 5571) +++ trunk/kdenlive/src/kdenlivedoc.cpp 2011-05-09 08:14:13 UTC (rev 5572) @@ -535,15 +535,14 @@ return QPoint(m_documentProperties.value("zonein").toInt(), m_documentProperties.value("zoneout").toInt()); } -bool KdenliveDoc::saveSceneList(const QString &path, const QString &scene, const QStringList expandedFolders) +QDomDocument KdenliveDoc::xmlSceneList(const QString &scene, const QStringList expandedFolders) { QDomDocument sceneList; sceneList.setContent(scene, true); QDomElement mlt = sceneList.firstChildElement("mlt"); if (mlt.isNull() || !mlt.hasChildNodes()) { - //Make sure we don't save if scenelist is corrupted - KMessageBox::error(kapp->activeWindow(), i18n("Cannot write to file %1, scene list is corrupted.", path)); - return false; + //scenelist is corrupted + return sceneList; } QDomElement addedXml = sceneList.createElement("kdenlivedoc"); @@ -658,7 +657,18 @@ addedXml.appendChild(sceneList.importNode(m_clipManager->groupsXml(), true)); //wes.appendChild(doc.importNode(kdenliveData, true)); + return sceneList; +} +bool KdenliveDoc::saveSceneList(const QString &path, const QString &scene, const QStringList expandedFolders) +{ + QDomDocument sceneList = xmlSceneList(scene, expandedFolders); + if (sceneList.isNull()) { + //Make sure we don't save if scenelist is corrupted + KMessageBox::error(kapp->activeWindow(), i18n("Cannot write to file %1, scene list is corrupted.", path)); + return false; + } + QFile file(path); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { kWarning() << "////// ERROR writing to file: " << path; Modified: trunk/kdenlive/src/kdenlivedoc.h =================================================================== --- trunk/kdenlive/src/kdenlivedoc.h 2011-05-08 09:21:53 UTC (rev 5571) +++ trunk/kdenlive/src/kdenlivedoc.h 2011-05-09 08:14:13 UTC (rev 5572) @@ -112,6 +112,9 @@ QPoint zoom() const; double dar() const; double projectDuration() const; + /** @brief Returns the project file xml. */ + QDomDocument xmlSceneList(const QString &scene, const QStringList expandedFolders); + /** @brief Saves the project file xml to a file. */ bool saveSceneList(const QString &path, const QString &scene, const QStringList expandedFolders); int tracksCount() const; TrackInfo trackInfoAt(int ix) const; Modified: trunk/kdenlive/src/mainwindow.cpp =================================================================== --- trunk/kdenlive/src/mainwindow.cpp 2011-05-08 09:21:53 UTC (rev 5571) +++ trunk/kdenlive/src/mainwindow.cpp 2011-05-09 08:14:13 UTC (rev 5572) @@ -4249,7 +4249,8 @@ void MainWindow::slotArchiveProject() { QList <DocClipBase*> list = m_projectList->documentClipList(); - ArchiveWidget *d = new ArchiveWidget(list, m_activeTimeline->projectView()->extractTransitionsLumas(), this); + QDomDocument doc = m_activeDocument->xmlSceneList(m_projectMonitor->sceneList(), m_projectList->expandedFolders()); + ArchiveWidget *d = new ArchiveWidget(doc, list, m_activeTimeline->projectView()->extractTransitionsLumas(), this); d->exec(); } Modified: trunk/kdenlive/src/widgets/archivewidget_ui.ui =================================================================== --- trunk/kdenlive/src/widgets/archivewidget_ui.ui 2011-05-08 09:21:53 UTC (rev 5571) +++ trunk/kdenlive/src/widgets/archivewidget_ui.ui 2011-05-09 08:14:13 UTC (rev 5572) @@ -63,9 +63,6 @@ </property> </widget> </item> - <item row="3" column="0" colspan="2"> - <widget class="QListWidget" name="files_list"/> - </item> <item row="4" column="0"> <widget class="QProgressBar" name="progressBar"> <property name="value"> @@ -83,6 +80,24 @@ </property> </widget> </item> + <item row="3" column="0" colspan="2"> + <widget class="QTreeWidget" name="files_list"> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="selectionBehavior"> + <enum>QAbstractItemView::SelectItems</enum> + </property> + <attribute name="headerVisible"> + <bool>false</bool> + </attribute> + <column> + <property name="text"> + <string notr="true">1</string> + </property> + </column> + </widget> + </item> </layout> </widget> <customwidgets> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tt...@us...> - 2011-05-08 09:22:00
|
Revision: 5571 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5571&view=rev Author: ttill Date: 2011-05-08 09:21:53 +0000 (Sun, 08 May 2011) Log Message: ----------- Rotoscoping: import keyframes generated by tracker. Requires https://github.com/ttill/MLT-roto-tracking Modified Paths: -------------- trunk/kdenlive/effects/rotoscoping.xml trunk/kdenlive/src/effectstackedit.cpp trunk/kdenlive/src/effectstackedit.h trunk/kdenlive/src/effectstackview.cpp trunk/kdenlive/src/renderer.cpp trunk/kdenlive/src/renderer.h trunk/kdenlive/src/rotoscoping/rotowidget.cpp trunk/kdenlive/src/rotoscoping/rotowidget.h trunk/kdenlive/src/transitionsettings.cpp Modified: trunk/kdenlive/effects/rotoscoping.xml =================================================================== --- trunk/kdenlive/effects/rotoscoping.xml 2011-05-06 19:52:19 UTC (rev 5570) +++ trunk/kdenlive/effects/rotoscoping.xml 2011-05-08 09:21:53 UTC (rev 5571) @@ -17,6 +17,10 @@ <parameter type="bool" name="invert" default="0"> <name>Invert</name> </parameter> + + <parameter type="bool" name="track" default="0"> + <name>Track</name> + </parameter> <parameter type="constant" name="feather" max="500" min="0" default="0"> <name>Feather width</name> Modified: trunk/kdenlive/src/effectstackedit.cpp =================================================================== --- trunk/kdenlive/src/effectstackedit.cpp 2011-05-06 19:52:19 UTC (rev 5570) +++ trunk/kdenlive/src/effectstackedit.cpp 2011-05-08 09:21:53 UTC (rev 5571) @@ -205,14 +205,14 @@ } } -void EffectStackEdit::transferParamDesc(const QDomElement d, int pos, int in, int out, bool isEffect) +void EffectStackEdit::transferParamDesc(const QDomElement d, ItemInfo info, bool isEffect) { clearAllItems(); if (m_keyframeEditor) delete m_keyframeEditor; m_keyframeEditor = NULL; m_params = d; - m_in = in; - m_out = out; + m_in = isEffect ? info.cropStart.frames(KdenliveSettings::project_fps()) : info.startPos.frames(KdenliveSettings::project_fps()); + m_out = isEffect ? (info.cropStart + info.cropDuration).frames(KdenliveSettings::project_fps()) - 1 : info.endPos.frames(KdenliveSettings::project_fps()); if (m_params.isNull()) { // kDebug() << "// EMPTY EFFECT STACK"; return; @@ -327,7 +327,7 @@ connect(pl, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters())); } else if (type == "geometry") { if (KdenliveSettings::on_monitor_effects()) { - m_geometryWidget = new GeometryWidget(m_monitor, m_timecode, pos, isEffect, m_params.hasAttribute("showrotation"), this); + m_geometryWidget = new GeometryWidget(m_monitor, m_timecode, isEffect ? 0 : qMax(0, (int)info.startPos.frames(KdenliveSettings::project_fps())), isEffect, m_params.hasAttribute("showrotation"), this); m_geometryWidget->setFrameSize(m_frameSize); m_geometryWidget->slotShowScene(!disable); // connect this before setupParam to make sure the monitor scene shows up at startup @@ -343,7 +343,7 @@ connect(this, SIGNAL(syncEffectsPos(int)), m_geometryWidget, SLOT(slotSyncPosition(int))); connect(this, SIGNAL(effectStateChanged(bool)), m_geometryWidget, SLOT(slotShowScene(bool))); } else { - Geometryval *geo = new Geometryval(m_profile, m_timecode, m_frameSize, pos); + Geometryval *geo = new Geometryval(m_profile, m_timecode, m_frameSize, isEffect ? 0 : qMax(0, (int)info.startPos.frames(KdenliveSettings::project_fps()))); if (minFrame == maxFrame) geo->setupParam(pa, m_in, m_out); else @@ -446,7 +446,7 @@ meetDependency(paramName, type, EffectsList::parameter(e, depends)); #ifdef QJSON } else if (type == "roto-spline") { - RotoWidget *roto = new RotoWidget(value, m_monitor, m_in, m_out, m_timecode, this); + RotoWidget *roto = new RotoWidget(value, m_monitor, info, m_timecode, this); roto->slotShowScene(!disable); connect(roto, SIGNAL(valueChanged()), this, SLOT(collectAllParameters())); connect(roto, SIGNAL(checkMonitorPosition(int)), this, SIGNAL(checkMonitorPosition(int))); Modified: trunk/kdenlive/src/effectstackedit.h =================================================================== --- trunk/kdenlive/src/effectstackedit.h 2011-05-06 19:52:19 UTC (rev 5570) +++ trunk/kdenlive/src/effectstackedit.h 2011-05-08 09:21:53 UTC (rev 5571) @@ -85,7 +85,7 @@ public slots: /** @brief Called when an effect is selected, builds the UI for this effect. */ - void transferParamDesc(const QDomElement d, int pos, int in, int out, bool isEffect = true); + void transferParamDesc(const QDomElement d, ItemInfo info, bool isEffect = true); /** @brief Called whenever(?) some parameter is changed in the gui. * Modified: trunk/kdenlive/src/effectstackview.cpp =================================================================== --- trunk/kdenlive/src/effectstackview.cpp 2011-05-06 19:52:19 UTC (rev 5570) +++ trunk/kdenlive/src/effectstackview.cpp 2011-05-08 09:21:53 UTC (rev 5571) @@ -199,7 +199,8 @@ if (m_clipref == NULL) { m_ui.effectlist->blockSignals(true); m_ui.effectlist->clear(); - m_effectedit->transferParamDesc(QDomElement(), 0, 0, 0); + ItemInfo info; + m_effectedit->transferParamDesc(QDomElement(), info); //m_ui.region_url->clear(); m_ui.effectlist->blockSignals(false); m_ui.checkAll->setToolTip(QString()); @@ -302,7 +303,8 @@ } m_ui.effectlist->blockSignals(false); if (m_ui.effectlist->count() == 0) { - m_effectedit->transferParamDesc(QDomElement(), 0, 0, 0); + ItemInfo info; + m_effectedit->transferParamDesc(QDomElement(), info); //m_ui.region_url->clear(); } else slotItemSelectionChanged(false); slotUpdateCheckAllButton(); @@ -319,11 +321,16 @@ eff = m_currentEffectList.at(activeRow); if (m_trackMode) { // showing track effects - m_effectedit->transferParamDesc(eff, 0, 0, m_trackInfo.duration); - } else m_effectedit->transferParamDesc(eff, - 0, - m_clipref->cropStart().frames(KdenliveSettings::project_fps()), - (m_clipref->cropStart() + m_clipref->cropDuration()).frames(KdenliveSettings::project_fps()) - 1); //minx max frame + ItemInfo info; + info.track = m_trackInfo.type; + info.cropDuration = GenTime(m_trackInfo.duration, KdenliveSettings::project_fps()); + info.cropStart = GenTime(0); + info.startPos = GenTime(-1); + info.track = 0; + m_effectedit->transferParamDesc(eff, info); + } else { + m_effectedit->transferParamDesc(eff, m_clipref->info()); + } //m_ui.region_url->setUrl(KUrl(eff.attribute("region"))); m_ui.labelComment->setText(i18n(eff.firstChildElement("description").firstChildElement("full").text().toUtf8().data())); } @@ -386,11 +393,17 @@ if (m_trackMode) { EffectsList::setParameter(dom, "in", QString::number(0)); EffectsList::setParameter(dom, "out", QString::number(m_trackInfo.duration)); - m_effectedit->transferParamDesc(dom, 0, 0, m_trackInfo.duration);//minx max frame + ItemInfo info; + info.track = m_trackInfo.type; + info.cropDuration = GenTime(m_trackInfo.duration, KdenliveSettings::project_fps()); + info.cropStart = GenTime(0); + info.startPos = GenTime(-1); + info.track = 0; + m_effectedit->transferParamDesc(dom, info); emit updateEffect(NULL, m_trackindex, old, dom, activeRow); } else { m_clipref->initEffect(dom); - m_effectedit->transferParamDesc(dom, 0, m_clipref->cropStart().frames(KdenliveSettings::project_fps()), (m_clipref->cropStart() + m_clipref->cropDuration()).frames(KdenliveSettings::project_fps()));//minx max frame + m_effectedit->transferParamDesc(dom, m_clipref->info()); //m_ui.region_url->setUrl(KUrl(dom.attribute("region"))); emit updateEffect(m_clipref, -1, old, dom, activeRow); } @@ -417,7 +430,8 @@ m_ui.buttonUp->setEnabled(false); m_ui.buttonDown->setEnabled(false); m_ui.checkAll->setEnabled(false); - m_effectedit->transferParamDesc(QDomElement(), 0, 0, 0); + ItemInfo info; + m_effectedit->transferParamDesc(QDomElement(), info); //m_ui.region_url->clear(); m_ui.buttonShowComments->setEnabled(false); m_ui.labelComment->setText(QString()); Modified: trunk/kdenlive/src/renderer.cpp =================================================================== --- trunk/kdenlive/src/renderer.cpp 2011-05-06 19:52:19 UTC (rev 5570) +++ trunk/kdenlive/src/renderer.cpp 2011-05-08 09:21:53 UTC (rev 5571) @@ -4162,6 +4162,11 @@ } } +Mlt::Producer* Render::getProducer() +{ + return m_mltProducer; +} + #include "renderer.moc" Modified: trunk/kdenlive/src/renderer.h =================================================================== --- trunk/kdenlive/src/renderer.h 2011-05-06 19:52:19 UTC (rev 5570) +++ trunk/kdenlive/src/renderer.h 2011-05-08 09:21:53 UTC (rev 5571) @@ -265,6 +265,9 @@ QList <int> checkTrackSequence(int); void sendFrameUpdate(); + /** @brief Returns a pointer to the main producer. */ + Mlt::Producer *getProducer(); + private: /** @brief The name of this renderer. Modified: trunk/kdenlive/src/rotoscoping/rotowidget.cpp =================================================================== --- trunk/kdenlive/src/rotoscoping/rotowidget.cpp 2011-05-06 19:52:19 UTC (rev 5570) +++ trunk/kdenlive/src/rotoscoping/rotowidget.cpp 2011-05-08 09:21:53 UTC (rev 5571) @@ -26,6 +26,8 @@ #include "simplekeyframes/simplekeyframewidget.h" #include "kdenlivesettings.h" +#include <mlt++/Mlt.h> + #include <math.h> #include <qjson/parser.h> @@ -33,13 +35,22 @@ #include <QVBoxLayout> +/** @brief Listener for "tracking-finished" event in MLT rotoscoping filter. */ +void tracking_finished(mlt_service *owner, RotoWidget *self, char *data) +{ + Q_UNUSED(owner) -RotoWidget::RotoWidget(QString data, Monitor *monitor, int in, int out, Timecode t, QWidget* parent) : + if (self) + self->setSpline(QString(data)); +} + +RotoWidget::RotoWidget(QString data, Monitor *monitor, ItemInfo info, Timecode t, QWidget* parent) : QWidget(parent), m_monitor(monitor), m_showScene(true), - m_in(in), - m_out(out) + m_in(info.cropStart.frames(KdenliveSettings::project_fps())), + m_out((info.cropStart + info.cropDuration).frames(KdenliveSettings::project_fps()) - 1), + m_filter(NULL) { QVBoxLayout *l = new QVBoxLayout(this); m_keyframeWidget = new SimpleKeyframeWidget(t, m_out - m_in, this); @@ -49,40 +60,6 @@ edit->showVisibilityButton(true); m_scene = edit->getScene(); - QJson::Parser parser; - bool ok; - m_data = parser.parse(data.toUtf8(), &ok); - if (!ok) { - // :( - } - - - if (m_data.canConvert(QVariant::Map)) { - /* - * pass keyframe data to keyframe timeline - */ - QList <int> keyframes; - QMap <QString, QVariant> map = m_data.toMap(); - QMap <QString, QVariant>::const_iterator i = map.constBegin(); - while (i != map.constEnd()) { - keyframes.append(i.key().toInt() - m_in); - ++i; - } - m_keyframeWidget->setKeyframes(keyframes); - - for (int j = 0; j < keyframes.count(); ++j) { - // key might already be justified - if (map.contains(QString::number(keyframes.at(j) + m_in))) { - QVariant value = map.take(QString::number(keyframes.at(j) + m_in)); - map[QString::number(keyframes.at(j) + m_in).rightJustified(log10((double)m_out) + 1, '0')] = value; - } - } - m_data = QVariant(map); - } else { - // static (only one keyframe) - m_keyframeWidget->setKeyframes(QList <int>() << 0); - } - m_item = new SplineItem(QList <BPoint>(), NULL, m_scene); connect(m_item, SIGNAL(changed(bool)), this, SLOT(slotUpdateData(bool))); @@ -94,11 +71,15 @@ connect(m_keyframeWidget, SIGNAL(keyframeMoved(int,int)), this, SLOT(slotMoveKeyframe(int,int))); connect(m_scene, SIGNAL(addKeyframe()), this, SLOT(slotAddKeyframe())); - slotPositionChanged(0, false); + setSpline(data, false); + setupTrackingListen(info); } RotoWidget::~RotoWidget() { + if (m_filter) + mlt_events_disconnect(m_filter->get_properties(), this); + delete m_keyframeWidget; m_scene->removeItem(m_item); @@ -256,6 +237,11 @@ data = m_data.toMap()[QString::number(keyframe).rightJustified(log10((double)m_out) + 1, '0')].toList(); else data = m_data.toList(); + + // skip tracking flag + if (data.count() && data.at(0).canConvert(QVariant::String)) + data.removeFirst(); + foreach (const QVariant &bpoint, data) { QList <QVariant> l = bpoint.toList(); BPoint p; @@ -321,15 +307,90 @@ m_keyframeWidget->updateTimecodeFormat(); } +void RotoWidget::keyframeTimelineFullUpdate() +{ + if (m_data.canConvert(QVariant::Map)) { + QList <int> keyframes; + QMap <QString, QVariant> map = m_data.toMap(); + QMap <QString, QVariant>::const_iterator i = map.constBegin(); + while (i != map.constEnd()) { + keyframes.append(i.key().toInt() - m_in); + ++i; + } + m_keyframeWidget->setKeyframes(keyframes); + /*for (int j = 0; j < keyframes.count(); ++j) { + // key might already be justified + if (map.contains(QString::number(keyframes.at(j) + m_in))) { + QVariant value = map.take(QString::number(keyframes.at(j) + m_in)); + map[QString::number(keyframes.at(j) + m_in).rightJustified(log10((double)m_out) + 1, '0')] = value; + } + } + m_data = QVariant(map);*/ + } else { + // static (only one keyframe) + m_keyframeWidget->setKeyframes(QList <int>() << 0); + } +} +void RotoWidget::setupTrackingListen(ItemInfo info) +{ + if (info.startPos < GenTime()) { + // TODO: track effects + return; + } + + Mlt::Service service(m_monitor->render->getProducer()->parent().get_service()); + Mlt::Tractor tractor(service); + Mlt::Producer trackProducer(tractor.track(tractor.count() - info.track - 1)); + Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service()); + + Mlt::Producer *clip = trackPlaylist.get_clip_at((int)info.startPos.frames(KdenliveSettings::project_fps())); + if (!clip) { + return; + } + + int i = 0; + Mlt::Filter *filter = clip->filter(0); + while (filter) { + if (strcmp(filter->get("kdenlive_id"), "rotoscoping") == 0) { + m_filter = filter; + filter->listen("tracking-finished", this, (mlt_listener)tracking_finished); + break; + } + filter = clip->filter(++i); + } + + delete clip; +} + +void RotoWidget::setSpline(QString spline, bool notify) +{ + QJson::Parser parser; + bool ok; + m_data = parser.parse(spline.simplified().toUtf8(), &ok); + if (!ok) { + // :( + } + keyframeTimelineFullUpdate(); + slotPositionChanged(m_keyframeWidget->getPosition(), false); + if (notify) + emit valueChanged(); +} + + static QVariant interpolate(int position, int in, int out, QVariant *splineIn, QVariant *splineOut) { qreal relPos = (position - in) / (qreal)(out - in + 1); QList<QVariant> keyframe1 = splineIn->toList(); QList<QVariant> keyframe2 = splineOut->toList(); QList<QVariant> keyframe; + if (keyframe1.count() && keyframe1.at(0).canConvert(QVariant::String)) + keyframe1.removeFirst(); + if (keyframe2.count() && keyframe2.at(0).canConvert(QVariant::String)) + keyframe2.removeFirst(); int max = qMin(keyframe1.count(), keyframe2.count()); + for (int i = 0; i < max; ++i) { QList<QVariant> p1 = keyframe1.at(i).toList(); QList<QVariant> p2 = keyframe2.at(i).toList(); Modified: trunk/kdenlive/src/rotoscoping/rotowidget.h =================================================================== --- trunk/kdenlive/src/rotoscoping/rotowidget.h 2011-05-06 19:52:19 UTC (rev 5570) +++ trunk/kdenlive/src/rotoscoping/rotowidget.h 2011-05-08 09:21:53 UTC (rev 5571) @@ -19,6 +19,7 @@ #ifndef ROTOWIDGET_H #define ROTOWIDGET_H +#include "definitions.h" #include "bpoint.h" #include "timecode.h" @@ -28,6 +29,10 @@ class MonitorScene; class SplineItem; class SimpleKeyframeWidget; +namespace Mlt +{ +class Filter; +} /** @brief Adjusts keyframes after resizing a clip. */ bool adjustRotoDuration(QString *data, int in, int out); @@ -37,12 +42,15 @@ Q_OBJECT public: - RotoWidget(QString data, Monitor *monitor, int in, int out, Timecode t, QWidget* parent = 0); + RotoWidget(QString data, Monitor *monitor, ItemInfo info, Timecode t, QWidget* parent = 0); virtual ~RotoWidget(); /** @brief Returns the spline(s) in the JSON format used by filter_rotoscoping (MLT). */ QString getSpline(); + /** @brief Replaces current data with \param spline (JSON). */ + void setSpline(QString spline, bool notify = true); + /** @brief Passed on to the keyframe timeline. Switches between frames and hh:mm:ss:ff timecode. */ void updateTimecodeFormat(); @@ -67,6 +75,7 @@ SplineItem *m_item; int m_in; int m_out; + Mlt::Filter *m_filter; /** @brief Returns the list of cubic Bézier points that form the spline at position @param keyframe. * The points are brought from the range [0, 1] into project resolution space. @@ -74,6 +83,12 @@ * Set @param keyframe to -1 if only one keyframe currently exists. */ QList <BPoint> getPoints(int keyframe); + /** @brief Adds tracking_finished as listener for "tracking-finished" event in MLT rotoscoping filter. */ + void setupTrackingListen(ItemInfo info); + + /** @brief Passes list of keyframe positions to keyframe timeline widget. */ + void keyframeTimelineFullUpdate(); + private slots: /** @brief Makes sure the monitor effect scene is only visible if the clip this geometry belongs to is visible. * @param renderPos Postion of the Monitor / Timeline cursor */ Modified: trunk/kdenlive/src/transitionsettings.cpp =================================================================== --- trunk/kdenlive/src/transitionsettings.cpp 2011-05-06 19:52:19 UTC (rev 5570) +++ trunk/kdenlive/src/transitionsettings.cpp 2011-05-08 09:21:53 UTC (rev 5571) @@ -105,21 +105,20 @@ void TransitionSettings::slotTransitionChanged(bool reinit, bool updateCurrent) { QDomElement e = m_usedTransition->toXML().cloneNode().toElement(); - int start = m_usedTransition->startPos().frames(KdenliveSettings::project_fps()); - int end = m_usedTransition->endPos().frames(KdenliveSettings::project_fps()); if (reinit) { // Reset the transition parameters to the default one QDomElement newTransition = MainWindow::transitions.getEffectByName(transitionList->currentText()).cloneNode().toElement(); slotUpdateEffectParams(e, newTransition); - m_effectEdit->transferParamDesc(newTransition, start, start, end, false); + m_effectEdit->transferParamDesc(newTransition, m_usedTransition->info(), false); } else if (!updateCurrent) { // Transition changed, update parameters dialog //slotUpdateEffectParams(e, e); - m_effectEdit->transferParamDesc(e, start, start, end, false); + m_effectEdit->transferParamDesc(e, m_usedTransition->info(), false); } else { // Same transition, we just want to update the parameters value slotUpdateEffectParams(e, e); - if (m_usedTransition->hasGeometry()) m_effectEdit->transferParamDesc(m_usedTransition->toXML(), start, start, end, false); + if (m_usedTransition->hasGeometry()) + m_effectEdit->transferParamDesc(m_usedTransition->toXML(), m_usedTransition->info(), false); } } @@ -183,7 +182,8 @@ } else { // null transition selected m_usedTransition = NULL; - m_effectEdit->transferParamDesc(QDomElement(), 0, 0, 0, false); + ItemInfo info; + m_effectEdit->transferParamDesc(QDomElement(), info, false); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <g-...@us...> - 2011-05-06 19:52:25
|
Revision: 5570 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5570&view=rev Author: g-marco Date: 2011-05-06 19:52:19 +0000 (Fri, 06 May 2011) Log Message: ----------- Allow use different ffmpeg present for 1 and 2nd pass. f.e. vpre=ultrafast,hq if no 2nd present is given, the first will be used. Modified Paths: -------------- trunk/kdenlive/renderer/kdenlive_render.cpp Modified: trunk/kdenlive/renderer/kdenlive_render.cpp =================================================================== --- trunk/kdenlive/renderer/kdenlive_render.cpp 2011-05-03 19:49:17 UTC (rev 5569) +++ trunk/kdenlive/renderer/kdenlive_render.cpp 2011-05-06 19:52:19 UTC (rev 5570) @@ -63,6 +63,10 @@ QString dest = desturl.path(); bool dualpass = false; bool doerase; + QString vpre=args.at(args.indexOf(QRegExp("vpre=.*"))); + QStringList vprelist=vpre.replace("vpre=","").split(","); + if (vprelist.size()>0) + args.replaceInStrings(QRegExp("^vpre=.*"),QString("vpre=").append(vprelist.at(0))); if (args.contains("pass=2")) { // dual pass encoding dualpass = true; @@ -73,7 +77,10 @@ RenderJob *job = new RenderJob(doerase, usekuiserver, render, profile, rendermodule, player, src, dest, preargs, args, in, out); job->start(); if (dualpass) { + if (vprelist.size()>1) + args.replaceInStrings(QRegExp("^vpre=.*"),QString("vpre=").append(vprelist.at(1))); args.replace(args.indexOf("pass=1"), "pass=2"); + args.replace(args.indexOf("pass=1"), "pass=2"); RenderJob *dualjob = new RenderJob(erase, usekuiserver, render, profile, rendermodule, player, src, dest, preargs, args, in, out); QObject::connect(job, SIGNAL(renderingFinished()), dualjob, SLOT(start())); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <j-...@us...> - 2011-05-03 19:49:24
|
Revision: 5569 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5569&view=rev Author: j-b-m Date: 2011-05-03 19:49:17 +0000 (Tue, 03 May 2011) Log Message: ----------- New feature: Archive project (in progress) Modified Paths: -------------- trunk/kdenlive/src/CMakeLists.txt trunk/kdenlive/src/kdenliveui.rc trunk/kdenlive/src/mainwindow.cpp trunk/kdenlive/src/mainwindow.h Added Paths: ----------- trunk/kdenlive/src/archivewidget.cpp trunk/kdenlive/src/archivewidget.h trunk/kdenlive/src/widgets/archivewidget_ui.ui Modified: trunk/kdenlive/src/CMakeLists.txt =================================================================== --- trunk/kdenlive/src/CMakeLists.txt 2011-04-30 07:00:17 UTC (rev 5568) +++ trunk/kdenlive/src/CMakeLists.txt 2011-05-03 19:49:17 UTC (rev 5569) @@ -134,6 +134,7 @@ widgets/smconfig_ui.ui widgets/bezierspline_ui.ui widgets/monitoreditwidget_ui.ui + widgets/archivewidget_ui.ui ) set(kdenlive_SRCS @@ -280,6 +281,7 @@ simplekeyframes/simpletimelinewidget.cpp simplekeyframes/simplekeyframewidget.cpp noteswidget.cpp + archivewidget.cpp ) add_definitions(${KDE4_DEFINITIONS}) Added: trunk/kdenlive/src/archivewidget.cpp =================================================================== --- trunk/kdenlive/src/archivewidget.cpp (rev 0) +++ trunk/kdenlive/src/archivewidget.cpp 2011-05-03 19:49:17 UTC (rev 5569) @@ -0,0 +1,151 @@ +/*************************************************************************** + * Copyright (C) 2011 by Jean-Baptiste Mardelle (jb...@kd...) * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + + +#include "archivewidget.h" +#include "titlewidget.h" + +#include <KLocale> +#include <KDiskFreeSpaceInfo> +#include <KUrlRequester> +#include <KFileDialog> + +#include <KDebug> +#include <QListWidget> +#include "projectsettings.h" + + +ArchiveWidget::ArchiveWidget(QList <DocClipBase*> list, QStringList lumas, QWidget * parent) : + QDialog(parent), + m_requestedSize(0), + m_copyJob(NULL) +{ + setupUi(this); + setWindowTitle(i18n("Archive Project")); + archive_url->setUrl(KUrl(QDir::homePath())); + connect(archive_url, SIGNAL(textChanged (const QString &)), this, SLOT(slotCheckSpace())); + + // process all files + QStringList allFonts; + foreach(const QString & file, lumas) { + kDebug()<<"LUMA: "<<file; + files_list->addItem(file); + m_requestedSize += QFileInfo(file).size(); + } + + for (int i = 0; i < list.count(); i++) { + DocClipBase *clip = list.at(i); + if (clip->clipType() == SLIDESHOW) { + QStringList subfiles = ProjectSettings::extractSlideshowUrls(clip->fileURL()); + foreach(const QString & file, subfiles) { + kDebug()<<"SLIDE: "<<file; + files_list->addItem(file); + m_requestedSize += QFileInfo(file).size(); + } + } else if (!clip->fileURL().isEmpty()) { + files_list->addItem(clip->fileURL().path()); + m_requestedSize += QFileInfo(clip->fileURL().path()).size(); + } + if (clip->clipType() == TEXT) { + QStringList imagefiles = TitleWidget::extractImageList(clip->getProperty("xmldata")); + QStringList fonts = TitleWidget::extractFontList(clip->getProperty("xmldata")); + foreach(const QString & file, imagefiles) { + kDebug()<<"TXT IMAGE: "<<file; + files_list->addItem(file); + m_requestedSize += QFileInfo(file).size(); + } + allFonts << fonts; + } else if (clip->clipType() == PLAYLIST) { + QStringList files = ProjectSettings::extractPlaylistUrls(clip->fileURL().path()); + foreach(const QString & file, files) { + kDebug()<<"PLAYLIST: "<<file; + files_list->addItem(file); + m_requestedSize += QFileInfo(file).size(); + } + } + } +#if QT_VERSION >= 0x040500 + allFonts.removeDuplicates(); +#endif + project_files->setText(i18n("%1 files to archive, requires %2", files_list->count(), KIO::convertSize(m_requestedSize))); + buttonBox->button(QDialogButtonBox::Apply)->setText(i18n("Archive")); + connect(buttonBox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), this, SLOT(slotStartArchiving())); + buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false); + + slotCheckSpace(); +} + +ArchiveWidget::~ArchiveWidget() +{ +} + +void ArchiveWidget::slotCheckSpace() +{ + KDiskFreeSpaceInfo inf = KDiskFreeSpaceInfo::freeSpaceInfo( archive_url->url().path()); + KIO::filesize_t freeSize = inf.available();; + if (freeSize > m_requestedSize) { + // everything is ok + buttonBox->button(QDialogButtonBox::Apply)->setEnabled(true); + icon_info->setPixmap(KIcon("dialog-ok").pixmap(16, 16)); + text_info->setText(i18n("Available space on drive: %1", KIO::convertSize(freeSize))); + } + else { + buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false); + icon_info->setPixmap(KIcon("dialog-close").pixmap(16, 16)); + text_info->setText(i18n("Not enough space on drive, free space: %1", KIO::convertSize(freeSize))); + } +} + +void ArchiveWidget::slotStartArchiving() +{ + if (m_copyJob) { + // archiving in progress, abort + m_copyJob->kill(KJob::EmitResult); + return; + } + KUrl::List files; + for (int i = 0; i < files_list->count(); i++) { + if (files_list->item(i)) + files << KUrl(files_list->item(i)->text()); + } + + progressBar->setValue(0); + buttonBox->button(QDialogButtonBox::Apply)->setText(i18n("Abort")); + m_copyJob = KIO::copy (files, archive_url->url(), KIO::HideProgressInfo); + connect(m_copyJob, SIGNAL(result(KJob *)), this, SLOT(slotArchivingFinished(KJob *))); + connect(m_copyJob, SIGNAL(processedSize(KJob *, qulonglong)), this, SLOT(slotArchivingProgress(KJob *, qulonglong))); +} + +void ArchiveWidget::slotArchivingFinished(KJob *job) +{ + progressBar->setValue(100); + buttonBox->button(QDialogButtonBox::Apply)->setText(i18n("Archive")); + if (job->error() == 0) text_info->setText(i18n("Project was successfully archived.")); + else { + icon_info->setPixmap(KIcon("dialog-close").pixmap(16, 16)); + text_info->setText(i18n("There was an error while copying the files: %1", job->errorString())); + } + m_copyJob = NULL; +} + +void ArchiveWidget::slotArchivingProgress(KJob *, qulonglong size) +{ + progressBar->setValue((int) 100 * size / m_requestedSize); +} + Added: trunk/kdenlive/src/archivewidget.h =================================================================== --- trunk/kdenlive/src/archivewidget.h (rev 0) +++ trunk/kdenlive/src/archivewidget.h 2011-05-03 19:49:17 UTC (rev 5569) @@ -0,0 +1,67 @@ +/*************************************************************************** + * Copyright (C) 2011 by Jean-Baptiste Mardelle (jb...@kd...) * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + + +#ifndef ARCHIVEWIDGET_H +#define ARCHIVEWIDGET_H + + +#include "ui_archivewidget_ui.h" +#include "docclipbase.h" + +#include <KDialog> +#include <kio/global.h> +#include <QLabel> +#include <QList> +#include <KIO/Job> +#include <KIO/CopyJob> + +class KJob; + +/** + * @class ArchiveWidget + * @brief A widget allowing to archive a project (copy all project files to a new location) + * @author Jean-Baptiste Mardelle + */ + +class ArchiveWidget : public QDialog, public Ui::ArchiveWidget_UI +{ + Q_OBJECT + +public: + ArchiveWidget(QList <DocClipBase*> list, QStringList lumas, QWidget * parent = 0); + ~ArchiveWidget(); + +private slots: + void slotCheckSpace(); + void slotStartArchiving(); + void slotArchivingFinished(KJob *job); + void slotArchivingProgress(KJob *, qulonglong); + +private: + KIO::filesize_t m_requestedSize; + KIO::CopyJob *m_copyJob; + +signals: + +}; + + +#endif + Modified: trunk/kdenlive/src/kdenliveui.rc =================================================================== --- trunk/kdenlive/src/kdenliveui.rc 2011-04-30 07:00:17 UTC (rev 5568) +++ trunk/kdenlive/src/kdenliveui.rc 2011-05-03 19:49:17 UTC (rev 5569) @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE kpartgui SYSTEM "kpartgui.dtd"> -<gui name="kdenlive" version="60"> +<gui name="kdenlive" version="61"> <ToolBar name="extraToolBar" > <text>Extra Toolbar</text> <Action name="project_render" /> @@ -10,6 +10,7 @@ <Menu name="file" > <Action name="dvd_wizard" /> <Action name="transcode_clip" /> + <Action name="archive_project" /> </Menu> <Menu name="edit" > Modified: trunk/kdenlive/src/mainwindow.cpp =================================================================== --- trunk/kdenlive/src/mainwindow.cpp 2011-04-30 07:00:17 UTC (rev 5568) +++ trunk/kdenlive/src/mainwindow.cpp 2011-05-03 19:49:17 UTC (rev 5569) @@ -61,6 +61,7 @@ #include "colorscopes/histogram.h" #include "audiospectrum.h" #include "spectrogram.h" +#include "archivewidget.h" #include <KApplication> #include <KAction> @@ -1206,6 +1207,11 @@ collection.addAction("transcode_clip", transcodeClip); connect(transcodeClip, SIGNAL(triggered(bool)), this, SLOT(slotTranscodeClip())); + KAction *archiveProject = new KAction(KIcon("file-save"), i18n("Archive Project"), this); + collection.addAction("archive_project", archiveProject); + connect(archiveProject, SIGNAL(triggered(bool)), this, SLOT(slotArchiveProject())); + + KAction *markIn = collection.addAction("mark_in"); markIn->setText(i18n("Set Zone In")); markIn->setShortcut(Qt::Key_I); @@ -4240,6 +4246,14 @@ m_notesWidget->insertHtml("<a href=\"" + QString::number(frames) + "\">" + position + "</a> "); } +void MainWindow::slotArchiveProject() +{ + QList <DocClipBase*> list = m_projectList->documentClipList(); + ArchiveWidget *d = new ArchiveWidget(list, m_activeTimeline->projectView()->extractTransitionsLumas(), this); + d->exec(); +} + + #include "mainwindow.moc" #ifdef DEBUG_MAINW Modified: trunk/kdenlive/src/mainwindow.h =================================================================== --- trunk/kdenlive/src/mainwindow.h 2011-04-30 07:00:17 UTC (rev 5568) +++ trunk/kdenlive/src/mainwindow.h 2011-05-03 19:49:17 UTC (rev 5569) @@ -474,6 +474,8 @@ void slotMaximizeCurrent(bool show); void slotTranscode(KUrl::List urls = KUrl::List()); void slotTranscodeClip(); + /** @brief Archive project: creates a copy of the project file with all clips in a new folder. */ + void slotArchiveProject(); void slotSetDocumentRenderProfile(QMap <QString, QString> props); void slotPrepareRendering(bool scriptExport, bool zoneOnly, const QString &chapterFile); Added: trunk/kdenlive/src/widgets/archivewidget_ui.ui =================================================================== --- trunk/kdenlive/src/widgets/archivewidget_ui.ui (rev 0) +++ trunk/kdenlive/src/widgets/archivewidget_ui.ui 2011-05-03 19:49:17 UTC (rev 5569) @@ -0,0 +1,130 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ArchiveWidget_UI</class> + <widget class="QDialog" name="ArchiveWidget_UI"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>320</width> + <height>220</height> + </rect> + </property> + <property name="windowTitle"> + <string>Dialog</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0" colspan="2"> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Archive folder</string> + </property> + </widget> + </item> + <item> + <widget class="KUrlRequester" name="archive_url"> + <property name="mode"> + <set>KFile::Directory</set> + </property> + </widget> + </item> + </layout> + </item> + <item row="1" column="0" colspan="2"> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="icon_info"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="text_info"> + <property name="text"> + <string/> + </property> + </widget> + </item> + </layout> + </item> + <item row="2" column="0" colspan="2"> + <widget class="QLabel" name="project_files"> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="3" column="0" colspan="2"> + <widget class="QListWidget" name="files_list"/> + </item> + <item row="4" column="0"> + <widget class="QProgressBar" name="progressBar"> + <property name="value"> + <number>0</number> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Apply|QDialogButtonBox::Close</set> + </property> + </widget> + </item> + </layout> + </widget> + <customwidgets> + <customwidget> + <class>KUrlRequester</class> + <extends>QFrame</extends> + <header>kurlrequester.h</header> + </customwidget> + </customwidgets> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>ArchiveWidget_UI</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>ArchiveWidget_UI</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <j-...@us...> - 2011-04-30 07:00:23
|
Revision: 5568 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5568&view=rev Author: j-b-m Date: 2011-04-30 07:00:17 +0000 (Sat, 30 Apr 2011) Log Message: ----------- Fix encoding problem in renderer: http://kdenlive.org/mantis/view.php?id=2110 Modified Paths: -------------- trunk/kdenlive/renderer/kdenlive_render.cpp trunk/kdenlive/src/renderwidget.cpp Modified: trunk/kdenlive/renderer/kdenlive_render.cpp =================================================================== --- trunk/kdenlive/renderer/kdenlive_render.cpp 2011-04-29 20:07:45 UTC (rev 5567) +++ trunk/kdenlive/renderer/kdenlive_render.cpp 2011-04-30 07:00:17 UTC (rev 5568) @@ -59,7 +59,8 @@ QString rendermodule = args.takeFirst(); QString player = args.takeFirst(); QString src = args.takeFirst(); - QString dest = QUrl(args.takeFirst()).path(); + QUrl desturl = QUrl::fromEncoded(args.takeFirst().toUtf8()); + QString dest = desturl.path(); bool dualpass = false; bool doerase; if (args.contains("pass=2")) { Modified: trunk/kdenlive/src/renderwidget.cpp =================================================================== --- trunk/kdenlive/src/renderwidget.cpp 2011-04-29 20:07:45 UTC (rev 5567) +++ trunk/kdenlive/src/renderwidget.cpp 2011-04-30 07:00:17 UTC (rev 5568) @@ -800,16 +800,11 @@ render_process_args << "consumer:" + (scriptExport ? "$SOURCE" : playlistPath); else render_process_args << (scriptExport ? "$SOURCE" : playlistPath); - render_process_args << (scriptExport ? "$TARGET" : dest); + render_process_args << (scriptExport ? "$TARGET" : KUrl(dest).url()); render_process_args << paramsList; QString group = m_view.size_list->currentItem()->data(MetaGroupRole).toString(); - QStringList renderParameters; - renderParameters << dest << item->data(RenderRole).toString() << renderArgs.simplified(); - renderParameters << QString::number(zoneIn) << QString::number(zoneOut) << QString::number(m_view.play_after->isChecked()); - renderParameters << QString::number(guideStart) << QString::number(guideEnd) << QString::number(resizeProfile); - QString scriptName; if (scriptExport) { // Generate script file @@ -838,7 +833,6 @@ m_view.tabWidget->setCurrentIndex(2); return; } - renderParameters << scriptName; // Save rendering profile to document QMap <QString, QString> renderProps; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tt...@us...> - 2011-04-29 20:07:51
|
Revision: 5567 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5567&view=rev Author: ttill Date: 2011-04-29 20:07:45 +0000 (Fri, 29 Apr 2011) Log Message: ----------- We are at 0.8.1 rather then 0.81 Modified Paths: -------------- trunk/kdenlive/CMakeLists.txt Modified: trunk/kdenlive/CMakeLists.txt =================================================================== --- trunk/kdenlive/CMakeLists.txt 2011-04-29 20:03:03 UTC (rev 5566) +++ trunk/kdenlive/CMakeLists.txt 2011-04-29 20:07:45 UTC (rev 5567) @@ -1,6 +1,6 @@ project(kdenlive) -set(BASE_VERSION 0.81) +set(BASE_VERSION 0.8.1) set(LIBMLT_REQUIRED_VERSION 0.7) option(RELEASE_BUILD "Remove compilation date from program version (use for stable releases)" OFF) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tt...@us...> - 2011-04-29 20:03:11
|
Revision: 5566 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5566&view=rev Author: ttill Date: 2011-04-29 20:03:03 +0000 (Fri, 29 Apr 2011) Log Message: ----------- Fix user specified CFLAGS ignored. Patch by RedDwarf: http://www.kdenlive.org/mantis/view.php?id=2108 Modified Paths: -------------- trunk/kdenlive/CMakeLists.txt Modified: trunk/kdenlive/CMakeLists.txt =================================================================== --- trunk/kdenlive/CMakeLists.txt 2011-04-28 20:08:55 UTC (rev 5565) +++ trunk/kdenlive/CMakeLists.txt 2011-04-29 20:03:03 UTC (rev 5566) @@ -8,7 +8,7 @@ # Search packages used by KDE. find_package(KDE4 REQUIRED) -set(CMAKE_C_FLAGS " --std=c99") # To compile kiss_fft +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --std=c99") # To compile kiss_fft include(KDE4Defaults) include(MacroLibrary) include(FindGettext) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <j-...@us...> - 2011-04-28 20:09:01
|
Revision: 5565 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5565&view=rev Author: j-b-m Date: 2011-04-28 20:08:55 +0000 (Thu, 28 Apr 2011) Log Message: ----------- Display error message if proxy duration is incorrect Modified Paths: -------------- trunk/kdenlive/src/projectlist.cpp Modified: trunk/kdenlive/src/projectlist.cpp =================================================================== --- trunk/kdenlive/src/projectlist.cpp 2011-04-28 20:05:13 UTC (rev 5564) +++ trunk/kdenlive/src/projectlist.cpp 2011-04-28 20:08:55 UTC (rev 5565) @@ -1299,8 +1299,10 @@ { ProjectItem *item = getItemById(id); if (item) { - //TODO: use durationError to display correct message to user after 0.8 release - if (durationError) kDebug() << "Proxy duration is wrong, try changing transcoding parameters."; + if (durationError) { + kDebug() << "Proxy duration is wrong, try changing transcoding parameters."; + emit displayMessage(i18n("Proxy clip unusable (duration is different from original)."), -2); + } item->setProxyStatus(PROXYCRASHED); QString path = item->referencedClip()->getProperty("proxy"); KUrl proxyFolder(m_doc->projectFolder().path( KUrl::AddTrailingSlash) + "proxy/"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <j-...@us...> - 2011-04-28 20:05:19
|
Revision: 5564 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5564&view=rev Author: j-b-m Date: 2011-04-28 20:05:13 +0000 (Thu, 28 Apr 2011) Log Message: ----------- Notes widget: context menu now allows to insert clickable timecode to make easy reference to some place in the project Modified Paths: -------------- trunk/kdenlive/src/CMakeLists.txt trunk/kdenlive/src/kdenlivedoc.cpp trunk/kdenlive/src/mainwindow.cpp trunk/kdenlive/src/mainwindow.h trunk/kdenlive/src/renderer.h Added Paths: ----------- trunk/kdenlive/src/noteswidget.cpp trunk/kdenlive/src/noteswidget.h Modified: trunk/kdenlive/src/CMakeLists.txt =================================================================== --- trunk/kdenlive/src/CMakeLists.txt 2011-04-28 19:41:22 UTC (rev 5563) +++ trunk/kdenlive/src/CMakeLists.txt 2011-04-28 20:05:13 UTC (rev 5564) @@ -279,6 +279,7 @@ monitoreditwidget.cpp simplekeyframes/simpletimelinewidget.cpp simplekeyframes/simplekeyframewidget.cpp + noteswidget.cpp ) add_definitions(${KDE4_DEFINITIONS}) Modified: trunk/kdenlive/src/kdenlivedoc.cpp =================================================================== --- trunk/kdenlive/src/kdenlivedoc.cpp 2011-04-28 19:41:22 UTC (rev 5563) +++ trunk/kdenlive/src/kdenlivedoc.cpp 2011-04-28 20:05:13 UTC (rev 5564) @@ -589,7 +589,7 @@ addedXml.appendChild(docproperties); QDomElement docnotes = sceneList.createElement("documentnotes"); - QDomText value = sceneList.createTextNode(m_notesWidget->toPlainText()); + QDomText value = sceneList.createTextNode(m_notesWidget->toHtml()); docnotes.appendChild(value); addedXml.appendChild(docnotes); Modified: trunk/kdenlive/src/mainwindow.cpp =================================================================== --- trunk/kdenlive/src/mainwindow.cpp 2011-04-28 19:41:22 UTC (rev 5563) +++ trunk/kdenlive/src/mainwindow.cpp 2011-04-28 20:05:13 UTC (rev 5564) @@ -215,7 +215,10 @@ m_notesDock = new QDockWidget(i18n("Project Notes"), this); m_notesDock->setObjectName("notes_widget"); - m_notesWidget = new KTextEdit(); + m_notesWidget = new NotesWidget(); + connect(m_notesWidget, SIGNAL(insertNotesTimecode()), this, SLOT(slotInsertNotesTimecode())); + connect(m_notesWidget, SIGNAL(seekProject(int)), m_projectMonitor->render, SLOT(seekToFrame(int))); + m_notesWidget->setTabChangesFocus(true); #if KDE_IS_VERSION(4,4,0) m_notesWidget->setClickMessage(i18n("Enter your project notes here ...")); @@ -4230,6 +4233,13 @@ m_projectList->updateProxyConfig(); } +void MainWindow::slotInsertNotesTimecode() +{ + int frames = m_projectMonitor->render->seekPosition().frames(m_activeDocument->fps()); + QString position = m_activeDocument->timecode().getTimecodeFromFrames(frames); + m_notesWidget->insertHtml("<a href=\"" + QString::number(frames) + "\">" + position + "</a> "); +} + #include "mainwindow.moc" #ifdef DEBUG_MAINW Modified: trunk/kdenlive/src/mainwindow.h =================================================================== --- trunk/kdenlive/src/mainwindow.h 2011-04-28 19:41:22 UTC (rev 5563) +++ trunk/kdenlive/src/mainwindow.h 2011-04-28 20:05:13 UTC (rev 5564) @@ -45,6 +45,7 @@ #include "statusbarmessagelabel.h" #include "dvdwizard.h" #include "stopmotion/stopmotion.h" +#include "noteswidget.h" class KdenliveDoc; class TrackView; @@ -149,7 +150,7 @@ //KListWidget *m_effectList; QDockWidget *m_notesDock; - KTextEdit *m_notesWidget; + NotesWidget *m_notesWidget; QDockWidget *m_effectStackDock; EffectStackView *m_effectStack; @@ -532,7 +533,8 @@ void slotDoAction(const QString& action_name); /** @brief Update project because the use of proxy clips was enabled / disabled. */ void slotUpdateProxySettings(); - + /** @brief Insert current project's timecode into the notes widget. */ + void slotInsertNotesTimecode(); signals: Q_SCRIPTABLE void abortRenderJob(const QString &url); }; Added: trunk/kdenlive/src/noteswidget.cpp =================================================================== --- trunk/kdenlive/src/noteswidget.cpp (rev 0) +++ trunk/kdenlive/src/noteswidget.cpp 2011-04-28 20:05:13 UTC (rev 5564) @@ -0,0 +1,67 @@ +/*************************************************************************** + * Copyright (C) 2008 by Jean-Baptiste Mardelle (jb...@kd...) * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + + +#include "noteswidget.h" + +#include <KLocale> +#include <KDebug> +#include <QMenu> +#include <QMouseEvent> + + +NotesWidget::NotesWidget(QWidget * parent) : + KTextEdit(parent) +{ + connect(this, SIGNAL(aboutToShowContextMenu(QMenu *)), this, SLOT(slotFillNotesMenu(QMenu *))); + setMouseTracking(true); +} + +void NotesWidget::slotFillNotesMenu(QMenu *menu) +{ + QAction *a = new QAction(i18n("Insert current timecode"), this); + connect(a, SIGNAL(triggered(bool)), this, SIGNAL(insertNotesTimecode())); + menu->insertAction(menu->actions().at(0), a); +} + +void NotesWidget::mouseMoveEvent( QMouseEvent * e ) +{ + QString anchor = anchorAt(e->pos()); + if (anchor.isEmpty()) viewport()->setCursor(Qt::IBeamCursor); + else viewport()->setCursor(Qt::PointingHandCursor); +} + +void NotesWidget::mousePressEvent( QMouseEvent * e ) +{ + QString anchor = anchorAt(e->pos()); + if (anchor.isEmpty()) { + KTextEdit::mousePressEvent(e); + return; + } + kDebug()<<"+++++++++\nCLICKED NACHOR: "<<anchor; + emit seekProject(anchor.toInt()); + e->setAccepted(true); +} + +NotesWidget::~NotesWidget() +{ +} + + + Added: trunk/kdenlive/src/noteswidget.h =================================================================== --- trunk/kdenlive/src/noteswidget.h (rev 0) +++ trunk/kdenlive/src/noteswidget.h 2011-04-28 20:05:13 UTC (rev 5564) @@ -0,0 +1,56 @@ +/*************************************************************************** + * Copyright (C) 2011 by Jean-Baptiste Mardelle (jb...@kd...) * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + + +#ifndef NOTESWIDGET_H +#define NOTESWIDGET_H + +#include <KTextEdit> + +/** + * @class NotesWidget + * @brief A small text editor to create project notes. + * @author Jean-Baptiste Mardelle + */ + +class NotesWidget : public KTextEdit +{ + Q_OBJECT + +public: + NotesWidget(QWidget * parent = 0); + ~NotesWidget(); + +protected: + virtual void mouseMoveEvent ( QMouseEvent * e ); + virtual void mousePressEvent ( QMouseEvent * e ); + +private slots: + void slotFillNotesMenu(QMenu *menu); + +private: + +signals: + void insertNotesTimecode(); + void seekProject(int); +}; + + +#endif + Modified: trunk/kdenlive/src/renderer.h =================================================================== --- trunk/kdenlive/src/renderer.h 2011-04-28 19:41:22 UTC (rev 5563) +++ trunk/kdenlive/src/renderer.h 2011-04-28 20:05:13 UTC (rev 5564) @@ -92,7 +92,6 @@ /** @brief Seeks the renderer clip to the given time. */ void seek(GenTime time); void seek(int time); - void seekToFrame(int pos); void seekToFrameDiff(int diff); int m_isBlocked; @@ -394,6 +393,7 @@ void slotSplitView(bool doit); void slotSwitchFullscreen(); void slotSetVolume(int volume); + void seekToFrame(int pos); }; #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <j-...@us...> - 2011-04-28 19:41:28
|
Revision: 5563 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5563&view=rev Author: j-b-m Date: 2011-04-28 19:41:22 +0000 (Thu, 28 Apr 2011) Log Message: ----------- Back to development mode... Modified Paths: -------------- trunk/kdenlive/CMakeLists.txt Modified: trunk/kdenlive/CMakeLists.txt =================================================================== --- trunk/kdenlive/CMakeLists.txt 2011-04-28 19:38:20 UTC (rev 5562) +++ trunk/kdenlive/CMakeLists.txt 2011-04-28 19:41:22 UTC (rev 5563) @@ -1,9 +1,9 @@ project(kdenlive) -set(BASE_VERSION 0.8) +set(BASE_VERSION 0.81) set(LIBMLT_REQUIRED_VERSION 0.7) -option(RELEASE_BUILD "Remove compilation date from program version (use for stable releases)" ON) +option(RELEASE_BUILD "Remove compilation date from program version (use for stable releases)" OFF) set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules) # Search packages used by KDE. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <j-...@us...> - 2011-04-28 19:38:26
|
Revision: 5562 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5562&view=rev Author: j-b-m Date: 2011-04-28 19:38:20 +0000 (Thu, 28 Apr 2011) Log Message: ----------- 0.8 branch Added Paths: ----------- branches/release-0_8_0/kdenlive/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <j-...@us...> - 2011-04-28 19:11:14
|
Revision: 5561 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5561&view=rev Author: j-b-m Date: 2011-04-28 19:11:08 +0000 (Thu, 28 Apr 2011) Log Message: ----------- Fix my mess Added Paths: ----------- branches/release-0_8_0/ Removed Paths: ------------- branches/release-0_5_0/release-0_8_0/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <j-...@us...> - 2011-04-28 19:08:07
|
Revision: 5560 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5560&view=rev Author: j-b-m Date: 2011-04-28 19:08:01 +0000 (Thu, 28 Apr 2011) Log Message: ----------- Create 0.8 branch Added Paths: ----------- branches/release-0_5_0/release-0_8_0/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <j-...@us...> - 2011-04-26 19:43:48
|
Revision: 5559 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5559&view=rev Author: j-b-m Date: 2011-04-26 19:43:42 +0000 (Tue, 26 Apr 2011) Log Message: ----------- Get ready for 0.8 release Modified Paths: -------------- trunk/kdenlive/CMakeLists.txt Modified: trunk/kdenlive/CMakeLists.txt =================================================================== --- trunk/kdenlive/CMakeLists.txt 2011-04-26 19:41:58 UTC (rev 5558) +++ trunk/kdenlive/CMakeLists.txt 2011-04-26 19:43:42 UTC (rev 5559) @@ -3,7 +3,7 @@ set(BASE_VERSION 0.8) set(LIBMLT_REQUIRED_VERSION 0.7) -option(RELEASE_BUILD "Remove compilation date from program version (use for stable releases)" OFF) +option(RELEASE_BUILD "Remove compilation date from program version (use for stable releases)" ON) set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules) # Search packages used by KDE. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <j-...@us...> - 2011-04-26 19:42:04
|
Revision: 5558 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5558&view=rev Author: j-b-m Date: 2011-04-26 19:41:58 +0000 (Tue, 26 Apr 2011) Log Message: ----------- Fix warning compilation and writing frame with decklink card, patch from user fleury: http://www.kdenlive.org/mantis/view.php?id=2077 Modified Paths: -------------- trunk/kdenlive/src/blackmagic/capture.cpp trunk/kdenlive/src/blackmagic/devices.cpp Modified: trunk/kdenlive/src/blackmagic/capture.cpp =================================================================== --- trunk/kdenlive/src/blackmagic/capture.cpp 2011-04-26 18:10:34 UTC (rev 5557) +++ trunk/kdenlive/src/blackmagic/capture.cpp 2011-04-26 19:41:58 UTC (rev 5558) @@ -315,6 +315,18 @@ return (ULONG)m_refCount; } + +inline bool safe_write(int fd, const void* bytes, size_t length) { + int rc = 0; + size_t written = 0; + const char* buf = static_cast<const char*>(bytes); + while (rc != -1 && written < length) { + rc = write(fd, &(buf[written]), length - written); + written += (rc >= 0 ? rc : 0); + } + return rc != -1; +} + void DeckLinkCaptureDelegate::slotProcessFrame() { if (m_framesList.isEmpty()) return; @@ -325,7 +337,7 @@ if (capturePath.endsWith("raw")) { // Save as raw uyvy422 imgage videoOutputFile = open(capturePath.toUtf8().constData(), O_WRONLY | O_CREAT/*|O_TRUNC*/, 0664); - write(videoOutputFile, frameBytes, videoFrame->GetRowBytes() * videoFrame->GetHeight()); + safe_write(videoOutputFile, frameBytes, videoFrame->GetRowBytes() * videoFrame->GetHeight()); close(videoOutputFile); emit frameSaved(capturePath); } else { @@ -398,17 +410,17 @@ if (videoOutputFile != -1) { if (!m_analyseFrame) videoFrame->GetBytes(&frameBytes); - write(videoOutputFile, frameBytes, videoFrame->GetRowBytes() * videoFrame->GetHeight()); + safe_write(videoOutputFile, frameBytes, videoFrame->GetRowBytes() * videoFrame->GetHeight()); if (rightEyeFrame) { rightEyeFrame->GetBytes(&frameBytes); - write(videoOutputFile, frameBytes, videoFrame->GetRowBytes() * videoFrame->GetHeight()); + safe_write(videoOutputFile, frameBytes, videoFrame->GetRowBytes() * videoFrame->GetHeight()); } } } frameCount++; - if (g_maxFrames > 0 && frameCount >= g_maxFrames) { + if (g_maxFrames > 0 && frameCount >= (uint) g_maxFrames) { pthread_cond_signal(&sleepCond); } } @@ -417,7 +429,7 @@ if (audioFrame) { if (audioOutputFile != -1) { audioFrame->GetBytes(&audioFrameBytes); - write(audioOutputFile, audioFrameBytes, audioFrame->GetSampleFrameCount() * g_audioChannels *(g_audioSampleDepth / 8)); + safe_write(audioOutputFile, audioFrameBytes, audioFrame->GetSampleFrameCount() * g_audioChannels *(g_audioSampleDepth / 8)); } } return S_OK; Modified: trunk/kdenlive/src/blackmagic/devices.cpp =================================================================== --- trunk/kdenlive/src/blackmagic/devices.cpp 2011-04-26 18:10:34 UTC (rev 5557) +++ trunk/kdenlive/src/blackmagic/devices.cpp 2011-04-26 19:41:58 UTC (rev 5558) @@ -173,7 +173,7 @@ IDeckLinkOutput* deckLinkOutput = NULL; IDeckLinkDisplayModeIterator* displayModeIterator = NULL; - IDeckLinkDisplayMode* displayMode = NULL; + //IDeckLinkDisplayMode* displayMode = NULL; HRESULT result; // Query the DeckLink for its configuration interface This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |