From 6d88a57712939ab2169f717f54149d1ea82acb42 Mon Sep 17 00:00:00 2001 From: peri4 Date: Thu, 1 Jul 2021 22:25:27 +0300 Subject: [PATCH] filesystem watching optimization --- project_fs/projectfilesystemwidget.cpp | 42 ++++++++++++++++++-------- project_fs/projectfilesystemwidget.h | 4 ++- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/project_fs/projectfilesystemwidget.cpp b/project_fs/projectfilesystemwidget.cpp index b797992..3de59c7 100644 --- a/project_fs/projectfilesystemwidget.cpp +++ b/project_fs/projectfilesystemwidget.cpp @@ -105,7 +105,7 @@ void ProjectFilesystemWidget::setCurrentFilter(const FilterDialog::Filter & v) { } -void ProjectFilesystemWidget::changeEvent(QEvent *e) { +void ProjectFilesystemWidget::changeEvent(QEvent * e) { QWidget::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: @@ -117,6 +117,30 @@ void ProjectFilesystemWidget::changeEvent(QEvent *e) { } +void ProjectFilesystemWidget::timerEvent(QTimerEvent * e) { + if (timer_fs_changed > 0) + killTimer(timer_fs_changed); + timer_fs_changed = 0; + int spos = tree->verticalScrollBar()->value(); + last_expanded.clear(); + rememberExpanded(tree->invisibleRootItem()); + for (QString path: fs_changed) { + QTreeWidgetItem * ti = item_map.value(path); + //QMessageBox::information(0, "", "changed " + path + " " + QString::number((qulonglong)ti)); + if (ti) { + createTree(ti, path, false); + cleanMappedItems(); + } + } + filter(); + restoreExpanded(tree->invisibleRootItem()); + fs_changed.clear(); + currentFileChanged(); + tree->verticalScrollBar()->setValue(spos); + QWidget::timerEvent(e); +} + + void ProjectFilesystemWidget::projectNameChanged() { for (int i = 0; i < tree->topLevelItemCount(); ++i) { ProjectExplorer::Project * p = (ProjectExplorer::Project *)itemProject(tree->topLevelItem(i)); @@ -350,18 +374,10 @@ void ProjectFilesystemWidget::cleanMappedItems() { void ProjectFilesystemWidget::directoryChanged(const QString & path) { - QTreeWidgetItem * ti = item_map.value(path); - //QMessageBox::information(0, "", "changed " + path + " " + QString::number((qulonglong)ti)); - if (!ti) return; - int spos = tree->verticalScrollBar()->value(); - last_expanded.clear(); - rememberExpanded(tree->invisibleRootItem()); - createTree(ti, path, false); - filter(); - restoreExpanded(tree->invisibleRootItem()); - cleanMappedItems(); - tree->verticalScrollBar()->setValue(spos); - currentFileChanged(); + if (timer_fs_changed > 0) + killTimer(timer_fs_changed); + timer_fs_changed = startTimer(500); + fs_changed << path; //QMessageBox::information(0, "", "map " + QString::number(ais.size())); //QMessageBox::information(0, "", "remove " + removed); } diff --git a/project_fs/projectfilesystemwidget.h b/project_fs/projectfilesystemwidget.h index 12e027d..d55f6d3 100644 --- a/project_fs/projectfilesystemwidget.h +++ b/project_fs/projectfilesystemwidget.h @@ -28,6 +28,7 @@ public: protected: void changeEvent(QEvent * e); + void timerEvent(QTimerEvent * e); void createTree(QTreeWidgetItem * ti, const QString & dir, bool proc_events = true); void createProjectTree(void * p); void projectNameChanged(); @@ -42,11 +43,12 @@ protected: void cleanMappedItems(); bool in_proc, need_rebuild; + int timer_fs_changed = 0; ExtensionSystem::IPlugin * proj_plug; QMenu popup_menu; QList this_actions; QMap item_map; - QSet last_expanded; + QSet last_expanded, fs_changed; FilterDialog filter_dialog; FilterDialog::Filter cur_filter; QElapsedTimer tm;