diff --git a/kerfuffle/archive_kerfuffle.h b/kerfuffle/archive_kerfuffle.h --- a/kerfuffle/archive_kerfuffle.h +++ b/kerfuffle/archive_kerfuffle.h @@ -153,6 +153,7 @@ Q_PROPERTY(bool isSingleFolderArchive READ isSingleFolderArchive) Q_PROPERTY(EncryptionType encryptionType READ encryptionType) Q_PROPERTY(qulonglong numberOfFiles READ numberOfFiles) + Q_PROPERTY(qulonglong numberOfFolders READ numberOfFolders) Q_PROPERTY(qulonglong unpackedSize READ unpackedSize) Q_PROPERTY(qulonglong packedSize READ packedSize) Q_PROPERTY(QString subfolderName READ subfolderName) @@ -175,6 +176,7 @@ bool hasComment() const; EncryptionType encryptionType(); qulonglong numberOfFiles(); + qulonglong numberOfFolders(); qulonglong unpackedSize(); qulonglong packedSize() const; QString subfolderName(); @@ -253,6 +255,7 @@ ArchiveError m_error; EncryptionType m_encryptionType; qulonglong m_numberOfFiles; + qulonglong m_numberOfFolders; QMimeType m_mimeType; }; diff --git a/kerfuffle/archive_kerfuffle.cpp b/kerfuffle/archive_kerfuffle.cpp --- a/kerfuffle/archive_kerfuffle.cpp +++ b/kerfuffle/archive_kerfuffle.cpp @@ -130,6 +130,7 @@ , m_error(NoError) , m_encryptionType(Unencrypted) , m_numberOfFiles(0) + , m_numberOfFolders(0) { qCDebug(ARK) << "Created archive instance"; @@ -246,6 +247,16 @@ return m_numberOfFiles; } +qulonglong Archive::numberOfFolders() +{ + if (!isValid()) { + return 0; + } + + listIfNotListed(); + return m_numberOfFolders; +} + qulonglong Archive::unpackedSize() { if (!isValid()) { @@ -273,9 +284,7 @@ void Archive::onNewEntry(const ArchiveEntry &entry) { - if (!entry[IsDirectory].toBool()) { - m_numberOfFiles++; - } + entry[IsDirectory].toBool() ? m_numberOfFolders++ : m_numberOfFiles++; } bool Archive::isValid() const diff --git a/kerfuffle/propertiesdialog.h b/kerfuffle/propertiesdialog.h --- a/kerfuffle/propertiesdialog.h +++ b/kerfuffle/propertiesdialog.h @@ -42,7 +42,7 @@ Q_OBJECT public: - explicit PropertiesDialog(QWidget *parent, Archive *archive); + explicit PropertiesDialog(QWidget *parent, Archive *archive, qulonglong numberOfFiles, qulonglong numberOfFolders, qulonglong size); private: QString calcHash(QCryptographicHash::Algorithm algorithm, const QString &path); diff --git a/kerfuffle/propertiesdialog.cpp b/kerfuffle/propertiesdialog.cpp --- a/kerfuffle/propertiesdialog.cpp +++ b/kerfuffle/propertiesdialog.cpp @@ -49,7 +49,7 @@ } }; -PropertiesDialog::PropertiesDialog(QWidget *parent, Archive *archive) +PropertiesDialog::PropertiesDialog(QWidget *parent, Archive *archive, qulonglong numberOfFiles, qulonglong numberOfFolders, qulonglong size) : QDialog(parent, Qt::Dialog) { qCDebug(ARK) << "PropertiesDialog loaded"; @@ -65,8 +65,10 @@ m_ui->lblMimetype->setText(archive->mimeType().name()); m_ui->lblReadOnly->setText(archive->isReadOnly() ? i18n("yes") : i18n("no")); m_ui->lblHasComment->setText(archive->hasComment() ? i18n("yes") : i18n("no")); - m_ui->lblNumberOfFiles->setText(QString::number(archive->numberOfFiles())); - m_ui->lblUnpackedSize->setText(KIO::convertSize(archive->unpackedSize())); + m_ui->lblNumberOfEntries->setText(i18n("%1 files, %2 folders", + QString::number(numberOfFiles), + QString::number(numberOfFolders))); + m_ui->lblUnpackedSize->setText(KIO::convertSize(size)); m_ui->lblPackedSize->setText(KIO::convertSize(archive->packedSize())); m_ui->lblCompressionRatio->setText(QString::number(float(archive->unpackedSize()) / float(archive->packedSize()), 'f', 1)); m_ui->lblLastModified->setText(fi.lastModified().toString(QStringLiteral("yyyy-MM-dd HH:mm"))); diff --git a/kerfuffle/propertiesdialog.ui b/kerfuffle/propertiesdialog.ui --- a/kerfuffle/propertiesdialog.ui +++ b/kerfuffle/propertiesdialog.ui @@ -38,6 +38,13 @@ + + + + + + + @@ -111,12 +118,12 @@ - Number of files: + Number of entries: - + @@ -232,13 +239,6 @@ - - - - - - - diff --git a/part/archivemodel.h b/part/archivemodel.h --- a/part/archivemodel.h +++ b/part/archivemodel.h @@ -85,6 +85,11 @@ */ void encryptArchive(const QString &password, bool encryptHeader); + void countEntriesAndSize(); + qulonglong numberOfFiles() const; + qulonglong numberOfFolders() const; + qulonglong uncompressedSize() const; + signals: void loadingStarted(); void loadingFinished(KJob *); @@ -124,12 +129,18 @@ void insertNode(ArchiveNode *node, InsertBehaviour behaviour = NotifyViews); void newEntry(const Kerfuffle::ArchiveEntry& entry, InsertBehaviour behaviour); + void traverseAndCountDirNode(ArchiveDirNode *dir); + QList m_newArchiveEntries; // holds entries from opening a new archive until it's totally open QList m_showColumns; QScopedPointer m_archive; ArchiveDirNode *m_rootNode; QString m_dbusPathName; + + qulonglong m_numberOfFiles; + qulonglong m_numberOfFolders; + qulonglong m_uncompressedSize; }; #endif // ARCHIVEMODEL_H diff --git a/part/archivemodel.cpp b/part/archivemodel.cpp --- a/part/archivemodel.cpp +++ b/part/archivemodel.cpp @@ -32,6 +32,7 @@ #include #include +#include #include #include #include @@ -283,6 +284,8 @@ : QAbstractItemModel(parent) , m_rootNode(new ArchiveDirNode(0, ArchiveEntry())) , m_dbusPathName(dbusPathName) + , m_numberOfFiles(0) + , m_numberOfFolders(0) { } @@ -1012,4 +1015,51 @@ } } +void ArchiveModel::countEntriesAndSize() { + m_numberOfFiles = 0; + m_numberOfFolders = 0; + m_uncompressedSize = 0; + QElapsedTimer timer; + timer.start(); + + foreach(ArchiveNode *node, m_rootNode->entries()) { + if (node->isDir()) { + traverseAndCountDirNode(dynamic_cast(node)); + m_numberOfFolders++; + } else { + m_numberOfFiles++; + m_uncompressedSize += node->entry()[Size].toULongLong(); + } + } + + qCDebug(ARK) << "Time to count entries and size:" << timer.elapsed() << "ms"; +} + +void ArchiveModel::traverseAndCountDirNode(ArchiveDirNode *dir) +{ + foreach(ArchiveNode *node, dir->entries()) { + if (node->isDir()) { + traverseAndCountDirNode(dynamic_cast(node)); + m_numberOfFolders++; + } else { + m_numberOfFiles++; + m_uncompressedSize += node->entry()[Size].toULongLong(); + } + } +} + +qulonglong ArchiveModel::numberOfFiles() const +{ + return m_numberOfFiles; +} + +qulonglong ArchiveModel::numberOfFolders() const +{ + return m_numberOfFolders; +} + +qulonglong ArchiveModel::uncompressedSize() const +{ + return m_uncompressedSize; +} diff --git a/part/part.cpp b/part/part.cpp --- a/part/part.cpp +++ b/part/part.cpp @@ -1307,8 +1307,12 @@ void Part::slotShowProperties() { + m_model->countEntriesAndSize(); QPointer dialog(new Kerfuffle::PropertiesDialog(0, - m_model->archive())); + m_model->archive(), + m_model->numberOfFiles(), + m_model->numberOfFolders(), + m_model->uncompressedSize())); dialog.data()->show(); }