Qnx: Save BlackBerry user configurations

* Add a bbndkconfigurations.xml file to store BlackBerry user configurations
* Save both manual and auto detected user configurations
* Mark invalid configurations in the BlackBerry settings widget
* Provide a cleanup user action to clear invalid configurations

Task-number: QTCREATORBUG-11004

Change-Id: Ibb29aa5010317f62233865d42d6ca4ae3afa0de3
Reviewed-by: David Kaspar <dkaspar@blackberry.com>
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
This commit is contained in:
El Mehdi Fekari
2013-12-05 18:24:08 +01:00
committed by Mehdi Fekari
parent 1131c11a11
commit 41a2059f85
10 changed files with 217 additions and 139 deletions

View File

@@ -65,8 +65,16 @@ using namespace Debugger;
namespace Qnx { namespace Qnx {
namespace Internal { namespace Internal {
const QLatin1String NDKEnvFileKey("NDKEnvFile");
const QLatin1String NDKPathKey("NDKPath");
const QLatin1String NDKDisplayNameKey("NDKDisplayName");
const QLatin1String NDKTargetKey("NDKTarget");
const QLatin1String NDKHostKey("NDKHost");
const QLatin1String NDKVersionKey("NDKVersion");
const QLatin1String NDKAutoDetectionSourceKey("NDKAutoDetectionSource");
const QLatin1String NDKAutoDetectedKey("NDKAutoDetectedKey");
BlackBerryConfiguration::BlackBerryConfiguration(const NdkInstallInformation &ndkInstallInfo) BlackBerryConfiguration::BlackBerryConfiguration(const NdkInstallInformation &ndkInstallInfo)
: m_isAutoDetected(true)
{ {
QString envFilePath = QnxUtils::envFilePath(ndkInstallInfo.path, ndkInstallInfo.version); QString envFilePath = QnxUtils::envFilePath(ndkInstallInfo.path, ndkInstallInfo.version);
QTC_ASSERT(!envFilePath.isEmpty(), return); QTC_ASSERT(!envFilePath.isEmpty(), return);
@@ -79,11 +87,12 @@ BlackBerryConfiguration::BlackBerryConfiguration(const NdkInstallInformation &nd
m_qnxHost = ndkInstallInfo.host; m_qnxHost = ndkInstallInfo.host;
m_sysRoot = FileName::fromString(ndkInstallInfo.target); m_sysRoot = FileName::fromString(ndkInstallInfo.target);
m_version = BlackBerryVersionNumber(ndkInstallInfo.version); m_version = BlackBerryVersionNumber(ndkInstallInfo.version);
m_autoDetectionSource = Utils::FileName::fromString(ndkInstallInfo.installationXmlFilePath);
ctor(); ctor();
} }
BlackBerryConfiguration::BlackBerryConfiguration(const FileName &ndkEnvFile) BlackBerryConfiguration::BlackBerryConfiguration(const FileName &ndkEnvFile)
: m_isAutoDetected(false) : m_autoDetectionSource(Utils::FileName())
{ {
QTC_ASSERT(!QFileInfo(ndkEnvFile.toString()).isDir(), return); QTC_ASSERT(!QFileInfo(ndkEnvFile.toString()).isDir(), return);
m_ndkEnvFile = ndkEnvFile; m_ndkEnvFile = ndkEnvFile;
@@ -115,6 +124,25 @@ BlackBerryConfiguration::BlackBerryConfiguration(const FileName &ndkEnvFile)
ctor(); ctor();
} }
BlackBerryConfiguration::BlackBerryConfiguration(const QVariantMap &data)
{
QString envFilePath = data.value(NDKEnvFileKey).toString();
QTC_ASSERT(!envFilePath.isEmpty(), return);
m_ndkEnvFile = Utils::FileName::fromString(envFilePath);
m_displayName = data.value(NDKDisplayNameKey).toString();
m_qnxEnv = QnxUtils::qnxEnvironmentFromNdkFile(m_ndkEnvFile.toString());
QString sep = QString::fromLatin1("/qnx6");
// The QNX_TARGET value is using Unix-like separator on all platforms.
m_targetName = data.value(NDKTargetKey).toString().split(sep).first().split(QLatin1Char('/')).last();
m_qnxHost = data.value(NDKHostKey).toString();
m_sysRoot = FileName::fromString(data.value(NDKTargetKey).toString());
m_version = BlackBerryVersionNumber(data.value(NDKVersionKey).toString());
if (data.value(QLatin1String(NDKAutoDetectedKey)).toBool())
m_autoDetectionSource = Utils::FileName::fromString(data.value(NDKAutoDetectionSourceKey).toString());
ctor();
}
void BlackBerryConfiguration::ctor() void BlackBerryConfiguration::ctor()
{ {
FileName qmake4Path = QnxUtils::executableWithExtension(FileName::fromString(m_qnxHost + QLatin1String("/usr/bin/qmake"))); FileName qmake4Path = QnxUtils::executableWithExtension(FileName::fromString(m_qnxHost + QLatin1String("/usr/bin/qmake")));
@@ -166,7 +194,12 @@ BlackBerryVersionNumber BlackBerryConfiguration::version() const
bool BlackBerryConfiguration::isAutoDetected() const bool BlackBerryConfiguration::isAutoDetected() const
{ {
return m_isAutoDetected; return !m_autoDetectionSource.isEmpty();
}
Utils::FileName BlackBerryConfiguration::autoDetectionSource() const
{
return m_autoDetectionSource;
} }
bool BlackBerryConfiguration::isActive() const bool BlackBerryConfiguration::isActive() const
@@ -182,8 +215,11 @@ bool BlackBerryConfiguration::isActive() const
bool BlackBerryConfiguration::isValid() const bool BlackBerryConfiguration::isValid() const
{ {
return !((m_qmake4BinaryFile.isEmpty() && m_qmake5BinaryFile.isEmpty()) || m_gccCompiler.isEmpty() return ((!m_qmake4BinaryFile.isEmpty() || !m_qmake5BinaryFile.isEmpty()) && !m_gccCompiler.isEmpty()
|| m_deviceDebugger.isEmpty() || m_simulatorDebugger.isEmpty()); && !m_deviceDebugger.isEmpty() && !m_simulatorDebugger.isEmpty()
&& m_ndkEnvFile.toFileInfo().exists() && (m_autoDetectionSource.isEmpty() ||
m_autoDetectionSource.toFileInfo().exists())
&& m_sysRoot.toFileInfo().exists());
} }
FileName BlackBerryConfiguration::ndkEnvFile() const FileName BlackBerryConfiguration::ndkEnvFile() const
@@ -226,6 +262,20 @@ QList<Utils::EnvironmentItem> BlackBerryConfiguration::qnxEnv() const
return m_qnxEnv; return m_qnxEnv;
} }
QVariantMap BlackBerryConfiguration::toMap() const
{
QVariantMap data;
data.insert(QLatin1String(NDKEnvFileKey), m_ndkEnvFile.toString());
data.insert(QLatin1String(NDKDisplayNameKey), m_displayName);
data.insert(QLatin1String(NDKPathKey), ndkPath());
data.insert(QLatin1String(NDKTargetKey), m_sysRoot.toString());
data.insert(QLatin1String(NDKHostKey), m_qnxHost);
data.insert(QLatin1String(NDKVersionKey), m_version.toString());
data.insert(QLatin1String(NDKAutoDetectionSourceKey), m_autoDetectionSource.toString());
data.insert(QLatin1String(NDKAutoDetectedKey), isAutoDetected());
return data;
}
QnxAbstractQtVersion *BlackBerryConfiguration::createQtVersion( QnxAbstractQtVersion *BlackBerryConfiguration::createQtVersion(
const FileName &qmakePath, Qnx::QnxArchitecture arch, const QString &versionName) const FileName &qmakePath, Qnx::QnxArchitecture arch, const QString &versionName)
{ {
@@ -302,7 +352,7 @@ Kit *BlackBerryConfiguration::createKit(
bool BlackBerryConfiguration::activate() bool BlackBerryConfiguration::activate()
{ {
if (!isValid()) { if (!isValid()) {
if (m_isAutoDetected) if (!m_autoDetectionSource.isEmpty())
return false; return false;
QString errorMessage = tr("The following errors occurred while activating target: %1").arg(m_targetName); QString errorMessage = tr("The following errors occurred while activating target: %1").arg(m_targetName);

View File

@@ -64,6 +64,7 @@ class BlackBerryConfiguration
public: public:
BlackBerryConfiguration(const NdkInstallInformation &ndkInstallInfo); BlackBerryConfiguration(const NdkInstallInformation &ndkInstallInfo);
BlackBerryConfiguration(const Utils::FileName &ndkEnvFile); BlackBerryConfiguration(const Utils::FileName &ndkEnvFile);
BlackBerryConfiguration(const QVariantMap &data);
bool activate(); bool activate();
void deactivate(); void deactivate();
QString ndkPath() const; QString ndkPath() const;
@@ -72,6 +73,7 @@ public:
QString qnxHost() const; QString qnxHost() const;
BlackBerryVersionNumber version() const; BlackBerryVersionNumber version() const;
bool isAutoDetected() const; bool isAutoDetected() const;
Utils::FileName autoDetectionSource() const;
bool isActive() const; bool isActive() const;
bool isValid() const; bool isValid() const;
Utils::FileName ndkEnvFile() const; Utils::FileName ndkEnvFile() const;
@@ -82,13 +84,14 @@ public:
Utils::FileName simulatorDebuger() const; Utils::FileName simulatorDebuger() const;
Utils::FileName sysRoot() const; Utils::FileName sysRoot() const;
QList<Utils::EnvironmentItem> qnxEnv() const; QList<Utils::EnvironmentItem> qnxEnv() const;
QVariantMap toMap() const;
private: private:
QString m_displayName; QString m_displayName;
QString m_targetName; QString m_targetName;
QString m_qnxHost; QString m_qnxHost;
bool m_isAutoDetected;
BlackBerryVersionNumber m_version; BlackBerryVersionNumber m_version;
Utils::FileName m_autoDetectionSource;
Utils::FileName m_ndkEnvFile; Utils::FileName m_ndkEnvFile;
Utils::FileName m_qmake4BinaryFile; Utils::FileName m_qmake4BinaryFile;
Utils::FileName m_qmake5BinaryFile; Utils::FileName m_qmake5BinaryFile;
@@ -99,6 +102,7 @@ private:
QList<Utils::EnvironmentItem> m_qnxEnv; QList<Utils::EnvironmentItem> m_qnxEnv;
void ctor(); void ctor();
QnxAbstractQtVersion* createQtVersion( QnxAbstractQtVersion* createQtVersion(
const Utils::FileName &qmakePath, Qnx::QnxArchitecture arch, const QString &versionName); const Utils::FileName &qmakePath, Qnx::QnxArchitecture arch, const QString &versionName);
QnxToolChain* createToolChain( QnxToolChain* createToolChain(

View File

@@ -67,6 +67,15 @@ const QLatin1String NDKEnvFileKey("NDKEnvFile");
const QLatin1String ManualNDKsGroup("ManualNDKs"); const QLatin1String ManualNDKsGroup("ManualNDKs");
const QLatin1String ActiveNDKsGroup("ActiveNDKs"); const QLatin1String ActiveNDKsGroup("ActiveNDKs");
const QLatin1String DefaultApiLevelKey("DefaultApiLevel"); const QLatin1String DefaultApiLevelKey("DefaultApiLevel");
const QLatin1String BBConfigsFileVersionKey("Version");
const QLatin1String BBConfigDataKey("BBConfiguration.");
const QLatin1String BBConfigCountKey("BBConfiguration.Count");
}
static Utils::FileName bbConfigSettingsFileName()
{
return Utils::FileName::fromString(Core::ICore::userResourcePath() + QLatin1String("/qnx/")
+ QLatin1String(Constants::QNX_BLACKBERRY_CONFIGS_FILENAME));
} }
static bool sortConfigurationsByVersion(const BlackBerryConfiguration *a, const BlackBerryConfiguration *b) static bool sortConfigurationsByVersion(const BlackBerryConfiguration *a, const BlackBerryConfiguration *b)
@@ -78,9 +87,50 @@ BlackBerryConfigurationManager::BlackBerryConfigurationManager(QObject *parent)
: QObject(parent), : QObject(parent),
m_defaultApiLevel(0) m_defaultApiLevel(0)
{ {
m_writer = new Utils::PersistentSettingsWriter(bbConfigSettingsFileName(),
QLatin1String("BlackBerryConfigurations"));
connect(Core::ICore::instance(), SIGNAL(saveSettingsRequested()), this, SLOT(saveSettings())); connect(Core::ICore::instance(), SIGNAL(saveSettingsRequested()), this, SLOT(saveSettings()));
} }
void BlackBerryConfigurationManager::saveConfigurations()
{
QTC_ASSERT(m_writer, return);
QVariantMap data;
data.insert(QLatin1String(BBConfigsFileVersionKey), 1);
int count = 0;
foreach (BlackBerryConfiguration *config, m_configs) {
QVariantMap tmp = config->toMap();
if (tmp.isEmpty())
continue;
data.insert(BBConfigDataKey + QString::number(count), tmp);
++count;
}
data.insert(QLatin1String(BBConfigCountKey), count);
m_writer->save(data, Core::ICore::mainWindow());
}
void BlackBerryConfigurationManager::restoreConfigurations()
{
Utils::PersistentSettingsReader reader;
if (!reader.load(bbConfigSettingsFileName()))
return;
QVariantMap data = reader.restoreValues();
int count = data.value(BBConfigCountKey, 0).toInt();
for (int i = 0; i < count; ++i) {
const QString key = BBConfigDataKey + QString::number(i);
if (!data.contains(key))
continue;
const QVariantMap dMap = data.value(key).toMap();
insertByVersion(new BlackBerryConfiguration(dMap));
}
}
// Backward compatibility: Read existing entries in the ManualNDKsGroup
// and then remove the group since not used.
void BlackBerryConfigurationManager::loadManualConfigurations() void BlackBerryConfigurationManager::loadManualConfigurations()
{ {
QSettings *settings = Core::ICore::settings(); QSettings *settings = Core::ICore::settings();
@@ -107,6 +157,7 @@ void BlackBerryConfigurationManager::loadManualConfigurations()
} }
settings->endGroup(); settings->endGroup();
settings->remove(ManualNDKsGroup);
settings->endGroup(); settings->endGroup();
} }
@@ -142,25 +193,13 @@ void BlackBerryConfigurationManager::loadDefaultApiLevel()
void BlackBerryConfigurationManager::loadAutoDetectedConfigurations() void BlackBerryConfigurationManager::loadAutoDetectedConfigurations()
{ {
QStringList activePaths = activeConfigurationNdkEnvPaths();
foreach (const NdkInstallInformation &ndkInfo, QnxUtils::installedNdks()) { foreach (const NdkInstallInformation &ndkInfo, QnxUtils::installedNdks()) {
BlackBerryConfiguration *config = new BlackBerryConfiguration(ndkInfo); BlackBerryConfiguration *config = new BlackBerryConfiguration(ndkInfo);
if (!addConfiguration(config)) { if (!addConfiguration(config)) {
delete config; delete config;
continue; continue;
} }
// Activate targets
foreach (const QString activeNdkEnvPath, activePaths) {
if (config->ndkEnvFile().toString() == activeNdkEnvPath)
config->activate();
}
} }
// If no target was/is activated, activate one since it's needed by
// device connection and CSK code.
if (activeConfigurations().isEmpty() && !m_configs.isEmpty())
m_configs.first()->activate();
} }
void BlackBerryConfigurationManager::setDefaultApiLevel(BlackBerryConfiguration *config) void BlackBerryConfigurationManager::setDefaultApiLevel(BlackBerryConfiguration *config)
@@ -175,45 +214,6 @@ void BlackBerryConfigurationManager::setDefaultApiLevel(BlackBerryConfiguration
m_defaultApiLevel = config; m_defaultApiLevel = config;
} }
QStringList BlackBerryConfigurationManager::activeConfigurationNdkEnvPaths()
{
QStringList actives;
QSettings *settings = Core::ICore::settings();
settings->beginGroup(SettingsGroup);
settings->beginGroup(ActiveNDKsGroup);
foreach (const QString &activeNdkEnvPath, settings->childGroups()) {
settings->beginGroup(activeNdkEnvPath);
actives.append(settings->value(NDKEnvFileKey).toString());
settings->endGroup();
}
settings->endGroup();
settings->endGroup();
return actives;
}
void BlackBerryConfigurationManager::saveManualConfigurations()
{
if (manualConfigurations().isEmpty())
return;
QSettings *settings = Core::ICore::settings();
settings->beginGroup(SettingsGroup);
settings->beginGroup(ManualNDKsGroup);
foreach (BlackBerryConfiguration *config, manualConfigurations()) {
settings->beginGroup(config->displayName());
settings->setValue(NDKEnvFileKey, config->ndkEnvFile().toString());
settings->endGroup();
}
settings->endGroup();
settings->endGroup();
}
void BlackBerryConfigurationManager::saveDefaultApiLevel() void BlackBerryConfigurationManager::saveDefaultApiLevel()
{ {
if (!m_defaultApiLevel) if (!m_defaultApiLevel)
@@ -225,51 +225,6 @@ void BlackBerryConfigurationManager::saveDefaultApiLevel()
settings->endGroup(); settings->endGroup();
} }
void BlackBerryConfigurationManager::saveActiveConfigurationNdkEnvPath()
{
if (activeConfigurations().isEmpty())
return;
QSettings *settings = Core::ICore::settings();
settings->beginGroup(SettingsGroup);
settings->beginGroup(ActiveNDKsGroup);
settings->remove(QString());
foreach (BlackBerryConfiguration *config, activeConfigurations()) {
settings->beginGroup(config->displayName());
settings->setValue(NDKEnvFileKey, config->ndkEnvFile().toString());
settings->endGroup();
}
settings->endGroup();
settings->endGroup();
}
// Remove no longer available/valid 'auto detected' BlackBerry kits and qt versions
void BlackBerryConfigurationManager::clearInvalidConfigurations()
{
// Deregister invalid auto deteted BlackBerry Kits
foreach (Kit *kit, KitManager::kits()) {
if (!kit->isAutoDetected())
continue;
if (DeviceTypeKitInformation::deviceTypeId(kit) == Constants::QNX_BB_OS_TYPE
&& !kit->isValid())
KitManager::deregisterKit(kit);
}
// Remove invalid auto detected BlackBerry qtVerions
foreach (QtSupport::BaseQtVersion *qtVersion, QtSupport::QtVersionManager::versions()) {
if (!qtVersion->isAutodetected())
continue;
if (qtVersion->platformName() == QLatin1String(Constants::QNX_BB_PLATFORM_NAME)
&& !qtVersion->isValid())
QtSupport::QtVersionManager::removeVersion(qtVersion);
}
}
void BlackBerryConfigurationManager::setKitsAutoDetectionSource() void BlackBerryConfigurationManager::setKitsAutoDetectionSource()
{ {
foreach (Kit *kit, KitManager::kits()) { foreach (Kit *kit, KitManager::kits()) {
@@ -287,6 +242,13 @@ void BlackBerryConfigurationManager::setKitsAutoDetectionSource()
} }
} }
void BlackBerryConfigurationManager::insertByVersion(BlackBerryConfiguration *config)
{
QList<BlackBerryConfiguration *>::iterator it = qLowerBound(m_configs.begin(), m_configs.end(),
config, &sortConfigurationsByVersion);
m_configs.insert(it, config);
}
// Switch to QnxToolchain for exisintg configuration using GccToolChain // Switch to QnxToolchain for exisintg configuration using GccToolChain
void BlackBerryConfigurationManager::checkToolChainConfiguration() void BlackBerryConfigurationManager::checkToolChainConfiguration()
{ {
@@ -308,8 +270,7 @@ void BlackBerryConfigurationManager::checkToolChainConfiguration()
bool BlackBerryConfigurationManager::addConfiguration(BlackBerryConfiguration *config) bool BlackBerryConfigurationManager::addConfiguration(BlackBerryConfiguration *config)
{ {
foreach (BlackBerryConfiguration *c, m_configs) { foreach (BlackBerryConfiguration *c, m_configs) {
if (c->ndkPath() == config->ndkPath() if (config->ndkEnvFile() == c->ndkEnvFile()) {
&& c->targetName() == config->targetName()) {
if (!config->isAutoDetected()) if (!config->isAutoDetected())
QMessageBox::warning(Core::ICore::mainWindow(), tr("NDK Already Known"), QMessageBox::warning(Core::ICore::mainWindow(), tr("NDK Already Known"),
tr("The NDK already has a configuration."), QMessageBox::Ok); tr("The NDK already has a configuration."), QMessageBox::Ok);
@@ -318,9 +279,7 @@ bool BlackBerryConfigurationManager::addConfiguration(BlackBerryConfiguration *c
} }
if (config->isValid()) { if (config->isValid()) {
QList<BlackBerryConfiguration *>::iterator it = qLowerBound(m_configs.begin(), m_configs.end(), insertByVersion(config);
config, &sortConfigurationsByVersion);
m_configs.insert(it, config);
return true; return true;
} }
@@ -335,8 +294,6 @@ void BlackBerryConfigurationManager::removeConfiguration(BlackBerryConfiguration
if (config->isActive()) if (config->isActive())
config->deactivate(); config->deactivate();
clearConfigurationSettings(config);
m_configs.removeAt(m_configs.indexOf(config)); m_configs.removeAt(m_configs.indexOf(config));
if (m_defaultApiLevel == config) { if (m_defaultApiLevel == config) {
@@ -409,39 +366,25 @@ void BlackBerryConfigurationManager::loadSettings()
// Backward compatibility: Set kit's auto detection source // Backward compatibility: Set kit's auto detection source
// for existing BlackBerry kits that do not have it set yet. // for existing BlackBerry kits that do not have it set yet.
setKitsAutoDetectionSource(); setKitsAutoDetectionSource();
clearInvalidConfigurations();
loadAutoDetectedConfigurations(); restoreConfigurations();
// For backward compatibility
loadManualConfigurations(); loadManualConfigurations();
loadAutoDetectedConfigurations();
loadDefaultApiLevel(); loadDefaultApiLevel();
checkToolChainConfiguration(); checkToolChainConfiguration();
// If no target was/is activated, activate one since it's needed by
// device connection and CSK code.
if (activeConfigurations().isEmpty() && !m_configs.isEmpty())
m_configs.first()->activate();
emit settingsLoaded(); emit settingsLoaded();
} }
void BlackBerryConfigurationManager::clearConfigurationSettings(BlackBerryConfiguration *config)
{
if (!config)
return;
QSettings *settings = Core::ICore::settings();
settings->beginGroup(SettingsGroup);
settings->beginGroup(ManualNDKsGroup);
foreach (const QString &manualNdk, settings->childGroups()) {
if (manualNdk == config->displayName()) {
settings->remove(manualNdk);
break;
}
}
settings->endGroup();
settings->endGroup();
}
void BlackBerryConfigurationManager::saveSettings() void BlackBerryConfigurationManager::saveSettings()
{ {
saveActiveConfigurationNdkEnvPath(); saveConfigurations();
saveManualConfigurations();
saveDefaultApiLevel(); saveDefaultApiLevel();
} }

View File

@@ -38,6 +38,8 @@
#include <QSettings> #include <QSettings>
#include <QObject> #include <QObject>
namespace Utils { class PersistentSettingsWriter; }
namespace Qnx { namespace Qnx {
namespace Internal { namespace Internal {
@@ -81,17 +83,21 @@ signals:
private: private:
BlackBerryConfigurationManager(QObject *parent = 0); BlackBerryConfigurationManager(QObject *parent = 0);
QList<BlackBerryConfiguration*> m_configs; QList<BlackBerryConfiguration*> m_configs;
BlackBerryConfiguration *m_defaultApiLevel; BlackBerryConfiguration *m_defaultApiLevel;
void loadManualConfigurations();
void loadDefaultApiLevel(); void loadDefaultApiLevel();
void saveManualConfigurations();
void saveDefaultApiLevel(); void saveDefaultApiLevel();
void saveActiveConfigurationNdkEnvPath();
void clearInvalidConfigurations(); Utils::PersistentSettingsWriter *m_writer;
void saveConfigurations();
void restoreConfigurations();
void loadManualConfigurations();
void setKitsAutoDetectionSource(); void setKitsAutoDetectionSource();
QStringList activeConfigurationNdkEnvPaths(); void insertByVersion(BlackBerryConfiguration* config);
}; };
} // namespace Internal } // namespace Internal

View File

@@ -51,6 +51,8 @@
namespace Qnx { namespace Qnx {
namespace Internal { namespace Internal {
static QIcon invalidConfigIcon(QLatin1String(":/projectexplorer/images/compile_error.png"));
BlackBerryNDKSettingsWidget::BlackBerryNDKSettingsWidget(QWidget *parent) : BlackBerryNDKSettingsWidget::BlackBerryNDKSettingsWidget(QWidget *parent) :
QWidget(parent), QWidget(parent),
m_ui(new Ui_BlackBerryNDKSettingsWidget), m_ui(new Ui_BlackBerryNDKSettingsWidget),
@@ -86,6 +88,7 @@ BlackBerryNDKSettingsWidget::BlackBerryNDKSettingsWidget(QWidget *parent) :
connect(m_ui->removeNdkButton, SIGNAL(clicked()), this, SLOT(removeNdkTarget())); connect(m_ui->removeNdkButton, SIGNAL(clicked()), this, SLOT(removeNdkTarget()));
connect(m_ui->activateNdkTargetButton, SIGNAL(clicked()), this, SLOT(activateNdkTarget())); connect(m_ui->activateNdkTargetButton, SIGNAL(clicked()), this, SLOT(activateNdkTarget()));
connect(m_ui->deactivateNdkTargetButton, SIGNAL(clicked()), this, SLOT(deactivateNdkTarget())); connect(m_ui->deactivateNdkTargetButton, SIGNAL(clicked()), this, SLOT(deactivateNdkTarget()));
connect(m_ui->cleanUpButton, SIGNAL(clicked()), this, SLOT(cleanUp()));
connect(m_ui->ndksTreeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(updateInfoTable(QTreeWidgetItem*))); connect(m_ui->ndksTreeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(updateInfoTable(QTreeWidgetItem*)));
connect(m_ui->apiLevelCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(setDefaultApiLevel(int))); connect(m_ui->apiLevelCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(setDefaultApiLevel(int)));
@@ -155,6 +158,7 @@ void BlackBerryNDKSettingsWidget::updateNdkList()
qDeleteAll(m_autoDetectedNdks->takeChildren()); qDeleteAll(m_autoDetectedNdks->takeChildren());
qDeleteAll(m_manualNdks->takeChildren()); qDeleteAll(m_manualNdks->takeChildren());
bool enableCleanUp = false;
foreach (BlackBerryConfiguration *config, m_bbConfigManager->configurations()) { foreach (BlackBerryConfiguration *config, m_bbConfigManager->configurations()) {
QTreeWidgetItem *parent = config->isAutoDetected() ? m_autoDetectedNdks : m_manualNdks; QTreeWidgetItem *parent = config->isAutoDetected() ? m_autoDetectedNdks : m_manualNdks;
QTreeWidgetItem *item = new QTreeWidgetItem(parent); QTreeWidgetItem *item = new QTreeWidgetItem(parent);
@@ -164,9 +168,36 @@ void BlackBerryNDKSettingsWidget::updateNdkList()
font.setBold(config->isActive() || m_activatedTargets.contains(config)); font.setBold(config->isActive() || m_activatedTargets.contains(config));
item->setFont(0, font); item->setFont(0, font);
item->setFont(1, font); item->setFont(1, font);
item->setIcon(0, config->isValid() ? QIcon() : invalidConfigIcon);
// TODO: Do the same if qmake, qcc, debugger are no longer detected...
if (!config->isValid()) {
QString toolTip = tr("Invalid target %1: ").arg(config->targetName());
if (config->isAutoDetected() && !config->autoDetectionSource().toFileInfo().exists())
toolTip += QLatin1Char('\n') + tr("- Target no longer installed.");
if (!config->ndkEnvFile().toFileInfo().exists())
toolTip += QLatin1Char('\n') + tr("- No NDK environment file found.");
if (config->qmake4BinaryFile().isEmpty()
&& config->qmake5BinaryFile().isEmpty())
toolTip += QLatin1Char('\n') + tr("- No Qt version found.");
if (config->gccCompiler().isEmpty())
toolTip += QLatin1Char('\n') + tr("- No compiler found.");
if (config->deviceDebuger().isEmpty())
toolTip += QLatin1Char('\n') + tr("- No debugger found for device.");
if (config->simulatorDebuger().isEmpty())
toolTip += QLatin1Char('\n') + tr("- No debugger found for simulator.");
item->setToolTip(0, toolTip);
enableCleanUp = true;
}
} }
m_ui->ndksTreeWidget->setCurrentItem(m_autoDetectedNdks->child(0)); m_ui->ndksTreeWidget->setCurrentItem(m_autoDetectedNdks->child(0));
m_ui->cleanUpButton->setEnabled(enableCleanUp);
} }
void BlackBerryNDKSettingsWidget::addNdkTarget() void BlackBerryNDKSettingsWidget::addNdkTarget()
@@ -276,6 +307,19 @@ void BlackBerryNDKSettingsWidget::uninstallNdkTarget()
launchBlackBerryInstallerWizard(BlackBerryInstallerDataHandler::UninstallMode, m_ui->versionLabel->text()); launchBlackBerryInstallerWizard(BlackBerryInstallerDataHandler::UninstallMode, m_ui->versionLabel->text());
} }
void BlackBerryNDKSettingsWidget::cleanUp()
{
foreach (BlackBerryConfiguration *config, m_bbConfigManager->configurations()) {
if (!config->isValid()) {
m_activatedTargets.removeOne(config);
m_deactivatedTargets.removeOne(config);
m_bbConfigManager->removeConfiguration(config);
}
}
updateNdkList();
}
void BlackBerryNDKSettingsWidget::handleInstallationFinished() void BlackBerryNDKSettingsWidget::handleInstallationFinished()
{ {
m_bbConfigManager->loadAutoDetectedConfigurations(); m_bbConfigManager->loadAutoDetectedConfigurations();

View File

@@ -75,6 +75,7 @@ public slots:
void activateNdkTarget(); void activateNdkTarget();
void deactivateNdkTarget(); void deactivateNdkTarget();
void uninstallNdkTarget(); void uninstallNdkTarget();
void cleanUp();
void handleInstallationFinished(); void handleInstallationFinished();
void handleUninstallationFinished(); void handleUninstallationFinished();
void updateUi(QTreeWidgetItem* item, BlackBerryConfiguration* config); void updateUi(QTreeWidgetItem* item, BlackBerryConfiguration* config);

View File

@@ -229,6 +229,29 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>13</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="cleanUpButton">
<property name="text">
<string>Clean Up</string>
</property>
</widget>
</item>
<item> <item>
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">

View File

@@ -113,6 +113,8 @@ const char QNX_BLACKBERRY_DEPLOY_CMD[] = "blackberry-deploy";
const char QNX_BLACKBERRY_CASCADESIMPORTER_VERSION[] = "0.0.1"; const char QNX_BLACKBERRY_CASCADESIMPORTER_VERSION[] = "0.0.1";
const char QNX_BLACKBERRY_CONFIGS_FILENAME[] = "bbndkconfigurations.xml";
} // namespace Constants } // namespace Constants
} // namespace Qnx } // namespace Qnx

View File

@@ -258,6 +258,7 @@ QList<NdkInstallInformation> QnxUtils::installedNdks()
ndkInfo.host = childElt.firstChildElement(QLatin1String("host")).text(); ndkInfo.host = childElt.firstChildElement(QLatin1String("host")).text();
ndkInfo.target = childElt.firstChildElement(QLatin1String("target")).text(); ndkInfo.target = childElt.firstChildElement(QLatin1String("target")).text();
ndkInfo.version = childElt.firstChildElement(QLatin1String("version")).text(); ndkInfo.version = childElt.firstChildElement(QLatin1String("version")).text();
ndkInfo.installationXmlFilePath = ndkFile.absoluteFilePath();
ndkList.append(ndkInfo); ndkList.append(ndkInfo);
} }

View File

@@ -54,6 +54,10 @@ public:
QString host; QString host;
QString target; QString target;
QString version; QString version;
QString installationXmlFilePath;
bool isValid() { return !path.isEmpty() && !name.isEmpty() && !host.isEmpty()
&& !target.isEmpty() && !version.isEmpty() && !installationXmlFilePath.isEmpty(); }
}; };
class QnxUtils class QnxUtils