From 6ab4adabf3923630bdd98e4a39ba6615ed79ee4d Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 27 Nov 2013 12:32:43 +0100 Subject: Debugger: Prevent overwriting of pre-defined Abi values Todo: Add a button to rescan ABIs to UI after UI freeze. Currently you have to change the debugger command and then change it back when replacing a debugger with a debugger for something else in place. Task-number: QTCREATORBUG-10755 Change-Id: Id3cf1da3f198b60e6c538e5478b11f1d6d379ff9 Reviewed-by: hjk Reviewed-by: Tobias Hunger --- src/plugins/debugger/debuggeroptionspage.cpp | 72 +++++++++++++++++----------- 1 file changed, 44 insertions(+), 28 deletions(-) (limited to 'src/plugins/debugger/debuggeroptionspage.cpp') diff --git a/src/plugins/debugger/debuggeroptionspage.cpp b/src/plugins/debugger/debuggeroptionspage.cpp index da42957d65..ef89a2d35d 100644 --- a/src/plugins/debugger/debuggeroptionspage.cpp +++ b/src/plugins/debugger/debuggeroptionspage.cpp @@ -39,6 +39,7 @@ #include #include +#include #include #include #include @@ -59,26 +60,6 @@ static const char debuggingToolsWikiLinkC[] = "http://qt-project.org/wiki/Qt_Cre // DebuggerItemConfigWidget // ----------------------------------------------------------------------- -class DebuggerItemConfigWidget : public QWidget -{ - Q_DECLARE_TR_FUNCTIONS(Debugger::Internal::DebuggerItemConfigWidget) - -public: - explicit DebuggerItemConfigWidget(DebuggerItemModel *model); - DebuggerItem store() const; - void setItem(const DebuggerItem &item); - void apply(); - -private: - QLineEdit *m_displayNameLineEdit; - QLabel *m_cdbLabel; - PathChooser *m_binaryChooser; - QLineEdit *m_abis; - DebuggerItemModel *m_model; - bool m_autodetected; - QVariant m_id; -}; - DebuggerItemConfigWidget::DebuggerItemConfigWidget(DebuggerItemModel *model) : m_model(model) { @@ -90,6 +71,7 @@ DebuggerItemConfigWidget::DebuggerItemConfigWidget(DebuggerItemModel *model) : m_binaryChooser->setExpectedKind(PathChooser::ExistingCommand); m_binaryChooser->setMinimumWidth(400); m_binaryChooser->setHistoryCompleter(QLatin1String("DebuggerPaths")); + connect(m_binaryChooser, SIGNAL(changed(QString)), this, SLOT(commandWasChanged())); m_cdbLabel = new QLabel(this); m_cdbLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); @@ -107,7 +89,7 @@ DebuggerItemConfigWidget::DebuggerItemConfigWidget(DebuggerItemModel *model) : formLayout->addRow(new QLabel(tr("ABIs:")), m_abis); } -DebuggerItem DebuggerItemConfigWidget::store() const +DebuggerItem DebuggerItemConfigWidget::item() const { DebuggerItem item(m_id); if (m_id.isNull()) @@ -116,11 +98,28 @@ DebuggerItem DebuggerItemConfigWidget::store() const item.setDisplayName(m_displayNameLineEdit->text()); item.setCommand(m_binaryChooser->fileName()); item.setAutoDetected(m_autodetected); - item.reinitializeFromFile(); - m_model->updateDebugger(item); + QList abiList; + foreach (const QString &a, m_abis->text().split(QRegExp(QLatin1String("[^A-Za-z0-9-_]+")))) { + ProjectExplorer::Abi abi(a); + if (a.isNull()) + continue; + abiList << a; + } + item.setAbis(abiList); return item; } + +void DebuggerItemConfigWidget::store() const +{ + m_model->updateDebugger(item()); +} + +void DebuggerItemConfigWidget::setAbis(const QStringList &abiNames) +{ + m_abis->setText(abiNames.join(QLatin1String(", "))); +} + void DebuggerItemConfigWidget::setItem(const DebuggerItem &item) { store(); // store away the (changed) settings for future use @@ -157,17 +156,34 @@ void DebuggerItemConfigWidget::setItem(const DebuggerItem &item) m_cdbLabel->setVisible(!text.isEmpty()); m_binaryChooser->setCommandVersionArguments(QStringList(versionCommand)); - m_abis->setText(item.abiNames().join(QLatin1String(", "))); + setAbis(item.abiNames()); } void DebuggerItemConfigWidget::apply() { - DebuggerItem item = m_model->currentDebugger(); - if (!item.isValid()) + DebuggerItem current = m_model->currentDebugger(); + if (!current.isValid()) return; // Nothing was selected here. - item = store(); - setItem(item); + store(); + setItem(item()); +} + +void DebuggerItemConfigWidget::commandWasChanged() +{ + // Use DebuggerItemManager as a cache: + const DebuggerItem *existing + = DebuggerItemManager::findByCommand(m_binaryChooser->fileName()); + if (existing) { + setAbis(existing->abiNames()); + } else { + QFileInfo fi = QFileInfo(m_binaryChooser->path()); + if (fi.isExecutable()) { + DebuggerItem tmp = item(); + tmp.reinitializeFromFile(); + setAbis(tmp.abiNames()); + } + } } // -------------------------------------------------------------------------- -- cgit v1.2.1 From 3d9a71a21c1a73256e8595459a1b1320485fd2f5 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 4 Dec 2013 12:34:48 +0100 Subject: Debugger: Do not warn SOFT_ASSERT when no debugger is selected Do not not try to update the debugger if none is actually set. This avoids triggering a SOFT_ASSERT in the debuggeritemmodel. Change-Id: I646e251f58d6e25f1a88bddc142d953f94522084 Reviewed-by: hjk --- src/plugins/debugger/debuggeroptionspage.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/plugins/debugger/debuggeroptionspage.cpp') diff --git a/src/plugins/debugger/debuggeroptionspage.cpp b/src/plugins/debugger/debuggeroptionspage.cpp index ef89a2d35d..f9ff147333 100644 --- a/src/plugins/debugger/debuggeroptionspage.cpp +++ b/src/plugins/debugger/debuggeroptionspage.cpp @@ -112,7 +112,9 @@ DebuggerItem DebuggerItemConfigWidget::item() const void DebuggerItemConfigWidget::store() const { - m_model->updateDebugger(item()); + DebuggerItem i = item(); + if (i.isValid()) + m_model->updateDebugger(i); } void DebuggerItemConfigWidget::setAbis(const QStringList &abiNames) -- cgit v1.2.1 From 0f4a7f302f790bd9a3abf145292585f1c3ba5681 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 4 Dec 2013 12:36:03 +0100 Subject: Debugger: Do not lose the engine type in the debuggeritemmodel Have the DebuggerItemConfigWidget remember the engine type (even though it does not display it), so that it can write that information back into the model later. Change-Id: I1ed0d6a8d3750696a7eb5c453179acc282b78ce4 Reviewed-by: hjk --- src/plugins/debugger/debuggeroptionspage.cpp | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src/plugins/debugger/debuggeroptionspage.cpp') diff --git a/src/plugins/debugger/debuggeroptionspage.cpp b/src/plugins/debugger/debuggeroptionspage.cpp index f9ff147333..16471d01ee 100644 --- a/src/plugins/debugger/debuggeroptionspage.cpp +++ b/src/plugins/debugger/debuggeroptionspage.cpp @@ -106,6 +106,7 @@ DebuggerItem DebuggerItemConfigWidget::item() const abiList << a; } item.setAbis(abiList); + item.setEngineType(m_engineType); return item; } @@ -159,6 +160,7 @@ void DebuggerItemConfigWidget::setItem(const DebuggerItem &item) m_binaryChooser->setCommandVersionArguments(QStringList(versionCommand)); setAbis(item.abiNames()); + m_engineType = item.engineType(); } void DebuggerItemConfigWidget::apply() @@ -178,14 +180,17 @@ void DebuggerItemConfigWidget::commandWasChanged() = DebuggerItemManager::findByCommand(m_binaryChooser->fileName()); if (existing) { setAbis(existing->abiNames()); + m_engineType = existing->engineType(); } else { QFileInfo fi = QFileInfo(m_binaryChooser->path()); if (fi.isExecutable()) { DebuggerItem tmp = item(); tmp.reinitializeFromFile(); setAbis(tmp.abiNames()); + m_engineType = tmp.engineType(); } } + m_model->updateDebugger(item()); } // -------------------------------------------------------------------------- -- cgit v1.2.1 From 760e401098eaeffc06aadb657ca3860c7cc93dcf Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 4 Dec 2013 13:21:10 +0100 Subject: Debugger: Reset engine type and ABI for non-existing commands Change-Id: I53bdb26ea4e48d59b4623076da9cdb4ff499c3e1 Reviewed-by: hjk --- src/plugins/debugger/debuggeroptionspage.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/plugins/debugger/debuggeroptionspage.cpp') diff --git a/src/plugins/debugger/debuggeroptionspage.cpp b/src/plugins/debugger/debuggeroptionspage.cpp index 16471d01ee..bd0b8d2916 100644 --- a/src/plugins/debugger/debuggeroptionspage.cpp +++ b/src/plugins/debugger/debuggeroptionspage.cpp @@ -188,6 +188,9 @@ void DebuggerItemConfigWidget::commandWasChanged() tmp.reinitializeFromFile(); setAbis(tmp.abiNames()); m_engineType = tmp.engineType(); + } else { + setAbis(QStringList()); + m_engineType = NoEngineType; } } m_model->updateDebugger(item()); -- cgit v1.2.1