Skip to content

Commit 5086341

Browse files
committed
make syntax highlighting customizeable
fixes #434
1 parent 976b6a7 commit 5086341

9 files changed

+271
-56
lines changed

src/models/disassemblymodel.cpp

+9-3
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@
1616
#include "highlighter.hpp"
1717
#include "sourcecodemodel.h"
1818

19-
DisassemblyModel::DisassemblyModel(QObject* parent)
19+
DisassemblyModel::DisassemblyModel(KSyntaxHighlighting::Repository* repository, QObject* parent)
2020
: QAbstractTableModel(parent)
2121
, m_document(new QTextDocument(this))
22-
, m_highlighter(new Highlighter(m_document, this))
22+
, m_highlighter(new Highlighter(m_document, repository, this))
2323
{
2424
m_document->setUndoRedoEnabled(false);
25-
m_highlighter->setDefinitionForName(QStringLiteral("GNU Assembler"));
25+
// TODO
26+
// m_highlighter->setDefinitionForName(QStringLiteral("GNU Assembler"));
2627
}
2728

2829
DisassemblyModel::~DisassemblyModel() = default;
@@ -223,3 +224,8 @@ QModelIndex DisassemblyModel::indexForFileLine(const Data::FileLine& fileLine) c
223224
return {};
224225
return index(bestMatch, 0);
225226
}
227+
228+
void DisassemblyModel::setSyntaxHighlightDefinition(const KSyntaxHighlighting::Definition& definition)
229+
{
230+
m_highlighter->setDefinition(definition);
231+
}

src/models/disassemblymodel.h

+7-1
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,16 @@
1818
class QTextDocument;
1919
class Highlighter;
2020

21+
namespace KSyntaxHighlighting {
22+
class Definition;
23+
class Repository;
24+
}
25+
2126
class DisassemblyModel : public QAbstractTableModel
2227
{
2328
Q_OBJECT
2429
public:
25-
explicit DisassemblyModel(QObject* parent = nullptr);
30+
explicit DisassemblyModel(KSyntaxHighlighting::Repository* repository = nullptr, QObject* parent = nullptr);
2631
~DisassemblyModel();
2732

2833
void setDisassembly(const DisassemblyOutput& disassemblyOutput, const Data::CallerCalleeResults& results);
@@ -59,6 +64,7 @@ class DisassemblyModel : public QAbstractTableModel
5964

6065
public slots:
6166
void updateHighlighting(int line);
67+
void setSyntaxHighlightDefinition(const KSyntaxHighlighting::Definition& definition);
6268

6369
private:
6470
QTextDocument* m_document;

src/models/highlighter.cpp

+12-15
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,16 @@
1919
#include <KSyntaxHighlighting/Theme>
2020
#endif
2121

22-
Highlighter::Highlighter(QTextDocument* document, QObject* parent)
22+
Highlighter::Highlighter(QTextDocument* document, KSyntaxHighlighting::Repository* repository, QObject* parent)
2323
: QObject(parent)
2424
#if KF5SyntaxHighlighting_FOUND
25-
, m_repository(std::make_unique<KSyntaxHighlighting::Repository>())
2625
, m_highlighter(new KSyntaxHighlighting::SyntaxHighlighter(document))
26+
, m_repository(repository)
2727
#endif
2828
{
29+
#if KF5SyntaxHighlighting_FOUND == 0
30+
Q_UNUSED(repository);
31+
#endif
2932
document->setDefaultFont(QFontDatabase::systemFont(QFontDatabase::FixedFont));
3033

3134
// if qApp is used, UBSAN complains
@@ -36,23 +39,17 @@ Highlighter::Highlighter(QTextDocument* document, QObject* parent)
3639

3740
Highlighter::~Highlighter() = default;
3841

39-
void Highlighter::setDefinitionForFilename(const QString& filename)
42+
void Highlighter::setDefinition(const KSyntaxHighlighting::Definition& definition)
4043
{
4144
#if KF5SyntaxHighlighting_FOUND
42-
const auto def = m_repository->definitionForFileName(filename);
43-
m_highlighter->setDefinition(def);
44-
#else
45-
Q_UNUSED(filename);
46-
#endif
47-
}
45+
// don't reparse if definition hasn't changed
46+
if (m_currentDefinition == definition.name())
47+
return;
4848

49-
void Highlighter::setDefinitionForName(const QString& name)
50-
{
51-
#if KF5SyntaxHighlighting_FOUND
52-
const auto def = m_repository->definitionForName(name);
53-
m_highlighter->setDefinition(def);
49+
m_highlighter->setDefinition(definition);
50+
m_currentDefinition = definition.name();
5451
#else
55-
Q_UNUSED(name);
52+
Q_UNUSED(definition);
5653
#endif
5754
}
5855

src/models/highlighter.hpp

+5-4
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,18 @@ class QTextDocument;
1717

1818
namespace KSyntaxHighlighting {
1919
class SyntaxHighlighter;
20+
class Definition;
2021
class Repository;
2122
}
2223

2324
class Highlighter : public QObject
2425
{
2526
Q_OBJECT
2627
public:
27-
Highlighter(QTextDocument* document, QObject* parent = nullptr);
28+
Highlighter(QTextDocument* document, KSyntaxHighlighting::Repository* repository, QObject* parent = nullptr);
2829
~Highlighter();
2930

30-
void setDefinitionForFilename(const QString& filename);
31-
void setDefinitionForName(const QString& name);
31+
void setDefinition(const KSyntaxHighlighting::Definition& definition);
3232

3333
protected:
3434
bool eventFilter(QObject* watched, QEvent* event) override;
@@ -37,7 +37,8 @@ class Highlighter : public QObject
3737
void updateColorTheme();
3838

3939
#if KF5SyntaxHighlighting_FOUND
40-
std::unique_ptr<KSyntaxHighlighting::Repository> m_repository;
4140
KSyntaxHighlighting::SyntaxHighlighter* m_highlighter = nullptr;
41+
KSyntaxHighlighting::Repository* m_repository = nullptr;
42+
QString m_currentDefinition;
4243
#endif
4344
};

src/models/sourcecodemodel.cpp

+8-3
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515

1616
#include "highlighter.hpp"
1717

18-
SourceCodeModel::SourceCodeModel(QObject* parent)
18+
SourceCodeModel::SourceCodeModel(KSyntaxHighlighting::Repository* repository, QObject* parent)
1919
: QAbstractTableModel(parent)
2020
, m_document(new QTextDocument(this))
21-
, m_highlighter(new Highlighter(m_document, this))
21+
, m_highlighter(new Highlighter(m_document, repository, this))
2222
{
2323
m_document->setUndoRedoEnabled(false);
2424
qRegisterMetaType<QTextLine>();
@@ -64,7 +64,7 @@ void SourceCodeModel::setDisassembly(const DisassemblyOutput& disassemblyOutput,
6464
const auto sourceCode = QString::fromUtf8(file.readAll());
6565

6666
m_document->clear();
67-
m_highlighter->setDefinitionForFilename(disassemblyOutput.mainSourceFileName);
67+
// m_highlighter->setDefinitionForFilename(disassemblyOutput.mainSourceFileName);
6868

6969
m_document->setPlainText(sourceCode);
7070
m_document->setTextWidth(m_document->idealWidth());
@@ -231,3 +231,8 @@ void SourceCodeModel::setSysroot(const QString& sysroot)
231231
{
232232
m_sysroot = sysroot;
233233
}
234+
235+
void SourceCodeModel::setSyntaxHighlightDefinition(const KSyntaxHighlighting::Definition& definition)
236+
{
237+
m_highlighter->setDefinition(definition);
238+
}

src/models/sourcecodemodel.h

+7-1
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,18 @@ class QTextDocument;
1818

1919
class Highlighter;
2020

21+
namespace KSyntaxHighlighting {
22+
class Repository;
23+
class Definition;
24+
}
25+
2126
Q_DECLARE_METATYPE(QTextLine)
2227

2328
class SourceCodeModel : public QAbstractTableModel
2429
{
2530
Q_OBJECT
2631
public:
27-
explicit SourceCodeModel(QObject* parent = nullptr);
32+
explicit SourceCodeModel(KSyntaxHighlighting::Repository* repository = nullptr, QObject* parent = nullptr);
2833
~SourceCodeModel();
2934

3035
void clear();
@@ -59,6 +64,7 @@ class SourceCodeModel : public QAbstractTableModel
5964
public slots:
6065
void updateHighlighting(int line);
6166
void setSysroot(const QString& sysroot);
67+
void setSyntaxHighlightDefinition(const KSyntaxHighlighting::Definition& definition);
6268

6369
private:
6470
QString m_sysroot;

src/resultsdisassemblypage.cpp

+58-2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,13 @@
2828
#include "parsers/perf/perfparser.h"
2929
#include "resultsutil.h"
3030

31+
#if KF5SyntaxHighlighting_FOUND
32+
#include <KSyntaxHighlighting/definition.h>
33+
#include <KSyntaxHighlighting/repository.h>
34+
#include <QCompleter>
35+
#include <QStringListModel>
36+
#endif
37+
3138
#include "data.h"
3239
#include "models/codedelegate.h"
3340
#include "models/costdelegate.h"
@@ -41,8 +48,14 @@
4148
ResultsDisassemblyPage::ResultsDisassemblyPage(QWidget* parent)
4249
: QWidget(parent)
4350
, ui(new Ui::ResultsDisassemblyPage)
44-
, m_disassemblyModel(new DisassemblyModel(this))
45-
, m_sourceCodeModel(new SourceCodeModel(this))
51+
#if KF5SyntaxHighlighting_FOUND
52+
, m_repository(new KSyntaxHighlighting::Repository)
53+
, m_disassemblyModel(new DisassemblyModel(m_repository.get(), this))
54+
, m_sourceCodeModel(new SourceCodeModel(m_repository.get(), this))
55+
#else
56+
, m_disassemblyModel(new DisassemblyModel(nullptr, this))
57+
, m_sourceCodeModel(new SourceCodeModel(nullptr, this))
58+
#endif
4659
, m_disassemblyCostDelegate(new CostDelegate(DisassemblyModel::CostRole, DisassemblyModel::TotalCostRole, this))
4760
, m_sourceCodeCostDelegate(new CostDelegate(SourceCodeModel::CostRole, SourceCodeModel::TotalCostRole, this))
4861
, m_disassemblyDelegate(new CodeDelegate(DisassemblyModel::RainbowLineNumberRole, DisassemblyModel::HighlightRole,
@@ -123,6 +136,39 @@ ResultsDisassemblyPage::ResultsDisassemblyPage(QWidget* parent)
123136
}
124137
}
125138
});
139+
140+
#if KF5SyntaxHighlighting_FOUND
141+
QStringList schemes;
142+
143+
for (const auto& entry : m_repository->definitions()) {
144+
schemes.push_back(entry.name());
145+
}
146+
147+
auto connectCompletion = [schemes, this](QComboBox* box, auto* model) {
148+
auto m = new QStringListModel(this);
149+
m->setStringList(schemes);
150+
151+
auto completer = new QCompleter(this);
152+
completer->setModel(m);
153+
completer->setCaseSensitivity(Qt::CaseInsensitive);
154+
completer->setCompletionMode(QCompleter::PopupCompletion);
155+
box->setCompleter(completer);
156+
157+
connect(completer, qOverload<const QModelIndex&>(&QCompleter::activated), this,
158+
[this, model](const QModelIndex& entry) {
159+
model->setSyntaxHighlightDefinition(m_repository->definitionForName(entry.data().toString()));
160+
});
161+
connect(box, qOverload<int>(&QComboBox::activated), this, [this, model, box]() {
162+
model->setSyntaxHighlightDefinition(m_repository->definitionForName(box->currentText()));
163+
});
164+
};
165+
166+
connectCompletion(ui->sourceCodeComboBox, m_sourceCodeModel);
167+
connectCompletion(ui->assemblyComboBox, m_disassemblyModel);
168+
#else
169+
ui->customSourceCodeHighlighting->setVisible(false);
170+
ui->customAssemblyHighlighting->setVisible(false);
171+
#endif
126172
}
127173

128174
ResultsDisassemblyPage::~ResultsDisassemblyPage() = default;
@@ -186,6 +232,16 @@ void ResultsDisassemblyPage::showDisassembly(const DisassemblyOutput& disassembl
186232
m_disassemblyModel->clear();
187233
m_sourceCodeModel->clear();
188234

235+
#if KF5SyntaxHighlighting_FOUND
236+
auto sourceCodeDefinition = m_repository->definitionForFileName(disassemblyOutput.mainSourceFileName);
237+
238+
ui->assemblyComboBox->setCurrentText(QStringLiteral("GNU Assembler"));
239+
ui->sourceCodeComboBox->setCurrentText(sourceCodeDefinition.name());
240+
241+
m_sourceCodeModel->setSyntaxHighlightDefinition(sourceCodeDefinition);
242+
m_disassemblyModel->setSyntaxHighlightDefinition(m_repository->definitionForName(QStringLiteral("GNU Assembler")));
243+
#endif
244+
189245
const auto& entry = m_callerCalleeResults.entry(m_curSymbol);
190246

191247
ui->filenameLabel->setText(disassemblyOutput.mainSourceFileName);

src/resultsdisassemblypage.h

+8
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#pragma once
1010

1111
#include "data.h"
12+
#include "hotspot-config.h"
1213
#include "models/costdelegate.h"
1314
#include <QWidget>
1415

@@ -34,6 +35,10 @@ struct DisassemblyOutput;
3435
class DisassemblyModel;
3536
class SourceCodeModel;
3637

38+
namespace KSyntaxHighlighting {
39+
class Repository;
40+
}
41+
3742
class ResultsDisassemblyPage : public QWidget
3843
{
3944
Q_OBJECT
@@ -58,6 +63,9 @@ class ResultsDisassemblyPage : public QWidget
5863
void showDisassembly(const DisassemblyOutput& disassemblyOutput);
5964

6065
QScopedPointer<Ui::ResultsDisassemblyPage> ui;
66+
#if KF5SyntaxHighlighting_FOUND
67+
QScopedPointer<KSyntaxHighlighting::Repository> m_repository;
68+
#endif
6169
// Model
6270
DisassemblyModel* m_disassemblyModel;
6371
SourceCodeModel* m_sourceCodeModel;

0 commit comments

Comments
 (0)