From aee8f8832bbf02dfbe62731c76e7481625c8ee19 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint <Friedemann.Kleint@nokia.com> Date: Wed, 22 Aug 2012 16:38:21 +0200 Subject: [PATCH] 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> --- src/plugins/debugger/debuggerplugin.cpp | 1 + .../devicesupport/deviceprocessesdialog.cpp | 43 +++++++++++++++---- .../devicesupport/deviceprocessesdialog.h | 2 + .../devicesupport/devicesettingswidget.cpp | 1 + 4 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 8000bda8da6..b1d45f4e4ef 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -1560,6 +1560,7 @@ void DebuggerPluginPrivate::attachToRunningApplication() void DebuggerPluginPrivate::attachToProcess(bool startServerOnly) { DeviceProcessesDialog *dlg = new DeviceProcessesDialog(mainWindow()); + dlg->addAcceptButton(DeviceProcessesDialog::tr("&Attach to Process")); dlg->showAllDevices(); if (dlg->exec() == QDialog::Rejected) { delete dlg; diff --git a/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.cpp b/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.cpp index df44ccf51a8..5c88d9b5bd1 100644 --- a/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.cpp +++ b/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.cpp @@ -120,11 +120,12 @@ public: FilterLineEdit *processFilterLineEdit; QPushButton *updateListButton; QPushButton *killProcessButton; - QPushButton *attachProcessButton; + QPushButton *acceptButton; + QDialogButtonBox *buttonBox; }; DeviceProcessesDialogPrivate::DeviceProcessesDialogPrivate(QWidget *parent) - : q(parent) + : q(parent), acceptButton(0), buttonBox(new QDialogButtonBox(parent)) { processList = 0; @@ -150,13 +151,9 @@ DeviceProcessesDialogPrivate::DeviceProcessesDialogPrivate(QWidget *parent) updateListButton = new QPushButton(DeviceProcessesDialog::tr("&Update List"), 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(killProcessButton, QDialogButtonBox::ActionRole); - buttonBox->addButton(attachProcessButton, QDialogButtonBox::AcceptRole); QFormLayout *leftColumn = new QFormLayout(); leftColumn->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); @@ -259,8 +256,9 @@ void DeviceProcessesDialogPrivate::handleProcessKilled() void DeviceProcessesDialogPrivate::updateButtons() { - bool hasSelection = procView->selectionModel()->hasSelection(); - attachProcessButton->setEnabled(hasSelection); + const bool hasSelection = procView->selectionModel()->hasSelection(); + if (acceptButton) + acceptButton->setEnabled(hasSelection); killProcessButton->setEnabled(hasSelection); 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) : QDialog(parent), d(new Internal::DeviceProcessesDialogPrivate(this)) { @@ -294,6 +307,20 @@ DeviceProcessesDialog::~DeviceProcessesDialog() 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) { d->profileChooser->hide(); diff --git a/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.h b/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.h index 9d11ad974df..3f7a968fa40 100644 --- a/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.h +++ b/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.h @@ -51,6 +51,8 @@ class PROJECTEXPLORER_EXPORT DeviceProcessesDialog : public QDialog public: explicit DeviceProcessesDialog(QWidget *parent = 0); ~DeviceProcessesDialog(); + void addAcceptButton(const QString &label); + void addCloseButton(); void setDevice(const IDevice::ConstPtr &device); void showAllDevices(); diff --git a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp index 08c628c8258..1d26187b7cc 100644 --- a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp @@ -336,6 +336,7 @@ void DeviceSettingsWidget::handleProcessListRequested() { QTC_ASSERT(currentDevice()->canCreateProcessModel(), return); DeviceProcessesDialog dlg; + dlg.addCloseButton(); dlg.setDevice(currentDevice()); dlg.exec(); } -- GitLab