filesystem watching optimization

This commit is contained in:
2021-07-01 22:25:27 +03:00
parent 1b57926c32
commit 6d88a57712
2 changed files with 32 additions and 14 deletions

View File

@@ -105,7 +105,7 @@ void ProjectFilesystemWidget::setCurrentFilter(const FilterDialog::Filter & v) {
} }
void ProjectFilesystemWidget::changeEvent(QEvent *e) { void ProjectFilesystemWidget::changeEvent(QEvent * e) {
QWidget::changeEvent(e); QWidget::changeEvent(e);
switch (e->type()) { switch (e->type()) {
case QEvent::LanguageChange: 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() { void ProjectFilesystemWidget::projectNameChanged() {
for (int i = 0; i < tree->topLevelItemCount(); ++i) { for (int i = 0; i < tree->topLevelItemCount(); ++i) {
ProjectExplorer::Project * p = (ProjectExplorer::Project *)itemProject(tree->topLevelItem(i)); ProjectExplorer::Project * p = (ProjectExplorer::Project *)itemProject(tree->topLevelItem(i));
@@ -350,18 +374,10 @@ void ProjectFilesystemWidget::cleanMappedItems() {
void ProjectFilesystemWidget::directoryChanged(const QString & path) { void ProjectFilesystemWidget::directoryChanged(const QString & path) {
QTreeWidgetItem * ti = item_map.value(path); if (timer_fs_changed > 0)
//QMessageBox::information(0, "", "changed " + path + " " + QString::number((qulonglong)ti)); killTimer(timer_fs_changed);
if (!ti) return; timer_fs_changed = startTimer(500);
int spos = tree->verticalScrollBar()->value(); fs_changed << path;
last_expanded.clear();
rememberExpanded(tree->invisibleRootItem());
createTree(ti, path, false);
filter();
restoreExpanded(tree->invisibleRootItem());
cleanMappedItems();
tree->verticalScrollBar()->setValue(spos);
currentFileChanged();
//QMessageBox::information(0, "", "map " + QString::number(ais.size())); //QMessageBox::information(0, "", "map " + QString::number(ais.size()));
//QMessageBox::information(0, "", "remove " + removed); //QMessageBox::information(0, "", "remove " + removed);
} }

View File

@@ -28,6 +28,7 @@ public:
protected: protected:
void changeEvent(QEvent * e); void changeEvent(QEvent * e);
void timerEvent(QTimerEvent * e);
void createTree(QTreeWidgetItem * ti, const QString & dir, bool proc_events = true); void createTree(QTreeWidgetItem * ti, const QString & dir, bool proc_events = true);
void createProjectTree(void * p); void createProjectTree(void * p);
void projectNameChanged(); void projectNameChanged();
@@ -42,11 +43,12 @@ protected:
void cleanMappedItems(); void cleanMappedItems();
bool in_proc, need_rebuild; bool in_proc, need_rebuild;
int timer_fs_changed = 0;
ExtensionSystem::IPlugin * proj_plug; ExtensionSystem::IPlugin * proj_plug;
QMenu popup_menu; QMenu popup_menu;
QList<QAction*> this_actions; QList<QAction*> this_actions;
QMap<QString, QTreeWidgetItem*> item_map; QMap<QString, QTreeWidgetItem*> item_map;
QSet<QString> last_expanded; QSet<QString> last_expanded, fs_changed;
FilterDialog filter_dialog; FilterDialog filter_dialog;
FilterDialog::Filter cur_filter; FilterDialog::Filter cur_filter;
QElapsedTimer tm; QElapsedTimer tm;