DeviceProcessDialog: Introduce methods for modal/non-modal use.

Add methods to be able to use the dialog as a non-modal
dialog showing a list of processes or a modal-dialog
for selecting a process.

Connect double-click to 'Accept' for the modal
case (regression from 2.5).

Change-Id: If05a1c40ee6a41135d943e9919a1250db03eeffb
Reviewed-by: hjk <qthjk@ovi.com>
This commit is contained in:
Friedemann Kleint
2012-08-22 16:38:21 +02:00
committed by hjk
parent 009d6b1e2f
commit aee8f8832b
4 changed files with 39 additions and 8 deletions

View File

@@ -1560,6 +1560,7 @@ void DebuggerPluginPrivate::attachToRunningApplication()
void DebuggerPluginPrivate::attachToProcess(bool startServerOnly) void DebuggerPluginPrivate::attachToProcess(bool startServerOnly)
{ {
DeviceProcessesDialog *dlg = new DeviceProcessesDialog(mainWindow()); DeviceProcessesDialog *dlg = new DeviceProcessesDialog(mainWindow());
dlg->addAcceptButton(DeviceProcessesDialog::tr("&Attach to Process"));
dlg->showAllDevices(); dlg->showAllDevices();
if (dlg->exec() == QDialog::Rejected) { if (dlg->exec() == QDialog::Rejected) {
delete dlg; delete dlg;

View File

@@ -120,11 +120,12 @@ public:
FilterLineEdit *processFilterLineEdit; FilterLineEdit *processFilterLineEdit;
QPushButton *updateListButton; QPushButton *updateListButton;
QPushButton *killProcessButton; QPushButton *killProcessButton;
QPushButton *attachProcessButton; QPushButton *acceptButton;
QDialogButtonBox *buttonBox;
}; };
DeviceProcessesDialogPrivate::DeviceProcessesDialogPrivate(QWidget *parent) DeviceProcessesDialogPrivate::DeviceProcessesDialogPrivate(QWidget *parent)
: q(parent) : q(parent), acceptButton(0), buttonBox(new QDialogButtonBox(parent))
{ {
processList = 0; processList = 0;
@@ -150,13 +151,9 @@ DeviceProcessesDialogPrivate::DeviceProcessesDialogPrivate(QWidget *parent)
updateListButton = new QPushButton(DeviceProcessesDialog::tr("&Update List"), q); updateListButton = new QPushButton(DeviceProcessesDialog::tr("&Update List"), q);
killProcessButton = new QPushButton(DeviceProcessesDialog::tr("&Kill Process"), q); killProcessButton = new QPushButton(DeviceProcessesDialog::tr("&Kill Process"), q);
attachProcessButton = new QPushButton(DeviceProcessesDialog::tr("&Attach to Process"), q);
QDialogButtonBox *buttonBox = new QDialogButtonBox(q);
buttonBox->setStandardButtons(QDialogButtonBox::Close);
buttonBox->addButton(updateListButton, QDialogButtonBox::ActionRole); buttonBox->addButton(updateListButton, QDialogButtonBox::ActionRole);
buttonBox->addButton(killProcessButton, QDialogButtonBox::ActionRole); buttonBox->addButton(killProcessButton, QDialogButtonBox::ActionRole);
buttonBox->addButton(attachProcessButton, QDialogButtonBox::AcceptRole);
QFormLayout *leftColumn = new QFormLayout(); QFormLayout *leftColumn = new QFormLayout();
leftColumn->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); leftColumn->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
@@ -259,8 +256,9 @@ void DeviceProcessesDialogPrivate::handleProcessKilled()
void DeviceProcessesDialogPrivate::updateButtons() void DeviceProcessesDialogPrivate::updateButtons()
{ {
bool hasSelection = procView->selectionModel()->hasSelection(); const bool hasSelection = procView->selectionModel()->hasSelection();
attachProcessButton->setEnabled(hasSelection); if (acceptButton)
acceptButton->setEnabled(hasSelection);
killProcessButton->setEnabled(hasSelection); killProcessButton->setEnabled(hasSelection);
errorText->setVisible(!errorText->document()->isEmpty()); errorText->setVisible(!errorText->document()->isEmpty());
} }
@@ -281,6 +279,21 @@ DeviceProcess DeviceProcessesDialogPrivate::selectedProcess() const
// //
/////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////
/*!
\class ProjectExplorer::DeviceProcessesDialog
\brief Shows a list of processes.
The dialog can be used as a
\list
\o Non-modal dialog showing a list of processes: Call addCloseButton()
to add a 'Close' button.
\o Modal dialog with an 'Accept' button to select a process: Call
addAcceptButton() passing the label text. This will create a
'Cancel' button as well.
\endlist
*/
DeviceProcessesDialog::DeviceProcessesDialog(QWidget *parent) DeviceProcessesDialog::DeviceProcessesDialog(QWidget *parent)
: QDialog(parent), d(new Internal::DeviceProcessesDialogPrivate(this)) : QDialog(parent), d(new Internal::DeviceProcessesDialogPrivate(this))
{ {
@@ -294,6 +307,20 @@ DeviceProcessesDialog::~DeviceProcessesDialog()
delete d; delete d;
} }
void DeviceProcessesDialog::addAcceptButton(const QString &label)
{
d->acceptButton = new QPushButton(label);
d->buttonBox->addButton(d->acceptButton, QDialogButtonBox::AcceptRole);
connect(d->procView, SIGNAL(doubleClicked(QModelIndex)),
d->acceptButton, SLOT(animateClick()));
d->buttonBox->addButton(QDialogButtonBox::Cancel);
}
void DeviceProcessesDialog::addCloseButton()
{
d->buttonBox->addButton(QDialogButtonBox::Close);
}
void DeviceProcessesDialog::setDevice(const IDevice::ConstPtr &device) void DeviceProcessesDialog::setDevice(const IDevice::ConstPtr &device)
{ {
d->profileChooser->hide(); d->profileChooser->hide();

View File

@@ -51,6 +51,8 @@ class PROJECTEXPLORER_EXPORT DeviceProcessesDialog : public QDialog
public: public:
explicit DeviceProcessesDialog(QWidget *parent = 0); explicit DeviceProcessesDialog(QWidget *parent = 0);
~DeviceProcessesDialog(); ~DeviceProcessesDialog();
void addAcceptButton(const QString &label);
void addCloseButton();
void setDevice(const IDevice::ConstPtr &device); void setDevice(const IDevice::ConstPtr &device);
void showAllDevices(); void showAllDevices();

View File

@@ -336,6 +336,7 @@ void DeviceSettingsWidget::handleProcessListRequested()
{ {
QTC_ASSERT(currentDevice()->canCreateProcessModel(), return); QTC_ASSERT(currentDevice()->canCreateProcessModel(), return);
DeviceProcessesDialog dlg; DeviceProcessesDialog dlg;
dlg.addCloseButton();
dlg.setDevice(currentDevice()); dlg.setDevice(currentDevice());
dlg.exec(); dlg.exec();
} }