1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
// Copyright (C) 2025 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "plaintextedit.h"
#include "../id.h"
#pragma once
namespace Utils {
const int FULL_LINE_HIGHLIGHT_FORMAT_PROPERTY_ID = QTextFormat::UserProperty + 43;
using FormatRanges = QList<QTextLayout::FormatRange>;
class QTCREATOR_UTILS_EXPORT LayoutItem
{
public:
LayoutItem() = default;
explicit LayoutItem(const Id &category);
virtual ~LayoutItem() = default;
virtual qreal height() { return 0.0; }
virtual qreal width() const { return 0.0; }
virtual void ensureLayouted(QTextDocument *doc, const QFontMetrics & fm, qreal availableWidth);
virtual void paintBackground(QPainter *p,const QPointF &pos,const QRectF &clip = {});
virtual void paintItem(
QPainter *p,
const QPointF &pos,
const FormatRanges &selections = {},
const QRectF &clip = {});
virtual void clear() {}
Id category() const { return m_category; }
private:
Id m_category;
};
using LayoutItems = std::list<std::unique_ptr<LayoutItem>>;
class QTCREATOR_UTILS_EXPORT TextLayoutItem : public LayoutItem
{
public:
TextLayoutItem() = default;
TextLayoutItem(std::unique_ptr<QTextLayout> &&layout, const Id &category);
qreal height() override;
qreal width() const override;
void ensureLayouted(QTextDocument *doc, const QFontMetrics & fm, qreal availableWidth) override;
void paintBackground(QPainter *p,const QPointF &pos,const QRectF &clip = {}) override;
void paintItem(
QPainter *p,
const QPointF &pos,
const FormatRanges &selections = {},
const QRectF &clip = {}) override;
void clear() override;
QTextLayout* layout();
private:
std::unique_ptr<QTextLayout> m_textLayout;
};
class QTCREATOR_UTILS_EXPORT EmptyLayoutItem : public LayoutItem
{
public:
EmptyLayoutItem() = default;
EmptyLayoutItem(qreal height, const Id &category = {});
void setBackground(const QBrush &background) { m_background = background; }
qreal height() override;
void paintBackground(QPainter *p,const QPointF &pos,const QRectF &clip = {}) override;
void paintItem(
QPainter *p,
const QPointF &pos,
const FormatRanges &selections = {},
const QRectF &clip = {}) override;
private:
qreal m_height = 0.0;
QBrush m_background;
};
class QTCREATOR_UTILS_EXPORT TextEditorLayout : public PlainTextDocumentLayout
{
public:
TextEditorLayout(PlainTextDocumentLayout *docLayout);
~TextEditorLayout() override;
void resetBlockSize(const QTextBlock &block);
void paintBlock(
const QTextBlock &block,
QPainter *p,
const QPointF &pos,
const FormatRanges &selections = {},
const QRectF &clipRect = {});
void paintBackground(const QTextBlock &block, QPainter *p, const QPointF &pos,const QRectF &clip = {});
QTextLayout *blockLayout(const QTextBlock &block) const override;
void clearBlockLayout(QTextBlock &block) const override;
void clearBlockLayout(
QTextBlock &start, QTextBlock &end, bool &blockVisibilityChanged) const override;
void relayout() override;
int additionalBlockHeight(const QTextBlock &block, bool includeEmbeddedWidgetsHeight) const override;
QRectF replacementBlockBoundingRect(const QTextBlock &block) const override;
int lineSpacing() const override;
int relativeLineSpacing() const override;
int mainLayoutOffset(const QTextBlock &block) const;
void prependLayoutItem(const QTextBlock &block, std::unique_ptr<LayoutItem> &&layoutItem);
void appendLayoutItem(const QTextBlock &block, std::unique_ptr<LayoutItem> &&layoutItem);
void prependAdditionalLayouts(
const QTextBlock &block, const QList<QTextLayout *> &layouts, const Id id = {});
void appendAdditionalLayouts(
const QTextBlock &block, const QList<QTextLayout *> &layouts, const Id id = {});
int removeLayoutItems(const QTextBlock &block, const Id id = {});
const QList<LayoutItem *> layoutItems(const QTextBlock &block) const;
const QList<LayoutItem *> layoutItemsForCategory(const QTextBlock &block, const Id id) const;
void documentChanged(int from, int charsRemoved, int charsAdded) override;
int blockLineCount(const QTextBlock &block) const override;
void setBlockLineCount(QTextBlock &block, int lineCount) const override;
int offsetForBlock(const QTextBlock &block) const;
void setBlockLayedOut(const QTextBlock &block) const override;
bool blockLayoutValid(int index) const;
int lineCount() const override;
int firstLineNumberOf(const QTextBlock &block) const override;
int offsetForLine(int line) const;
int lineForOffset(int offset) const;
int documentPixelHeight() const;
QTextBlock findBlockByLineNumber(int lineNumber) const override;
bool moveCursorImpl(
QTextCursor &cursor,
QTextCursor::MoveOperation operation,
QTextCursor::MoveMode mode = QTextCursor::MoveAnchor) const;
bool moveCursor(
QTextCursor &cursor,
QTextCursor::MoveOperation operation,
QTextCursor::MoveMode mode = QTextCursor::MoveAnchor,
int steps = 1) const override;
qreal blockWidth(const QTextBlock &block) override;
private:
class TextEditorLayoutPrivate;
TextEditorLayoutPrivate *d;
};
} // namespace Utils
|