From b2a2abe6aebe6cacd99582ccb0e9f4cfabb7b640 Mon Sep 17 00:00:00 2001 From: peri4 Date: Tue, 25 May 2021 23:58:03 +0300 Subject: [PATCH] project add/remove/rename optimizations, remove bugs in directories watching --- project_fs/projectfilesystemwidget.cpp | 110 ++++++++++++++++++------- project_fs/projectfilesystemwidget.h | 6 +- 2 files changed, 85 insertions(+), 31 deletions(-) diff --git a/project_fs/projectfilesystemwidget.cpp b/project_fs/projectfilesystemwidget.cpp index 2d686de..d6c88e5 100644 --- a/project_fs/projectfilesystemwidget.cpp +++ b/project_fs/projectfilesystemwidget.cpp @@ -77,9 +77,21 @@ ProjectFilesystemWidget::ProjectFilesystemWidget(QWidget * parent): QWidget(pare proj_plug = 0; //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(projectAdded(ProjectExplorer::Project*)), this, SLOT(projectsChanged())); - connect(ProjectExplorer::SessionManager::instance(), SIGNAL(projectDisplayNameChanged(ProjectExplorer::Project*)), this, SLOT(projectsChanged())); - connect(ProjectExplorer::SessionManager::instance(), SIGNAL(projectRemoved(ProjectExplorer::Project*)), this, SLOT(projectsChanged())); + connect(ProjectExplorer::SessionManager::instance(), &ProjectExplorer::SessionManager::projectAdded, [this](ProjectExplorer::Project * p){ + createProjectTree(p); + 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(Core::EditorManager::instance(), SIGNAL(currentEditorChanged(Core::IEditor*)), this, SLOT(currentFileChanged())); 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) { qDeleteAll(ti->takeChildren()); } QFileInfoList fl = QDir(dir).entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot, QDir::LocaleAware | QDir::DirsFirst); - checkProcEvents(); + if (proc_events) checkProcEvents(); fs_watcher.addPath(dir); item_map[dir] = ti; for (QFileInfo i: fl) { @@ -130,7 +151,7 @@ void ProjectFilesystemWidget::createTree(QTreeWidgetItem * ti, const QString & d ni->setData(0, roleIsDir, i.isDir()); item_map[i.absoluteFilePath()] = ni; if (i.isDir()) { - createTree(ni, dir + "/" + i.fileName()); + createTree(ni, dir + "/" + i.fileName(), proc_events); } ti->addChild(ni); } @@ -232,20 +253,7 @@ void ProjectFilesystemWidget::projectsChanged() { QApplication::setOverrideCursor(Qt::WaitCursor); QList pl = ProjectExplorer::SessionManager::projects(); for (ProjectExplorer::Project * p: pl) { - QTreeWidgetItem * ri = new QTreeWidgetItem(); - 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); + createProjectTree(p); } startupProjectChanged(); 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() { filter_dialog.setFilter(cur_filter); if (filter_dialog.exec() == QDialog::Rejected) return; @@ -294,15 +322,18 @@ void ProjectFilesystemWidget::startupProjectChanged() { } -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(); - rememberExpanded(tree->invisibleRootItem()); - createTree(ti, path); - filter(); - restoreExpanded(tree->invisibleRootItem()); +QTreeWidgetItem * ProjectFilesystemWidget::projectItem(void * p) { + if (!p) return nullptr; + for (int i = 0; i < tree->topLevelItemCount(); ++i) { + QTreeWidgetItem * ti = tree->topLevelItem(i); + if (itemProject(ti) == p) + return ti; + } + return nullptr; +} + + +void ProjectFilesystemWidget::cleanMappedItems() { QList ail = tree->findItems("", Qt::MatchContains | Qt::MatchRecursive), map_values = item_map.values(); QSet ais; //QString removed; @@ -310,8 +341,27 @@ void ProjectFilesystemWidget::directoryChanged(const QString & path) { for (auto * i: map_values) if (!ais.contains(i)) { //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, "", "remove " + removed); } diff --git a/project_fs/projectfilesystemwidget.h b/project_fs/projectfilesystemwidget.h index 8663fa9..12e027d 100644 --- a/project_fs/projectfilesystemwidget.h +++ b/project_fs/projectfilesystemwidget.h @@ -28,7 +28,9 @@ public: protected: 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); void filter(); void rememberExpanded(QTreeWidgetItem * ti); @@ -36,6 +38,8 @@ protected: void setExtVariable(); void checkProcEvents(); void * itemProject(QTreeWidgetItem * ti); + QTreeWidgetItem * projectItem(void * p); + void cleanMappedItems(); bool in_proc, need_rebuild; ExtensionSystem::IPlugin * proj_plug;