AndroidRunConfiguration: Take .pro file parsing into account

Disable the runconfiguration if the project could not be parsed.

Change-Id: I979315b5e38fd1d8674da68289e021e014070c54
Reviewed-by: Daniel Teske <daniel.teske@digia.com>
This commit is contained in:
Daniel Teske
2013-10-09 16:25:57 +02:00
parent 0a43f097de
commit a97dd8aba6
3 changed files with 72 additions and 1 deletions

View File

@@ -37,10 +37,17 @@
#include <projectexplorer/target.h> #include <projectexplorer/target.h>
#include <qtsupport/qtoutputformatter.h> #include <qtsupport/qtoutputformatter.h>
#include <qtsupport/qtkitinformation.h> #include <qtsupport/qtkitinformation.h>
#include <qt4projectmanager/qt4project.h>
#include <qt4projectmanager/qt4nodes.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
namespace {
const char PRO_FILE_KEY[] = "Qt4ProjectManager.Qt4RunConfiguration.ProFile";
}
using namespace ProjectExplorer; using namespace ProjectExplorer;
using Qt4ProjectManager::Qt4Project;
namespace Android { namespace Android {
namespace Internal { namespace Internal {
@@ -49,12 +56,17 @@ AndroidRunConfiguration::AndroidRunConfiguration(Target *parent, Core::Id id, co
: RunConfiguration(parent, id) : RunConfiguration(parent, id)
, m_proFilePath(path) , m_proFilePath(path)
{ {
Qt4Project *project = static_cast<Qt4Project *>(parent->project());
m_parseSuccess = project->validParse(m_proFilePath);
m_parseInProgress = project->parseInProgress(m_proFilePath);
init(); init();
} }
AndroidRunConfiguration::AndroidRunConfiguration(Target *parent, AndroidRunConfiguration *source) AndroidRunConfiguration::AndroidRunConfiguration(Target *parent, AndroidRunConfiguration *source)
: RunConfiguration(parent, source) : RunConfiguration(parent, source)
, m_proFilePath(source->m_proFilePath) , m_proFilePath(source->m_proFilePath)
, m_parseSuccess(source->m_parseSuccess)
, m_parseInProgress(source->m_parseInProgress)
{ {
init(); init();
} }
@@ -62,6 +74,55 @@ AndroidRunConfiguration::AndroidRunConfiguration(Target *parent, AndroidRunConfi
void AndroidRunConfiguration::init() void AndroidRunConfiguration::init()
{ {
setDefaultDisplayName(defaultDisplayName()); setDefaultDisplayName(defaultDisplayName());
connect(target()->project(), SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)),
this, SLOT(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)));
}
bool AndroidRunConfiguration::fromMap(const QVariantMap &map)
{
const QDir projectDir = QDir(target()->project()->projectDirectory());
m_proFilePath = QDir::cleanPath(projectDir.filePath(map.value(QLatin1String(PRO_FILE_KEY)).toString()));
m_parseSuccess = static_cast<Qt4Project *>(target()->project())->validParse(m_proFilePath);
m_parseInProgress = static_cast<Qt4Project *>(target()->project())->parseInProgress(m_proFilePath);
return RunConfiguration::fromMap(map);
}
QVariantMap AndroidRunConfiguration::toMap() const
{
const QDir projectDir = QDir(target()->project()->projectDirectory());
QVariantMap map(RunConfiguration::toMap());
map.insert(QLatin1String(PRO_FILE_KEY), projectDir.relativeFilePath(m_proFilePath));
return map;
}
bool AndroidRunConfiguration::isEnabled() const
{
return m_parseSuccess && !m_parseInProgress;
}
QString AndroidRunConfiguration::disabledReason() const
{
if (m_parseInProgress)
return tr("The .pro file '%1' is currently being parsed.")
.arg(QFileInfo(m_proFilePath).fileName());
if (!m_parseSuccess)
return static_cast<Qt4Project *>(target()->project())->disabledReasonForRunConfiguration(m_proFilePath);
return QString();
}
void AndroidRunConfiguration::proFileUpdated(Qt4ProjectManager::Qt4ProFileNode *pro, bool success, bool parseInProgress)
{
if (m_proFilePath != pro->path())
return;
bool enabled = isEnabled();
QString reason = disabledReason();
m_parseSuccess = success;
m_parseInProgress = parseInProgress;
if (enabled != isEnabled() || reason != disabledReason())
emit enabledChanged();
} }
QWidget *AndroidRunConfiguration::createConfigurationWidget() QWidget *AndroidRunConfiguration::createConfigurationWidget()

View File

@@ -35,6 +35,8 @@
#include <projectexplorer/runconfiguration.h> #include <projectexplorer/runconfiguration.h>
namespace Qt4ProjectManager { class Qt4ProFileNode; }
namespace Android { namespace Android {
namespace Internal { namespace Internal {
@@ -59,14 +61,22 @@ public:
const QString remoteChannel() const; const QString remoteChannel() const;
const QString dumperLib() const; const QString dumperLib() const;
bool isEnabled() const;
QString disabledReason() const;
protected: protected:
AndroidRunConfiguration(ProjectExplorer::Target *parent, AndroidRunConfiguration *source); AndroidRunConfiguration(ProjectExplorer::Target *parent, AndroidRunConfiguration *source);
QString defaultDisplayName(); QString defaultDisplayName();
bool fromMap(const QVariantMap &map);
QVariantMap toMap() const;
private slots:
void proFileUpdated(Qt4ProjectManager::Qt4ProFileNode *pro, bool success, bool parseInProgress);
private: private:
void init(); void init();
QString m_proFilePath; QString m_proFilePath;
bool m_parseSuccess;
bool m_parseInProgress;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -94,7 +94,7 @@ QList<Core::Id> AndroidRunConfigurationFactory::availableCreationIds(Target *par
const Core::Id base = Core::Id(ANDROID_RC_ID_PREFIX); const Core::Id base = Core::Id(ANDROID_RC_ID_PREFIX);
foreach (Qt4ProFileNode *node, nodes) foreach (Qt4ProFileNode *node, nodes)
if (node->projectType() == ApplicationTemplate || node->projectType() == LibraryTemplate) if (node->projectType() == ApplicationTemplate || node->projectType() == LibraryTemplate)
ids << base.withSuffix(node->targetInformation().target); ids << base.withSuffix(node->path());
return ids; return ids;
} }