Device support: Make device actions a little more flexible.

We give the implementors of the IDevice subclasses a litte more freedom
by not assuming a modal dialog.

Change-Id: I629a3ab7fc50a73229e6439af53f1bae0cf0259e
Reviewed-by: Tobias Hunger <tobias.hunger@nokia.com>
This commit is contained in:
Christian Kandeler
2012-05-02 16:03:26 +02:00
parent e19ad8eab2
commit d9b36a1b50
9 changed files with 30 additions and 32 deletions

View File

@@ -103,19 +103,21 @@ QString MaddeDevice::displayNameForActionId(Core::Id actionId) const
return QString(); // Can't happen. return QString(); // Can't happen.
} }
QDialog *MaddeDevice::createAction(Core::Id actionId, QWidget *parent) const void MaddeDevice::executeAction(Core::Id actionId, QWidget *parent)
{ {
QTC_ASSERT(actionIds().contains(actionId), return 0); QTC_ASSERT(actionIds().contains(actionId), return);
QDialog *d;
const LinuxDeviceConfiguration::ConstPtr device const LinuxDeviceConfiguration::ConstPtr device
= sharedFromThis().staticCast<const LinuxDeviceConfiguration>(); = sharedFromThis().staticCast<const LinuxDeviceConfiguration>();
if (actionId == Core::Id(MaddeDeviceTestActionId)) if (actionId == Core::Id(MaddeDeviceTestActionId))
return new LinuxDeviceTestDialog(device, new MaddeDeviceTester, parent); d = new LinuxDeviceTestDialog(device, new MaddeDeviceTester, parent);
if (actionId == Core::Id(MaddeRemoteProcessesActionId)) else if (actionId == Core::Id(MaddeRemoteProcessesActionId))
return new RemoteLinuxProcessesDialog(new GenericRemoteLinuxProcessList(device), parent); d = new RemoteLinuxProcessesDialog(new GenericRemoteLinuxProcessList(device), parent);
if (actionId == Core::Id(Constants::GenericDeployKeyToDeviceActionId)) else if (actionId == Core::Id(Constants::GenericDeployKeyToDeviceActionId))
return PublicKeyDeploymentDialog::createDialog(device, parent); d = PublicKeyDeploymentDialog::createDialog(device, parent);
return 0; // Can't happen. if (d)
d->exec();
} }
QString MaddeDevice::maddeDisplayType(const QString &type) QString MaddeDevice::maddeDisplayType(const QString &type)

View File

@@ -53,7 +53,7 @@ public:
QString displayType() const; QString displayType() const;
QList<Core::Id> actionIds() const; QList<Core::Id> actionIds() const;
QString displayNameForActionId(Core::Id actionId) const; QString displayNameForActionId(Core::Id actionId) const;
QDialog *createAction(Core::Id actionId, QWidget *parent) const; void executeAction(Core::Id actionId, QWidget *parent);
ProjectExplorer::IDevice::Ptr clone() const; ProjectExplorer::IDevice::Ptr clone() const;
static QString maddeDisplayType(const QString &type); static QString maddeDisplayType(const QString &type);

View File

@@ -283,12 +283,9 @@ void DeviceSettingsWidget::clearDetails()
void DeviceSettingsWidget::handleAdditionalActionRequest(int actionId) void DeviceSettingsWidget::handleAdditionalActionRequest(int actionId)
{ {
const IDevice::ConstPtr &device = currentDevice(); const IDevice::Ptr &device = m_deviceManager->mutableDeviceAt(currentIndex());
QTC_ASSERT(device, return); QTC_ASSERT(device, return);
QDialog * const action = device->createAction(Core::Id::fromUniqueIdentifier(actionId), this); device->executeAction(Core::Id::fromUniqueIdentifier(actionId), this);
if (action)
action->exec();
delete action;
} }
} // namespace Internal } // namespace Internal

View File

@@ -114,10 +114,9 @@
*/ */
/*! /*!
* \fn QDialog *ProjectExplorer::IDevice::createAction(const QString &actionId) const * \fn void ProjectExplorer::IDevice::executeAction(Core::Id actionId, QWidget *parent)
* \brief Produces a dialog implementing the respective action. The dialog is supposed to be * \brief Executes the respective action. This is typically done via some sort of dialog or
* modal, so implementers must make sure to make whatever it does interruptible as * wizard, so a parent widget argument is provided.
* to not needlessly block the UI.
*/ */
/*! /*!

View File

@@ -41,7 +41,6 @@
#include <QVariantMap> #include <QVariantMap>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QDialog;
class QWidget; class QWidget;
QT_END_NAMESPACE QT_END_NAMESPACE
@@ -83,7 +82,7 @@ public:
virtual IDeviceWidget *createWidget() = 0; virtual IDeviceWidget *createWidget() = 0;
virtual QList<Core::Id> actionIds() const = 0; virtual QList<Core::Id> actionIds() const = 0;
virtual QString displayNameForActionId(Core::Id actionId) const = 0; virtual QString displayNameForActionId(Core::Id actionId) const = 0;
virtual QDialog *createAction(Core::Id actionId, QWidget *parent = 0) const = 0; virtual void executeAction(Core::Id actionId, QWidget *parent = 0) = 0;
enum AvailabilityState { DeviceAvailable, DeviceUnavailable, DeviceAvailabilityUnknown }; enum AvailabilityState { DeviceAvailable, DeviceUnavailable, DeviceAvailabilityUnknown };
AvailabilityState availability() const; AvailabilityState availability() const;

View File

@@ -207,11 +207,10 @@ QString SymbianIDevice::displayNameForActionId(Core::Id actionId) const
return QString(); return QString();
} }
QDialog *SymbianIDevice::createAction(Core::Id actionId, QWidget *parent) const void SymbianIDevice::executeAction(Core::Id actionId, QWidget *parent)
{ {
Q_UNUSED(actionId); Q_UNUSED(actionId);
Q_UNUSED(parent); Q_UNUSED(parent);
return 0;
} }
QVariantMap SymbianIDevice::toMap() const QVariantMap SymbianIDevice::toMap() const

View File

@@ -78,7 +78,7 @@ public:
ProjectExplorer::IDeviceWidget* createWidget(); ProjectExplorer::IDeviceWidget* createWidget();
QList<Core::Id> actionIds() const; QList<Core::Id> actionIds() const;
QString displayNameForActionId(Core::Id actionId) const; QString displayNameForActionId(Core::Id actionId) const;
QDialog* createAction(Core::Id actionId, QWidget*parent) const; void executeAction(Core::Id actionId, QWidget*parent);
protected: protected:
SymbianIDevice(const SymbianIDevice &other); SymbianIDevice(const SymbianIDevice &other);

View File

@@ -120,19 +120,21 @@ QString LinuxDeviceConfiguration::displayNameForActionId(Core::Id actionId) cons
return QString(); // Can't happen. return QString(); // Can't happen.
} }
QDialog *LinuxDeviceConfiguration::createAction(Core::Id actionId, QWidget *parent) const void LinuxDeviceConfiguration::executeAction(Core::Id actionId, QWidget *parent)
{ {
QTC_ASSERT(actionIds().contains(actionId), return 0); QTC_ASSERT(actionIds().contains(actionId), return);
QDialog *d;
const LinuxDeviceConfiguration::ConstPtr device const LinuxDeviceConfiguration::ConstPtr device
= sharedFromThis().staticCast<const LinuxDeviceConfiguration>(); = sharedFromThis().staticCast<const LinuxDeviceConfiguration>();
if (actionId == Core::Id(Constants::GenericTestDeviceActionId)) if (actionId == Core::Id(Constants::GenericTestDeviceActionId))
return new LinuxDeviceTestDialog(device, new GenericLinuxDeviceTester, parent); d = new LinuxDeviceTestDialog(device, new GenericLinuxDeviceTester, parent);
if (actionId == Core::Id(Constants::GenericRemoteProcessesActionId)) else if (actionId == Core::Id(Constants::GenericRemoteProcessesActionId))
return new RemoteLinuxProcessesDialog(new GenericRemoteLinuxProcessList(device, parent)); d = new RemoteLinuxProcessesDialog(new GenericRemoteLinuxProcessList(device, parent));
if (actionId == Core::Id(Constants::GenericDeployKeyToDeviceActionId)) else if (actionId == Core::Id(Constants::GenericDeployKeyToDeviceActionId))
return PublicKeyDeploymentDialog::createDialog(device, parent); d = PublicKeyDeploymentDialog::createDialog(device, parent);
return 0; // Can't happen. if (d)
d->exec();
} }
LinuxDeviceConfiguration::LinuxDeviceConfiguration() : d(new LinuxDeviceConfigurationPrivate) LinuxDeviceConfiguration::LinuxDeviceConfiguration() : d(new LinuxDeviceConfigurationPrivate)

View File

@@ -77,7 +77,7 @@ public:
ProjectExplorer::IDeviceWidget *createWidget(); ProjectExplorer::IDeviceWidget *createWidget();
QList<Core::Id> actionIds() const; QList<Core::Id> actionIds() const;
QString displayNameForActionId(Core::Id actionId) const; QString displayNameForActionId(Core::Id actionId) const;
QDialog *createAction(Core::Id actionId, QWidget *parent) const; void executeAction(Core::Id actionId, QWidget *parent);
void fromMap(const QVariantMap &map); void fromMap(const QVariantMap &map);
ProjectExplorer::IDevice::Ptr clone() const; ProjectExplorer::IDevice::Ptr clone() const;