diff options
| author | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-09-02 17:59:38 +1000 |
|---|---|---|
| committer | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-09-02 17:59:38 +1000 |
| commit | dccdcd417ff24c6f3897511f307e6c832598f6c7 (patch) | |
| tree | 913d9aa2f4a0d7443e2db4c4f91113cebf220ca0 /plugin/src/Caelestia | |
| parent | plugin/fsm: allow disabling watching (diff) | |
| download | caelestia-shell-dccdcd417ff24c6f3897511f307e6c832598f6c7.tar.gz caelestia-shell-dccdcd417ff24c6f3897511f307e6c832598f6c7.tar.bz2 caelestia-shell-dccdcd417ff24c6f3897511f307e6c832598f6c7.zip | |
plugin/fsm: add showHidden & dirs filter
Diffstat (limited to 'plugin/src/Caelestia')
| -rw-r--r-- | plugin/src/Caelestia/filesystemmodel.cpp | 119 | ||||
| -rw-r--r-- | plugin/src/Caelestia/filesystemmodel.hpp | 10 |
2 files changed, 88 insertions, 41 deletions
diff --git a/plugin/src/Caelestia/filesystemmodel.cpp b/plugin/src/Caelestia/filesystemmodel.cpp index 3ba95d8..3f75303 100644 --- a/plugin/src/Caelestia/filesystemmodel.cpp +++ b/plugin/src/Caelestia/filesystemmodel.cpp @@ -74,6 +74,21 @@ void FileSystemModel::setWatchChanges(bool watchChanges) { update(); } +bool FileSystemModel::showHidden() const { + return m_showHidden; +} + +void FileSystemModel::setShowHidden(bool showHidden) { + if (m_showHidden == showHidden) { + return; + } + + m_showHidden = showHidden; + emit showHiddenChanged(); + + update(); +} + FileSystemModel::Filter FileSystemModel::filter() const { return m_filter; } @@ -96,8 +111,14 @@ QList<FileSystemEntry*> FileSystemModel::entries() const { void FileSystemModel::watchDirIfRecursive(const QString& path) { if (m_recursive && m_watchChanges) { const auto currentDir = m_dir; - const auto future = QtConcurrent::run([path]() { - QDirIterator iter(path, QDir::Dirs | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); + const bool showHidden = m_showHidden; + const auto future = QtConcurrent::run([showHidden, path]() { + QDir::Filters filters = QDir::Dirs | QDir::NoDotAndDotDot; + if (showHidden) { + filters |= QDir::Hidden; + } + + QDirIterator iter(path, filters, QDirIterator::Subdirectories); QStringList dirs; while (iter.hasNext()) { dirs << iter.next(); @@ -105,10 +126,10 @@ void FileSystemModel::watchDirIfRecursive(const QString& path) { return dirs; }); const auto watcher = new QFutureWatcher<QStringList>(this); - connect(watcher, &QFutureWatcher<QStringList>::finished, this, [currentDir, watcher, this]() { + connect(watcher, &QFutureWatcher<QStringList>::finished, this, [currentDir, showHidden, watcher, this]() { const auto paths = watcher->result(); - if (currentDir == m_dir && !paths.isEmpty()) { - // Ignore if dir has changed + if (currentDir == m_dir && showHidden == m_showHidden && !paths.isEmpty()) { + // Ignore if dir or showHidden has changed m_watcher.addPaths(paths); } watcher->deleteLater(); @@ -158,58 +179,76 @@ void FileSystemModel::updateEntries() { void FileSystemModel::updateEntriesForDir(const QString& dir) { const bool recursive = m_recursive; + const bool showHidden = m_showHidden; const auto filter = m_filter; const auto oldEntries = m_entries; const auto baseDir = m_dir; - const auto future = QtConcurrent::run( - [dir, recursive, filter, oldEntries, baseDir](QPromise<QPair<QSet<QString>, QSet<QString>>>& promise) { - const auto flags = recursive ? QDirIterator::Subdirectories : QDirIterator::NoIteratorFlags; - - std::optional<QDirIterator> iter; + const auto future = QtConcurrent::run([dir, recursive, showHidden, filter, oldEntries, baseDir]( + QPromise<QPair<QSet<QString>, QSet<QString>>>& promise) { + const auto flags = recursive ? QDirIterator::Subdirectories : QDirIterator::NoIteratorFlags; - if (filter == Images) { - QStringList filters; - for (const auto& format : QImageReader::supportedImageFormats()) { - filters << "*." + format; - } + std::optional<QDirIterator> iter; - iter.emplace(dir, filters, QDir::Files, flags); - } else if (filter == Files) { - iter.emplace(dir, QDir::Files, flags); - } else { - iter.emplace(dir, QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot, flags); + if (filter == Images) { + QStringList nameFilters; + for (const auto& format : QImageReader::supportedImageFormats()) { + nameFilters << "*." + format; } - QSet<QString> newPaths; - while (iter->hasNext()) { - if (promise.isCanceled()) { - return; - } - - QString path = iter->next(); + QDir::Filters filters = QDir::Files; + if (showHidden) { + filters |= QDir::Hidden; + } - if (filter == Images) { - QImageReader reader(path); - if (!reader.canRead()) { - continue; - } - } + iter.emplace(dir, nameFilters, filters, flags); + } else { + QDir::Filters filters; - newPaths.insert(path); + if (filter == Files) { + filters = QDir::Files; + } else if (filter == Dirs) { + filters = QDir::Dirs | QDir::NoDotAndDotDot; + } else { + filters = QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot; } - QSet<QString> oldPaths; - for (const auto& entry : oldEntries) { - oldPaths.insert(entry->path()); + if (showHidden) { + filters |= QDir::Hidden; } - if (promise.isCanceled() || newPaths == oldPaths) { + iter.emplace(dir, filters, flags); + } + + QSet<QString> newPaths; + while (iter->hasNext()) { + if (promise.isCanceled()) { return; } - promise.addResult(qMakePair(oldPaths - newPaths, newPaths - oldPaths)); - }); + QString path = iter->next(); + + if (filter == Images) { + QImageReader reader(path); + if (!reader.canRead()) { + continue; + } + } + + newPaths.insert(path); + } + + QSet<QString> oldPaths; + for (const auto& entry : oldEntries) { + oldPaths.insert(entry->path()); + } + + if (promise.isCanceled() || newPaths == oldPaths) { + return; + } + + promise.addResult(qMakePair(oldPaths - newPaths, newPaths - oldPaths)); + }); if (m_futures.contains(dir)) { m_futures[dir].cancel(); diff --git a/plugin/src/Caelestia/filesystemmodel.hpp b/plugin/src/Caelestia/filesystemmodel.hpp index ab226a3..f30850d 100644 --- a/plugin/src/Caelestia/filesystemmodel.hpp +++ b/plugin/src/Caelestia/filesystemmodel.hpp @@ -63,6 +63,7 @@ class FileSystemModel : public QAbstractListModel { Q_PROPERTY(QString path READ path WRITE setPath NOTIFY pathChanged) Q_PROPERTY(bool recursive READ recursive WRITE setRecursive NOTIFY recursiveChanged) Q_PROPERTY(bool watchChanges READ watchChanges WRITE setWatchChanges NOTIFY watchChangesChanged) + Q_PROPERTY(bool showHidden READ showHidden WRITE setShowHidden NOTIFY showHiddenChanged) Q_PROPERTY(Filter filter READ filter WRITE setFilter NOTIFY filterChanged) Q_PROPERTY(QList<FileSystemEntry*> entries READ entries NOTIFY entriesChanged) @@ -71,7 +72,8 @@ public: enum Filter { NoFilter, Images, - Files + Files, + Dirs }; Q_ENUM(Filter) @@ -79,6 +81,7 @@ public: : QAbstractListModel(parent) , m_recursive(true) , m_watchChanges(true) + , m_showHidden(false) , m_filter(NoFilter) { connect(&m_watcher, &QFileSystemWatcher::directoryChanged, this, &FileSystemModel::watchDirIfRecursive); connect(&m_watcher, &QFileSystemWatcher::directoryChanged, this, &FileSystemModel::updateEntriesForDir); @@ -97,6 +100,9 @@ public: bool watchChanges() const; void setWatchChanges(bool watchChanges); + bool showHidden() const; + void setShowHidden(bool showHidden); + Filter filter() const; void setFilter(Filter filter); @@ -106,6 +112,7 @@ signals: void pathChanged(); void recursiveChanged(); void watchChangesChanged(); + void showHiddenChanged(); void filterChanged(); void entriesChanged(); @@ -121,6 +128,7 @@ private: QString m_path; bool m_recursive; bool m_watchChanges; + bool m_showHidden; Filter m_filter; void watchDirIfRecursive(const QString& path); |