From d0f8fdb29dbaff48c9aec7f3e771b1b0f647e664 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Thu, 5 Apr 2012 15:40:12 +0200 Subject: [PATCH] DeviceManager: Allow for replacements of devices When adding a device with an existing internalId, the devicemanager will now replace the device with that id, calling remove on the old one and adding the new one afterwards. The DeviceManager also emits a deviceUpdated signal with the id of the device that was changed. Change-Id: I88c789de355f3e059dbf909c20f58548a2fd46fc Reviewed-by: Christian Kandeler --- .../projectexplorer/devicesupport/devicemanager.cpp | 12 +++++++++--- .../projectexplorer/devicesupport/devicemanager.h | 2 ++ .../projectexplorer/devicesupport/idevice.cpp | 2 ++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp index 667ae31e9d8..6291a697cca 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp @@ -226,8 +226,10 @@ QString DeviceManager::settingsFilePath() void DeviceManager::addDevice(const IDevice::Ptr &device) { QTC_ASSERT(this != instance() || (device->isAutoDetected()), return); - QTC_ASSERT(!device->isAutoDetected() || !findAutoDetectedDevice(d->devices, device->type(), - device->fingerprint()), return); + + const int pos = indexForInternalId(device->internalId()); + if (pos >= 0) + removeDevice(pos); // Ensure uniqueness of name. QString name = device->displayName(); @@ -239,7 +241,8 @@ void DeviceManager::addDevice(const IDevice::Ptr &device) while (hasDevice(name)); } device->setDisplayName(name); - device->setInternalId(unusedId()); + if (pos < 0) + device->setInternalId(unusedId()); if (!defaultDevice(device->type())) d->defaultDevices.insert(device->type(), device->internalId()); d->devices << device; @@ -258,6 +261,9 @@ void DeviceManager::addDevice(const IDevice::Ptr &device) } emit deviceAdded(device); + if (pos >= 0) + emit deviceUpdated(device->internalId()); + emit updated(); } diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.h b/src/plugins/projectexplorer/devicesupport/devicemanager.h index c48b346ffcb..accd04b5202 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.h +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.h @@ -73,6 +73,8 @@ public: static const IDeviceFactory *factoryForDeviceType(const QString &type); signals: + void deviceUpdated(ProjectExplorer::IDevice::Id id); + void deviceAdded(const QSharedPointer &device); void deviceRemoved(int index); void displayNameChanged(int index); diff --git a/src/plugins/projectexplorer/devicesupport/idevice.cpp b/src/plugins/projectexplorer/devicesupport/idevice.cpp index 0b934501880..9c44012d6b6 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevice.cpp @@ -153,6 +153,8 @@ namespace Internal { class IDevicePrivate { public: + IDevicePrivate() : internalId(IDevice::invalidId()) { } + QString displayName; QString type; IDevice::Origin origin;