From dbb1e04c779785416debb6f0e04c0ae104e3a2eb Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 6 Jul 2023 11:33:41 +0200 Subject: [PATCH] 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 --- src/plugins/terminal/terminalpane.cpp | 18 +-- src/plugins/terminal/terminalplugin.cpp | 8 +- src/plugins/terminal/terminalsettings.cpp | 150 ++++++++++++---------- src/plugins/terminal/terminalsettings.h | 8 +- src/plugins/terminal/terminalwidget.cpp | 32 ++--- 5 files changed, 111 insertions(+), 105 deletions(-) diff --git a/src/plugins/terminal/terminalpane.cpp b/src/plugins/terminal/terminalpane.cpp index d8144818fe6..1f6c87abbe2 100644 --- a/src/plugins/terminal/terminalpane.cpp +++ b/src/plugins/terminal/terminalpane.cpp @@ -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 ¶meters) 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")); diff --git a/src/plugins/terminal/terminalplugin.cpp b/src/plugins/terminal/terminalplugin.cpp index 38b58b1722f..7940fb712b9 100644 --- a/src/plugins/terminal/terminalplugin.cpp +++ b/src/plugins/terminal/terminalplugin.cpp @@ -39,8 +39,6 @@ public: m_terminalPane = nullptr; } - void initialize() final { addManaged(); } - 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); diff --git a/src/plugins/terminal/terminalsettings.cpp b/src/plugins/terminal/terminalsettings.cpp index f0b9f201784..47811b230a7 100644 --- a/src/plugins/terminal/terminalsettings.cpp +++ b/src/plugins/terminal/terminalsettings.cpp @@ -6,6 +6,7 @@ #include "terminaltr.h" #include +#include #include #include @@ -90,13 +91,13 @@ static expected_str 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 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 loadVsCodeColors(const FilePath &path) // clang-format off const QList> 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 loadVsCodeColors(const FilePath &path) static expected_str loadKonsoleColorScheme(const FilePath &path) { - QSettings settings(path.toFSPathString(), QSettings::IniFormat); - auto parseColor = [](const QStringList &parts) -> expected_str { if (parts.size() != 3 && parts.size() != 4) return make_unexpected(Tr::tr("Invalid color format.")); @@ -257,39 +256,41 @@ static expected_str loadKonsoleColorScheme(const FilePath &path) }; // clang-format off - const QList> colorKeys = { - qMakePair(QLatin1String("Background/Color"), &TerminalSettings::instance().backgroundColor), - qMakePair(QLatin1String("Foreground/Color"), &TerminalSettings::instance().foregroundColor), + TerminalSettings &s = settings(); + const QPair 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 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> colorKeys = { - qMakePair(QLatin1String("Scheme/ColorBackground"), &TerminalSettings::instance().backgroundColor), - qMakePair(QLatin1String("Scheme/ColorForeground"), &TerminalSettings::instance().foregroundColor), + const QPair 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 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 diff --git a/src/plugins/terminal/terminalsettings.h b/src/plugins/terminal/terminalsettings.h index 1c07f9ab033..e253abf69e8 100644 --- a/src/plugins/terminal/terminalsettings.h +++ b/src/plugins/terminal/terminalsettings.h @@ -3,17 +3,15 @@ #pragma once -#include +#include 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 diff --git a/src/plugins/terminal/terminalwidget.cpp b/src/plugins/terminal/terminalwidget.cpp index 98877b841f0..4e88071a94f 100644 --- a/src/plugins/terminal/terminalwidget.cpp +++ b/src/plugins/terminal/terminalwidget.cpp @@ -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(); 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 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(event); - if (TerminalSettings::instance().lockKeyboard() && m_shortcutMap.tryShortcut(k)) + if (settings().lockKeyboard() && m_shortcutMap.tryShortcut(k)) return true; keyPressEvent(k);