diff --git a/src/plugins/android/androidplugin.cpp b/src/plugins/android/androidplugin.cpp index b1a67572ab34aaa4bcca9db2a39c315d43156131..3b594746353f122e7a55324f3a4a854fe63b8c75 100644 --- a/src/plugins/android/androidplugin.cpp +++ b/src/plugins/android/androidplugin.cpp @@ -74,14 +74,15 @@ bool AndroidPlugin::initialize(const QStringList &arguments, QString *errorMessa addAutoReleasedObject(new Internal::AndroidDeployConfigurationFactory); addAutoReleasedObject(new Internal::AndroidDeviceFactory); ProjectExplorer::KitManager::instance()->registerKitInformation(new Internal::AndroidGdbServerKitInformation); + + ProjectExplorer::DeviceManager::instance() + ->addDevice(ProjectExplorer::IDevice::Ptr(new Internal::AndroidDevice)); + return true; } void AndroidPlugin::extensionsInitialized() { - ProjectExplorer::DeviceManager *dm = ProjectExplorer::DeviceManager::instance(); - if (dm->find(Core::Id(Constants::ANDROID_DEVICE_ID)).isNull()) - dm->addDevice(ProjectExplorer::IDevice::Ptr(new Internal::AndroidDevice)); connect(ProjectExplorer::KitManager::instance(), SIGNAL(kitsChanged()), this, SLOT(kitsRestored())); } diff --git a/src/plugins/projectexplorer/kitinformation.cpp b/src/plugins/projectexplorer/kitinformation.cpp index 71f27e3987263c6ee6ee30feaf0ace3db3d57383..f7ed99b4728d90aa7c6463d4cacb90c9f0f7c15e 100644 --- a/src/plugins/projectexplorer/kitinformation.cpp +++ b/src/plugins/projectexplorer/kitinformation.cpp @@ -40,6 +40,7 @@ #include <extensionsystem/pluginmanager.h> #include <projectexplorer/abi.h> #include <utils/pathchooser.h> +#include <utils/qtcassert.h> #include <QComboBox> #include <QHBoxLayout> @@ -336,12 +337,8 @@ static const char DEVICE_INFORMATION[] = "PE.Profile.Device"; DeviceKitInformation::DeviceKitInformation() { setObjectName(QLatin1String("DeviceInformation")); - connect(DeviceManager::instance(), SIGNAL(deviceRemoved(Core::Id)), - this, SIGNAL(validationNeeded())); - connect(DeviceManager::instance(), SIGNAL(deviceUpdated(Core::Id)), - this, SIGNAL(validationNeeded())); - connect(DeviceManager::instance(), SIGNAL(deviceUpdated(Core::Id)), - this, SLOT(deviceUpdated(Core::Id))); + connect(KitManager::instance(), SIGNAL(kitsLoaded()), + this, SLOT(kitsWereLoaded())); } Core::Id DeviceKitInformation::dataId() const @@ -381,6 +378,16 @@ void DeviceKitInformation::fix(Kit *k) if (!dev.isNull() && dev->type() == DeviceTypeKitInformation::deviceTypeId(k)) return; + setDeviceId(k, Core::Id()); +} + +void DeviceKitInformation::setup(Kit *k) +{ + QTC_ASSERT(DeviceManager::instance()->isLoaded(), return); + IDevice::ConstPtr dev = DeviceKitInformation::device(k); + if (!dev.isNull() && dev->type() == DeviceTypeKitInformation::deviceTypeId(k)) + return; + setDeviceId(k, Core::Id::fromSetting(defaultValue(k))); } @@ -403,6 +410,7 @@ KitInformation::ItemList DeviceKitInformation::toUserOutput(Kit *k) const IDevice::ConstPtr DeviceKitInformation::device(const Kit *k) { + QTC_ASSERT(DeviceManager::instance()->isLoaded(), return IDevice::ConstPtr()); DeviceManager *dm = DeviceManager::instance(); return dm ? dm->find(deviceId(k)) : IDevice::ConstPtr(); } @@ -422,11 +430,40 @@ void DeviceKitInformation::setDeviceId(Kit *k, const Core::Id id) k->setValue(DEVICE_INFORMATION, id.toSetting()); } -void DeviceKitInformation::deviceUpdated(const Core::Id &id) +void DeviceKitInformation::kitsWereLoaded() { foreach (Kit *k, KitManager::instance()->kits()) + fix(k); + + connect(DeviceManager::instance(), SIGNAL(deviceAdded(Core::Id)), + this, SLOT(deviceAdded(Core::Id))); + connect(DeviceManager::instance(), SIGNAL(deviceRemoved(Core::Id)), + this, SLOT(deviceRemoved(Core::Id))); + connect(DeviceManager::instance(), SIGNAL(deviceUpdated(Core::Id)), + this, SLOT(deviceUpdated(Core::Id))); +} + +void DeviceKitInformation::deviceUpdated(const Core::Id &id) +{ + foreach (Kit *k, KitManager::instance()->kits()) { if (deviceId(k) == id) notifyAboutUpdate(k); + } +} + +void DeviceKitInformation::deviceAdded(const Core::Id &id) +{ + Q_UNUSED(id); + DeviceMatcher m; + foreach (Kit *k, KitManager::instance()->kits(&m)) + fix(k); +} + +void DeviceKitInformation::deviceRemoved(const Core::Id &id) +{ + DeviceMatcher m(id); + foreach (Kit *k, KitManager::instance()->kits(&m)) + fix(k); } } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/kitinformation.h b/src/plugins/projectexplorer/kitinformation.h index c206b0d4dd65d288cec09f0bf5b1559e76e1fb51..e4c5d52660ea9a8920edf541375f14ea55aa9465 100644 --- a/src/plugins/projectexplorer/kitinformation.h +++ b/src/plugins/projectexplorer/kitinformation.h @@ -200,6 +200,7 @@ public: QList<Task> validate(const Kit *k) const; void fix(Kit *k); + void setup(Kit *k); KitConfigWidget *createConfigWidget(Kit *k) const; @@ -211,7 +212,11 @@ public: static Core::Id deviceId(const Kit *k); static void setDevice(Kit *k, IDevice::ConstPtr dev); static void setDeviceId(Kit *k, const Core::Id id); + private slots: + void kitsWereLoaded(); + void deviceAdded(const Core::Id &id); + void deviceRemoved(const Core::Id &id); void deviceUpdated(const Core::Id &id); }; @@ -221,6 +226,8 @@ public: DeviceMatcher(Core::Id id) : m_devId(id) { } + DeviceMatcher() { } + bool matches(const Kit *k) const { return DeviceKitInformation::deviceId(k) == m_devId; diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 9dda5035a5b24e32ad757729f08b190e5712a0aa..faa9c9ca288afa8c7e12a28e9897f86f3bfa55fb 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -346,6 +346,12 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er d->m_kitManager = new KitManager; // register before ToolChainManager new DeviceManager; // Create DeviceManager singleton d->m_toolChainManager = new ToolChainManager; + + // Register KitInformation: + KitManager::instance()->registerKitInformation(new DeviceTypeKitInformation); + KitManager::instance()->registerKitInformation(new DeviceKitInformation); + KitManager::instance()->registerKitInformation(new SysRootKitInformation); + addAutoReleasedObject(new Internal::ToolChainOptionsPage); addAutoReleasedObject(new KitOptionsPage); @@ -1119,15 +1125,10 @@ void ProjectExplorerPlugin::extensionsInitialized() // Register KitInformation: // Only do this now to make sure all device factories were properly initialized. - KitManager::instance()->registerKitInformation(new SysRootKitInformation); - KitManager::instance()->registerKitInformation(new DeviceKitInformation); - KitManager::instance()->registerKitInformation(new DeviceTypeKitInformation); KitManager::instance()->registerKitInformation(new ToolChainKitInformation); - DeviceManager *dm = DeviceManager::instance(); - if (dm->find(Core::Id(Constants::DESKTOP_DEVICE_ID)).isNull()) - DeviceManager::instance()->addDevice(IDevice::Ptr(new DesktopDevice)); - dm->load(); + DeviceManager::instance()->addDevice(IDevice::Ptr(new DesktopDevice)); + DeviceManager::instance()->load(); d->m_toolChainManager->restoreToolChains(); d->m_kitManager->restoreKits(); }