Terminal: Use new settings creation pattern

Does not delay much yet, as settings() is accessed in
Plugin::extensionInitialized()

Task-number: QTCREATORBUG-29167
Change-Id: I8f7c7fbef78c4ce0f92302e57a81f6216456c27b
Reviewed-by: Marcus Tillmanns <marcus.tillmanns@qt.io>
This commit is contained in:
hjk
2023-07-06 11:33:41 +02:00
parent 2a731003cf
commit dbb1e04c77
5 changed files with 111 additions and 105 deletions

View File

@@ -72,13 +72,13 @@ TerminalPane::TerminalPane(QObject *parent)
});
const auto updateEscButton = [this] {
m_escSettingButton->setChecked(TerminalSettings::instance().sendEscapeToTerminal());
m_escSettingButton->setChecked(settings().sendEscapeToTerminal());
static const QString escKey
= QKeySequence(Qt::Key_Escape).toString(QKeySequence::NativeText);
static const QString shiftEsc = QKeySequence(
QKeyCombination(Qt::ShiftModifier, Qt::Key_Escape))
.toString(QKeySequence::NativeText);
if (TerminalSettings::instance().sendEscapeToTerminal.value()) {
if (settings().sendEscapeToTerminal.value()) {
m_escSettingButton->setText(escKey);
m_escSettingButton->setToolTip(Tr::tr("Sends Esc to terminal instead of Qt Creator."));
} else {
@@ -93,12 +93,12 @@ TerminalPane::TerminalPane(QObject *parent)
updateEscButton();
connect(m_escSettingButton, &QToolButton::toggled, this, [this, updateEscButton] {
TerminalSettings::instance().sendEscapeToTerminal.setValue(m_escSettingButton->isChecked());
TerminalSettings::instance().writeSettings();
settings().sendEscapeToTerminal.setValue(m_escSettingButton->isChecked());
settings().writeSettings();
updateEscButton();
});
connect(&TerminalSettings::instance(), &TerminalSettings::applied, this, updateEscButton);
connect(&settings(), &TerminalSettings::applied, this, updateEscButton);
}
TerminalPane::~TerminalPane() {}
@@ -142,7 +142,7 @@ void TerminalPane::openTerminal(const OpenTerminalParameters &parameters)
QFileIconProvider iconProvider;
const FilePath command = parametersCopy.shellCommand
? parametersCopy.shellCommand->executable()
: TerminalSettings::instance().shell.filePath();
: settings().shell.filePath();
icon = iconProvider.icon(command.toFileInfo());
}
}
@@ -250,10 +250,10 @@ void TerminalPane::initActions()
createShellMenu();
lockKeyboard.setCheckable(true);
lockKeyboard.setChecked(TerminalSettings::instance().lockKeyboard());
lockKeyboard.setChecked(settings().lockKeyboard());
auto updateLockKeyboard = [this](bool locked) {
TerminalSettings::instance().lockKeyboard.setValue(locked);
settings().lockKeyboard.setValue(locked);
if (locked) {
lockKeyboard.setIcon(LOCK_KEYBOARD_ICON.icon());
lockKeyboard.setToolTip(Tr::tr("Sends keyboard shortcuts to Terminal."));
@@ -263,7 +263,7 @@ void TerminalPane::initActions()
}
};
updateLockKeyboard(TerminalSettings::instance().lockKeyboard());
updateLockKeyboard(settings().lockKeyboard());
connect(&lockKeyboard, &QAction::toggled, this, updateLockKeyboard);
newTerminal.setText(Tr::tr("New Terminal"));

View File

@@ -39,8 +39,6 @@ public:
m_terminalPane = nullptr;
}
void initialize() final { addManaged<TerminalSettings>(); }
void extensionsInitialized() final
{
m_terminalPane = new TerminalPane;
@@ -61,8 +59,8 @@ public:
static bool isEnabled = false;
auto settingsChanged = [enable, disable] {
if (isEnabled != TerminalSettings::instance().enableTerminal()) {
isEnabled = TerminalSettings::instance().enableTerminal();
if (isEnabled != settings().enableTerminal()) {
isEnabled = settings().enableTerminal();
if (isEnabled)
enable();
else
@@ -70,7 +68,7 @@ public:
}
};
QObject::connect(&TerminalSettings::instance(),
QObject::connect(&settings(),
&Utils::AspectContainer::applied,
this,
settingsChanged);

View File

@@ -6,6 +6,7 @@
#include "terminaltr.h"
#include <coreplugin/icore.h>
#include <coreplugin/dialogs/ioptionspage.h>
#include <utils/dropsupport.h>
#include <utils/environment.h>
@@ -90,13 +91,13 @@ static expected_str<void> loadXdefaults(const FilePath &path)
const QString colorName = match.captured(1);
const QColor color(match.captured(2));
if (colorName == "foreground") {
TerminalSettings::instance().foregroundColor.setVolatileValue(color);
settings().foregroundColor.setVolatileValue(color);
} else if (colorName == "background") {
TerminalSettings::instance().backgroundColor.setVolatileValue(color);
settings().backgroundColor.setVolatileValue(color);
} else {
const int colorIndex = colorName.mid(5).toInt();
if (colorIndex >= 0 && colorIndex < 16)
TerminalSettings::instance().colors[colorIndex].setVolatileValue(color);
settings().colors[colorIndex].setVolatileValue(color);
}
}
}
@@ -152,14 +153,14 @@ static expected_str<void> loadItermColors(const FilePath &path)
const auto c = colorName.mid(5, 2);
const int colorIndex = c.toInt();
if (colorIndex >= 0 && colorIndex < 16)
TerminalSettings::instance().colors[colorIndex].setVolatileValue(
settings().colors[colorIndex].setVolatileValue(
color);
} else if (colorName == "Foreground Color") {
TerminalSettings::instance().foregroundColor.setVolatileValue(color);
settings().foregroundColor.setVolatileValue(color);
} else if (colorName == "Background Color") {
TerminalSettings::instance().backgroundColor.setVolatileValue(color);
settings().backgroundColor.setVolatileValue(color);
} else if (colorName == "Selection Color") {
TerminalSettings::instance().selectionColor.setVolatileValue(color);
settings().selectionColor.setVolatileValue(color);
}
}
}
@@ -196,33 +197,33 @@ static expected_str<void> loadVsCodeColors(const FilePath &path)
// clang-format off
const QList<QPair<QStringView, ColorAspect *>> colorKeys = {
qMakePair(u"editor.background", &TerminalSettings::instance().backgroundColor),
qMakePair(u"terminal.foreground", &TerminalSettings::instance().foregroundColor),
qMakePair(u"terminal.selectionBackground", &TerminalSettings::instance().selectionColor),
qMakePair(u"editor.background", &settings().backgroundColor),
qMakePair(u"terminal.foreground", &settings().foregroundColor),
qMakePair(u"terminal.selectionBackground", &settings().selectionColor),
qMakePair(u"terminal.ansiBlack", &TerminalSettings::instance().colors[0]),
qMakePair(u"terminal.ansiBrightBlack", &TerminalSettings::instance().colors[8]),
qMakePair(u"terminal.ansiBlack", &settings().colors[0]),
qMakePair(u"terminal.ansiBrightBlack", &settings().colors[8]),
qMakePair(u"terminal.ansiRed", &TerminalSettings::instance().colors[1]),
qMakePair(u"terminal.ansiBrightRed", &TerminalSettings::instance().colors[9]),
qMakePair(u"terminal.ansiRed", &settings().colors[1]),
qMakePair(u"terminal.ansiBrightRed", &settings().colors[9]),
qMakePair(u"terminal.ansiGreen", &TerminalSettings::instance().colors[2]),
qMakePair(u"terminal.ansiBrightGreen", &TerminalSettings::instance().colors[10]),
qMakePair(u"terminal.ansiGreen", &settings().colors[2]),
qMakePair(u"terminal.ansiBrightGreen", &settings().colors[10]),
qMakePair(u"terminal.ansiYellow", &TerminalSettings::instance().colors[3]),
qMakePair(u"terminal.ansiBrightYellow", &TerminalSettings::instance().colors[11]),
qMakePair(u"terminal.ansiYellow", &settings().colors[3]),
qMakePair(u"terminal.ansiBrightYellow", &settings().colors[11]),
qMakePair(u"terminal.ansiBlue", &TerminalSettings::instance().colors[4]),
qMakePair(u"terminal.ansiBrightBlue", &TerminalSettings::instance().colors[12]),
qMakePair(u"terminal.ansiBlue", &settings().colors[4]),
qMakePair(u"terminal.ansiBrightBlue", &settings().colors[12]),
qMakePair(u"terminal.ansiMagenta", &TerminalSettings::instance().colors[5]),
qMakePair(u"terminal.ansiBrightMagenta", &TerminalSettings::instance().colors[13]),
qMakePair(u"terminal.ansiMagenta", &settings().colors[5]),
qMakePair(u"terminal.ansiBrightMagenta", &settings().colors[13]),
qMakePair(u"terminal.ansiCyan", &TerminalSettings::instance().colors[6]),
qMakePair(u"terminal.ansiBrightCyan", &TerminalSettings::instance().colors[14]),
qMakePair(u"terminal.ansiCyan", &settings().colors[6]),
qMakePair(u"terminal.ansiBrightCyan", &settings().colors[14]),
qMakePair(u"terminal.ansiWhite", &TerminalSettings::instance().colors[7]),
qMakePair(u"terminal.ansiBrightWhite", &TerminalSettings::instance().colors[15])
qMakePair(u"terminal.ansiWhite", &settings().colors[7]),
qMakePair(u"terminal.ansiBrightWhite", &settings().colors[15])
};
// clang-format on
@@ -247,8 +248,6 @@ static expected_str<void> loadVsCodeColors(const FilePath &path)
static expected_str<void> loadKonsoleColorScheme(const FilePath &path)
{
QSettings settings(path.toFSPathString(), QSettings::IniFormat);
auto parseColor = [](const QStringList &parts) -> expected_str<QColor> {
if (parts.size() != 3 && parts.size() != 4)
return make_unexpected(Tr::tr("Invalid color format."));
@@ -257,39 +256,41 @@ static expected_str<void> loadKonsoleColorScheme(const FilePath &path)
};
// clang-format off
const QList<QPair<QString, ColorAspect *>> colorKeys = {
qMakePair(QLatin1String("Background/Color"), &TerminalSettings::instance().backgroundColor),
qMakePair(QLatin1String("Foreground/Color"), &TerminalSettings::instance().foregroundColor),
TerminalSettings &s = settings();
const QPair<QString, ColorAspect *> colorKeys[] = {
{ "Background/Color", &s.backgroundColor },
{ "Foreground/Color", &s.foregroundColor},
qMakePair(QLatin1String("Color0/Color"), &TerminalSettings::instance().colors[0]),
qMakePair(QLatin1String("Color0Intense/Color"), &TerminalSettings::instance().colors[8]),
{ "Color0/Color", &s.colors[0] },
{ "Color0Intense/Color", &s.colors[8] },
qMakePair(QLatin1String("Color1/Color"), &TerminalSettings::instance().colors[1]),
qMakePair(QLatin1String("Color1Intense/Color"), &TerminalSettings::instance().colors[9]),
{ "Color1/Color", &s.colors[1] },
{ "Color1Intense/Color", &s.colors[9] },
qMakePair(QLatin1String("Color2/Color"), &TerminalSettings::instance().colors[2]),
qMakePair(QLatin1String("Color2Intense/Color"), &TerminalSettings::instance().colors[10]),
{ "Color2/Color", &s.colors[2] },
{ "Color2Intense/Color", &s.colors[10] },
qMakePair(QLatin1String("Color3/Color"), &TerminalSettings::instance().colors[3]),
qMakePair(QLatin1String("Color3Intense/Color"), &TerminalSettings::instance().colors[11]),
{ "Color3/Color", &s.colors[3] },
{ "Color3Intense/Color", &s.colors[11] },
qMakePair(QLatin1String("Color4/Color"), &TerminalSettings::instance().colors[4]),
qMakePair(QLatin1String("Color4Intense/Color"), &TerminalSettings::instance().colors[12]),
{ "Color4/Color", &s.colors[4] },
{ "Color4Intense/Color", &s.colors[12] },
qMakePair(QLatin1String("Color5/Color"), &TerminalSettings::instance().colors[5]),
qMakePair(QLatin1String("Color5Intense/Color"), &TerminalSettings::instance().colors[13]),
{ "Color5/Color", &s.colors[5] },
{ "Color5Intense/Color", &s.colors[13] },
qMakePair(QLatin1String("Color6/Color"), &TerminalSettings::instance().colors[6]),
qMakePair(QLatin1String("Color6Intense/Color"), &TerminalSettings::instance().colors[14]),
{ "Color6/Color", &s.colors[6] },
{ "Color6Intense/Color", &s.colors[14] },
qMakePair(QLatin1String("Color7/Color"), &TerminalSettings::instance().colors[7]),
qMakePair(QLatin1String("Color7Intense/Color"), &TerminalSettings::instance().colors[15])
{ "Color7/Color", &s.colors[7] },
{ "Color7Intense/Color", &s.colors[15] }
};
// clang-format on
QSettings ini(path.toFSPathString(), QSettings::IniFormat);
for (const auto &colorKey : colorKeys) {
if (settings.contains(colorKey.first)) {
const auto color = parseColor(settings.value(colorKey.first).toStringList());
if (ini.contains(colorKey.first)) {
const auto color = parseColor(ini.value(colorKey.first).toStringList());
if (!color)
return make_unexpected(color.error());
@@ -313,26 +314,25 @@ static expected_str<void> loadXFCE4ColorScheme(const FilePath &path)
f.write(*arr);
f.close();
QSettings settings(f.fileName(), QSettings::IniFormat);
QSettings ini(f.fileName(), QSettings::IniFormat);
TerminalSettings &s = settings();
// clang-format off
const QList<QPair<QString, ColorAspect *>> colorKeys = {
qMakePair(QLatin1String("Scheme/ColorBackground"), &TerminalSettings::instance().backgroundColor),
qMakePair(QLatin1String("Scheme/ColorForeground"), &TerminalSettings::instance().foregroundColor),
const QPair<QString, ColorAspect *> colorKeys[] = {
{ "Scheme/ColorBackground", &s.backgroundColor },
{ "Scheme/ColorForeground", &s.foregroundColor }
};
// clang-format on
for (const auto &colorKey : colorKeys) {
if (settings.contains(colorKey.first)) {
colorKey.second->setVolatileValue(QColor(settings.value(colorKey.first).toString()));
}
if (ini.contains(colorKey.first))
colorKey.second->setVolatileValue(QColor(ini.value(colorKey.first).toString()));
}
QStringList colors = settings.value(QLatin1String("Scheme/ColorPalette")).toStringList();
QStringList colors = ini.value(QLatin1String("Scheme/ColorPalette")).toStringList();
int i = 0;
for (const auto &color : colors) {
TerminalSettings::instance().colors[i++].setVolatileValue(QColor(color));
}
for (const QString &color : colors)
s.colors[i++].setVolatileValue(QColor(color));
return {};
}
@@ -353,23 +353,15 @@ static expected_str<void> loadColorScheme(const FilePath &path)
return make_unexpected(Tr::tr("Unknown color scheme format."));
}
static TerminalSettings *s_instance;
TerminalSettings &TerminalSettings::instance()
TerminalSettings &settings()
{
return *s_instance;
static TerminalSettings theSettings;
return theSettings;
}
TerminalSettings::TerminalSettings()
{
s_instance = this;
setSettingsGroup("Terminal");
setId("Terminal.General");
setDisplayName("Terminal");
setCategory("ZY.Terminal");
setDisplayCategory("Terminal");
setCategoryIconPath(":/terminal/images/settingscategory_terminal.png");
enableTerminal.setSettingsKey("EnableTerminal");
enableTerminal.setLabelText(Tr::tr("Use internal terminal"));
@@ -587,4 +579,20 @@ TerminalSettings::TerminalSettings()
readSettings();
}
class TerminalSettingsPage final : public Core::IOptionsPage
{
public:
TerminalSettingsPage()
{
setId("Terminal.General");
setDisplayName("Terminal");
setCategory("ZY.Terminal");
setDisplayCategory("Terminal");
setCategoryIconPath(":/terminal/images/settingscategory_terminal.png");
setSettingsProvider([] { return &settings(); });
}
};
const TerminalSettingsPage settingsPage;
} // Terminal

View File

@@ -3,17 +3,15 @@
#pragma once
#include <coreplugin/dialogs/ioptionspage.h>
#include <utils/aspects.h>
namespace Terminal {
class TerminalSettings : public Core::PagedSettings
class TerminalSettings : public Utils::AspectContainer
{
public:
TerminalSettings();
static TerminalSettings &instance();
Utils::BoolAspect enableTerminal{this};
Utils::StringAspect font{this};
@@ -35,4 +33,6 @@ public:
Utils::BoolAspect lockKeyboard{this};
};
TerminalSettings &settings();
} // Terminal

View File

@@ -126,7 +126,7 @@ TerminalWidget::TerminalWidget(QWidget *parent, const OpenTerminalParameters &op
verticalScrollBar()->triggerAction(QAbstractSlider::SliderSingleStepAdd);
});
connect(&TerminalSettings::instance(), &AspectContainer::applied, this, [this] {
connect(&settings(), &AspectContainer::applied, this, [this] {
// Setup colors first, as setupFont will redraw the screen.
setupColors();
setupFont();
@@ -143,8 +143,8 @@ void TerminalWidget::setupPty()
m_process = std::make_unique<Process>();
CommandLine shellCommand = m_openParameters.shellCommand.value_or(
CommandLine{TerminalSettings::instance().shell(),
TerminalSettings::instance().shellArguments.value(),
CommandLine{settings().shell(),
settings().shellArguments.value(),
CommandLine::Raw});
Environment env = m_openParameters.environment.value_or(Environment{})
@@ -230,8 +230,8 @@ void TerminalWidget::setupFont()
{
QFont f;
f.setFixedPitch(true);
f.setFamily(TerminalSettings::instance().font.value());
f.setPointSize(TerminalSettings::instance().fontSize.value());
f.setFamily(settings().font.value());
f.setPointSize(settings().fontSize.value());
setFont(f);
}
@@ -241,12 +241,12 @@ void TerminalWidget::setupColors()
// Check if the colors have changed.
std::array<QColor, 20> newColors;
for (int i = 0; i < 16; ++i) {
newColors[i] = TerminalSettings::instance().colors[i].value();
newColors[i] = settings().colors[i].value();
}
newColors[ColorIndex::Background] = TerminalSettings::instance().backgroundColor.value();
newColors[ColorIndex::Foreground] = TerminalSettings::instance().foregroundColor.value();
newColors[ColorIndex::Selection] = TerminalSettings::instance().selectionColor.value();
newColors[ColorIndex::FindMatch] = TerminalSettings::instance().findMatchColor.value();
newColors[ColorIndex::Background] = settings().backgroundColor.value();
newColors[ColorIndex::Foreground] = settings().foregroundColor.value();
newColors[ColorIndex::Selection] = settings().selectionColor.value();
newColors[ColorIndex::FindMatch] = settings().findMatchColor.value();
if (m_currentColors == newColors)
return;
@@ -401,7 +401,7 @@ void TerminalWidget::setupSurface()
verticalScrollBar()->setValue(verticalScrollBar()->maximum());
});
connect(m_surface.get(), &Internal::TerminalSurface::bell, this, [] {
if (TerminalSettings::instance().audibleBell.value())
if (settings().audibleBell.value())
QApplication::beep();
});
connect(m_surface.get(),
@@ -438,7 +438,7 @@ void TerminalWidget::setupSurface()
void TerminalWidget::configBlinkTimer()
{
bool shouldRun = m_cursor.visible && m_cursor.blink && hasFocus()
&& TerminalSettings::instance().allowBlinkingCursor.value();
&& settings().allowBlinkingCursor.value();
if (shouldRun != m_cursorBlinkTimer.isActive()) {
if (shouldRun)
m_cursorBlinkTimer.start();
@@ -1006,7 +1006,7 @@ void TerminalWidget::paintCursor(QPainter &p) const
cursor.shape = Internal::Cursor::Shape::Underline;
const bool blinkState = !cursor.blink || m_cursorBlinkState
|| !TerminalSettings::instance().allowBlinkingCursor.value();
|| !settings().allowBlinkingCursor.value();
if (cursor.visible && blinkState) {
const int cursorCellWidth = m_surface->cellWidthAt(cursor.position.x(), cursor.position.y());
@@ -1162,7 +1162,7 @@ void TerminalWidget::keyPressEvent(QKeyEvent *event)
}
if (event->key() == Qt::Key_Escape) {
bool sendToTerminal = TerminalSettings::instance().sendEscapeToTerminal.value();
bool sendToTerminal = settings().sendEscapeToTerminal.value();
bool send = false;
if (sendToTerminal && event->modifiers() == Qt::NoModifier)
send = true;
@@ -1570,7 +1570,7 @@ void TerminalWidget::showEvent(QShowEvent *event)
bool TerminalWidget::event(QEvent *event)
{
if (TerminalSettings::instance().lockKeyboard() && event->type() == QEvent::ShortcutOverride) {
if (settings().lockKeyboard() && event->type() == QEvent::ShortcutOverride) {
event->accept();
return true;
}
@@ -1584,7 +1584,7 @@ bool TerminalWidget::event(QEvent *event)
if (event->type() == QEvent::KeyPress) {
auto k = static_cast<QKeyEvent *>(event);
if (TerminalSettings::instance().lockKeyboard() && m_shortcutMap.tryShortcut(k))
if (settings().lockKeyboard() && m_shortcutMap.tryShortcut(k))
return true;
keyPressEvent(k);