diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h b/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h index 964014e4aaeb94824178226a7a1f885a37aea17e..fcb5e2904ea1b0baae98f644668647b43d73591a 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h +++ b/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h @@ -42,6 +42,8 @@ const char * const CMAKEMIMETYPE = "text/x-cmake"; // TOOD check that this is c const char * const CMAKE_EDITOR_ID = "CMakeProject.CMakeEditor"; const char * const CMAKE_EDITOR_DISPLAY_NAME = "CMake Editor"; const char * const C_CMAKEEDITOR = "CMakeProject.Context.CMakeEditor"; +const char * const RUNCMAKE = "CMakeProject.RunCMake"; +const char * const RUNCMAKECONTEXTMENU = "CMakeProject.RunCMakeContextMenu"; // Project const char * const CMAKEPROJECT_ID = "CMakeProjectManager.CMakeProject"; diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp index 9d925df06e4c66916b8f69407377324df91bcffb..76976c50a2028869d1df1bc655766f7872185f63 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp @@ -31,6 +31,7 @@ ** **************************************************************************/ +#include "cmakeopenprojectwizard.h" #include "cmakeprojectmanager.h" #include "cmakeprojectconstants.h" #include "cmakeproject.h" @@ -40,7 +41,11 @@ #include #include +#include +#include +#include #include +#include #include #include #include @@ -60,6 +65,72 @@ CMakeManager::CMakeManager(CMakeSettingsPage *cmakeSettingsPage) { m_projectContext = Core::Context(CMakeProjectManager::Constants::PROJECTCONTEXT); m_projectLanguage = Core::Context(ProjectExplorer::Constants::LANG_CXX); + + ProjectExplorer::ProjectExplorerPlugin *projectExplorer = ProjectExplorer::ProjectExplorerPlugin::instance(); + connect(projectExplorer, SIGNAL(aboutToShowContextMenu(ProjectExplorer::Project*, ProjectExplorer::Node*)), + this, SLOT(updateContextMenu(ProjectExplorer::Project*, ProjectExplorer::Node*))); + + Core::ActionManager *am = Core::ICore::instance()->actionManager(); + + Core::ActionContainer *mbuild = + am->actionContainer(ProjectExplorer::Constants::M_BUILDPROJECT); + Core::ActionContainer *mproject = + am->actionContainer(ProjectExplorer::Constants::M_PROJECTCONTEXT); + Core::ActionContainer *msubproject = + am->actionContainer(ProjectExplorer::Constants::M_SUBPROJECTCONTEXT); + + m_runCMakeAction = new QAction(QIcon(), tr("Run cmake"), this); + Core::Command *command = am->registerAction(m_runCMakeAction, Constants::RUNCMAKE, m_projectContext); + command->setAttribute(Core::Command::CA_Hide); + mbuild->addAction(command, ProjectExplorer::Constants::G_BUILD_PROJECT); + connect(m_runCMakeAction, SIGNAL(triggered()), this, SLOT(runCMake())); + + m_runCMakeActionContextMenu = new QAction(QIcon(), tr("Run cmake"), this); + command = am->registerAction(m_runCMakeActionContextMenu, Constants::RUNCMAKECONTEXTMENU, m_projectContext); + command->setAttribute(Core::Command::CA_Hide); + mproject->addAction(command, ProjectExplorer::Constants::G_PROJECT_BUILD); + msubproject->addAction(command, ProjectExplorer::Constants::G_PROJECT_BUILD); + connect(m_runCMakeActionContextMenu, SIGNAL(triggered()), this, SLOT(runCMakeContextMenu())); + +} + +void CMakeManager::updateContextMenu(ProjectExplorer::Project *project, ProjectExplorer::Node *node) +{ + Q_UNUSED(node); + m_contextProject = project; +} + +void CMakeManager::runCMake() +{ + runCMake(ProjectExplorer::ProjectExplorerPlugin::instance()->currentProject()); +} + +void CMakeManager::runCMakeContextMenu() +{ + runCMake(m_contextProject); +} + +void CMakeManager::runCMake(ProjectExplorer::Project *project) +{ + if (!project) + return; + CMakeProject *cmakeProject = qobject_cast(project); + if (!cmakeProject) + return; + + if (!cmakeProject->activeTarget()) + return; + if (!cmakeProject->activeTarget()->activeBuildConfiguration()) + return; + CMakeBuildConfiguration *bc = cmakeProject->activeTarget()->activeBuildConfiguration(); + CMakeOpenProjectWizard copw(this, + cmakeProject->projectDirectory(), + bc->buildDirectory(), + CMakeOpenProjectWizard::WantToUpdate, + bc->environment()); + if (copw.exec() == QDialog::Accepted) { + cmakeProject->parseCMakeLists(); + } } Core::Context CMakeManager::projectContext() const diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.h b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.h index 6fed62b38d7576de1cb6966eefed830c01921639..9b1919491d06e93658b6106acb8633f741e144c7 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.h +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.h @@ -36,6 +36,8 @@ #include #include +#include +#include #include #include @@ -44,6 +46,7 @@ #include #include #include +#include QT_FORWARD_DECLARE_CLASS(QProcess) QT_FORWARD_DECLARE_CLASS(QLabel) @@ -84,12 +87,20 @@ public: static QString findCbpFile(const QDir &); static QString findDumperLibrary(const Utils::Environment &env); +private slots: + void updateContextMenu(ProjectExplorer::Project *project, ProjectExplorer::Node *node); + void runCMake(); + void runCMakeContextMenu(); private: + void runCMake(ProjectExplorer::Project *project); static QString qtVersionForQMake(const QString &qmakePath); static QPair findQtDir(const Utils::Environment &env); Core::Context m_projectContext; Core::Context m_projectLanguage; CMakeSettingsPage *m_settingsPage; + QAction *m_runCMakeAction; + QAction *m_runCMakeActionContextMenu; + ProjectExplorer::Project *m_contextProject; }; struct CMakeValidator