project add/remove/rename optimizations, remove bugs in directories watching

This commit is contained in:
2021-05-25 23:58:03 +03:00
parent 7dfcd37a87
commit b2a2abe6ae
2 changed files with 85 additions and 31 deletions

View File

@@ -77,9 +77,21 @@ ProjectFilesystemWidget::ProjectFilesystemWidget(QWidget * parent): QWidget(pare
proj_plug = 0; proj_plug = 0;
//connect(ProjectExplorer::ProjectTree::instance(), SIGNAL(subtreeChanged(ProjectExplorer::FolderNode*)), this, SLOT(projectsChanged())); //connect(ProjectExplorer::ProjectTree::instance(), SIGNAL(subtreeChanged(ProjectExplorer::FolderNode*)), this, SLOT(projectsChanged()));
connect(ProjectExplorer::SessionManager::instance(), SIGNAL(startupProjectChanged(ProjectExplorer::Project *)), this, SLOT(startupProjectChanged())); connect(ProjectExplorer::SessionManager::instance(), SIGNAL(startupProjectChanged(ProjectExplorer::Project *)), this, SLOT(startupProjectChanged()));
connect(ProjectExplorer::SessionManager::instance(), SIGNAL(projectAdded(ProjectExplorer::Project*)), this, SLOT(projectsChanged())); connect(ProjectExplorer::SessionManager::instance(), &ProjectExplorer::SessionManager::projectAdded, [this](ProjectExplorer::Project * p){
connect(ProjectExplorer::SessionManager::instance(), SIGNAL(projectDisplayNameChanged(ProjectExplorer::Project*)), this, SLOT(projectsChanged())); createProjectTree(p);
connect(ProjectExplorer::SessionManager::instance(), SIGNAL(projectRemoved(ProjectExplorer::Project*)), this, SLOT(projectsChanged())); filter();
startupProjectChanged();
});
connect(ProjectExplorer::SessionManager::instance(), &ProjectExplorer::SessionManager::projectDisplayNameChanged, [this](ProjectExplorer::Project * p){
projectNameChanged();
});
connect(ProjectExplorer::SessionManager::instance(), &ProjectExplorer::SessionManager::projectRemoved, [this](ProjectExplorer::Project * p){
QTreeWidgetItem * pi = projectItem(p);
if (!pi) return;
delete pi;
cleanMappedItems();
startupProjectChanged();
});
//connect(ProjectExplorer::SessionManager::instance(), SIGNAL(), this, SLOT(startupProjectChanged())); //connect(ProjectExplorer::SessionManager::instance(), SIGNAL(), this, SLOT(startupProjectChanged()));
connect(Core::EditorManager::instance(), SIGNAL(currentEditorChanged(Core::IEditor*)), this, SLOT(currentFileChanged())); connect(Core::EditorManager::instance(), SIGNAL(currentEditorChanged(Core::IEditor*)), this, SLOT(currentFileChanged()));
connect(&fs_watcher, SIGNAL(directoryChanged(const QString &)), this, SLOT(directoryChanged(const QString &))); connect(&fs_watcher, SIGNAL(directoryChanged(const QString &)), this, SLOT(directoryChanged(const QString &)));
@@ -105,12 +117,21 @@ void ProjectFilesystemWidget::changeEvent(QEvent *e) {
} }
void ProjectFilesystemWidget::createTree(QTreeWidgetItem * ti, const QString & dir) { void ProjectFilesystemWidget::projectNameChanged() {
for (int i = 0; i < tree->topLevelItemCount(); ++i) {
ProjectExplorer::Project * p = (ProjectExplorer::Project *)itemProject(tree->topLevelItem(i));
if (!p) continue;
tree->topLevelItem(i)->setText(0, p->displayName());
}
}
void ProjectFilesystemWidget::createTree(QTreeWidgetItem * ti, const QString & dir, bool proc_events) {
if (ti->childCount() > 0) { if (ti->childCount() > 0) {
qDeleteAll(ti->takeChildren()); qDeleteAll(ti->takeChildren());
} }
QFileInfoList fl = QDir(dir).entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot, QDir::LocaleAware | QDir::DirsFirst); QFileInfoList fl = QDir(dir).entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot, QDir::LocaleAware | QDir::DirsFirst);
checkProcEvents(); if (proc_events) checkProcEvents();
fs_watcher.addPath(dir); fs_watcher.addPath(dir);
item_map[dir] = ti; item_map[dir] = ti;
for (QFileInfo i: fl) { for (QFileInfo i: fl) {
@@ -130,7 +151,7 @@ void ProjectFilesystemWidget::createTree(QTreeWidgetItem * ti, const QString & d
ni->setData(0, roleIsDir, i.isDir()); ni->setData(0, roleIsDir, i.isDir());
item_map[i.absoluteFilePath()] = ni; item_map[i.absoluteFilePath()] = ni;
if (i.isDir()) { if (i.isDir()) {
createTree(ni, dir + "/" + i.fileName()); createTree(ni, dir + "/" + i.fileName(), proc_events);
} }
ti->addChild(ni); ti->addChild(ni);
} }
@@ -232,20 +253,7 @@ void ProjectFilesystemWidget::projectsChanged() {
QApplication::setOverrideCursor(Qt::WaitCursor); QApplication::setOverrideCursor(Qt::WaitCursor);
QList<ProjectExplorer::Project *> pl = ProjectExplorer::SessionManager::projects(); QList<ProjectExplorer::Project *> pl = ProjectExplorer::SessionManager::projects();
for (ProjectExplorer::Project * p: pl) { for (ProjectExplorer::Project * p: pl) {
QTreeWidgetItem * ri = new QTreeWidgetItem(); createProjectTree(p);
QString dir = p->projectDirectory().toString();
ri->setText(0, p->displayName());
QFile logo(dir + "/logo.png");
if (logo.exists())
ri->setIcon(0, QIcon(logo.fileName()));
else
ri->setIcon(0, Core::FileIconProvider::icon(QFileIconProvider::Folder));
ri->setData(0, roleProject, (qulonglong)p);
ri->setData(0, roleFullPath, dir);
ri->setData(0, roleIsDir, true);
ri->setData(0, roleItemType, itProject);
createTree(ri, dir);
tree->addTopLevelItem(ri);
} }
startupProjectChanged(); startupProjectChanged();
currentFileChanged(); currentFileChanged();
@@ -262,6 +270,26 @@ void ProjectFilesystemWidget::projectsChanged() {
} }
void ProjectFilesystemWidget::createProjectTree(void * p) {
if (!p) return;
ProjectExplorer::Project * pr = (ProjectExplorer::Project *)p;
QTreeWidgetItem * ri = new QTreeWidgetItem();
QString dir = pr->projectDirectory().toString();
ri->setText(0, pr->displayName());
QFile logo(dir + "/logo.png");
if (logo.exists())
ri->setIcon(0, QIcon(logo.fileName()));
else
ri->setIcon(0, Core::FileIconProvider::icon(QFileIconProvider::Folder));
ri->setData(0, roleProject, (qulonglong)pr);
ri->setData(0, roleFullPath, dir);
ri->setData(0, roleIsDir, true);
ri->setData(0, roleItemType, itProject);
createTree(ri, dir);
tree->addTopLevelItem(ri);
}
void ProjectFilesystemWidget::filterClicked() { void ProjectFilesystemWidget::filterClicked() {
filter_dialog.setFilter(cur_filter); filter_dialog.setFilter(cur_filter);
if (filter_dialog.exec() == QDialog::Rejected) return; if (filter_dialog.exec() == QDialog::Rejected) return;
@@ -294,15 +322,18 @@ void ProjectFilesystemWidget::startupProjectChanged() {
} }
void ProjectFilesystemWidget::directoryChanged(const QString & path) { QTreeWidgetItem * ProjectFilesystemWidget::projectItem(void * p) {
QTreeWidgetItem * ti = item_map.value(path); if (!p) return nullptr;
//QMessageBox::information(0, "", "changed " + path + " " + QString::number((qulonglong)ti)); for (int i = 0; i < tree->topLevelItemCount(); ++i) {
if (!ti) return; QTreeWidgetItem * ti = tree->topLevelItem(i);
int spos = tree->verticalScrollBar()->value(); if (itemProject(ti) == p)
rememberExpanded(tree->invisibleRootItem()); return ti;
createTree(ti, path); }
filter(); return nullptr;
restoreExpanded(tree->invisibleRootItem()); }
void ProjectFilesystemWidget::cleanMappedItems() {
QList<QTreeWidgetItem*> ail = tree->findItems("", Qt::MatchContains | Qt::MatchRecursive), map_values = item_map.values(); QList<QTreeWidgetItem*> ail = tree->findItems("", Qt::MatchContains | Qt::MatchRecursive), map_values = item_map.values();
QSet<QTreeWidgetItem*> ais; QSet<QTreeWidgetItem*> ais;
//QString removed; //QString removed;
@@ -310,8 +341,27 @@ void ProjectFilesystemWidget::directoryChanged(const QString & path) {
for (auto * i: map_values) for (auto * i: map_values)
if (!ais.contains(i)) { if (!ais.contains(i)) {
//removed += item_map.key(i) + "\n"; //removed += item_map.key(i) + "\n";
item_map.remove(item_map.key(i)); QString path = item_map.key(i);
if (QDir(path).exists())
fs_watcher.removePath(path);
item_map.remove(path);
} }
}
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();
//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,7 +28,9 @@ public:
protected: protected:
void changeEvent(QEvent * e); void changeEvent(QEvent * e);
void createTree(QTreeWidgetItem * ti, const QString & dir); void createTree(QTreeWidgetItem * ti, const QString & dir, bool proc_events = true);
void createProjectTree(void * p);
void projectNameChanged();
bool filterTree(QTreeWidgetItem * ti, const QString & filter); bool filterTree(QTreeWidgetItem * ti, const QString & filter);
void filter(); void filter();
void rememberExpanded(QTreeWidgetItem * ti); void rememberExpanded(QTreeWidgetItem * ti);
@@ -36,6 +38,8 @@ protected:
void setExtVariable(); void setExtVariable();
void checkProcEvents(); void checkProcEvents();
void * itemProject(QTreeWidgetItem * ti); void * itemProject(QTreeWidgetItem * ti);
QTreeWidgetItem * projectItem(void * p);
void cleanMappedItems();
bool in_proc, need_rebuild; bool in_proc, need_rebuild;
ExtensionSystem::IPlugin * proj_plug; ExtensionSystem::IPlugin * proj_plug;