plugin/fsm: lazy entriesChanged

Only emit when it actually changes (comparison via paths)
This commit is contained in:
2 * r + 2 * t 2025-08-31 23:47:13 +10:00
parent f6c9380e9b
commit ee0c011822

View file

@ -130,19 +130,17 @@ void FileSystemModel::updateWatcher() {
void FileSystemModel::updateEntries() { void FileSystemModel::updateEntries() {
if (m_path.isEmpty()) { if (m_path.isEmpty()) {
beginResetModel(); if (!m_entries.isEmpty()) {
qDeleteAll(m_entries); beginResetModel();
m_entries.clear(); qDeleteAll(m_entries);
emit entriesChanged(); m_entries.clear();
endResetModel(); emit entriesChanged();
endResetModel();
}
return; return;
} }
beginResetModel();
qDeleteAll(m_entries);
m_entries.clear();
const auto flags = m_recursive ? QDirIterator::Subdirectories : QDirIterator::NoIteratorFlags; const auto flags = m_recursive ? QDirIterator::Subdirectories : QDirIterator::NoIteratorFlags;
std::optional<QDirIterator> iter; std::optional<QDirIterator> iter;
@ -160,17 +158,36 @@ void FileSystemModel::updateEntries() {
iter.emplace(m_path, QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot, flags); iter.emplace(m_path, QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot, flags);
} }
QStringList newPaths;
while (iter.value().hasNext()) { while (iter.value().hasNext()) {
QString entry = iter.value().next(); QString path = iter.value().next();
if (m_filter == Images) { if (m_filter == Images) {
QImageReader reader(entry); QImageReader reader(path);
if (reader.canRead()) { if (!reader.canRead()) {
m_entries << new FileSystemEntry(entry, m_dir.relativeFilePath(entry), this); 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(); emit entriesChanged();