From 85abc753ef0a8b5f6aa719daa64be77f03a5f993 Mon Sep 17 00:00:00 2001 From: Lieven Hey Date: Tue, 31 Oct 2023 10:45:12 +0100 Subject: [PATCH] implement syntax highlighting with QTextLayout Using QTextDocument was a little bit overkill since we don't need rich text support. This replaces it with a simple QTextLayout implementation. closed: #522, #505 --- src/models/CMakeLists.txt | 6 +- src/models/disassemblymodel.cpp | 39 +++---- src/models/disassemblymodel.h | 11 +- src/models/formattingutils.cpp | 23 ++++ src/models/formattingutils.h | 17 +++ src/models/highlightedtext.cpp | 200 ++++++++++++++++++++++++++++++++ src/models/highlightedtext.h | 57 +++++++++ src/models/highlighter.cpp | 82 ------------- src/models/highlighter.hpp | 56 --------- src/models/sourcecodemodel.cpp | 49 +++----- src/models/sourcecodemodel.h | 21 +--- src/resultsdisassemblypage.cpp | 21 ++-- 12 files changed, 351 insertions(+), 231 deletions(-) create mode 100644 src/models/formattingutils.cpp create mode 100644 src/models/formattingutils.h create mode 100644 src/models/highlightedtext.cpp create mode 100644 src/models/highlightedtext.h delete mode 100644 src/models/highlighter.cpp delete mode 100644 src/models/highlighter.hpp diff --git a/src/models/CMakeLists.txt b/src/models/CMakeLists.txt index e0ab27021..6abe01bb8 100644 --- a/src/models/CMakeLists.txt +++ b/src/models/CMakeLists.txt @@ -1,5 +1,6 @@ add_library( - models STATIC + models + STATIC ../settings.cpp ../util.cpp callercalleemodel.cpp @@ -12,7 +13,7 @@ add_library( eventmodel.cpp filterandzoomstack.cpp frequencymodel.cpp - highlighter.cpp + highlightedtext.cpp processfiltermodel.cpp processlist_unix.cpp processmodel.cpp @@ -21,6 +22,7 @@ add_library( timelinedelegate.cpp topproxy.cpp treemodel.cpp + formattingutils.cpp ) target_link_libraries( diff --git a/src/models/disassemblymodel.cpp b/src/models/disassemblymodel.cpp index d2ee7cd6b..61256a950 100644 --- a/src/models/disassemblymodel.cpp +++ b/src/models/disassemblymodel.cpp @@ -6,22 +6,15 @@ SPDX-License-Identifier: GPL-2.0-or-later */ -#include -#include -#include - #include "disassemblymodel.h" -#include "highlighter.hpp" #include "search.h" #include "sourcecodemodel.h" DisassemblyModel::DisassemblyModel(KSyntaxHighlighting::Repository* repository, QObject* parent) : QAbstractTableModel(parent) - , m_document(new QTextDocument(this)) - , m_highlighter(new Highlighter(m_document, repository, this)) + , m_highlightedText(repository) { - m_document->setUndoRedoEnabled(false); } DisassemblyModel::~DisassemblyModel() = default; @@ -56,17 +49,13 @@ void DisassemblyModel::setDisassembly(const DisassemblyOutput& disassemblyOutput m_results = results; m_numTypes = results.selfCosts.numTypes(); - m_document->clear(); - - QTextCursor cursor(m_document); - cursor.beginEditBlock(); - for (const auto& it : disassemblyOutput.disassemblyLines) { - cursor.insertText(it.disassembly); - cursor.insertBlock(); - } - cursor.endEditBlock(); + QStringList assemblyLines; + assemblyLines.reserve(disassemblyOutput.disassemblyLines.size()); + std::transform(disassemblyOutput.disassemblyLines.cbegin(), disassemblyOutput.disassemblyLines.cend(), + std::back_inserter(assemblyLines), + [](const DisassemblyOutput::DisassemblyLine& line) { return line.disassembly; }); - m_document->setTextWidth(m_document->idealWidth()); + m_highlightedText.setText(assemblyLines); endResetModel(); } @@ -112,6 +101,7 @@ QVariant DisassemblyModel::data(const QModelIndex& index, int role) const } const auto& data = m_data.disassemblyLines.at(index.row()); + const auto& line = m_highlightedText.textAt(index.row()); if (role == AddrRole) return data.addr; @@ -127,10 +117,10 @@ QVariant DisassemblyModel::data(const QModelIndex& index, int role) const } else if (index.column() == HexdumpColumn) { return data.hexdump; } else if (index.column() == DisassemblyColumn) { - const auto block = m_document->findBlockByLineNumber(index.row()); - if (role == SyntaxHighlightRole) - return QVariant::fromValue(block.layout()->lineAt(0)); - return block.text(); + if (role == SyntaxHighlightRole) { + return QVariant::fromValue(m_highlightedText.lineAt(index.row())); + } + return m_highlightedText.textAt(index.row()); } } @@ -153,7 +143,7 @@ QVariant DisassemblyModel::data(const QModelIndex& index, int role) const return totalCost; } else if (role == Qt::ToolTipRole) { auto tooltip = tr("addr: %1
assembly: %2
disassembly: %3") - .arg(QString::number(data.addr, 16), data.disassembly); + .arg(QString::number(data.addr, 16), line); return Util::formatTooltip(tooltip, locationCost, m_results.selfCosts); } @@ -162,8 +152,7 @@ QVariant DisassemblyModel::data(const QModelIndex& index, int role) const return Util::formatCostRelative(costLine, totalCost, true); } else { if (role == Qt::ToolTipRole) - return tr("%1
No samples at this location.
") - .arg(data.disassembly.toHtmlEscaped()); + return tr("%1
No samples at this location.
").arg(line.toHtmlEscaped()); else return QString(); } diff --git a/src/models/disassemblymodel.h b/src/models/disassemblymodel.h index 8835225ed..28a1da063 100644 --- a/src/models/disassemblymodel.h +++ b/src/models/disassemblymodel.h @@ -14,9 +14,7 @@ #include "data.h" #include "disassemblyoutput.h" - -class QTextDocument; -class Highlighter; +#include "highlightedtext.h" namespace KSyntaxHighlighting { class Definition; @@ -47,9 +45,9 @@ class DisassemblyModel : public QAbstractTableModel Data::FileLine fileLineForIndex(const QModelIndex& index) const; QModelIndex indexForFileLine(const Data::FileLine& line) const; - Highlighter* highlighter() const + HighlightedText* highlightedText() { - return m_highlighter; + return &m_highlightedText; } enum Columns @@ -82,8 +80,7 @@ public slots: void find(const QString& search, Direction direction, int offset); private: - QTextDocument* m_document; - Highlighter* m_highlighter; + HighlightedText m_highlightedText; DisassemblyOutput m_data; Data::CallerCalleeResults m_results; int m_numTypes = 0; diff --git a/src/models/formattingutils.cpp b/src/models/formattingutils.cpp new file mode 100644 index 000000000..942fabf87 --- /dev/null +++ b/src/models/formattingutils.cpp @@ -0,0 +1,23 @@ +/* + SPDX-FileCopyrightText: Lieven Hey + SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com + + SPDX-License-Identifier: GPL-2.0-or-later +*/ + +#include "formattingutils.h" + +QString Util::removeAnsi(const QString& stringWithAnsi) +{ + if (!stringWithAnsi.contains(escapeChar)) { + return stringWithAnsi; + } + + QString ansiFreeString = stringWithAnsi; + while (ansiFreeString.contains(escapeChar)) { + const auto escapeStart = ansiFreeString.indexOf(escapeChar); + const auto escapeEnd = ansiFreeString.indexOf(QLatin1Char('m'), escapeStart); + ansiFreeString.remove(escapeStart, escapeEnd - escapeStart + 1); + } + return ansiFreeString; +} diff --git a/src/models/formattingutils.h b/src/models/formattingutils.h new file mode 100644 index 000000000..de8e79352 --- /dev/null +++ b/src/models/formattingutils.h @@ -0,0 +1,17 @@ +/* + SPDX-FileCopyrightText: Lieven Hey + SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com + + SPDX-License-Identifier: GPL-2.0-or-later +*/ + +#pragma once + +#include + +namespace Util { +// escape character also known as \033 and \e it signals the start of an ansi escape sequence +constexpr auto escapeChar = QLatin1Char('\u001B'); + +QString removeAnsi(const QString& stringWithAnsi); +} diff --git a/src/models/highlightedtext.cpp b/src/models/highlightedtext.cpp new file mode 100644 index 000000000..dec760843 --- /dev/null +++ b/src/models/highlightedtext.cpp @@ -0,0 +1,200 @@ +/* + SPDX-FileCopyrightText: Lieven Hey + SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com + + SPDX-License-Identifier: GPL-2.0-or-later +*/ + +#include "highlightedtext.h" + +#include +#include + +#include + +#include + +#if KFSyntaxHighlighting_FOUND +#include +#include +#include +#include +#include +#include +#include +#endif + +#include "formattingutils.h" + +#if KFSyntaxHighlighting_FOUND +class HighlightingImplementation : public KSyntaxHighlighting::AbstractHighlighter +{ +public: + HighlightingImplementation(KSyntaxHighlighting::Repository* repository) + : m_repository(repository) + { + } + ~HighlightingImplementation() override = default; + + QVector format(const QStringList& text) + { + m_formats.clear(); + m_offset = 0; + + KSyntaxHighlighting::State state; + for (const auto& line : text) { + state = highlightLine(line, state); + + // KSyntaxHighlighting uses line offsets but QTextLayout uses global offsets + m_offset += line.size(); + } + + return m_formats; + } + + void themeChanged() + { + if (!m_repository) { + return; + } + + KSyntaxHighlighting::Repository::DefaultTheme theme; + const auto palette = QGuiApplication::palette(); + if (palette.base().color().lightness() < 128) { + theme = KSyntaxHighlighting::Repository::DarkTheme; + } else { + theme = KSyntaxHighlighting::Repository::LightTheme; + } + setTheme(m_repository->defaultTheme(theme)); + } + + void setHighlightingDefinition(const KSyntaxHighlighting::Definition& definition) + { + setDefinition(definition); + } + + QString definitionName() const + { + return definition().name(); + } + +protected: + void applyFormat(int offset, int length, const KSyntaxHighlighting::Format& format) override + { + QTextCharFormat textCharFormat; + textCharFormat.setForeground(format.textColor(theme())); + m_formats.push_back({m_offset + offset, length, textCharFormat}); + } + +private: + KSyntaxHighlighting::Repository* m_repository; + QVector m_formats; + int m_offset = 0; +}; +#else +class HighlightingImplementation +{ +public: + HighlightingImplementation(KSyntaxHighlighting::Repository*) = default; + ~HighlightingImplementation() override = default; + + QVector format(const QStringList& text) override + { + return {}; + } + + void themeChanged() override { } + + void setHighlightingDefinition(const KSyntaxHighlighting::Definition& /*definition*/) override { } + QString definitionName() const override + { + return {}; + }; +#endif + +HighlightedText::HighlightedText(KSyntaxHighlighting::Repository* repository, QObject* parent) + : QObject(parent) +#if KFSyntaxHighlighting_FOUND + , m_repository(repository) +#endif + , m_layout(std::make_unique()) +{ + m_layout->setCacheEnabled(true); + m_layout->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont)); +} + +HighlightedText::~HighlightedText() = default; + +void HighlightedText::setText(const QStringList& text) +{ + if (!m_highlighter) { + m_highlighter = std::make_unique(m_repository); + } + + m_highlighter->themeChanged(); + m_highlighter->format(text); + + m_lines.reserve(text.size()); + m_cleanedLines.reserve(text.size()); + + QString formattedText; + + for (const auto& line : text) { + const auto& lineWithNewline = QLatin1String("%1%2").arg(line, QChar::LineSeparator); + const auto& ansiFreeLine = Util::removeAnsi(lineWithNewline); + m_cleanedLines.push_back(ansiFreeLine); + m_lines.push_back(lineWithNewline); + formattedText += ansiFreeLine; + } + + m_layout->setText(formattedText); + + applyFormatting(); +} + +void HighlightedText::setDefinition(const KSyntaxHighlighting::Definition& definition) +{ + Q_ASSERT(m_highlighter); + m_highlighter->setHighlightingDefinition(definition); + emit definitionChanged(definition.name()); + applyFormatting(); +} + +QString HighlightedText::textAt(int index) const +{ + Q_ASSERT(m_highlighter); + Q_ASSERT(index < m_cleanedLines.size()); + return m_cleanedLines.at(index); +} + +QTextLine HighlightedText::lineAt(int index) const +{ + Q_ASSERT(m_layout); + return m_layout->lineAt(index); +} + +void HighlightedText::applyFormatting() +{ + Q_ASSERT(m_highlighter); + + m_layout->setFormats(m_highlighter->format(m_lines)); + + m_layout->clearLayout(); + m_layout->beginLayout(); + + while (true) { + QTextLine line = m_layout->createLine(); + if (!line.isValid()) + break; + + line.setPosition(QPointF(0, 0)); + } + m_layout->endLayout(); +} + +QString HighlightedText::definition() const +{ + if (!m_highlighter) + return {}; + return m_highlighter->definitionName(); +} diff --git a/src/models/highlightedtext.h b/src/models/highlightedtext.h new file mode 100644 index 000000000..f4495f4d2 --- /dev/null +++ b/src/models/highlightedtext.h @@ -0,0 +1,57 @@ +/* + SPDX-FileCopyrightText: Lieven Hey + SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com + + SPDX-License-Identifier: GPL-2.0-or-later +*/ + +#pragma once + +#include + +#include + +class QTextLayout; +class QTextLine; + +#include "hotspot-config.h" + +namespace KSyntaxHighlighting { +class SyntaxHighlighter; +class Definition; +class Repository; +} + +class HighlightingImplementation; + +class HighlightedText : public QObject +{ + Q_OBJECT +public: + HighlightedText(KSyntaxHighlighting::Repository* repository, QObject* parent = nullptr); + ~HighlightedText() override; + + void setText(const QStringList& text); + void setDefinition(const KSyntaxHighlighting::Definition& definition); + + QString textAt(int index) const; + QTextLine lineAt(int index) const; + QString definition() const; + +signals: + void definitionChanged(const QString& definition); + +private slots: + void applyFormatting(); + +private: + void updateHighlighting(); + +#if KFSyntaxHighlighting_FOUND + KSyntaxHighlighting::Repository* m_repository; +#endif + std::unique_ptr m_highlighter; + std::unique_ptr m_layout; + QStringList m_lines; + QStringList m_cleanedLines; +}; diff --git a/src/models/highlighter.cpp b/src/models/highlighter.cpp deleted file mode 100644 index f8e8241cd..000000000 --- a/src/models/highlighter.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/* - SPDX-FileCopyrightText: Lieven Hey - SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com - - SPDX-License-Identifier: GPL-2.0-or-later -*/ - -#include "highlighter.hpp" - -#include -#include -#include -#include - -#if KFSyntaxHighlighting_FOUND -#include -#include -#include -#include -#endif - -Highlighter::Highlighter(QTextDocument* document, KSyntaxHighlighting::Repository* repository, QObject* parent) - : QObject(parent) -#if KFSyntaxHighlighting_FOUND - , m_highlighter(new KSyntaxHighlighting::SyntaxHighlighter(document)) - , m_repository(repository) -#endif -{ -#if !KFSyntaxHighlighting_FOUND - Q_UNUSED(repository); -#endif - document->setDefaultFont(QFontDatabase::systemFont(QFontDatabase::FixedFont)); - - // if qApp is used, UBSAN complains - QApplication::instance()->installEventFilter(this); - - updateColorTheme(); -} - -Highlighter::~Highlighter() = default; - -void Highlighter::setDefinition(const KSyntaxHighlighting::Definition& definition) -{ -#if KFSyntaxHighlighting_FOUND - // don't reparse if definition hasn't changed - if (m_currentDefinition == definition.name()) - return; - - m_highlighter->setDefinition(definition); - m_currentDefinition = definition.name(); - emit definitionChanged(m_currentDefinition); -#else - Q_UNUSED(definition); -#endif -} - -bool Highlighter::eventFilter(QObject* /*watched*/, QEvent* event) -{ - if (event->type() == QEvent::Type::ApplicationPaletteChange) { - updateColorTheme(); - } - - return false; -} - -void Highlighter::updateColorTheme() -{ -#if KFSyntaxHighlighting_FOUND - if (!m_repository) { - return; - } - - KSyntaxHighlighting::Repository::DefaultTheme theme; - if (QPalette().base().color().lightness() < 128) { - theme = KSyntaxHighlighting::Repository::DarkTheme; - } else { - theme = KSyntaxHighlighting::Repository::LightTheme; - } - m_highlighter->setTheme(m_repository->defaultTheme(theme)); - m_highlighter->rehighlight(); -#endif -} diff --git a/src/models/highlighter.hpp b/src/models/highlighter.hpp deleted file mode 100644 index 3966497a3..000000000 --- a/src/models/highlighter.hpp +++ /dev/null @@ -1,56 +0,0 @@ -/* - SPDX-FileCopyrightText: Lieven Hey - SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com - - SPDX-License-Identifier: GPL-2.0-or-later -*/ - -#pragma once - -#include "hotspot-config.h" - -#include - -#include - -class QTextDocument; - -namespace KSyntaxHighlighting { -class SyntaxHighlighter; -class Definition; -class Repository; -} - -class Highlighter : public QObject -{ - Q_OBJECT -public: - Highlighter(QTextDocument* document, KSyntaxHighlighting::Repository* repository, QObject* parent = nullptr); - ~Highlighter(); - - void setDefinition(const KSyntaxHighlighting::Definition& definition); - - QString definition() const - { -#if KFSyntaxHighlighting_FOUND - return m_currentDefinition; -#else - return {}; -#endif - } - -signals: - void definitionChanged(const QString& definition); - -protected: - bool eventFilter(QObject* watched, QEvent* event) override; - -private: - void updateColorTheme(); - -#if KFSyntaxHighlighting_FOUND - KSyntaxHighlighting::SyntaxHighlighter* m_highlighter = nullptr; - KSyntaxHighlighting::Repository* m_repository = nullptr; - QString m_currentDefinition; -#endif -}; diff --git a/src/models/sourcecodemodel.cpp b/src/models/sourcecodemodel.cpp index 5bf71eb88..3bede7c6f 100644 --- a/src/models/sourcecodemodel.cpp +++ b/src/models/sourcecodemodel.cpp @@ -18,7 +18,6 @@ #include #include -#include "highlighter.hpp" #include "search.h" #include @@ -26,10 +25,8 @@ Q_LOGGING_CATEGORY(sourcecodemodel, "hotspot.sourcecodemodel", QtWarningMsg) SourceCodeModel::SourceCodeModel(KSyntaxHighlighting::Repository* repository, QObject* parent) : QAbstractTableModel(parent) - , m_document(new QTextDocument(this)) - , m_highlighter(new Highlighter(m_document, repository, this)) + , m_highlightedText(repository) { - m_document->setUndoRedoEnabled(false); qRegisterMetaType(); } @@ -38,7 +35,7 @@ SourceCodeModel::~SourceCodeModel() = default; void SourceCodeModel::clear() { beginResetModel(); - m_document->clear(); + m_highlightedText.setText({}); endResetModel(); } @@ -56,19 +53,6 @@ void SourceCodeModel::setDisassembly(const DisassemblyOutput& disassemblyOutput, return; } - QFile file(disassemblyOutput.realSourceFileName); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - return; - } - - const auto sourceCode = QString::fromUtf8(file.readAll()); - - m_sourceCodeLines.clear(); - m_document->clear(); - - m_document->setPlainText(sourceCode); - m_document->setTextWidth(m_document->idealWidth()); - int maxLineNumber = 0; int minLineNumber = std::numeric_limits::max(); @@ -123,15 +107,16 @@ void SourceCodeModel::setDisassembly(const DisassemblyOutput& disassemblyOutput, m_startLine = minLineNumber - 1; // convert to index m_numLines = maxLineNumber - minLineNumber + 1; // include minLineNumber - m_sourceCodeLines.reserve(m_numLines); + QFile file(disassemblyOutput.realSourceFileName); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + return; + } - for (int i = m_startLine; i < m_startLine + m_numLines; i++) { - auto block = m_document->findBlockByLineNumber(i); - if (!block.isValid()) - continue; + const auto sourceCode = QString::fromUtf8(file.readAll()); - m_sourceCodeLines.push_back({block.text(), block.layout()->lineAt(0)}); - } + m_lines = sourceCode.split(QLatin1Char('\n')); + + m_highlightedText.setText(m_lines); } QVariant SourceCodeModel::headerData(int section, Qt::Orientation orientation, int role) const @@ -183,9 +168,11 @@ QVariant SourceCodeModel::data(const QModelIndex& index, int role) const return m_prettySymbol; } - if (role == SyntaxHighlightRole) - return QVariant::fromValue(m_sourceCodeLines[index.row() - 1].line); - return m_sourceCodeLines[index.row() - 1].text; + const int lineNumber = m_startLine + index.row() - 1; + if (role == SyntaxHighlightRole) { + return QVariant::fromValue(m_highlightedText.lineAt(lineNumber)); + } + return m_highlightedText.textAt(lineNumber); } if (index.column() == SourceCodeLineNumber) { @@ -264,13 +251,11 @@ void SourceCodeModel::setSysroot(const QString& sysroot) void SourceCodeModel::find(const QString& search, Direction direction, int current) { - auto searchFunc = [&search](const SourceCodeLine& line) { - return line.text.indexOf(search, 0, Qt::CaseInsensitive) != -1; - }; + auto searchFunc = [&search](const QString& line) { return line.indexOf(search, 0, Qt::CaseInsensitive) != -1; }; auto endReached = [this] { emit searchEndReached(); }; - const int resultIndex = ::search(m_sourceCodeLines, current, direction, searchFunc, endReached); + const int resultIndex = ::search(m_lines, current, direction, searchFunc, endReached); if (resultIndex >= 0) { emit resultFound(createIndex(resultIndex + 1, SourceCodeColumn)); diff --git a/src/models/sourcecodemodel.h b/src/models/sourcecodemodel.h index ab985ccf9..677d166e2 100644 --- a/src/models/sourcecodemodel.h +++ b/src/models/sourcecodemodel.h @@ -9,27 +9,17 @@ #include "data.h" #include "disassemblyoutput.h" +#include "highlightedtext.h" #include #include #include -class QTextDocument; - -class Highlighter; - namespace KSyntaxHighlighting { class Repository; class Definition; } -struct SourceCodeLine -{ - QString text; - QTextLine line; -}; -Q_DECLARE_TYPEINFO(SourceCodeLine, Q_MOVABLE_TYPE); - enum class Direction; Q_DECLARE_METATYPE(QTextLine) @@ -53,9 +43,9 @@ class SourceCodeModel : public QAbstractTableModel Data::FileLine fileLineForIndex(const QModelIndex& index) const; QModelIndex indexForFileLine(const Data::FileLine& line) const; - Highlighter* highlighter() const + HighlightedText* highlightedText() { - return m_highlighter; + return &m_highlightedText; } enum Columns @@ -88,14 +78,13 @@ public slots: private: QString m_sysroot; QSet m_validLineNumbers; - QTextDocument* m_document = nullptr; - QVector m_sourceCodeLines; - Highlighter* m_highlighter = nullptr; + HighlightedText m_highlightedText; Data::Costs m_selfCosts; Data::Costs m_inclusiveCosts; QString m_mainSourceFileName; QString m_prettySymbol; int m_startLine = 0; int m_numLines = 0; + QStringList m_lines; int m_highlightLine = 0; }; diff --git a/src/resultsdisassemblypage.cpp b/src/resultsdisassemblypage.cpp index 9bbdb3dd6..33cd2116d 100644 --- a/src/resultsdisassemblypage.cpp +++ b/src/resultsdisassemblypage.cpp @@ -32,7 +32,6 @@ #include "resultsutil.h" #if KFSyntaxHighlighting_FOUND -#include "highlighter.hpp" #include #include #include @@ -454,13 +453,12 @@ ResultsDisassemblyPage::ResultsDisassemblyPage(CostContextMenu* costContextMenu, completer->setCompletionMode(QCompleter::PopupCompletion); box->setCompleter(completer); box->setModel(definitionModel); - box->setCurrentText(model->highlighter()->definition()); + box->setCurrentText(model->highlightedText()->definition()); connect(box, qOverload(&QComboBox::activated), this, [this, model, box]() { - model->highlighter()->setDefinition(m_repository->definitionForName(box->currentText())); + model->highlightedText()->setDefinition(m_repository->definitionForName(box->currentText())); }); - - connect(model->highlighter(), &Highlighter::definitionChanged, + connect(model->highlightedText(), &HighlightedText::definitionChanged, [box](const QString& definition) { box->setCurrentText(definition); }); }; @@ -553,12 +551,6 @@ void ResultsDisassemblyPage::showDisassembly(const DisassemblyOutput& disassembl Q_ASSERT(!m_symbolStack.isEmpty()); const auto& curSymbol = m_symbolStack[m_stackIndex]; -#if KFSyntaxHighlighting_FOUND - m_sourceCodeModel->highlighter()->setDefinition( - m_repository->definitionForFileName(disassemblyOutput.mainSourceFileName)); - m_disassemblyModel->highlighter()->setDefinition(m_repository->definitionForName(QStringLiteral("GNU Assembler"))); -#endif - const auto& entry = m_callerCalleeResults.entry(curSymbol); ui->filenameLabel->setText(disassemblyOutput.mainSourceFileName); @@ -577,6 +569,13 @@ void ResultsDisassemblyPage::showDisassembly(const DisassemblyOutput& disassembl m_disassemblyModel->setDisassembly(disassemblyOutput, m_callerCalleeResults); m_sourceCodeModel->setDisassembly(disassemblyOutput, m_callerCalleeResults); +#if KFSyntaxHighlighting_FOUND + m_sourceCodeModel->highlightedText()->setDefinition( + m_repository->definitionForFileName(disassemblyOutput.mainSourceFileName)); + m_disassemblyModel->highlightedText()->setDefinition( + m_repository->definitionForName(QStringLiteral("GNU Assembler"))); +#endif + ResultsUtil::hideEmptyColumns(m_callerCalleeResults.selfCosts, ui->assemblyView, DisassemblyModel::COLUMN_COUNT); ResultsUtil::hideEmptyColumns(m_callerCalleeResults.selfCosts, ui->sourceCodeView, SourceCodeModel::COLUMN_COUNT);