summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-09-02 14:52:47 +1000
committer2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-09-02 14:52:47 +1000
commit2601955dfd356cc8643159bb17f0ec3e41cf75a4 (patch)
tree54a5b41ec785e63653444976385076d312315b5b
parentplugin/fsm: sort dirs first (diff)
downloadcaelestia-shell-2601955dfd356cc8643159bb17f0ec3e41cf75a4.tar.gz
caelestia-shell-2601955dfd356cc8643159bb17f0ec3e41cf75a4.tar.bz2
caelestia-shell-2601955dfd356cc8643159bb17f0ec3e41cf75a4.zip
plugin/fsm: only update changed dir
Also add added and removed signals
-rw-r--r--plugin/src/Caelestia/filesystemmodel.cpp15
-rw-r--r--plugin/src/Caelestia/filesystemmodel.hpp6
2 files changed, 16 insertions, 5 deletions
diff --git a/plugin/src/Caelestia/filesystemmodel.cpp b/plugin/src/Caelestia/filesystemmodel.cpp
index eee8c2f..8e2efae 100644
--- a/plugin/src/Caelestia/filesystemmodel.cpp
+++ b/plugin/src/Caelestia/filesystemmodel.cpp
@@ -116,6 +116,10 @@ void FileSystemModel::updateEntries() {
return;
}
+ updateEntriesForDir(m_path);
+}
+
+void FileSystemModel::updateEntriesForDir(const QString& dir) {
const auto flags = m_recursive ? QDirIterator::Subdirectories : QDirIterator::NoIteratorFlags;
std::optional<QDirIterator> iter;
@@ -126,11 +130,11 @@ void FileSystemModel::updateEntries() {
filters << "*." + format;
}
- iter.emplace(m_path, filters, QDir::Files, flags);
+ iter.emplace(dir, filters, QDir::Files, flags);
} else if (m_filter == Files) {
- iter.emplace(m_path, QDir::Files, flags);
+ iter.emplace(dir, QDir::Files, flags);
} else {
- iter.emplace(m_path, QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot, flags);
+ iter.emplace(dir, QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot, flags);
}
QSet<QString> newPaths;
@@ -164,12 +168,15 @@ void FileSystemModel::updateEntries() {
const int numEntries = static_cast<int>(m_entries.size());
for (int i = numEntries - 1; i >= 0; --i) {
if (removedPaths.contains(m_entries[i]->path())) {
+ emit removed(m_entries[i]->path());
delete m_entries.takeAt(i);
}
}
for (const auto& path : addedPaths) {
- m_entries << new FileSystemEntry(path, m_dir.relativeFilePath(path), this);
+ const auto entry = new FileSystemEntry(path, m_dir.relativeFilePath(path), this);
+ emit added(entry);
+ m_entries << entry;
}
std::sort(m_entries.begin(), m_entries.end(), [](const FileSystemEntry* a, const FileSystemEntry* b) {
diff --git a/plugin/src/Caelestia/filesystemmodel.hpp b/plugin/src/Caelestia/filesystemmodel.hpp
index e12b26a..e7e1cf2 100644
--- a/plugin/src/Caelestia/filesystemmodel.hpp
+++ b/plugin/src/Caelestia/filesystemmodel.hpp
@@ -78,7 +78,7 @@ public:
, m_recursive(true)
, m_filter(NoFilter) {
connect(&m_watcher, &QFileSystemWatcher::directoryChanged, this, &FileSystemModel::watchDirIfRecursive);
- connect(&m_watcher, &QFileSystemWatcher::directoryChanged, this, &FileSystemModel::updateEntries);
+ connect(&m_watcher, &QFileSystemWatcher::directoryChanged, this, &FileSystemModel::updateEntriesForDir);
}
int rowCount(const QModelIndex& parent = QModelIndex()) const override;
@@ -102,6 +102,9 @@ signals:
void filterChanged();
void entriesChanged();
+ void added(const FileSystemEntry* entry);
+ void removed(const QString& path);
+
private:
QDir m_dir;
QFileSystemWatcher m_watcher;
@@ -115,4 +118,5 @@ private:
void update();
void updateWatcher();
void updateEntries();
+ void updateEntriesForDir(const QString& dir);
};