From 39b3c9787e88f5ddce11011962ec3f1aa8f38c15 Mon Sep 17 00:00:00 2001 From: Lieven Hey Date: Thu, 2 May 2024 16:18:28 +0200 Subject: [PATCH] feat: add tab width setting This patch allows the user to set a custom width for \t. Since we use a monospace font we can simply use a multiple of the character width. This is done by settings the tabstopdistance of the QTextOption property of QTextLayout. closes: #583 --- src/disassemblysettingspage.ui | 18 ++++++++++++++---- src/models/highlightedtext.cpp | 31 +++++++++++++++++++++++++++++-- src/models/highlightedtext.h | 4 ++-- src/resultsdisassemblypage.cpp | 8 ++++++++ src/settings.cpp | 13 +++++++++++++ src/settings.h | 10 ++++++++++ src/settingsdialog.cpp | 2 ++ 7 files changed, 78 insertions(+), 8 deletions(-) diff --git a/src/disassemblysettingspage.ui b/src/disassemblysettingspage.ui index b1f2471b..69221f36 100644 --- a/src/disassemblysettingspage.ui +++ b/src/disassemblysettingspage.ui @@ -32,14 +32,14 @@ 0 - + Source Code Search Paths: - + KEditListWidget::All @@ -60,20 +60,30 @@ - + Show hexdump: - + + + + + Tab width + + + + + + diff --git a/src/models/highlightedtext.cpp b/src/models/highlightedtext.cpp index 2ce792ed..aabf2439 100644 --- a/src/models/highlightedtext.cpp +++ b/src/models/highlightedtext.cpp @@ -7,6 +7,7 @@ #include "highlightedtext.h" +#include #include #include #include @@ -15,6 +16,8 @@ #include +#include + #if KFSyntaxHighlighting_FOUND #include #include @@ -250,13 +253,24 @@ class HighlightedLine m_layout = nullptr; } + void setTabWidthInPixels(int tabWidthInPixels) + { + m_tabWidthInPixels = tabWidthInPixels; + m_layout = nullptr; + } + private: std::unique_ptr buildLayout() const { Q_ASSERT(m_index != -1); auto layout = std::make_unique(); - layout->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont)); + auto option = layout->textOption(); + option.setTabStopDistance(m_tabWidthInPixels); + layout->setTextOption(option); + + auto font = QFontDatabase::systemFont(QFontDatabase::FixedFont); + layout->setFont(font); layout->setText(m_text); layout->setFormats(m_highlighter->format(m_index)); @@ -276,6 +290,7 @@ class HighlightedLine HighlightingImplementation* m_highlighter = nullptr; QString m_text; int m_index = -1; + int m_tabWidthInPixels = -1; // qts default value mutable std::unique_ptr m_layout; }; static_assert(std::is_nothrow_move_constructible_v); @@ -285,7 +300,6 @@ HighlightedText::HighlightedText(KSyntaxHighlighting::Repository* repository, QO : QObject(parent) , m_repository(repository) { - Q_UNUSED(repository); } HighlightedText::~HighlightedText() = default; @@ -313,6 +327,9 @@ void HighlightedText::setText(const QStringList& text) return HighlightedLine {m_highlighter.get(), text, index++}; }); + // this is free since we currently have no text rendered + updateTabWidth(m_tabWidth); + m_cleanedLines = text; std::for_each(m_cleanedLines.begin(), m_cleanedLines.end(), Util::removeAnsi); } @@ -358,3 +375,13 @@ void HighlightedText::updateHighlighting() std::for_each(m_highlightedLines.begin(), m_highlightedLines.end(), [](HighlightedLine& line) { line.updateHighlighting(); }); } + +void HighlightedText::updateTabWidth(int tabWidth) +{ + m_tabWidth = tabWidth; + auto font = QFontDatabase::systemFont(QFontDatabase::FixedFont); + const auto tabWidthInPixels = tabWidth * QFontMetrics(font).horizontalAdvance(QLatin1Char(' ')); + + std::for_each(m_highlightedLines.begin(), m_highlightedLines.end(), + [tabWidthInPixels](HighlightedLine& line) { line.setTabWidthInPixels(tabWidthInPixels); }); +} diff --git a/src/models/highlightedtext.h b/src/models/highlightedtext.h index 0c79f763..07858939 100644 --- a/src/models/highlightedtext.h +++ b/src/models/highlightedtext.h @@ -14,8 +14,6 @@ class QTextLayout; class QTextLine; -#include "hotspot-config.h" - namespace KSyntaxHighlighting { class SyntaxHighlighter; class Definition; @@ -53,6 +51,7 @@ class HighlightedText : public QObject public slots: void updateHighlighting(); + void updateTabWidth(int tabWidth); private: KSyntaxHighlighting::Repository* m_repository; @@ -61,4 +60,5 @@ public slots: QStringList m_lines; QStringList m_cleanedLines; bool m_isUsingAnsi = false; + int m_tabWidth = 4; }; diff --git a/src/resultsdisassemblypage.cpp b/src/resultsdisassemblypage.cpp index 813afe8a..0983a093 100644 --- a/src/resultsdisassemblypage.cpp +++ b/src/resultsdisassemblypage.cpp @@ -274,6 +274,14 @@ ResultsDisassemblyPage::ResultsDisassemblyPage(CostContextMenu* costContextMenu, connect(ui->assemblyView, &QTreeView::entered, this, updateFromDisassembly); connect(ui->sourceCodeView, &QTreeView::entered, this, updateFromSource); + connect(settings, &Settings::tabWidthChanged, m_sourceCodeModel->highlightedText(), + &HighlightedText::updateTabWidth); + connect(settings, &Settings::tabWidthChanged, m_disassemblyModel->highlightedText(), + &HighlightedText::updateTabWidth); + + m_sourceCodeModel->highlightedText()->updateTabWidth(settings->tabWidth()); + m_disassemblyModel->highlightedText()->updateTabWidth(settings->tabWidth()); + auto createContextMenu = [](QTreeView* view, auto* model, auto&& addEntries) { auto gotoMenuWidget = new QWidget(view); auto layout = new QHBoxLayout(gotoMenuWidget); diff --git a/src/settings.cpp b/src/settings.cpp index 8f1f13c7..1e65da7b 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -253,6 +253,11 @@ void Settings::loadFromFile() connect(this, &Settings::showHexdumpChanged, [sharedConfig](bool showHexdump) { sharedConfig->group(QStringLiteral("Disassembly")).writeEntry("showHexdump", showHexdump); }); + + setTabWidth(sharedConfig->group(QStringLiteral("Disassembly")).readEntry("tabWidth", DefaultTabWidth)); + connect(this, &Settings::tabWidthChanged, [sharedConfig](int distance) { + sharedConfig->group(QStringLiteral("Disassembly")).writeEntry("tabWidth", distance); + }); } void Settings::setSourceCodePaths(const QString& paths) @@ -286,3 +291,11 @@ void Settings::setShowHexdump(bool showHexdump) emit showHexdumpChanged(m_showHexdump); } } + +void Settings::setTabWidth(int distance) +{ + if (m_tabWidth != distance) { + m_tabWidth = distance; + emit tabWidthChanged(m_tabWidth); + } +} diff --git a/src/settings.h b/src/settings.h index 90d7d16b..eadccf91 100644 --- a/src/settings.h +++ b/src/settings.h @@ -163,6 +163,13 @@ class Settings : public QObject return m_showHexdump; } + int tabWidth() const + { + return m_tabWidth; + } + + static constexpr int DefaultTabWidth = 4; + void loadFromFile(); signals: @@ -187,6 +194,7 @@ class Settings : public QObject void perfPathChanged(const QString& perfPath); void showBranchesChanged(bool showBranches); void showHexdumpChanged(bool showHexdump); + void tabWidthChanged(int distance); public slots: void setPrettifySymbols(bool prettifySymbols); @@ -212,6 +220,7 @@ public slots: void setPerfPath(const QString& path); void setShowBranches(bool showBranches); void setShowHexdump(bool showHexdump); + void setTabWidth(int distance); private: using QObject::QObject; @@ -237,6 +246,7 @@ public slots: QString m_perfMapPath; bool m_showBranches = true; bool m_showHexdump = false; + int m_tabWidth = DefaultTabWidth; QString m_lastUsedEnvironment; diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp index e41defd2..e9cb6009 100644 --- a/src/settingsdialog.cpp +++ b/src/settingsdialog.cpp @@ -337,10 +337,12 @@ void SettingsDialog::addSourcePathPage() disassemblyPage->showBranches->setChecked(settings->showBranches()); disassemblyPage->showHexdump->setChecked(settings->showHexdump()); + disassemblyPage->tabWidth->setValue(settings->tabWidth()); connect(buttonBox(), &QDialogButtonBox::accepted, this, [this, colon, settings] { settings->setSourceCodePaths(disassemblyPage->sourcePaths->items().join(colon)); settings->setShowBranches(disassemblyPage->showBranches->isChecked()); settings->setShowHexdump(disassemblyPage->showHexdump->isChecked()); + settings->setTabWidth(disassemblyPage->tabWidth->value()); }); }