filesystem watching optimization
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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<QAction*> this_actions;
|
||||
QMap<QString, QTreeWidgetItem*> item_map;
|
||||
QSet<QString> last_expanded;
|
||||
QSet<QString> last_expanded, fs_changed;
|
||||
FilterDialog filter_dialog;
|
||||
FilterDialog::Filter cur_filter;
|
||||
QElapsedTimer tm;
|
||||
|
||||
Reference in New Issue
Block a user