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();
}