diff options
| author | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-08-31 23:47:13 +1000 |
|---|---|---|
| committer | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-08-31 23:47:13 +1000 |
| commit | ee0c011822312d3d3378294bcb4014226a5f49fa (patch) | |
| tree | 443df14ae0c167658419432b463e1d378c2d3027 /plugin/src | |
| parent | plugin/fsm: add new roles (diff) | |
| download | caelestia-shell-ee0c011822312d3d3378294bcb4014226a5f49fa.tar.gz caelestia-shell-ee0c011822312d3d3378294bcb4014226a5f49fa.tar.bz2 caelestia-shell-ee0c011822312d3d3378294bcb4014226a5f49fa.zip | |
plugin/fsm: lazy entriesChanged
Only emit when it actually changes (comparison via paths)
Diffstat (limited to '')
| -rw-r--r-- | plugin/src/Caelestia/filesystemmodel.cpp | 47 |
1 files changed, 32 insertions, 15 deletions
diff --git a/plugin/src/Caelestia/filesystemmodel.cpp b/plugin/src/Caelestia/filesystemmodel.cpp index 8722cc0..3fb20d9 100644 --- a/plugin/src/Caelestia/filesystemmodel.cpp +++ b/plugin/src/Caelestia/filesystemmodel.cpp @@ -130,19 +130,17 @@ void FileSystemModel::updateWatcher() { void FileSystemModel::updateEntries() { if (m_path.isEmpty()) { - beginResetModel(); - qDeleteAll(m_entries); - m_entries.clear(); - emit entriesChanged(); - endResetModel(); + if (!m_entries.isEmpty()) { + beginResetModel(); + qDeleteAll(m_entries); + m_entries.clear(); + emit entriesChanged(); + endResetModel(); + } return; } - beginResetModel(); - qDeleteAll(m_entries); - m_entries.clear(); - const auto flags = m_recursive ? QDirIterator::Subdirectories : QDirIterator::NoIteratorFlags; std::optional<QDirIterator> iter; @@ -160,17 +158,36 @@ void FileSystemModel::updateEntries() { iter.emplace(m_path, QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot, flags); } + QStringList newPaths; + while (iter.value().hasNext()) { - QString entry = iter.value().next(); + QString path = iter.value().next(); if (m_filter == Images) { - QImageReader reader(entry); - if (reader.canRead()) { - m_entries << new FileSystemEntry(entry, m_dir.relativeFilePath(entry), this); + QImageReader reader(path); + if (!reader.canRead()) { + continue; } - } else { - m_entries << new FileSystemEntry(entry, m_dir.relativeFilePath(entry), this); } + + newPaths << path; + } + + QStringList oldPaths; + for (const auto& entry : m_entries) { + oldPaths << entry->path(); + } + + if (newPaths == oldPaths) { + return; + } + + beginResetModel(); + qDeleteAll(m_entries); + m_entries.clear(); + + for (const auto& path : newPaths) { + m_entries << new FileSystemEntry(path, m_dir.relativeFilePath(path), this); } emit entriesChanged(); |