diff --git a/src/filemetadataprovider.h b/src/filemetadataprovider.h --- a/src/filemetadataprovider.h +++ b/src/filemetadataprovider.h @@ -143,10 +143,10 @@ void totalPropertyAndInsert(const QString& prop, const QList& resources, QSet& allProperties); - /* - * @return The number of subdirectories for the directory \a path. + /** + * @return The number of files and hidden files for the directory path. */ - static int subDirectoriesCount(const QString &path); + static QPair subDirectoriesCount(const QString &path); bool m_readOnly; diff --git a/src/filemetadataprovider.cpp b/src/filemetadataprovider.cpp --- a/src/filemetadataprovider.cpp +++ b/src/filemetadataprovider.cpp @@ -166,11 +166,19 @@ if (item.isDir()) { bool isSizeUnknown = !item.isLocalFile(); if (!isSizeUnknown) { - const int count = subDirectoriesCount(item.url().path()); + const QPair counts = subDirectoriesCount(item.url().path()); + const int count = counts.first; isSizeUnknown = count == -1; if (!isSizeUnknown) { - const QString itemCountString = i18ncp("@item:intable", "%1 item", "%1 items", count); + QString itemCountString = i18ncp("@item:intable", "%1 item", "%1 items", count); m_data.insert(QStringLiteral("kfileitem#size"), itemCountString); + + const int hiddenCount = counts.second; + if (hiddenCount > 0) { + // add hidden items count + QString hiddenCountString = i18ncp("@item:intable", "%1 item", "%1 items", hiddenCount); + m_data.insert(QStringLiteral("kfileitem#hiddenItems"), hiddenCountString); + } } } if (isSizeUnknown) { @@ -208,10 +216,28 @@ if (allDirectories) { int count = 0; + int hiddenCount = 0; + bool isSizeKnown = true; for (const KFileItem& item : qAsConst(m_fileItems)) { - count += subDirectoriesCount(item.url().path()); + isSizeKnown = item.isLocalFile(); + if (!isSizeKnown) { + return; + } + const QPair counts = subDirectoriesCount(item.url().path()); + const int subcount = counts.first; + isSizeKnown = subcount != -1; + if (!isSizeKnown) { + return; + } + count += subcount; + hiddenCount += counts.second; + } + QString itemCountString = i18ncp("@item:intable", "%1 item", "%1 items", count); + if (hiddenCount > 0) { + // add hidden items count + QString hiddenCountString = i18ncp("@item:intable", "%1 item", "%1 items", hiddenCount); + m_data.insert(QStringLiteral("kfileitem#hiddenItems"), hiddenCountString); } - const QString itemCountString = i18ncp("@item:intable", "%1 item", "%1 items", count); m_data.insert(QStringLiteral("kfileitem#totalSize"), itemCountString); } else { @@ -392,6 +418,7 @@ { QStringLiteral("kfileitem#size"), i18nc("@label", "Size") }, { QStringLiteral("kfileitem#tags"), i18nc("@label", "Tags") }, { QStringLiteral("kfileitem#totalSize"), i18nc("@label", "Total Size") }, + { QStringLiteral("kfileitem#hiddenItems"), i18nc("@label", "Hidden items") }, { QStringLiteral("kfileitem#type"), i18nc("@label", "Type") }, { QStringLiteral("tags"), i18nc("@label", "Tags") }, { QStringLiteral("rating"), i18nc("@label", "Rating") }, @@ -415,12 +442,13 @@ { QStringLiteral("kfileitem#type"), QStringLiteral("0FileItemA") }, { QStringLiteral("kfileitem#size"), QStringLiteral("0FileItemB") }, { QStringLiteral("kfileitem#totalSize"), QStringLiteral("0FileItemB") }, - { QStringLiteral("kfileitem#modified"), QStringLiteral("0FileItemC") }, - { QStringLiteral("kfileitem#accessed"), QStringLiteral("0FileItemD") }, - { QStringLiteral("kfileitem#created"), QStringLiteral("0FileItemE") }, - { QStringLiteral("kfileitem#owner"), QStringLiteral("0FileItemF") }, - { QStringLiteral("kfileitem#group"), QStringLiteral("0FileItemG") }, - { QStringLiteral("kfileitem#permissions"), QStringLiteral("0FileItemH") }, + { QStringLiteral("kfileitem#hiddenItems"), QStringLiteral("0FileItemC") }, + { QStringLiteral("kfileitem#modified"), QStringLiteral("0FileItemD") }, + { QStringLiteral("kfileitem#accessed"), QStringLiteral("0FileItemE") }, + { QStringLiteral("kfileitem#created"), QStringLiteral("0FileItemF") }, + { QStringLiteral("kfileitem#owner"), QStringLiteral("0FileItemG") }, + { QStringLiteral("kfileitem#group"), QStringLiteral("0FileItemH") }, + { QStringLiteral("kfileitem#permissions"), QStringLiteral("0FileItemI") }, // Editable Data { QStringLiteral("tags"), QStringLiteral("1EditableDataA") }, @@ -488,7 +516,7 @@ return m_data; } -int FileMetaDataProvider::subDirectoriesCount(const QString& path) +QPair FileMetaDataProvider::subDirectoriesCount(const QString& path) { #ifdef Q_OS_WIN QDir dir(path); @@ -498,9 +526,11 @@ // Copyright (C) 2006 David Faure int count = -1; + int hiddenCount = -1; DIR* dir = ::opendir(QFile::encodeName(path).constData()); if (dir) { count = 0; + hiddenCount = 0; struct dirent *dirEntry = nullptr; while ((dirEntry = ::readdir(dir))) { // krazy:exclude=syscalls if (dirEntry->d_name[0] == '.') { @@ -512,12 +542,15 @@ // Skip ".." continue; } + // hidden files + hiddenCount++; + } else { + ++count; } - ++count; } ::closedir(dir); } - return count; + return QPair(count, hiddenCount); #endif }