Commit cf4ee59c authored by BogDan Vatra's avatar BogDan Vatra
Browse files

Make it easy to set a kit matcher.



Using a function to set a kit matcher is much easier that crating a new
class. It also enables an easy way to reuse classes that are using it.
E.g.
DeviceProcessesDialog processDialog;
processDialog.kitChooser()->setKitMatcher([](const Kit* kit) {
   return kit->isValid() && other_checks_with(kit);
});

Change-Id: I4e2fc7c52038902412cec5331504230bb8160ceb
Reviewed-by: default avatarTobias Hunger <tobias.hunger@theqtcompany.com>
parent f51a4035
......@@ -46,24 +46,10 @@ using namespace Utils;
namespace Analyzer {
namespace Internal {
class SshKitChooser : public KitChooser
{
public:
SshKitChooser(QWidget *parent = 0) : KitChooser(parent) { }
private:
bool kitMatches(const Kit *kit) const {
if (!KitChooser::kitMatches(kit))
return false;
const IDevice::ConstPtr device = DeviceKitInformation::device(kit);
return device && !device->sshParameters().host.isEmpty();
}
};
class StartRemoteDialogPrivate
{
public:
SshKitChooser *kitChooser;
KitChooser *kitChooser;
QLineEdit *executable;
QLineEdit *arguments;
QLineEdit *workingDirectory;
......@@ -79,7 +65,11 @@ StartRemoteDialog::StartRemoteDialog(QWidget *parent)
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
setWindowTitle(tr("Start Remote Analysis"));
d->kitChooser = new Internal::SshKitChooser(this);
d->kitChooser = new KitChooser(this);
d->kitChooser->setKitMatcher([](const Kit *kit) {
const IDevice::ConstPtr device = DeviceKitInformation::device(kit);
return kit->isValid() && device && !device->sshParameters().host.isEmpty();
});
d->executable = new QLineEdit(this);
d->arguments = new QLineEdit(this);
d->workingDirectory = new QLineEdit(this);
......
......@@ -110,18 +110,16 @@ DebuggerKitChooser::DebuggerKitChooser(Mode mode, QWidget *parent)
, m_hostAbi(Abi::hostAbi())
, m_mode(mode)
{
}
// Match valid debuggers and restrict local debugging to compatible toolchains.
bool DebuggerKitChooser::kitMatches(const Kit *k) const
{
if (!DebuggerKitInformation::isValidDebugger(k))
return false;
if (m_mode == LocalDebugging) {
const ToolChain *tc = ToolChainKitInformation::toolChain(k);
return tc && tc->targetAbi().os() == m_hostAbi.os();
}
return true;
setKitMatcher([this](const Kit *k) {
// Match valid debuggers and restrict local debugging to compatible toolchains.
if (!DebuggerKitInformation::isValidDebugger(k))
return false;
if (m_mode == LocalDebugging) {
const ToolChain *tc = ToolChainKitInformation::toolChain(k);
return tc && tc->targetAbi().os() == m_hostAbi.os();
}
return true;
});
}
QString DebuggerKitChooser::kitToolTip(Kit *k) const
......
......@@ -69,7 +69,6 @@ public:
explicit DebuggerKitChooser(Mode mode = AnyDebugging, QWidget *parent = 0);
protected:
bool kitMatches(const ProjectExplorer::Kit *k) const;
QString kitToolTip(ProjectExplorer::Kit *k) const;
private:
......
/****************************************************************************
**
** Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company
** Contact: info@kdab.com
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms and
** conditions see http://www.qt.io/terms-conditions. For further information
** use the contact form at http://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 or version 3 as published by the Free
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
** following information to ensure the GNU Lesser General Public License
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, The Qt Company gives you certain additional
** rights. These rights are described in The Qt Company LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
****************************************************************************/
#include "devicetypekitchooser.h"
#include "../kitinformation.h"
using namespace ProjectExplorer;
DeviceTypeKitChooser::DeviceTypeKitChooser(Core::Id deviceType, QWidget *parent)
: KitChooser(parent)
, m_deviceType(deviceType)
{
}
bool DeviceTypeKitChooser::kitMatches(const Kit *k) const
{
if (!KitChooser::kitMatches(k))
return false;
return DeviceTypeKitInformation::deviceTypeId(k) == m_deviceType;
}
/****************************************************************************
**
** Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company
** Contact: info@kdab.com
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms and
** conditions see http://www.qt.io/terms-conditions. For further information
** use the contact form at http://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 or version 3 as published by the Free
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
** following information to ensure the GNU Lesser General Public License
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, The Qt Company gives you certain additional
** rights. These rights are described in The Qt Company LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
****************************************************************************/
#ifndef PROJECTEXPLORER_DEVICETYPEKITCHOOSER_H
#define PROJECTEXPLORER_DEVICETYPEKITCHOOSER_H
#include "../kitchooser.h"
#include "../projectexplorer_export.h"
#include <coreplugin/id.h>
namespace ProjectExplorer {
class PROJECTEXPLORER_EXPORT DeviceTypeKitChooser : public KitChooser
{
Q_OBJECT
public:
explicit DeviceTypeKitChooser(Core::Id deviceType, QWidget *parent = 0);
protected:
bool kitMatches(const Kit *k) const;
private:
Core::Id m_deviceType;
};
} // namespace ProjectExplorer
#endif // PROJECTEXPLORER_DEVICETYPEKITCHOOSER_H
......@@ -47,7 +47,10 @@ namespace ProjectExplorer {
const char lastKitKey[] = "LastSelectedKit";
KitChooser::KitChooser(QWidget *parent) :
QWidget(parent)
QWidget(parent),
m_kitMatcher([](const Kit *k) {
return k->isValid();
})
{
m_chooser = new QComboBox(this);
m_chooser->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
......@@ -79,11 +82,6 @@ void KitChooser::onCurrentIndexChanged(int index)
emit currentIndexChanged(index);
}
bool KitChooser::kitMatches(const Kit *k) const
{
return k->isValid();
}
QString KitChooser::kitText(const Kit *k) const
{
return k->displayName();
......@@ -98,7 +96,7 @@ void KitChooser::populate()
{
m_chooser->clear();
foreach (Kit *kit, KitManager::sortKits(KitManager::kits())) {
if (kitMatches(kit)) {
if (m_kitMatcher(kit)) {
m_chooser->addItem(kitText(kit), qVariantFromValue(kit->id()));
m_chooser->setItemData(m_chooser->count() - 1, kitToolTip(kit), Qt::ToolTipRole);
}
......@@ -140,6 +138,12 @@ Core::Id KitChooser::currentKitId() const
return kit ? kit->id() : Core::Id();
}
void KitChooser::setKitMatcher(const KitChooser::KitMatcher &matcher)
{
m_kitMatcher = matcher;
populate();
}
Kit *KitChooser::kitAt(int index) const
{
Core::Id id = qvariant_cast<Core::Id>(m_chooser->itemData(index));
......
......@@ -35,6 +35,8 @@
#include <QWidget>
#include <functional>
QT_BEGIN_NAMESPACE
class QComboBox;
class QPushButton;
......@@ -57,6 +59,9 @@ public:
void setCurrentKitId(Core::Id id);
Core::Id currentKitId() const;
typedef std::function<bool(const Kit *k)> KitMatcher;
void setKitMatcher(const KitMatcher &matcher);
Kit *currentKit() const;
signals:
......@@ -71,11 +76,11 @@ private slots:
void onManageButtonClicked();
protected:
virtual bool kitMatches(const Kit *k) const;
virtual QString kitText(const Kit *k) const;
virtual QString kitToolTip(Kit *k) const;
private:
KitMatcher m_kitMatcher;
Kit *kitAt(int index) const;
QComboBox *m_chooser;
QPushButton *m_manageButton;
......
......@@ -130,7 +130,6 @@ HEADERS += projectexplorer.h \
devicesupport/devicesettingswidget.h \
devicesupport/devicesettingspage.h \
devicesupport/devicetestdialog.h \
devicesupport/devicetypekitchooser.h \
devicesupport/deviceusedportsgatherer.h \
devicesupport/deviceapplicationrunner.h \
devicesupport/localprocesslist.h \
......@@ -272,7 +271,6 @@ SOURCES += projectexplorer.cpp \
devicesupport/devicesettingswidget.cpp \
devicesupport/devicesettingspage.cpp \
devicesupport/devicetestdialog.cpp \
devicesupport/devicetypekitchooser.cpp \
devicesupport/deviceusedportsgatherer.cpp \
devicesupport/deviceapplicationrunner.cpp \
devicesupport/localprocesslist.cpp \
......
......@@ -213,7 +213,6 @@ QtcPlugin {
"devicesettingspage.cpp", "devicesettingspage.h",
"devicesettingswidget.cpp", "devicesettingswidget.h", "devicesettingswidget.ui",
"devicetestdialog.cpp", "devicetestdialog.h", "devicetestdialog.ui",
"devicetypekitchooser.cpp", "devicetypekitchooser.h",
"deviceusedportsgatherer.cpp", "deviceusedportsgatherer.h",
"idevice.cpp", "idevice.h",
"idevicefactory.cpp", "idevicefactory.h",
......
......@@ -40,10 +40,10 @@
#include <debugger/debuggerstartparameters.h>
#include <projectexplorer/devicesupport/deviceapplicationrunner.h>
#include <projectexplorer/devicesupport/deviceusedportsgatherer.h>
#include <projectexplorer/devicesupport/devicetypekitchooser.h>
#include <projectexplorer/devicesupport/deviceprocessesdialog.h>
#include <projectexplorer/devicesupport/deviceprocesslist.h>
#include <projectexplorer/kit.h>
#include <projectexplorer/kitchooser.h>
#include <projectexplorer/kitinformation.h>
#include <projectexplorer/projectexplorer.h>
#include <projectexplorer/toolchain.h>
......@@ -74,7 +74,11 @@ QnxAttachDebugSupport::QnxAttachDebugSupport(QObject *parent)
void QnxAttachDebugSupport::showProcessesDialog()
{
ProjectExplorer::DeviceTypeKitChooser *kitChooser = new ProjectExplorer::DeviceTypeKitChooser(Core::Id(Constants::QNX_QNX_OS_TYPE));
auto kitChooser = new ProjectExplorer::KitChooser;
kitChooser->setKitMatcher([](const ProjectExplorer::Kit *k){
return k->isValid() && ProjectExplorer::DeviceTypeKitInformation::deviceTypeId(k) == Core::Id(Constants::QNX_QNX_OS_TYPE);
});
QnxAttachDebugDialog dlg(kitChooser, 0);
dlg.addAcceptButton(ProjectExplorer::DeviceProcessesDialog::tr("&Attach to Process"));
dlg.showAllDevices();
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment