Navigation Menu

Skip to content

Commit

Permalink
Merge branch 'mer-1658' into 'master'
Browse files Browse the repository at this point in the history
[nemo-qml-plugin-filemanager] Add option to show hidden files. Contributes to MER#1658



See merge request !8
  • Loading branch information
matthewvogt committed Sep 22, 2016
2 parents 8b9b010 + 9cd87d3 commit 1060a53
Show file tree
Hide file tree
Showing 8 changed files with 116 additions and 16 deletions.
51 changes: 48 additions & 3 deletions src/plugin/filemodel.cpp
Expand Up @@ -53,7 +53,9 @@ enum {
SymLinkTargetRole = Qt::UserRole + 8,
IsSelectedRole = Qt::UserRole + 9,
ExtensionRole = Qt::UserRole + 10,
AbsolutePathRole = Qt::UserRole + 11
AbsolutePathRole = Qt::UserRole + 11,
LastAccessedRole = Qt::UserRole + 12,
BaseNameRole = Qt::UserRole + 13
};

int access(QString fileName, int how)
Expand Down Expand Up @@ -93,6 +95,8 @@ FileModel::FileModel(QObject *parent) :
m_caseSensitivity(Qt::CaseSensitive),
m_includeDirectories(true),
m_includeParentDirectory(false),
m_includeHiddenFiles(false),
m_includeSystemFiles(false),
m_active(false),
m_dirty(false),
m_populated(false),
Expand Down Expand Up @@ -155,6 +159,12 @@ QVariant FileModel::data(const QModelIndex &index, int role) const
case AbsolutePathRole:
return info.absoluteFilePath();

case LastAccessedRole:
return info.lastAccessed();

case BaseNameRole:
return info.baseName();

default:
return QVariant();
}
Expand All @@ -174,6 +184,8 @@ QHash<int, QByteArray> FileModel::roleNames() const
roles.insert(IsSelectedRole, QByteArray("isSelected"));
roles.insert(ExtensionRole, QByteArray("extension"));
roles.insert(AbsolutePathRole, QByteArray("absolutePath"));
roles.insert(LastAccessedRole, QByteArray("accessed"));
roles.insert(BaseNameRole, QByteArray("baseName"));
return roles;
}

Expand Down Expand Up @@ -202,6 +214,7 @@ void FileModel::setPath(QString path)
m_path = path;
m_absolutePath = QString();
m_directory = QString();
m_parentPath = QString();
scheduleUpdate(PathChanged);
}

Expand Down Expand Up @@ -250,6 +263,24 @@ void FileModel::setIncludeParentDirectory(bool include)
scheduleUpdate(IncludeParentDirectoryChanged | ContentChanged);
}

void FileModel::setIncludeHiddenFiles(bool include)
{
if (m_includeHiddenFiles == include)
return;

m_includeHiddenFiles = include;
scheduleUpdate(IncludeHiddenFilesChanged | ContentChanged);
}

void FileModel::setIncludeSystemFiles(bool include)
{
if (m_includeSystemFiles == include)
return;

m_includeSystemFiles = include;
scheduleUpdate(IncludeSystemFilesChanged | ContentChanged);
}

void FileModel::setDirectorySort(DirectorySort sort)
{
if (m_directorySort == sort)
Expand Down Expand Up @@ -433,6 +464,7 @@ void FileModel::readAllEntries()

m_absolutePath = dir.absolutePath();
m_directory = dir.isRoot() ? QStringLiteral("/") : dir.dirName();
m_parentPath = dir.isRoot() ? QString() : QDir::cleanPath(dir.absoluteFilePath(QStringLiteral("..")));
m_files = directoryEntries(dir);
}

Expand Down Expand Up @@ -511,11 +543,18 @@ QDir FileModel::directory() const

if (m_includeDirectories) {
filters |= QDir::AllDirs;
if (!m_includeParentDirectory) {
if (!m_includeParentDirectory || dir.isRoot()) {
filters |= QDir::NoDotDot;
}
}

if (m_includeHiddenFiles) {
filters |= QDir::Hidden;
}
if (m_includeSystemFiles) {
filters |= QDir::System;
}

QDir::SortFlags sortFlags(QDir::LocaleAware);

if (m_sortBy == SortByName) {
Expand Down Expand Up @@ -562,7 +601,7 @@ void FileModel::scheduleUpdate(ChangedFlags flags)

void FileModel::update()
{
if (!m_populated) {
if (!m_populated || (m_changedFlags & SortOrderChanged)) {
// Do a complete refresh
readDirectory();
} else if (m_changedFlags & ContentChanged) {
Expand All @@ -589,6 +628,12 @@ void FileModel::update()
if (m_changedFlags & IncludeParentDirectoryChanged) {
emit includeParentDirectoryChanged();
}
if (m_changedFlags & IncludeHiddenFilesChanged) {
emit includeHiddenFilesChanged();
}
if (m_changedFlags & IncludeSystemFilesChanged) {
emit includeSystemFilesChanged();
}
if (m_changedFlags & DirectorySortChanged) {
emit directorySortChanged();
}
Expand Down
31 changes: 24 additions & 7 deletions src/plugin/filemodel.h
Expand Up @@ -58,11 +58,14 @@ class FileModel : public QAbstractListModel
Q_PROPERTY(QString path READ path WRITE setPath NOTIFY pathChanged)
Q_PROPERTY(QString absolutePath READ absolutePath NOTIFY pathChanged)
Q_PROPERTY(QString directoryName READ directoryName NOTIFY pathChanged)
Q_PROPERTY(QString parentDirectoryName READ parentDirectoryName NOTIFY pathChanged)
Q_PROPERTY(Sort sortBy READ sortBy WRITE setSortBy NOTIFY sortByChanged)
Q_PROPERTY(Qt::SortOrder sortOrder READ sortOrder WRITE setSortOrder NOTIFY sortOrderChanged)
Q_PROPERTY(Qt::CaseSensitivity caseSensitivity READ caseSensitivity WRITE setCaseSensitivity NOTIFY caseSensitivityChanged)
Q_PROPERTY(bool includeDirectories READ includeDirectories WRITE setIncludeDirectories NOTIFY includeDirectoriesChanged)
Q_PROPERTY(bool includeParentDirectory READ includeParentDirectory WRITE setIncludeParentDirectory NOTIFY includeParentDirectoryChanged)
Q_PROPERTY(bool includeHiddenFiles READ includeHiddenFiles WRITE setIncludeHiddenFiles NOTIFY includeHiddenFilesChanged)
Q_PROPERTY(bool includeSystemFiles READ includeSystemFiles WRITE setIncludeSystemFiles NOTIFY includeSystemFilesChanged)
Q_PROPERTY(DirectorySort directorySort READ directorySort WRITE setDirectorySort NOTIFY directorySortChanged)
Q_PROPERTY(QStringList nameFilters READ nameFilters WRITE setNameFilters NOTIFY nameFiltersChanged)
Q_PROPERTY(bool populated READ populated NOTIFY populatedChanged)
Expand Down Expand Up @@ -107,6 +110,7 @@ class FileModel : public QAbstractListModel

QString absolutePath() const { return m_absolutePath; }
QString directoryName() const { return m_directory; }
QString parentDirectoryName() const { return m_parentPath; }

Sort sortBy() const { return m_sortBy; }
void setSortBy(Sort sortBy);
Expand All @@ -123,6 +127,12 @@ class FileModel : public QAbstractListModel
bool includeParentDirectory() const { return m_includeParentDirectory; }
void setIncludeParentDirectory(bool include);

bool includeHiddenFiles() const { return m_includeHiddenFiles; }
void setIncludeHiddenFiles(bool include);

bool includeSystemFiles() const { return m_includeSystemFiles; }
void setIncludeSystemFiles(bool include);

DirectorySort directorySort() const { return m_directorySort; }
void setDirectorySort(DirectorySort sort);

Expand Down Expand Up @@ -165,6 +175,8 @@ public slots:
void caseSensitivityChanged();
void includeDirectoriesChanged();
void includeParentDirectoryChanged();
void includeHiddenFilesChanged();
void includeSystemFilesChanged();
void directorySortChanged();
void nameFiltersChanged();
void populatedChanged();
Expand All @@ -184,13 +196,15 @@ private slots:
CaseSensitivityChanged = (1 << 3),
IncludeDirectoriesChanged = (1 << 4),
IncludeParentDirectoryChanged = (1 << 5),
DirectorySortChanged = (1 << 6),
NameFiltersChanged = (1 << 7),
PopulatedChanged = (1 << 8),
CountChanged = (1 << 9),
ActiveChanged = (1 << 10),
SelectedCountChanged = (1 << 11),
ContentChanged = (1 << 12),
IncludeHiddenFilesChanged = (1 << 6),
IncludeSystemFilesChanged = (1 << 7),
DirectorySortChanged = (1 << 8),
NameFiltersChanged = (1 << 9),
PopulatedChanged = (1 << 10),
CountChanged = (1 << 11),
ActiveChanged = (1 << 12),
SelectedCountChanged = (1 << 13),
ContentChanged = (1 << 14),
};
Q_DECLARE_FLAGS(ChangedFlags, Changed);

Expand All @@ -210,12 +224,15 @@ private slots:
QString m_path;
QString m_absolutePath;
QString m_directory;
QString m_parentPath;
Sort m_sortBy;
DirectorySort m_directorySort;
Qt::SortOrder m_sortOrder;
Qt::CaseSensitivity m_caseSensitivity;
bool m_includeDirectories;
bool m_includeParentDirectory;
bool m_includeHiddenFiles;
bool m_includeSystemFiles;
bool m_active;
bool m_dirty;
bool m_populated;
Expand Down
12 changes: 12 additions & 0 deletions src/plugin/statfileinfo.cpp
Expand Up @@ -59,6 +59,18 @@ bool StatFileInfo::exists() const
return m_fileInfo.exists();
}

QString StatFileInfo::extension() const
{
// If there is only one token following a dot, prefer it to be the baseName
return m_fileInfo.completeBaseName().isEmpty() ? QString() : m_fileInfo.suffix();
}

QString StatFileInfo::baseName() const
{
QString rv(m_fileInfo.completeBaseName());
return rv.isEmpty() ? m_fileInfo.fileName() : rv;
}

bool StatFileInfo::isSafeToRead() const
{
// it is safe to read non-existing files
Expand Down
4 changes: 3 additions & 1 deletion src/plugin/statfileinfo.h
Expand Up @@ -97,8 +97,10 @@ class StatFileInfo
uint ownerId() const { return m_fileInfo.ownerId(); }
qint64 size() const { return m_fileInfo.size(); }
QDateTime lastModified() const { return m_fileInfo.lastModified(); }
QDateTime lastAccessed() const { return m_fileInfo.lastRead(); }
QDateTime created() const { return m_fileInfo.created(); }
QString extension() const { return m_fileInfo.suffix(); }
QString extension() const;
QString baseName() const;
bool exists() const;
bool isSafeToRead() const;

Expand Down
6 changes: 6 additions & 0 deletions tests/auto/folder/.hidden
@@ -0,0 +1,6 @@






3 changes: 3 additions & 0 deletions tests/auto/folder/.hidden.xml
@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<xml>
</xml>
Binary file added tests/auto/folder/.tarball.tar.bz2
Binary file not shown.
25 changes: 20 additions & 5 deletions tests/auto/tst_filemodel.qml
Expand Up @@ -49,6 +49,8 @@ Item {
model: fileModel
Item {
property string fileName: model.fileName
property string baseName: model.baseName
property string extension: model.extension
property string mimeType: model.mimeType
property int size: model.size
property bool isDir: model.isDir
Expand All @@ -65,10 +67,13 @@ Item {
}

property var results: [
{fileName: "a", mimeType: "application/x-zerosize", size: 0, isDir: false},
{fileName: "b", mimeType: "text/plain", size: 2, isDir: false},
{fileName: "c", mimeType: "text/plain", size: 4, isDir: false},
{fileName: "subfolder", mimeType: "inode/directory", size: 4096, isDir: true}
{fileName: "a", baseName: "a", extension: "", mimeType: "application/x-zerosize", size: 0, isDir: false},
{fileName: "b", baseName: "b", extension: "", mimeType: "text/plain", size: 2, isDir: false},
{fileName: "c", baseName: "c", extension: "", mimeType: "text/plain", size: 4, isDir: false},
{fileName: "subfolder", baseName: "subfolder", extension: "", mimeType: "inode/directory", size: 4096, isDir: true},
{fileName: ".hidden.xml", baseName: ".hidden", extension: "xml", mimeType: "application/xml", size: 52, isDir: false},
{fileName: ".tarball.tar.bz2", baseName: ".tarball.tar", extension: "bz2", mimeType: "application/x-bzip-compressed-tar", size: 109, isDir: false},
{fileName: ".hidden", baseName: ".hidden", extension: "", mimeType: "text/plain", size: 6, isDir: false}
]

function test_listing() {
Expand All @@ -77,10 +82,12 @@ Item {
compare(fileModel.count, indices.length, name)

for (var i = 0; i < indices.length; i++) {
var message = name + ': failed at index:' + i + '(result[' + indices[i] + '])'
var message = name + ': failed at index:' + i + ' (result[' + indices[i] + '])'
var actual = repeater.itemAt(i)
var expected = results[indices[i]]
compare(actual.fileName, expected.fileName, message)
compare(actual.baseName, expected.baseName, message)
compare(actual.extension, expected.extension, message)
compare(actual.mimeType, expected.mimeType, message)
compare(actual.size, expected.size, message)
compare(actual.isDir, expected.isDir, message)
Expand All @@ -94,6 +101,14 @@ Item {
fileModel.sortOrder = Qt.DescendingOrder
check([0, 1, 2], 'Reverse by size')

fileModel.includeHiddenFiles = true
fileModel.sortBy = FileModel.SortByName
check([2, 1, 0, 5, 4, 6], 'Reverse by name with hidden')

fileModel.sortBy = FileModel.SortBySize
check([0, 1, 2, 6, 4, 5], 'Reverse by size with hidden')

fileModel.includeHiddenFiles = false
fileModel.directorySort = FileModel.SortDirectoriesBeforeFiles
fileModel.includeDirectories = true
check([3, 0, 1, 2], 'Reverse by size after directories')
Expand Down

0 comments on commit 1060a53

Please sign in to comment.