summaryrefslogtreecommitdiff
path: root/plugin/src
diff options
context:
space:
mode:
author2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-09-02 17:59:38 +1000
committer2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-09-02 17:59:38 +1000
commitdccdcd417ff24c6f3897511f307e6c832598f6c7 (patch)
tree913d9aa2f4a0d7443e2db4c4f91113cebf220ca0 /plugin/src
parentplugin/fsm: allow disabling watching (diff)
downloadcaelestia-shell-dccdcd417ff24c6f3897511f307e6c832598f6c7.tar.gz
caelestia-shell-dccdcd417ff24c6f3897511f307e6c832598f6c7.tar.bz2
caelestia-shell-dccdcd417ff24c6f3897511f307e6c832598f6c7.zip
plugin/fsm: add showHidden & dirs filter
Diffstat (limited to 'plugin/src')
-rw-r--r--plugin/src/Caelestia/filesystemmodel.cpp119
-rw-r--r--plugin/src/Caelestia/filesystemmodel.hpp10
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);