Hi, 

my fourth patch adds a sub-menu which allows to build/rebuild/clean the 
current project *only*. At the same time the patch changes the 
"build/rebuild/clean Project" to always build the dependencies, too. 

So the user gets the chance to build a project either with or without 
dependencies. 

I use to hang out on #qt-creator (choenig) if you're looking for me.
I'd be happy to get some feedback or ideas for further improvements :-).

thanks and
take care, have fun
/christian
From 64555406956b2b3357fbf7b980dfab9fccdafb1e Mon Sep 17 00:00:00 2001
From: Christian Hoenig <[email protected]>
Date: Tue, 31 Mar 2009 16:43:32 +0200
Subject: [PATCH] Implement "Build Project Only" submenu and build project dependencies

---
 src/plugins/projectexplorer/projectexplorer.cpp    |  122 +++++++++++++++++--
 src/plugins/projectexplorer/projectexplorer.h      |    7 +
 .../projectexplorer/projectexplorerconstants.h     |    4 +
 3 files changed, 120 insertions(+), 13 deletions(-)

diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index 2082b08..3751327 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -504,7 +504,6 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
     // build action
     m_buildAction = new QAction(tr("Build Project"), this);
     cmd = am->registerAction(m_buildAction, Constants::BUILD, globalcontext);
-    cmd->setAttribute(Core::Command::CA_UpdateText);
     cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+B")));
     mbuild->addAction(cmd, Constants::G_BUILD_PROJECT);
     mproject->addAction(cmd, Constants::G_PROJECT_BUILD);
@@ -521,6 +520,31 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
     mbuild->addAction(cmd, Constants::G_BUILD_PROJECT);
     mproject->addAction(cmd, Constants::G_PROJECT_BUILD);
 
+    // build project only menu
+    Core::ActionContainer *mpo = am->createMenu(Constants::BUILDPRJONLYMENU);
+    m_buildPrjOnlyMenu = mpo->menu();
+    m_buildPrjOnlyMenu->setTitle(tr("Project Only"));
+    mbuild->addMenu(mpo, Constants::G_BUILD_PROJECT);
+    mproject->addMenu(mpo, Constants::G_PROJECT_BUILD);
+
+    // build action
+    m_buildPrjOnlyAction = new QAction(tr("Build Project Only"), this);
+    cmd = am->registerAction(m_buildPrjOnlyAction, Constants::BUILDPRJONLY, globalcontext);
+    cmd->setAttribute(Core::Command::CA_UpdateText);
+    mpo->addAction(cmd, "");
+
+    // rebuild action
+    m_rebuildPrjOnlyAction = new QAction(tr("Rebuild Project only"), this);
+    cmd = am->registerAction(m_rebuildPrjOnlyAction, Constants::REBUILDPRJONLY, globalcontext);
+    cmd->setAttribute(Core::Command::CA_UpdateText);
+    mpo->addAction(cmd, "");
+
+    // clean action
+    m_cleanPrjOnlyAction = new QAction(tr("Clean Project only"), this);
+    cmd = am->registerAction(m_cleanPrjOnlyAction, Constants::CLEANPRJONLY, globalcontext);
+    cmd->setAttribute(Core::Command::CA_UpdateText);
+    mpo->addAction(cmd, "");
+
     // Add Set Build Configuration to menu
     mbuild->addMenu(mbc, Constants::G_BUILD_PROJECT);
     mproject->addMenu(mbc, Constants::G_PROJECT_CONFIG);
@@ -651,10 +675,13 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
 #if 0
     connect(m_loadAction, SIGNAL(triggered()), this, SLOT(loadAction()));
 #endif
+    connect(m_buildPrjOnlyAction, SIGNAL(triggered()), this, SLOT(buildProjectOnly()));
     connect(m_buildAction, SIGNAL(triggered()), this, SLOT(buildProject()));
     connect(m_buildSessionAction, SIGNAL(triggered()), this, SLOT(buildSession()));
+    connect(m_rebuildPrjOnlyAction, SIGNAL(triggered()), this, SLOT(rebuildProjectOnly()));
     connect(m_rebuildAction, SIGNAL(triggered()), this, SLOT(rebuildProject()));
     connect(m_rebuildSessionAction, SIGNAL(triggered()), this, SLOT(rebuildSession()));
+    connect(m_cleanPrjOnlyAction, SIGNAL(triggered()), this, SLOT(cleanProjectOnly()));
     connect(m_cleanAction, SIGNAL(triggered()), this, SLOT(cleanProject()));
     connect(m_cleanSessionAction, SIGNAL(triggered()), this, SLOT(cleanSession()));
     connect(m_runAction, SIGNAL(triggered()), this, SLOT(runProject()));
@@ -1247,15 +1274,27 @@ void ProjectExplorerPlugin::updateActions()
     m_unloadAction->setEnabled(m_currentProject != 0);
     if (m_currentProject == 0) {
         m_unloadAction->setText(tr("Unload Project"));
-        m_buildAction->setText(tr("Build Project"));
+        m_buildPrjOnlyMenu->setTitle(tr("Project only"));
+        m_buildPrjOnlyAction->setText(tr("Build Project only"));
+        m_rebuildPrjOnlyAction->setText(tr("Rebuild Project only"));
+        m_cleanPrjOnlyAction->setText(tr("Clean Project only"));
     } else {
         m_unloadAction->setText(tr("Unload Project \"%1\"").arg(m_currentProject->name()));
-        m_buildAction->setText(tr("Build Project \"%1\"").arg(m_currentProject->name()));
+        m_buildPrjOnlyMenu->setTitle(tr("Project \"%1\" only").arg(m_currentProject->name()));
+        m_buildPrjOnlyAction->setText(tr("Build Project \"%1\" only").arg(m_currentProject->name()));
+        m_rebuildPrjOnlyAction->setText(tr("Rebuild Project \"%1\" only").arg(m_currentProject->name()));
+        m_cleanPrjOnlyAction->setText(tr("Clean Project \"%1\" only").arg(m_currentProject->name()));
     }
 
     m_buildAction->setEnabled(enableBuildActions);
     m_rebuildAction->setEnabled(enableBuildActions);
     m_cleanAction->setEnabled(enableBuildActions);
+
+    m_buildPrjOnlyMenu->setEnabled(enableBuildActions);
+    m_buildPrjOnlyAction->setEnabled(enableBuildActions);
+    m_rebuildPrjOnlyAction->setEnabled(enableBuildActions);
+    m_cleanPrjOnlyAction->setEnabled(enableBuildActions);
+
     m_clearSession->setEnabled(hasProjects && !building);
     m_buildSessionAction->setEnabled(hasProjects && !building);
     m_rebuildSessionAction->setEnabled(hasProjects && !building);
@@ -1332,15 +1371,30 @@ bool ProjectExplorerPlugin::saveModifiedFiles(const QList<Project *> & projects)
 //NBS handle case where there is no activeBuildConfiguration
 // because someone delete all build configurations
 
-void ProjectExplorerPlugin::buildProject()
+void ProjectExplorerPlugin::buildProjectOnly()
 {
     if (debug)
-        qDebug() << "ProjectExplorerPlugin::buildProject";
+        qDebug() << "ProjectExplorerPlugin::buildProjectOnly";
 
     if (saveModifiedFiles(QList<Project *>() << m_currentProject))
         buildManager()->buildProject(m_currentProject, m_currentProject->activeBuildConfiguration());
 }
 
+void ProjectExplorerPlugin::buildProject()
+{
+    if (debug)
+        qDebug() << "ProjectExplorerPlugin::buildProject";
+
+    const QList<Project *> & projects = m_session->projectOrder(m_currentProject);
+    if (saveModifiedFiles(projects)) {
+        QStringList configurations;
+        foreach (const Project * pro, projects)
+            configurations << pro->activeBuildConfiguration();
+
+        m_buildManager->buildProjects(projects, configurations);
+    }
+}
+
 void ProjectExplorerPlugin::buildSession()
 {
     if (debug)
@@ -1356,10 +1410,10 @@ void ProjectExplorerPlugin::buildSession()
     }
 }
 
-void ProjectExplorerPlugin::rebuildProject()
+void ProjectExplorerPlugin::rebuildProjectOnly()
 {
     if (debug)
-        qDebug() << "ProjectExplorerPlugin::rebuildProject";
+        qDebug() << "ProjectExplorerPlugin::rebuildProjectOnly";
 
     if (saveModifiedFiles(QList<Project *>() << m_currentProject)) {
         m_buildManager->cleanProject(m_currentProject, m_currentProject->activeBuildConfiguration());
@@ -1367,6 +1421,22 @@ void ProjectExplorerPlugin::rebuildProject()
     }
 }
 
+void ProjectExplorerPlugin::rebuildProject()
+{
+    if (debug)
+        qDebug() << "ProjectExplorerPlugin::rebuildProject";
+
+    const QList<Project *> & projects = m_session->projectOrder(m_currentProject);
+    if (saveModifiedFiles(projects)) {
+        QStringList configurations;
+        foreach (const Project * pro, projects)
+            configurations << pro->activeBuildConfiguration();
+
+        m_buildManager->cleanProjects(projects, configurations);
+        m_buildManager->buildProjects(projects, configurations);
+    }
+}
+
 void ProjectExplorerPlugin::rebuildSession()
 {
     if (debug)
@@ -1383,15 +1453,30 @@ void ProjectExplorerPlugin::rebuildSession()
     }
 }
 
-void ProjectExplorerPlugin::cleanProject()
+void ProjectExplorerPlugin::cleanProjectOnly()
 {
     if (debug)
-        qDebug() << "ProjectExplorerPlugin::cleanProject";
+        qDebug() << "ProjectExplorerPlugin::cleanProjectOnly";
 
     if (saveModifiedFiles(QList<Project *>() << m_currentProject))
         m_buildManager->cleanProject(m_currentProject, m_currentProject->activeBuildConfiguration());
 }
 
+void ProjectExplorerPlugin::cleanProject()
+{
+    if (debug)
+        qDebug() << "ProjectExplorerPlugin::cleanProject";
+
+    const QList<Project *> & projects = m_session->projectOrder(m_currentProject);
+    if (saveModifiedFiles(projects)) {
+        QStringList configurations;
+        foreach (const Project * pro, projects)
+            configurations << pro->activeBuildConfiguration();
+
+        m_buildManager->cleanProjects(projects, configurations);
+    }
+}
+
 void ProjectExplorerPlugin::cleanSession()
 {
     if (debug)
@@ -1426,8 +1511,13 @@ void ProjectExplorerPlugin::runProjectImpl(Project *pro)
         m_runMode = ProjectExplorer::Constants::RUNMODE;
 
         m_delayedRunConfiguration = pro->activeRunConfiguration();
-        //NBS TODO make the build project step take into account project dependencies
-        m_buildManager->buildProject(pro, pro->activeBuildConfiguration());
+
+        const QList<Project *> & projects = m_session->projectOrder(pro);
+        QStringList configurations;
+        foreach (const Project * prj, projects)
+            configurations << prj->activeBuildConfiguration();
+
+        m_buildManager->buildProjects(projects, configurations);
     }
 }
 
@@ -1440,8 +1530,14 @@ void ProjectExplorerPlugin::debugProject()
     if (saveModifiedFiles(QList<Project *>() << pro)) {
         m_runMode = ProjectExplorer::Constants::DEBUGMODE;
         m_delayedRunConfiguration = pro->activeRunConfiguration();
-        //NBS TODO make the build project step take into account project dependencies
-        m_buildManager->buildProject(pro, pro->activeBuildConfiguration());
+
+        const QList<Project *> & projects = m_session->projectOrder(pro);
+        QStringList configurations;
+        foreach (const Project * prj, projects)
+            configurations << prj->activeBuildConfiguration();
+
+        m_buildManager->buildProjects(projects, configurations);
+
         updateRunAction();
     }
 }
diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h
index 08c27ef..852b742 100644
--- a/src/plugins/projectexplorer/projectexplorer.h
+++ b/src/plugins/projectexplorer/projectexplorer.h
@@ -127,10 +127,13 @@ signals:
 private slots:
     void buildStateChanged(ProjectExplorer::Project * pro);
     void buildQueueFinished(bool success);
+    void buildProjectOnly();
     void buildProject();
     void buildSession();
+    void rebuildProjectOnly();
     void rebuildProject();
     void rebuildSession();
+    void cleanProjectOnly();
     void cleanProject();
     void cleanSession();
     void cancelBuild();
@@ -218,10 +221,13 @@ private:
 #endif
     QAction *m_unloadAction;
     QAction *m_clearSession;
+    QAction *m_buildPrjOnlyAction;
     QAction *m_buildAction;
     QAction *m_buildSessionAction;
+    QAction *m_rebuildPrjOnlyAction;
     QAction *m_rebuildAction;
     QAction *m_rebuildSessionAction;
+    QAction *m_cleanPrjOnlyAction;
     QAction *m_cleanAction;
     QAction *m_cleanSessionAction;
     QAction *m_runAction;
@@ -239,6 +245,7 @@ private:
     QAction *m_removeFileAction;
     QAction *m_renameFileAction;
 
+    QMenu *m_buildPrjOnlyMenu;
     QMenu *m_buildConfigurationMenu;
     QActionGroup *m_buildConfigurationActionGroup;
     QMenu *m_runConfigurationMenu;
diff --git a/src/plugins/projectexplorer/projectexplorerconstants.h b/src/plugins/projectexplorer/projectexplorerconstants.h
index a9638b2..9eb6cfc 100644
--- a/src/plugins/projectexplorer/projectexplorerconstants.h
+++ b/src/plugins/projectexplorer/projectexplorerconstants.h
@@ -43,12 +43,16 @@ const char * const NEWPROJECT           = "ProjectExplorer.NewProject";
 const char * const LOAD                 = "ProjectExplorer.Load";
 const char * const UNLOAD               = "ProjectExplorer.Unload";
 const char * const CLEARSESSION         = "ProjectExplorer.ClearSession";
+const char * const BUILDPRJONLY         = "ProjectExplorer.BuildProjectOnly";
 const char * const BUILD                = "ProjectExplorer.Build";
 const char * const BUILDSESSION         = "ProjectExplorer.BuildSession";
+const char * const REBUILDPRJONLY       = "ProjectExplorer.RebuildProjectOnly";
 const char * const REBUILD              = "ProjectExplorer.Rebuild";
 const char * const REBUILDSESSION       = "ProjectExplorer.RebuildSession";
+const char * const CLEANPRJONLY         = "ProjectExplorer.CleanProjectOnly";
 const char * const CLEAN                = "ProjectExplorer.Clean";
 const char * const CLEANSESSION         = "ProjectExplorer.CleanSession";
+const char * const BUILDPRJONLYMENU     = "ProjectExplorer.BuildProjectOnlyMenu";
 const char * const BUILDCONFIGURATIONMENU = "ProjectExplorer.BuildConfigurationMenu";
 const char * const CANCELBUILD          = "ProjectExplorer.CancelBuild";
 const char * const RUNCONFIGURATIONMENU = "ProjectExplorer.RunConfigurationMenu";
-- 
1.6.0.6

_______________________________________________
Qt-creator mailing list
[email protected]
http://lists.trolltech.com/mailman/listinfo/qt-creator

Reply via email to