+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", "application/x-gzip");
+ archive.open( QIODevice::WriteOnly );
+
+ // 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
+ bool result = false;
+ if (m_temp) {
+ archive.addLocalFile(m_temp->fileName(), m_name + ".kdenlive");
+ result = archive.close();
+ delete m_temp;
+ m_temp = 0;
+ }
+ emit archivingFinished(result);
+}
+
+void ArchiveWidget::slotArchivingFinished(bool result)
+{
+ if (result) {
+ slotJobResult(true, i18n("Project was successfully archived."));
+ buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false);
+ }
+ else {
+ slotJobResult(false, i18n("There was an error processing project file"));
+ }
+ progressBar->setValue(100);
+ buttonBox->button(QDialogButtonBox::Apply)->setText(i18n("Archive"));
+ archive_url->setEnabled(true);
+ proxy_only->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);
+ }
+}
+
+void ArchiveWidget::slotArchivingProgress(int p)
+{
+ progressBar->setValue(p);
+}
+
+void ArchiveWidget::slotStartExtracting()
+{
+ if (m_archiveThread.isRunning()) {
+ //TODO: abort extracting
+ return;
+ }
+ QFileInfo f(m_extractUrl.path());
+ m_requestedSize = f.size();
+ KIO::NetAccess::mkdir(archive_url->url().path(KUrl::RemoveTrailingSlash), this);
+ slotDisplayMessage("system-run", i18n("Extracting..."));
+ buttonBox->button(QDialogButtonBox::Apply)->setText(i18n("Abort"));
+ 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()
+{
+ m_extractArchive->directory()->copyTo(archive_url->url().path(KUrl::AddTrailingSlash));
+ m_extractArchive->close();
+ emit extractingFinished();
+}
+
+QString ArchiveWidget::extractedProjectFile() const
+{
+ return archive_url->url().path(KUrl::AddTrailingSlash) + m_projectName;
+}
+
+void ArchiveWidget::slotExtractingFinished()
+{
+ m_progressTimer->stop();
+ // Process project file
+ QFile file(extractedProjectFile());
+ bool error = false;
+ if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ error = true;
+ }
+ else {
+ QString playList = QString::fromUtf8(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();
+}
+
+void ArchiveWidget::slotProxyOnly(int onlyProxy)
+{
+ m_requestedSize = 0;
+ if (onlyProxy == Qt::Checked) {
+ // Archive proxy clips
+ QStringList proxyIdList;
+ QTreeWidgetItem *parentItem = NULL;
+
+ // Build list of existing proxy ids
+ for (int i = 0; i < files_list->topLevelItemCount(); ++i) {
+ parentItem = files_list->topLevelItem(i);
+ if (parentItem->data(0, Qt::UserRole).toString() == "proxy") break;
+ }
+ if (!parentItem) return;
+ int items = parentItem->childCount();
+ for (int j = 0; j < items; j++) {
+ proxyIdList << parentItem->child(j)->data(0, Qt::UserRole + 2).toString();
+ }
+
+ // Parse all items to disable original clips for existing proxies
+ for (int i = 0; i < proxyIdList.count(); ++i) {
+ QString id = proxyIdList.at(i);
+ if (id.isEmpty()) continue;
+ for (int j = 0; j < files_list->topLevelItemCount(); j++) {
+ parentItem = files_list->topLevelItem(j);
+ if (parentItem->data(0, Qt::UserRole).toString() == "proxy") continue;
+ items = parentItem->childCount();
+ for (int k = 0; k < items; k++) {
+ if (parentItem->child(k)->data(0, Qt::UserRole + 2).toString() == id) {
+ // This item has a proxy, do not archive it
+ parentItem->child(k)->setFlags(Qt::ItemIsSelectable);
+ break;
+ }
+ }
+ }
+ }
+ }
+ else {
+ // Archive all clips
+ for (int i = 0; i < files_list->topLevelItemCount(); ++i) {
+ QTreeWidgetItem *parentItem = files_list->topLevelItem(i);
+ int items = parentItem->childCount();
+ for (int j = 0; j < items; j++) {
+ parentItem->child(j)->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+ }
+ }
+ }
+
+ // Calculate requested size
+ int total = 0;
+ for (int i = 0; i < files_list->topLevelItemCount(); ++i) {
+ QTreeWidgetItem *parentItem = files_list->topLevelItem(i);
+ int items = parentItem->childCount();
+ int itemsCount = 0;
+ bool isSlideshow = parentItem->data(0, Qt::UserRole).toString() == "slideshows";
+
+ for (int j = 0; j < items; j++) {
+ if (!parentItem->child(j)->isDisabled()) {
+ m_requestedSize += parentItem->child(j)->data(0, Qt::UserRole + 3).toInt();
+ if (isSlideshow) total += parentItem->child(j)->data(0, Qt::UserRole + 1).toStringList().count();
+ else total ++;
+ itemsCount ++;
+ }
+ }
+ parentItem->setText(0, parentItem->text(0).section('(', 0, 0) + i18np("(%1 item)", "(%1 items)", itemsCount));
+ }
+ project_files->setText(i18np("%1 file to archive, requires %2", "%1 files to archive, requires %2", total, KIO::convertSize(m_requestedSize)));
+ slotCheckSpace();
+}
+
+
+#include "archivewidget.moc"