forked from qt-creator/qt-creator
Debugger: Small corrections to "Generic" item handling
Change-Id: Idd8f6a64aa64b8f13e713b3337ad1f8f2b8735db Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -116,6 +116,9 @@ void DebuggerItem::createId()
|
|||||||
|
|
||||||
void DebuggerItem::reinitializeFromFile(QString *error, Utils::Environment *customEnv)
|
void DebuggerItem::reinitializeFromFile(QString *error, Utils::Environment *customEnv)
|
||||||
{
|
{
|
||||||
|
if (isGeneric())
|
||||||
|
return;
|
||||||
|
|
||||||
// CDB only understands the single-dash -version, whereas GDB and LLDB are
|
// CDB only understands the single-dash -version, whereas GDB and LLDB are
|
||||||
// happy with both -version and --version. So use the "working" -version
|
// happy with both -version and --version. So use the "working" -version
|
||||||
// except for the experimental LLDB-MI which insists on --version.
|
// except for the experimental LLDB-MI which insists on --version.
|
||||||
@@ -282,6 +285,16 @@ QString DebuggerItem::engineTypeName() const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DebuggerItem::setGeneric(bool on)
|
||||||
|
{
|
||||||
|
m_detectionSource = on ? QLatin1String("Generic") : QLatin1String();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DebuggerItem::isGeneric() const
|
||||||
|
{
|
||||||
|
return m_detectionSource == "Generic";
|
||||||
|
}
|
||||||
|
|
||||||
QStringList DebuggerItem::abiNames() const
|
QStringList DebuggerItem::abiNames() const
|
||||||
{
|
{
|
||||||
QStringList list;
|
QStringList list;
|
||||||
@@ -297,13 +310,15 @@ QDateTime DebuggerItem::lastModified() const
|
|||||||
|
|
||||||
QIcon DebuggerItem::decoration() const
|
QIcon DebuggerItem::decoration() const
|
||||||
{
|
{
|
||||||
|
if (isGeneric())
|
||||||
|
return {};
|
||||||
if (m_engineType == NoEngineType)
|
if (m_engineType == NoEngineType)
|
||||||
return Icons::CRITICAL.icon();
|
return Icons::CRITICAL.icon();
|
||||||
if (!m_command.isExecutableFile())
|
if (!m_command.isExecutableFile())
|
||||||
return Icons::WARNING.icon();
|
return Icons::WARNING.icon();
|
||||||
if (!m_workingDirectory.isEmpty() && !m_workingDirectory.isDir())
|
if (!m_workingDirectory.isEmpty() && !m_workingDirectory.isDir())
|
||||||
return Icons::WARNING.icon();
|
return Icons::WARNING.icon();
|
||||||
return QIcon();
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
QString DebuggerItem::validityMessage() const
|
QString DebuggerItem::validityMessage() const
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
#include <projectexplorer/abi.h>
|
#include <projectexplorer/abi.h>
|
||||||
|
|
||||||
#include <utils/fileutils.h>
|
#include <utils/filepath.h>
|
||||||
#include <utils/environment.h>
|
#include <utils/environment.h>
|
||||||
|
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
@@ -84,6 +84,9 @@ public:
|
|||||||
QString detectionSource() const { return m_detectionSource; }
|
QString detectionSource() const { return m_detectionSource; }
|
||||||
void setDetectionSource(const QString &source) { m_detectionSource = source; }
|
void setDetectionSource(const QString &source) { m_detectionSource = source; }
|
||||||
|
|
||||||
|
bool isGeneric() const;
|
||||||
|
void setGeneric(bool on);
|
||||||
|
|
||||||
static bool addAndroidLldbPythonEnv(const Utils::FilePath &lldbCmd, Utils::Environment &env);
|
static bool addAndroidLldbPythonEnv(const Utils::FilePath &lldbCmd, Utils::Environment &env);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -92,7 +92,8 @@ static DebuggerItemManagerPrivate *d = nullptr;
|
|||||||
class DebuggerItemConfigWidget : public QWidget
|
class DebuggerItemConfigWidget : public QWidget
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit DebuggerItemConfigWidget();
|
DebuggerItemConfigWidget();
|
||||||
|
|
||||||
void load(const DebuggerItem *item);
|
void load(const DebuggerItem *item);
|
||||||
void store() const;
|
void store() const;
|
||||||
|
|
||||||
@@ -104,13 +105,18 @@ private:
|
|||||||
QLineEdit *m_displayNameLineEdit;
|
QLineEdit *m_displayNameLineEdit;
|
||||||
QLineEdit *m_typeLineEdit;
|
QLineEdit *m_typeLineEdit;
|
||||||
QLabel *m_cdbLabel;
|
QLabel *m_cdbLabel;
|
||||||
QLineEdit *m_versionLabel;
|
|
||||||
PathChooser *m_binaryChooser;
|
PathChooser *m_binaryChooser;
|
||||||
PathChooser *m_workingDirectoryChooser;
|
|
||||||
QLineEdit *m_abis;
|
|
||||||
bool m_autodetected = false;
|
bool m_autodetected = false;
|
||||||
|
bool m_generic = false;
|
||||||
DebuggerEngineType m_engineType = NoEngineType;
|
DebuggerEngineType m_engineType = NoEngineType;
|
||||||
QVariant m_id;
|
QVariant m_id;
|
||||||
|
|
||||||
|
QLabel *m_abisLabel;
|
||||||
|
QLineEdit *m_abis;
|
||||||
|
QLabel *m_versionLabel;
|
||||||
|
QLineEdit *m_version;
|
||||||
|
QLabel *m_workingDirectoryLabel;
|
||||||
|
PathChooser *m_workingDirectoryChooser;
|
||||||
};
|
};
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
@@ -174,7 +180,7 @@ public:
|
|||||||
|
|
||||||
QModelIndex lastIndex() const;
|
QModelIndex lastIndex() const;
|
||||||
void setCurrentIndex(const QModelIndex &index);
|
void setCurrentIndex(const QModelIndex &index);
|
||||||
void addDebugger(const DebuggerItem &item, bool changed = false);
|
DebuggerTreeItem *addDebugger(const DebuggerItem &item, bool changed = false);
|
||||||
void updateDebugger(const DebuggerItem &item);
|
void updateDebugger(const DebuggerItem &item);
|
||||||
void apply();
|
void apply();
|
||||||
void cancel();
|
void cancel();
|
||||||
@@ -213,6 +219,7 @@ DebuggerItemModel::DebuggerItemModel()
|
|||||||
|
|
||||||
DebuggerItem genericGdb(QVariant("gdb"));
|
DebuggerItem genericGdb(QVariant("gdb"));
|
||||||
genericGdb.setAutoDetected(true);
|
genericGdb.setAutoDetected(true);
|
||||||
|
genericGdb.setGeneric(true);
|
||||||
genericGdb.setEngineType(GdbEngineType);
|
genericGdb.setEngineType(GdbEngineType);
|
||||||
genericGdb.setAbi(Abi());
|
genericGdb.setAbi(Abi());
|
||||||
genericGdb.setCommand("gdb");
|
genericGdb.setCommand("gdb");
|
||||||
@@ -222,17 +229,20 @@ DebuggerItemModel::DebuggerItemModel()
|
|||||||
DebuggerItem genericLldb(QVariant("lldb"));
|
DebuggerItem genericLldb(QVariant("lldb"));
|
||||||
genericLldb.setAutoDetected(true);
|
genericLldb.setAutoDetected(true);
|
||||||
genericLldb.setEngineType(LldbEngineType);
|
genericLldb.setEngineType(LldbEngineType);
|
||||||
|
genericLldb.setGeneric(true);
|
||||||
genericLldb.setAbi(Abi());
|
genericLldb.setAbi(Abi());
|
||||||
genericLldb.setCommand("lldb");
|
genericLldb.setCommand("lldb");
|
||||||
genericLldb.setUnexpandedDisplayName(Tr::tr("%1 from PATH on Build Device").arg("LLDB"));
|
genericLldb.setUnexpandedDisplayName(Tr::tr("%1 from PATH on Build Device").arg("LLDB"));
|
||||||
generic->appendChild(new DebuggerTreeItem(genericLldb, false));
|
generic->appendChild(new DebuggerTreeItem(genericLldb, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
void DebuggerItemModel::addDebugger(const DebuggerItem &item, bool changed)
|
DebuggerTreeItem *DebuggerItemModel::addDebugger(const DebuggerItem &item, bool changed)
|
||||||
{
|
{
|
||||||
QTC_ASSERT(item.id().isValid(), return);
|
QTC_ASSERT(item.id().isValid(), return {});
|
||||||
int group = item.isAutoDetected() ? AutoDetected : Manual;
|
int group = item.isGeneric() ? Generic : (item.isAutoDetected() ? AutoDetected : Manual);
|
||||||
rootItem()->childAt(group)->appendChild(new DebuggerTreeItem(item, changed));
|
auto treeItem = new DebuggerTreeItem(item, changed);
|
||||||
|
rootItem()->childAt(group)->appendChild(treeItem);
|
||||||
|
return treeItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DebuggerItemModel::updateDebugger(const DebuggerItem &item)
|
void DebuggerItemModel::updateDebugger(const DebuggerItem &item)
|
||||||
@@ -321,6 +331,7 @@ DebuggerItemConfigWidget::DebuggerItemConfigWidget()
|
|||||||
});
|
});
|
||||||
m_binaryChooser->setAllowPathFromDevice(true);
|
m_binaryChooser->setAllowPathFromDevice(true);
|
||||||
|
|
||||||
|
m_workingDirectoryLabel = new QLabel(Tr::tr("ABIs:"));
|
||||||
m_workingDirectoryChooser = new PathChooser(this);
|
m_workingDirectoryChooser = new PathChooser(this);
|
||||||
m_workingDirectoryChooser->setExpectedKind(PathChooser::Directory);
|
m_workingDirectoryChooser->setExpectedKind(PathChooser::Directory);
|
||||||
m_workingDirectoryChooser->setMinimumWidth(400);
|
m_workingDirectoryChooser->setMinimumWidth(400);
|
||||||
@@ -330,10 +341,12 @@ DebuggerItemConfigWidget::DebuggerItemConfigWidget()
|
|||||||
m_cdbLabel->setTextInteractionFlags(Qt::TextBrowserInteraction);
|
m_cdbLabel->setTextInteractionFlags(Qt::TextBrowserInteraction);
|
||||||
m_cdbLabel->setOpenExternalLinks(true);
|
m_cdbLabel->setOpenExternalLinks(true);
|
||||||
|
|
||||||
m_versionLabel = new QLineEdit(this);
|
m_versionLabel = new QLabel(Tr::tr("Version:"));
|
||||||
m_versionLabel->setPlaceholderText(Tr::tr("Unknown"));
|
m_version = new QLineEdit(this);
|
||||||
m_versionLabel->setEnabled(false);
|
m_version->setPlaceholderText(Tr::tr("Unknown"));
|
||||||
|
m_version->setEnabled(false);
|
||||||
|
|
||||||
|
m_abisLabel = new QLabel(Tr::tr("Working directory:"));
|
||||||
m_abis = new QLineEdit(this);
|
m_abis = new QLineEdit(this);
|
||||||
m_abis->setEnabled(false);
|
m_abis->setEnabled(false);
|
||||||
|
|
||||||
@@ -343,9 +356,9 @@ DebuggerItemConfigWidget::DebuggerItemConfigWidget()
|
|||||||
formLayout->addRow(m_cdbLabel);
|
formLayout->addRow(m_cdbLabel);
|
||||||
formLayout->addRow(new QLabel(Tr::tr("Path:")), m_binaryChooser);
|
formLayout->addRow(new QLabel(Tr::tr("Path:")), m_binaryChooser);
|
||||||
formLayout->addRow(new QLabel(Tr::tr("Type:")), m_typeLineEdit);
|
formLayout->addRow(new QLabel(Tr::tr("Type:")), m_typeLineEdit);
|
||||||
formLayout->addRow(new QLabel(Tr::tr("ABIs:")), m_abis);
|
formLayout->addRow(m_abisLabel, m_abis);
|
||||||
formLayout->addRow(new QLabel(Tr::tr("Version:")), m_versionLabel);
|
formLayout->addRow(m_versionLabel, m_version);
|
||||||
formLayout->addRow(new QLabel(Tr::tr("Working directory:")), m_workingDirectoryChooser);
|
formLayout->addRow(m_workingDirectoryLabel, m_workingDirectoryChooser);
|
||||||
|
|
||||||
connect(m_binaryChooser, &PathChooser::textChanged,
|
connect(m_binaryChooser, &PathChooser::textChanged,
|
||||||
this, &DebuggerItemConfigWidget::binaryPathHasChanged);
|
this, &DebuggerItemConfigWidget::binaryPathHasChanged);
|
||||||
@@ -357,21 +370,24 @@ DebuggerItemConfigWidget::DebuggerItemConfigWidget()
|
|||||||
|
|
||||||
DebuggerItem DebuggerItemConfigWidget::item() const
|
DebuggerItem DebuggerItemConfigWidget::item() const
|
||||||
{
|
{
|
||||||
|
static const QRegularExpression noAbi("[^A-Za-z0-9-_]+");
|
||||||
|
|
||||||
DebuggerItem item(m_id);
|
DebuggerItem item(m_id);
|
||||||
item.setUnexpandedDisplayName(m_displayNameLineEdit->text());
|
item.setUnexpandedDisplayName(m_displayNameLineEdit->text());
|
||||||
item.setCommand(m_binaryChooser->filePath());
|
item.setCommand(m_binaryChooser->filePath());
|
||||||
item.setWorkingDirectory(m_workingDirectoryChooser->filePath());
|
item.setWorkingDirectory(m_workingDirectoryChooser->filePath());
|
||||||
item.setAutoDetected(m_autodetected);
|
item.setAutoDetected(m_autodetected);
|
||||||
Abis abiList;
|
Abis abiList;
|
||||||
const QStringList abis = m_abis->text().split(QRegularExpression("[^A-Za-z0-9-_]+"));
|
const QStringList abis = m_abis->text().split(noAbi);
|
||||||
for (const QString &a : abis) {
|
for (const QString &a : abis) {
|
||||||
if (a.isNull())
|
if (a.isNull())
|
||||||
continue;
|
continue;
|
||||||
abiList << Abi::fromString(a);
|
abiList << Abi::fromString(a);
|
||||||
}
|
}
|
||||||
item.setAbis(abiList);
|
item.setAbis(abiList);
|
||||||
item.setVersion(m_versionLabel->text());
|
item.setVersion(m_version->text());
|
||||||
item.setEngineType(m_engineType);
|
item.setEngineType(m_engineType);
|
||||||
|
item.setGeneric(m_generic);
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -393,6 +409,7 @@ void DebuggerItemConfigWidget::load(const DebuggerItem *item)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// Set values:
|
// Set values:
|
||||||
|
m_generic = item->isGeneric();
|
||||||
m_autodetected = item->isAutoDetected();
|
m_autodetected = item->isAutoDetected();
|
||||||
|
|
||||||
m_displayNameLineEdit->setEnabled(!item->isAutoDetected());
|
m_displayNameLineEdit->setEnabled(!item->isAutoDetected());
|
||||||
@@ -402,6 +419,15 @@ void DebuggerItemConfigWidget::load(const DebuggerItem *item)
|
|||||||
|
|
||||||
m_binaryChooser->setReadOnly(item->isAutoDetected());
|
m_binaryChooser->setReadOnly(item->isAutoDetected());
|
||||||
m_binaryChooser->setFilePath(item->command());
|
m_binaryChooser->setFilePath(item->command());
|
||||||
|
m_binaryChooser->setExpectedKind(m_generic ? PathChooser::Any : PathChooser::ExistingCommand);
|
||||||
|
|
||||||
|
m_abisLabel->setVisible(!m_generic);
|
||||||
|
m_abis->setVisible(!m_generic);
|
||||||
|
m_versionLabel->setVisible(!m_generic);
|
||||||
|
m_version->setVisible(!m_generic);
|
||||||
|
m_workingDirectoryLabel->setVisible(!m_generic);
|
||||||
|
m_workingDirectoryChooser->setVisible(!m_generic);
|
||||||
|
|
||||||
|
|
||||||
m_workingDirectoryChooser->setReadOnly(item->isAutoDetected());
|
m_workingDirectoryChooser->setReadOnly(item->isAutoDetected());
|
||||||
m_workingDirectoryChooser->setFilePath(item->workingDirectory());
|
m_workingDirectoryChooser->setFilePath(item->workingDirectory());
|
||||||
@@ -425,7 +451,7 @@ void DebuggerItemConfigWidget::load(const DebuggerItem *item)
|
|||||||
m_cdbLabel->setText(text);
|
m_cdbLabel->setText(text);
|
||||||
m_cdbLabel->setVisible(!text.isEmpty());
|
m_cdbLabel->setVisible(!text.isEmpty());
|
||||||
m_binaryChooser->setCommandVersionArguments(QStringList(versionCommand));
|
m_binaryChooser->setCommandVersionArguments(QStringList(versionCommand));
|
||||||
m_versionLabel->setText(item->version());
|
m_version->setText(item->version());
|
||||||
setAbis(item->abiNames());
|
setAbis(item->abiNames());
|
||||||
m_engineType = item->engineType();
|
m_engineType = item->engineType();
|
||||||
m_id = item->id();
|
m_id = item->id();
|
||||||
@@ -437,6 +463,7 @@ void DebuggerItemConfigWidget::binaryPathHasChanged()
|
|||||||
if (!m_id.isValid())
|
if (!m_id.isValid())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!m_generic) {
|
||||||
DebuggerItem tmp;
|
DebuggerItem tmp;
|
||||||
if (m_binaryChooser->filePath().isExecutableFile()) {
|
if (m_binaryChooser->filePath().isExecutableFile()) {
|
||||||
tmp = item();
|
tmp = item();
|
||||||
@@ -444,9 +471,10 @@ void DebuggerItemConfigWidget::binaryPathHasChanged()
|
|||||||
}
|
}
|
||||||
|
|
||||||
setAbis(tmp.abiNames());
|
setAbis(tmp.abiNames());
|
||||||
m_versionLabel->setText(tmp.version());
|
m_version->setText(tmp.version());
|
||||||
m_engineType = tmp.engineType();
|
m_engineType = tmp.engineType();
|
||||||
m_typeLineEdit->setText(tmp.engineTypeName());
|
m_typeLineEdit->setText(tmp.engineTypeName());
|
||||||
|
}
|
||||||
|
|
||||||
store();
|
store();
|
||||||
}
|
}
|
||||||
@@ -554,8 +582,10 @@ void DebuggerConfigWidget::cloneDebugger()
|
|||||||
newItem.setUnexpandedDisplayName(d->uniqueDisplayName(Tr::tr("Clone of %1").arg(item->displayName())));
|
newItem.setUnexpandedDisplayName(d->uniqueDisplayName(Tr::tr("Clone of %1").arg(item->displayName())));
|
||||||
newItem.reinitializeFromFile();
|
newItem.reinitializeFromFile();
|
||||||
newItem.setAutoDetected(false);
|
newItem.setAutoDetected(false);
|
||||||
d->m_model->addDebugger(newItem, true);
|
newItem.setGeneric(item->isGeneric());
|
||||||
m_debuggerView->setCurrentIndex(d->m_model->lastIndex());
|
newItem.setEngineType(item->engineType());
|
||||||
|
auto addedItem = d->m_model->addDebugger(newItem, true);
|
||||||
|
m_debuggerView->setCurrentIndex(d->m_model->indexForItem(addedItem));
|
||||||
}
|
}
|
||||||
|
|
||||||
void DebuggerConfigWidget::addDebugger()
|
void DebuggerConfigWidget::addDebugger()
|
||||||
@@ -565,8 +595,8 @@ void DebuggerConfigWidget::addDebugger()
|
|||||||
item.setEngineType(NoEngineType);
|
item.setEngineType(NoEngineType);
|
||||||
item.setUnexpandedDisplayName(d->uniqueDisplayName(Tr::tr("New Debugger")));
|
item.setUnexpandedDisplayName(d->uniqueDisplayName(Tr::tr("New Debugger")));
|
||||||
item.setAutoDetected(false);
|
item.setAutoDetected(false);
|
||||||
d->m_model->addDebugger(item, true);
|
auto addedItem = d->m_model->addDebugger(item, true);
|
||||||
m_debuggerView->setCurrentIndex(d->m_model->lastIndex());
|
m_debuggerView->setCurrentIndex(d->m_model->indexForItem(addedItem));
|
||||||
}
|
}
|
||||||
|
|
||||||
void DebuggerConfigWidget::removeDebugger()
|
void DebuggerConfigWidget::removeDebugger()
|
||||||
|
|||||||
Reference in New Issue
Block a user