Don't show a expanding-toggle in the Folders Panel if there are no subdirectories

BUG: 290745
FIXED-IN: 4.8.0
This commit is contained in:
Peter Penz 2012-01-15 10:39:11 +01:00
parent f38a70f5d0
commit 8306a0fa6c
5 changed files with 40 additions and 7 deletions

View file

@ -183,6 +183,20 @@ bool KFileItemModel::showHiddenFiles() const
return dirLister ? dirLister->showingDotFiles() : false; return dirLister ? dirLister->showingDotFiles() : false;
} }
void KFileItemModel::setShowFoldersOnly(bool enabled)
{
KDirLister* dirLister = m_dirLister.data();
if (dirLister) {
dirLister->setDirOnlyMode(enabled);
}
}
bool KFileItemModel::showFoldersOnly() const
{
KDirLister* dirLister = m_dirLister.data();
return dirLister ? dirLister->dirOnlyMode() : false;
}
QMimeData* KFileItemModel::createMimeData(const QSet<int>& indexes) const QMimeData* KFileItemModel::createMimeData(const QSet<int>& indexes) const
{ {
QMimeData* data = new QMimeData(); QMimeData* data = new QMimeData();

View file

@ -73,6 +73,13 @@ public:
void setShowHiddenFiles(bool show); void setShowHiddenFiles(bool show);
bool showHiddenFiles() const; bool showHiddenFiles() const;
/**
* If set to true, only folders are shown as items of the model. Files
* are ignored.
*/
void setShowFoldersOnly(bool enabled);
bool showFoldersOnly() const;
/** @reimp */ /** @reimp */
virtual QMimeData* createMimeData(const QSet<int>& indexes) const; virtual QMimeData* createMimeData(const QSet<int>& indexes) const;

View file

@ -33,7 +33,7 @@
#include <QElapsedTimer> #include <QElapsedTimer>
#include <QTimer> #include <QTimer>
// Required includes for subDirectoriesCount(): // Required includes for subItemsCount():
#ifdef Q_WS_WIN #ifdef Q_WS_WIN
#include <QDir> #include <QDir>
#else #else
@ -770,7 +770,7 @@ QHash<QByteArray, QVariant> KFileItemModelRolesUpdater::rolesData(const KFileIte
if ((getSizeRole || getIsExpandableRole) && item.isDir() && item.isLocalFile()) { if ((getSizeRole || getIsExpandableRole) && item.isDir() && item.isLocalFile()) {
const QString path = item.localPath(); const QString path = item.localPath();
const int count = subDirectoriesCount(path); const int count = subItemsCount(path);
if (count >= 0) { if (count >= 0) {
if (getSizeRole) { if (getSizeRole) {
data.insert("size", KIO::filesize_t(count)); data.insert("size", KIO::filesize_t(count));
@ -826,16 +826,22 @@ KFileItemList KFileItemModelRolesUpdater::sortedItems(const QSet<KFileItem>& ite
return itemList; return itemList;
} }
int KFileItemModelRolesUpdater::subDirectoriesCount(const QString& path) const int KFileItemModelRolesUpdater::subItemsCount(const QString& path) const
{ {
const bool countHiddenFiles = m_model->showHiddenFiles(); const bool countHiddenFiles = m_model->showHiddenFiles();
const bool showFoldersOnly = m_model->showFoldersOnly();
#ifdef Q_WS_WIN #ifdef Q_WS_WIN
QDir dir(path); QDir dir(path);
QDir::Filters filters = QDir::AllEntries | QDir::NoDotAndDotDot | QDir::System; QDir::Filters filters = QDir::NoDotAndDotDot | QDir::System;
if (countHiddenFiles) { if (countHiddenFiles) {
filters |= QDir::Hidden; filters |= QDir::Hidden;
} }
if (showFoldersOnly) {
filters |= QDir::Dirs;
} else {
filters |= QDir::AllEntries;
}
return dir.entryList(filters).count(); return dir.entryList(filters).count();
#else #else
// Taken from kdelibs/kio/kio/kdirmodel.cpp // Taken from kdelibs/kio/kio/kdirmodel.cpp
@ -857,7 +863,10 @@ int KFileItemModelRolesUpdater::subDirectoriesCount(const QString& path) const
continue; continue;
} }
} }
++count;
if (!showFoldersOnly || dirEntry->d_type == DT_DIR) {
++count;
}
} }
::closedir(dir); ::closedir(dir);
} }

View file

@ -164,7 +164,10 @@ private:
KFileItemList sortedItems(const QSet<KFileItem>& items) const; KFileItemList sortedItems(const QSet<KFileItem>& items) const;
int subDirectoriesCount(const QString& path) const; /**
* @return The number of items of the path \a path.
*/
int subItemsCount(const QString& path) const;
private: private:
// Property for setPaused()/isPaused(). // Property for setPaused()/isPaused().

View file

@ -140,7 +140,6 @@ void FoldersPanel::showEvent(QShowEvent* event)
// This assures that no performance and memory overhead is given when the TreeView is not // This assures that no performance and memory overhead is given when the TreeView is not
// used at all (see FoldersPanel::setUrl()). // used at all (see FoldersPanel::setUrl()).
m_dirLister = new KDirLister(); m_dirLister = new KDirLister();
m_dirLister->setDirOnlyMode(true);
m_dirLister->setAutoUpdate(true); m_dirLister->setAutoUpdate(true);
m_dirLister->setMainWindow(window()); m_dirLister->setMainWindow(window());
m_dirLister->setDelayedMimeTypes(true); m_dirLister->setDelayedMimeTypes(true);
@ -163,6 +162,7 @@ void FoldersPanel::showEvent(QShowEvent* event)
view->setOpacity(0); view->setOpacity(0);
KFileItemModel* model = new KFileItemModel(m_dirLister, this); KFileItemModel* model = new KFileItemModel(m_dirLister, this);
model->setShowFoldersOnly(true);
model->setShowHiddenFiles(FoldersPanelSettings::hiddenFilesShown()); model->setShowHiddenFiles(FoldersPanelSettings::hiddenFilesShown());
// Use a QueuedConnection to give the view the possibility to react first on the // Use a QueuedConnection to give the view the possibility to react first on the
// finished loading. // finished loading.