From: Jean-Baptiste Mardelle Date: Tue, 10 May 2011 09:20:29 +0000 (+0000) Subject: Show progress while extracting archived project X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=86e749b3719d01c440202540c3d3bb19a2b9bfee;p=kdenlive Show progress while extracting archived project svn path=/trunk/kdenlive/; revision=5582 --- diff --git a/src/archivewidget.cpp b/src/archivewidget.cpp index bd94a757..1641e6d3 100644 --- a/src/archivewidget.cpp +++ b/src/archivewidget.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -44,7 +45,8 @@ ArchiveWidget::ArchiveWidget(QString projectName, QDomDocument doc, QList 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 @@ ArchiveWidget::ArchiveWidget(const KUrl &url, QWidget * parent): 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(const KUrl &url, QWidget * parent): ArchiveWidget::~ArchiveWidget() { + if (m_extractArchive) delete m_extractArchive; } void ArchiveWidget::done ( int r ) @@ -681,19 +684,39 @@ void ArchiveWidget::slotStartExtracting() //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 (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 @@ QString ArchiveWidget::extractedProjectFile() void ArchiveWidget::slotExtractingFinished() { + m_progressTimer->stop(); + delete m_progressTimer; // Process project file QFile file(extractedProjectFile()); bool error = false; diff --git a/src/archivewidget.h b/src/archivewidget.h index 1fab3e46..5903937e 100644 --- a/src/archivewidget.h +++ b/src/archivewidget.h @@ -29,11 +29,11 @@ #include #include #include -#include #include #include class KJob; +class KTar; /** * @class ArchiveWidget @@ -66,6 +66,8 @@ private slots: void slotStartExtracting(); void doExtracting(); void slotExtractingFinished(); + void slotExtractProgress(); + void slotGotProgress(KJob*); protected: virtual void closeEvent ( QCloseEvent * e ); @@ -85,6 +87,8 @@ private: 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 @@ signals: void archivingFinished(bool); void archiveProgress(int); void extractingFinished(); - };