project add/remove/rename optimizations, remove bugs in directories watching
This commit is contained in:
@@ -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<ProjectExplorer::Project *> 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<QTreeWidgetItem*> ail = tree->findItems("", Qt::MatchContains | Qt::MatchRecursive), map_values = item_map.values();
|
||||
QSet<QTreeWidgetItem*> 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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user