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;
|
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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user