Debugger: Small corrections to "Generic" item handling

Change-Id: Idd8f6a64aa64b8f13e713b3337ad1f8f2b8735db
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
hjk
2023-03-28 18:22:58 +02:00
parent 463e47bbdd
commit cf138ad909
3 changed files with 81 additions and 33 deletions

View File

@@ -116,6 +116,9 @@ void DebuggerItem::createId()
void DebuggerItem::reinitializeFromFile(QString *error, Utils::Environment *customEnv)
{
if (isGeneric())
return;
// CDB only understands the single-dash -version, whereas GDB and LLDB are
// happy with both -version and --version. So use the "working" -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 list;
@@ -297,13 +310,15 @@ QDateTime DebuggerItem::lastModified() const
QIcon DebuggerItem::decoration() const
{
if (isGeneric())
return {};
if (m_engineType == NoEngineType)
return Icons::CRITICAL.icon();
if (!m_command.isExecutableFile())
return Icons::WARNING.icon();
if (!m_workingDirectory.isEmpty() && !m_workingDirectory.isDir())
return Icons::WARNING.icon();
return QIcon();
return {};
}
QString DebuggerItem::validityMessage() const

View File

@@ -8,7 +8,7 @@
#include <projectexplorer/abi.h>
#include <utils/fileutils.h>
#include <utils/filepath.h>
#include <utils/environment.h>
#include <QDateTime>
@@ -84,6 +84,9 @@ public:
QString detectionSource() const { return m_detectionSource; }
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);
private:

View File

@@ -92,7 +92,8 @@ static DebuggerItemManagerPrivate *d = nullptr;
class DebuggerItemConfigWidget : public QWidget
{
public:
explicit DebuggerItemConfigWidget();
DebuggerItemConfigWidget();
void load(const DebuggerItem *item);
void store() const;
@@ -104,13 +105,18 @@ private:
QLineEdit *m_displayNameLineEdit;
QLineEdit *m_typeLineEdit;
QLabel *m_cdbLabel;
QLineEdit *m_versionLabel;
PathChooser *m_binaryChooser;
PathChooser *m_workingDirectoryChooser;
QLineEdit *m_abis;
bool m_autodetected = false;
bool m_generic = false;
DebuggerEngineType m_engineType = NoEngineType;
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;
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 apply();
void cancel();
@@ -213,6 +219,7 @@ DebuggerItemModel::DebuggerItemModel()
DebuggerItem genericGdb(QVariant("gdb"));
genericGdb.setAutoDetected(true);
genericGdb.setGeneric(true);
genericGdb.setEngineType(GdbEngineType);
genericGdb.setAbi(Abi());
genericGdb.setCommand("gdb");
@@ -222,17 +229,20 @@ DebuggerItemModel::DebuggerItemModel()
DebuggerItem genericLldb(QVariant("lldb"));
genericLldb.setAutoDetected(true);
genericLldb.setEngineType(LldbEngineType);
genericLldb.setGeneric(true);
genericLldb.setAbi(Abi());
genericLldb.setCommand("lldb");
genericLldb.setUnexpandedDisplayName(Tr::tr("%1 from PATH on Build Device").arg("LLDB"));
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);
int group = item.isAutoDetected() ? AutoDetected : Manual;
rootItem()->childAt(group)->appendChild(new DebuggerTreeItem(item, changed));
QTC_ASSERT(item.id().isValid(), return {});
int group = item.isGeneric() ? Generic : (item.isAutoDetected() ? AutoDetected : Manual);
auto treeItem = new DebuggerTreeItem(item, changed);
rootItem()->childAt(group)->appendChild(treeItem);
return treeItem;
}
void DebuggerItemModel::updateDebugger(const DebuggerItem &item)
@@ -321,6 +331,7 @@ DebuggerItemConfigWidget::DebuggerItemConfigWidget()
});
m_binaryChooser->setAllowPathFromDevice(true);
m_workingDirectoryLabel = new QLabel(Tr::tr("ABIs:"));
m_workingDirectoryChooser = new PathChooser(this);
m_workingDirectoryChooser->setExpectedKind(PathChooser::Directory);
m_workingDirectoryChooser->setMinimumWidth(400);
@@ -330,10 +341,12 @@ DebuggerItemConfigWidget::DebuggerItemConfigWidget()
m_cdbLabel->setTextInteractionFlags(Qt::TextBrowserInteraction);
m_cdbLabel->setOpenExternalLinks(true);
m_versionLabel = new QLineEdit(this);
m_versionLabel->setPlaceholderText(Tr::tr("Unknown"));
m_versionLabel->setEnabled(false);
m_versionLabel = new QLabel(Tr::tr("Version:"));
m_version = new QLineEdit(this);
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->setEnabled(false);
@@ -343,9 +356,9 @@ DebuggerItemConfigWidget::DebuggerItemConfigWidget()
formLayout->addRow(m_cdbLabel);
formLayout->addRow(new QLabel(Tr::tr("Path:")), m_binaryChooser);
formLayout->addRow(new QLabel(Tr::tr("Type:")), m_typeLineEdit);
formLayout->addRow(new QLabel(Tr::tr("ABIs:")), m_abis);
formLayout->addRow(new QLabel(Tr::tr("Version:")), m_versionLabel);
formLayout->addRow(new QLabel(Tr::tr("Working directory:")), m_workingDirectoryChooser);
formLayout->addRow(m_abisLabel, m_abis);
formLayout->addRow(m_versionLabel, m_version);
formLayout->addRow(m_workingDirectoryLabel, m_workingDirectoryChooser);
connect(m_binaryChooser, &PathChooser::textChanged,
this, &DebuggerItemConfigWidget::binaryPathHasChanged);
@@ -357,21 +370,24 @@ DebuggerItemConfigWidget::DebuggerItemConfigWidget()
DebuggerItem DebuggerItemConfigWidget::item() const
{
static const QRegularExpression noAbi("[^A-Za-z0-9-_]+");
DebuggerItem item(m_id);
item.setUnexpandedDisplayName(m_displayNameLineEdit->text());
item.setCommand(m_binaryChooser->filePath());
item.setWorkingDirectory(m_workingDirectoryChooser->filePath());
item.setAutoDetected(m_autodetected);
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) {
if (a.isNull())
continue;
abiList << Abi::fromString(a);
}
item.setAbis(abiList);
item.setVersion(m_versionLabel->text());
item.setVersion(m_version->text());
item.setEngineType(m_engineType);
item.setGeneric(m_generic);
return item;
}
@@ -393,6 +409,7 @@ void DebuggerItemConfigWidget::load(const DebuggerItem *item)
return;
// Set values:
m_generic = item->isGeneric();
m_autodetected = item->isAutoDetected();
m_displayNameLineEdit->setEnabled(!item->isAutoDetected());
@@ -402,6 +419,15 @@ void DebuggerItemConfigWidget::load(const DebuggerItem *item)
m_binaryChooser->setReadOnly(item->isAutoDetected());
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->setFilePath(item->workingDirectory());
@@ -425,7 +451,7 @@ void DebuggerItemConfigWidget::load(const DebuggerItem *item)
m_cdbLabel->setText(text);
m_cdbLabel->setVisible(!text.isEmpty());
m_binaryChooser->setCommandVersionArguments(QStringList(versionCommand));
m_versionLabel->setText(item->version());
m_version->setText(item->version());
setAbis(item->abiNames());
m_engineType = item->engineType();
m_id = item->id();
@@ -437,6 +463,7 @@ void DebuggerItemConfigWidget::binaryPathHasChanged()
if (!m_id.isValid())
return;
if (!m_generic) {
DebuggerItem tmp;
if (m_binaryChooser->filePath().isExecutableFile()) {
tmp = item();
@@ -444,9 +471,10 @@ void DebuggerItemConfigWidget::binaryPathHasChanged()
}
setAbis(tmp.abiNames());
m_versionLabel->setText(tmp.version());
m_version->setText(tmp.version());
m_engineType = tmp.engineType();
m_typeLineEdit->setText(tmp.engineTypeName());
}
store();
}
@@ -554,8 +582,10 @@ void DebuggerConfigWidget::cloneDebugger()
newItem.setUnexpandedDisplayName(d->uniqueDisplayName(Tr::tr("Clone of %1").arg(item->displayName())));
newItem.reinitializeFromFile();
newItem.setAutoDetected(false);
d->m_model->addDebugger(newItem, true);
m_debuggerView->setCurrentIndex(d->m_model->lastIndex());
newItem.setGeneric(item->isGeneric());
newItem.setEngineType(item->engineType());
auto addedItem = d->m_model->addDebugger(newItem, true);
m_debuggerView->setCurrentIndex(d->m_model->indexForItem(addedItem));
}
void DebuggerConfigWidget::addDebugger()
@@ -565,8 +595,8 @@ void DebuggerConfigWidget::addDebugger()
item.setEngineType(NoEngineType);
item.setUnexpandedDisplayName(d->uniqueDisplayName(Tr::tr("New Debugger")));
item.setAutoDetected(false);
d->m_model->addDebugger(item, true);
m_debuggerView->setCurrentIndex(d->m_model->lastIndex());
auto addedItem = d->m_model->addDebugger(item, true);
m_debuggerView->setCurrentIndex(d->m_model->indexForItem(addedItem));
}
void DebuggerConfigWidget::removeDebugger()