diff --git a/src/plugins/projectexplorer/miniprojecttargetselector.cpp b/src/plugins/projectexplorer/miniprojecttargetselector.cpp index ea21f492f38..46d71950ba6 100644 --- a/src/plugins/projectexplorer/miniprojecttargetselector.cpp +++ b/src/plugins/projectexplorer/miniprojecttargetselector.cpp @@ -213,6 +213,8 @@ ProjectListWidget::ProjectListWidget(SessionManager *sessionManager, QWidget *pa this, SLOT(removeProject(ProjectExplorer::Project*))); connect(m_sessionManager, SIGNAL(startupProjectChanged(ProjectExplorer::Project*)), this, SLOT(changeStartupProject(ProjectExplorer::Project*))); + connect(m_sessionManager, SIGNAL(projectDisplayNameChanged(ProjectExplorer::Project*)), + this, SLOT(projectDisplayNameChanged(ProjectExplorer::Project*))); connect(this, SIGNAL(currentRowChanged(int)), this, SLOT(setProject(int))); } @@ -294,6 +296,45 @@ void ProjectListWidget::removeProject(Project *project) } +void ProjectListWidget::projectDisplayNameChanged(Project *project) +{ + m_ignoreIndexChange = true; + + int oldPos = 0; + bool useFullName = false; + for (int i = 0; i < count(); ++i) { + Project *p = item(i)->data(Qt::UserRole).value(); + if (p == project) { + oldPos = i; + } else if (p->displayName() == project->displayName()) { + useFullName = true; + item(i)->setText(fullName(p)); + } + } + + bool isCurrentItem = (oldPos == currentRow()); + QListWidgetItem *projectItem = takeItem(oldPos); + + QString sortName = fullName(project); + int pos = count(); + for (int i = 0; i < count(); ++i) { + Project *p = item(i)->data(Qt::UserRole).value(); + QString itemSortName = fullName(p); + if (itemSortName > sortName) { + pos = i; + break; + } + } + + QString displayName = useFullName ? fullName(project) : project->displayName(); + projectItem->setText(displayName); + insertItem(pos, projectItem); + if (isCurrentItem) + setCurrentRow(pos); + + m_ignoreIndexChange = false; +} + void ProjectListWidget::setProject(int index) { if (m_ignoreIndexChange) @@ -538,6 +579,8 @@ MiniProjectTargetSelector::MiniProjectTargetSelector(QAction *targetSelectorActi this, SLOT(projectAdded(ProjectExplorer::Project*))); connect(m_sessionManager, SIGNAL(projectRemoved(ProjectExplorer::Project*)), this, SLOT(projectRemoved(ProjectExplorer::Project*))); + connect(m_sessionManager, SIGNAL(projectDisplayNameChanged(ProjectExplorer::Project*)), + this, SLOT(updateActionAndSummary())); connect(m_listWidgets[TARGET], SIGNAL(changeActiveProjectConfiguration(ProjectExplorer::ProjectConfiguration*)), this, SLOT(setActiveTarget(ProjectExplorer::ProjectConfiguration*))); diff --git a/src/plugins/projectexplorer/miniprojecttargetselector.h b/src/plugins/projectexplorer/miniprojecttargetselector.h index 9ce759e9e57..dd54700e4df 100644 --- a/src/plugins/projectexplorer/miniprojecttargetselector.h +++ b/src/plugins/projectexplorer/miniprojecttargetselector.h @@ -75,6 +75,7 @@ public: private slots: void addProject(ProjectExplorer::Project *project); void removeProject(ProjectExplorer::Project *project); + void projectDisplayNameChanged(ProjectExplorer::Project *project); void changeStartupProject(ProjectExplorer::Project *project); void setProject(int index); private: diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index 712de97233c..f0ec13f1513 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -119,6 +119,7 @@ public: virtual void configureAsExampleProject(const QStringList &platforms); signals: + void displayNameChanged(); void fileListChanged(); // Note: activeTarget can be 0 (if no targets are defined). diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 1611a7356df..1a2e3d53d16 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -356,6 +356,8 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er this, SLOT(projectRemoved(ProjectExplorer::Project*))); connect(d->m_session, SIGNAL(startupProjectChanged(ProjectExplorer::Project*)), this, SLOT(startupProjectChanged())); + connect(d->m_session, SIGNAL(projectDisplayNameChanged(ProjectExplorer::Project*)), + this, SLOT(projectDisplayNameChanged(ProjectExplorer::Project*))); connect(d->m_session, SIGNAL(dependencyChanged(ProjectExplorer::Project*,ProjectExplorer::Project*)), this, SLOT(updateActions())); connect(d->m_session, SIGNAL(sessionLoaded(QString)), @@ -2153,6 +2155,12 @@ void ProjectExplorerPlugin::projectRemoved(ProjectExplorer::Project * pro) this, SLOT(updateActions())); } +void ProjectExplorerPlugin::projectDisplayNameChanged(Project *pro) +{ + addToRecentProjects(pro->document()->fileName(), pro->displayName()); + updateActions(); +} + void ProjectExplorerPlugin::startupProjectChanged() { static QPointer previousStartupProject = 0; diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h index 8e61dbc71f8..8fc5509cb6c 100644 --- a/src/plugins/projectexplorer/projectexplorer.h +++ b/src/plugins/projectexplorer/projectexplorer.h @@ -220,6 +220,7 @@ private slots: void projectAdded(ProjectExplorer::Project *pro); void projectRemoved(ProjectExplorer::Project *pro); + void projectDisplayNameChanged(ProjectExplorer::Project *pro); void startupProjectChanged(); // Calls updateRunAction void activeTargetChanged(); void activeRunConfigurationChanged(); diff --git a/src/plugins/projectexplorer/projectmodels.cpp b/src/plugins/projectexplorer/projectmodels.cpp index a7c5758531e..633a7fdaa69 100644 --- a/src/plugins/projectexplorer/projectmodels.cpp +++ b/src/plugins/projectexplorer/projectmodels.cpp @@ -652,7 +652,6 @@ void FlatModel::removed(FolderNode* parentNode, const QList &newNodeList) QList::const_iterator oldIter = oldNodeList.constBegin(); QList::const_iterator newIter = newNodeList.constBegin(); - Q_ASSERT(isSorted(oldNodeList)); Q_ASSERT(isSorted(newNodeList)); QSet emptyDifference; diff --git a/src/plugins/projectexplorer/projectwindow.cpp b/src/plugins/projectexplorer/projectwindow.cpp index ceddef50bd6..7cc11f8b421 100644 --- a/src/plugins/projectexplorer/projectwindow.cpp +++ b/src/plugins/projectexplorer/projectwindow.cpp @@ -252,6 +252,9 @@ ProjectWindow::ProjectWindow(QWidget *parent) connect(session, SIGNAL(startupProjectChanged(ProjectExplorer::Project*)), this, SLOT(startupProjectChanged(ProjectExplorer::Project*))); + connect(session, SIGNAL(projectDisplayNameChanged(ProjectExplorer::Project*)), + this, SLOT(projectUpdated(ProjectExplorer::Project*))); + // Update properties to empty project for now: showProperties(-1, -1); } diff --git a/src/plugins/projectexplorer/projectwindow.h b/src/plugins/projectexplorer/projectwindow.h index 8a5be9f2f94..38a9e305034 100644 --- a/src/plugins/projectexplorer/projectwindow.h +++ b/src/plugins/projectexplorer/projectwindow.h @@ -82,7 +82,10 @@ public: void aboutToShutdown(); void extensionsInitialized(); + +public slots: void projectUpdated(ProjectExplorer::Project *p); + private slots: void targetFactoriesChanged(); void showProperties(int index, int subIndex); diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp index 1b5d5905118..4e47a8c298d 100644 --- a/src/plugins/projectexplorer/session.cpp +++ b/src/plugins/projectexplorer/session.cpp @@ -274,6 +274,9 @@ void SessionManager::addProjects(const QList &projects) connect(pro, SIGNAL(fileListChanged()), this, SLOT(clearProjectFileCache())); + connect(pro, SIGNAL(displayNameChanged()), + this, SLOT(projectDisplayNameChanged())); + if (debug) qDebug() << "SessionManager - adding project " << pro->displayName(); } @@ -910,6 +913,27 @@ void SessionManager::sessionLoadingProgress() QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); } +void SessionManager::projectDisplayNameChanged() +{ + Project *pro = qobject_cast(sender()); + if (pro) { + Node *currentNode = 0; + if (ProjectExplorerPlugin::currentProject() == pro) + currentNode = ProjectExplorerPlugin::instance()->currentNode(); + + // Fix node sorting + QList nodes; + nodes << pro->rootProjectNode(); + m_sessionNode->removeProjectNodes(nodes); + m_sessionNode->addProjectNodes(nodes); + + if (currentNode) + ProjectExplorerPlugin::instance()->setCurrentNode(currentNode); + + emit projectDisplayNameChanged(pro); + } +} + QStringList ProjectExplorer::SessionManager::projectsForSessionName(const QString &session) const { const QString fileName = sessionNameToFileName(session); diff --git a/src/plugins/projectexplorer/session.h b/src/plugins/projectexplorer/session.h index d0c5b400612..972a6496591 100644 --- a/src/plugins/projectexplorer/session.h +++ b/src/plugins/projectexplorer/session.h @@ -127,7 +127,7 @@ signals: void projectAdded(ProjectExplorer::Project *project); void singleProjectAdded(ProjectExplorer::Project *project); void aboutToRemoveProject(ProjectExplorer::Project *project); - + void projectDisplayNameChanged(ProjectExplorer::Project *project); void projectRemoved(ProjectExplorer::Project *project); void startupProjectChanged(ProjectExplorer::Project *project); @@ -147,6 +147,8 @@ private slots: void markSessionFileDirty(bool makeDefaultVirginDirty = true); void sessionLoadingProgress(); + void projectDisplayNameChanged(); + private: bool projectContainsFile(Project *p, const QString &fileName) const; void restoreValues(const Utils::PersistentSettingsReader &reader);