Debugger: Make DebuggerRunConfig sub-aspects direct members

Change-Id: I53979892598164b26c8fc1977b1366b0a56fa152
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
This commit is contained in:
hjk
2024-02-15 17:10:32 +01:00
parent 01f106b279
commit e3b62d0aa5
4 changed files with 82 additions and 76 deletions

View File

@@ -2518,9 +2518,20 @@ TriStateAspect::TriStateAspect(AspectContainer *container,
{ {
setDisplayStyle(DisplayStyle::ComboBox); setDisplayStyle(DisplayStyle::ComboBox);
setDefaultValue(TriState::Default); setDefaultValue(TriState::Default);
addOption(onString.isEmpty() ? Tr::tr("Enable") : onString); SelectionAspect::addOption({});
addOption(offString.isEmpty() ? Tr::tr("Disable") : offString); SelectionAspect::addOption({});
addOption(defaultString.isEmpty() ? Tr::tr("Leave at Default") : defaultString); SelectionAspect::addOption({});
setOptionTexts(onString, offString, defaultString);
}
void TriStateAspect::setOptionTexts(const QString &onString,
const QString &offString,
const QString &defaultString)
{
QTC_ASSERT(d->m_options.size() == 3, return);
d->m_options[0].displayName = onString.isEmpty() ? Tr::tr("Enable") : onString;
d->m_options[1].displayName = offString.isEmpty() ? Tr::tr("Disable") : offString;
d->m_options[2].displayName = defaultString.isEmpty() ? Tr::tr("Leave at Default") : defaultString;
} }
TriState TriStateAspect::value() const TriState TriStateAspect::value() const

View File

@@ -554,7 +554,6 @@ protected:
void bufferToGui() override; void bufferToGui() override;
bool guiToBuffer() override; bool guiToBuffer() override;
private:
std::unique_ptr<Internal::SelectionAspectPrivate> d; std::unique_ptr<Internal::SelectionAspectPrivate> d;
}; };
@@ -812,6 +811,13 @@ public:
TriState defaultValue() const; TriState defaultValue() const;
void setDefaultValue(TriState setting); void setDefaultValue(TriState setting);
void setOptionTexts(const QString &onString,
const QString &offString,
const QString &defaultString);
private:
void addOption(const QString &displayName, const QString &toolTip = {}) = delete;
void addOption(const Option &option) = delete;
}; };
class QTCREATOR_UTILS_EXPORT StringListAspect : public TypedAspect<QStringList> class QTCREATOR_UTILS_EXPORT StringListAspect : public TypedAspect<QStringList>

View File

@@ -26,10 +26,8 @@
#include <utils/environment.h> #include <utils/environment.h>
#include <utils/layoutbuilder.h> #include <utils/layoutbuilder.h>
#include <QCheckBox>
#include <QDebug> #include <QDebug>
#include <QLabel> #include <QLabel>
#include <QTextEdit>
using namespace ProjectExplorer; using namespace ProjectExplorer;
using namespace Utils; using namespace Utils;
@@ -79,26 +77,26 @@ DebuggerRunConfigurationAspect::DebuggerRunConfigurationAspect(Target *target)
const auto setSummaryText = [this, details] { const auto setSummaryText = [this, details] {
QStringList items; QStringList items;
if (m_cppAspect->value() == TriState::Enabled) if (m_cppAspect() == TriState::Enabled)
items.append(Tr::tr("Enable C++ debugger.")); items.append(Tr::tr("Enable C++ debugger."));
else if (m_cppAspect->value() == TriState::Default) else if (m_cppAspect() == TriState::Default)
items.append(Tr::tr("Try to determine need for C++ debugger.")); items.append(Tr::tr("Try to determine need for C++ debugger."));
if (m_qmlAspect->value() == TriState::Enabled) if (m_qmlAspect() == TriState::Enabled)
items.append(Tr::tr("Enable QML debugger.")); items.append(Tr::tr("Enable QML debugger."));
else if (m_qmlAspect->value() == TriState::Default) else if (m_qmlAspect() == TriState::Default)
items.append(Tr::tr("Try to determine need for QML debugger.")); items.append(Tr::tr("Try to determine need for QML debugger."));
items.append(m_overrideStartupAspect->value().isEmpty() items.append(m_overrideStartupAspect().isEmpty()
? Tr::tr("Without additional startup commands.") ? Tr::tr("Without additional startup commands.")
: Tr::tr("With additional startup commands.")); : Tr::tr("With additional startup commands."));
details->setSummaryText(items.join(" ")); details->setSummaryText(items.join(" "));
}; };
setSummaryText(); setSummaryText();
connect(m_cppAspect, &BaseAspect::changed, this, setSummaryText); connect(&m_cppAspect, &BaseAspect::changed, this, setSummaryText);
connect(m_qmlAspect, &BaseAspect::changed, this, setSummaryText); connect(&m_qmlAspect, &BaseAspect::changed, this, setSummaryText);
connect(m_overrideStartupAspect, &BaseAspect::changed, this, setSummaryText); connect(&m_overrideStartupAspect, &BaseAspect::changed, this, setSummaryText);
return details; return details;
}); });
@@ -109,63 +107,54 @@ DebuggerRunConfigurationAspect::DebuggerRunConfigurationAspect(Target *target)
addDataExtractor(this, &DebuggerRunConfigurationAspect::useMultiProcess, &Data::useMultiProcess); addDataExtractor(this, &DebuggerRunConfigurationAspect::useMultiProcess, &Data::useMultiProcess);
addDataExtractor(this, &DebuggerRunConfigurationAspect::overrideStartup, &Data::overrideStartup); addDataExtractor(this, &DebuggerRunConfigurationAspect::overrideStartup, &Data::overrideStartup);
m_cppAspect = new TriStateAspect(nullptr, Tr::tr("Enabled"), Tr::tr("Disabled"), Tr::tr("Automatic")); m_cppAspect.setSettingsKey("RunConfiguration.UseCppDebugger");
m_cppAspect->setLabelText(Tr::tr("C++ debugger:")); m_cppAspect.setLabelText(Tr::tr("C++ debugger:"));
m_cppAspect->setSettingsKey("RunConfiguration.UseCppDebugger"); m_cppAspect.setOptionTexts(Tr::tr("Enabled"), Tr::tr("Disabled"), Tr::tr("Automatic"));
m_qmlAspect = new TriStateAspect(nullptr, Tr::tr("Enabled"), Tr::tr("Disabled"), Tr::tr("Automatic")); m_qmlAspect.setSettingsKey("RunConfiguration.UseQmlDebugger");
m_qmlAspect->setLabelText(Tr::tr("QML debugger:")); m_qmlAspect.setLabelText(Tr::tr("QML debugger:"));
m_qmlAspect->setSettingsKey("RunConfiguration.UseQmlDebugger"); m_qmlAspect.setOptionTexts(Tr::tr("Enabled"), Tr::tr("Disabled"), Tr::tr("Automatic"));
m_pythonAspect = new TriStateAspect(nullptr, Tr::tr("Enabled"), Tr::tr("Disabled"), Tr::tr("Automatic")); m_pythonAspect.setSettingsKey("RunConfiguration.UsePythonDebugger");
m_pythonAspect->setLabelText(Tr::tr("Python debugger:")); m_pythonAspect.setLabelText(Tr::tr("Python debugger:"));
m_pythonAspect->setSettingsKey("RunConfiguration.UsePythonDebugger"); m_pythonAspect.setOptionTexts(Tr::tr("Enabled"), Tr::tr("Disabled"), Tr::tr("Automatic"));
// Make sure at least one of the debuggers is set to be active. // Make sure at least one of the debuggers is set to be active.
connect(m_cppAspect, &TriStateAspect::changed, this, [this]{ connect(&m_cppAspect, &TriStateAspect::changed, this, [this] {
if (Utils::allOf({m_cppAspect, m_qmlAspect, m_pythonAspect}, &isDisabled)) if (Utils::allOf({&m_cppAspect, &m_qmlAspect, &m_pythonAspect}, &isDisabled))
m_qmlAspect->setValue(TriState::Default); m_qmlAspect.setValue(TriState::Default);
}); });
connect(m_qmlAspect, &TriStateAspect::changed, this, [this]{ connect(&m_qmlAspect, &TriStateAspect::changed, this, [this] {
if (Utils::allOf({m_cppAspect, m_qmlAspect, m_pythonAspect}, &isDisabled)) if (Utils::allOf({&m_cppAspect, &m_qmlAspect, &m_pythonAspect}, &isDisabled))
m_cppAspect->setValue(TriState::Default); m_cppAspect.setValue(TriState::Default);
}); });
connect(m_qmlAspect, &TriStateAspect::changed, this, [this] { connect(&m_qmlAspect, &TriStateAspect::changed, this, [this] {
if (Utils::allOf({m_cppAspect, m_qmlAspect, m_pythonAspect}, &isDisabled)) if (Utils::allOf({&m_cppAspect, &m_qmlAspect, &m_pythonAspect}, &isDisabled))
m_cppAspect->setValue(TriState::Default); m_cppAspect.setValue(TriState::Default);
}); });
m_multiProcessAspect = new BoolAspect; m_multiProcessAspect.setSettingsKey("RunConfiguration.UseMultiProcess");
m_multiProcessAspect->setSettingsKey("RunConfiguration.UseMultiProcess"); m_multiProcessAspect.setLabel(Tr::tr("Enable Debugging of Subprocesses"),
m_multiProcessAspect->setLabel(Tr::tr("Enable Debugging of Subprocesses"),
BoolAspect::LabelPlacement::AtCheckBox); BoolAspect::LabelPlacement::AtCheckBox);
m_overrideStartupAspect = new StringAspect; m_overrideStartupAspect.setSettingsKey("RunConfiguration.OverrideDebuggerStartup");
m_overrideStartupAspect->setSettingsKey("RunConfiguration.OverrideDebuggerStartup"); m_overrideStartupAspect.setDisplayStyle(StringAspect::TextEditDisplay);
m_overrideStartupAspect->setDisplayStyle(StringAspect::TextEditDisplay); m_overrideStartupAspect.setLabelText(Tr::tr("Additional startup commands:"));
m_overrideStartupAspect->setLabelText(Tr::tr("Additional startup commands:"));
} }
DebuggerRunConfigurationAspect::~DebuggerRunConfigurationAspect() DebuggerRunConfigurationAspect::~DebuggerRunConfigurationAspect() = default;
{
delete m_cppAspect;
delete m_qmlAspect;
delete m_pythonAspect;
delete m_multiProcessAspect;
delete m_overrideStartupAspect;
}
void DebuggerRunConfigurationAspect::setUseQmlDebugger(bool value) void DebuggerRunConfigurationAspect::setUseQmlDebugger(bool value)
{ {
m_qmlAspect->setValue(value ? TriState::Enabled : TriState::Disabled); m_qmlAspect.setValue(value ? TriState::Enabled : TriState::Disabled);
} }
bool DebuggerRunConfigurationAspect::useCppDebugger() const bool DebuggerRunConfigurationAspect::useCppDebugger() const
{ {
if (m_cppAspect->value() == TriState::Default) if (m_cppAspect() == TriState::Default)
return m_target->project()->projectLanguages().contains( return m_target->project()->projectLanguages().contains(
ProjectExplorer::Constants::CXX_LANGUAGE_ID); ProjectExplorer::Constants::CXX_LANGUAGE_ID);
return m_cppAspect->value() == TriState::Enabled; return m_cppAspect() == TriState::Enabled;
} }
static bool projectHasQmlDefines(ProjectExplorer::Project *project) static bool projectHasQmlDefines(ProjectExplorer::Project *project)
@@ -185,7 +174,7 @@ static bool projectHasQmlDefines(ProjectExplorer::Project *project)
bool DebuggerRunConfigurationAspect::useQmlDebugger() const bool DebuggerRunConfigurationAspect::useQmlDebugger() const
{ {
if (m_qmlAspect->value() == TriState::Default) { if (m_qmlAspect() == TriState::Default) {
const Core::Context languages = m_target->project()->projectLanguages(); const Core::Context languages = m_target->project()->projectLanguages();
if (!languages.contains(ProjectExplorer::Constants::QMLJS_LANGUAGE_ID)) if (!languages.contains(ProjectExplorer::Constants::QMLJS_LANGUAGE_ID))
return projectHasQmlDefines(m_target->project()); return projectHasQmlDefines(m_target->project());
@@ -199,31 +188,31 @@ bool DebuggerRunConfigurationAspect::useQmlDebugger() const
return !languages.contains(ProjectExplorer::Constants::CXX_LANGUAGE_ID); return !languages.contains(ProjectExplorer::Constants::CXX_LANGUAGE_ID);
} }
return m_qmlAspect->value() == TriState::Enabled; return m_qmlAspect() == TriState::Enabled;
} }
bool DebuggerRunConfigurationAspect::usePythonDebugger() const bool DebuggerRunConfigurationAspect::usePythonDebugger() const
{ {
if (m_pythonAspect->value() == TriState::Default) { if (m_pythonAspect() == TriState::Default) {
const Core::Context languages = m_target->project()->projectLanguages(); const Core::Context languages = m_target->project()->projectLanguages();
return languages.contains(ProjectExplorer::Constants::PYTHON_LANGUAGE_ID); return languages.contains(ProjectExplorer::Constants::PYTHON_LANGUAGE_ID);
} }
return m_pythonAspect->value() == TriState::Enabled; return m_pythonAspect() == TriState::Enabled;
} }
bool DebuggerRunConfigurationAspect::useMultiProcess() const bool DebuggerRunConfigurationAspect::useMultiProcess() const
{ {
return m_multiProcessAspect->value(); return m_multiProcessAspect();
} }
void DebuggerRunConfigurationAspect::setUseMultiProcess(bool value) void DebuggerRunConfigurationAspect::setUseMultiProcess(bool value)
{ {
m_multiProcessAspect->setValue(value); m_multiProcessAspect.setValue(value);
} }
QString DebuggerRunConfigurationAspect::overrideStartup() const QString DebuggerRunConfigurationAspect::overrideStartup() const
{ {
return m_overrideStartupAspect->value(); return m_overrideStartupAspect();
} }
int DebuggerRunConfigurationAspect::portsUsedByDebugger() const int DebuggerRunConfigurationAspect::portsUsedByDebugger() const
@@ -238,31 +227,31 @@ int DebuggerRunConfigurationAspect::portsUsedByDebugger() const
void DebuggerRunConfigurationAspect::toMap(Store &map) const void DebuggerRunConfigurationAspect::toMap(Store &map) const
{ {
m_cppAspect->toMap(map); m_cppAspect.toMap(map);
m_qmlAspect->toMap(map); m_qmlAspect.toMap(map);
m_pythonAspect->toMap(map); m_pythonAspect.toMap(map);
m_multiProcessAspect->toMap(map); m_multiProcessAspect.toMap(map);
m_overrideStartupAspect->toMap(map); m_overrideStartupAspect.toMap(map);
// compatibility to old settings // compatibility to old settings
map.insert("RunConfiguration.UseCppDebuggerAuto", m_cppAspect->value() == TriState::Default); map.insert("RunConfiguration.UseCppDebuggerAuto", m_cppAspect() == TriState::Default);
map.insert("RunConfiguration.UseQmlDebuggerAuto", m_qmlAspect->value() == TriState::Default); map.insert("RunConfiguration.UseQmlDebuggerAuto", m_qmlAspect() == TriState::Default);
} }
void DebuggerRunConfigurationAspect::fromMap(const Store &map) void DebuggerRunConfigurationAspect::fromMap(const Store &map)
{ {
m_cppAspect->fromMap(map); m_cppAspect.fromMap(map);
m_qmlAspect->fromMap(map); m_qmlAspect.fromMap(map);
m_pythonAspect->fromMap(map); m_pythonAspect.fromMap(map);
// respect old project settings // respect old project settings
if (map.value("RunConfiguration.UseCppDebuggerAuto", false).toBool()) if (map.value("RunConfiguration.UseCppDebuggerAuto", false).toBool())
m_cppAspect->setValue(TriState::Default); m_cppAspect.setValue(TriState::Default);
if (map.value("RunConfiguration.UseQmlDebuggerAuto", false).toBool()) if (map.value("RunConfiguration.UseQmlDebuggerAuto", false).toBool())
m_qmlAspect->setValue(TriState::Default); m_qmlAspect.setValue(TriState::Default);
m_multiProcessAspect->fromMap(map); m_multiProcessAspect.fromMap(map);
m_overrideStartupAspect->fromMap(map); m_overrideStartupAspect.fromMap(map);
} }
} // namespace Debugger } // namespace Debugger

View File

@@ -40,11 +40,11 @@ public:
}; };
private: private:
Utils::TriStateAspect *m_cppAspect; Utils::TriStateAspect m_cppAspect;
Utils::TriStateAspect *m_qmlAspect; Utils::TriStateAspect m_qmlAspect;
Utils::TriStateAspect *m_pythonAspect; Utils::TriStateAspect m_pythonAspect;
Utils::BoolAspect *m_multiProcessAspect; Utils::BoolAspect m_multiProcessAspect;
Utils::StringAspect *m_overrideStartupAspect; Utils::StringAspect m_overrideStartupAspect;
ProjectExplorer::Target *m_target; ProjectExplorer::Target *m_target;
}; };