TextEditor: introduce text suggestion interface

And also a copilot suggestion implementing that interface that allows
reverting all changes done to a suggestion as well as applying it.

Change-Id: I236c1fc5e5844d19ac606672af54e273e9c42e1c
Reviewed-by: Marcus Tillmanns <marcus.tillmanns@qt.io>
This commit is contained in:
David Schulz
2023-03-27 07:28:48 +02:00
parent 1ee46580ac
commit 8a1e34f084
10 changed files with 190 additions and 147 deletions

View File

@@ -42,6 +42,24 @@ public:
virtual ~CodeFormatterData();
};
class TEXTEDITOR_EXPORT TextSuggestion
{
public:
TextSuggestion();
virtual bool apply() = 0;
virtual void reset() = 0;
virtual int position() = 0;
int currentPosition() const { return m_currentPosition; }
void setCurrentPosition(int position) { m_currentPosition = position; }
QTextDocument *document() { return &m_replacementDocument; }
private:
QTextDocument m_replacementDocument;
int m_currentPosition = -1;
};
class TEXTEDITOR_EXPORT TextBlockUserData : public QTextBlockUserData
{
public:
@@ -126,11 +144,9 @@ public:
QByteArray expectedRawStringSuffix() { return m_expectedRawStringSuffix; }
void setExpectedRawStringSuffix(const QByteArray &suffix) { m_expectedRawStringSuffix = suffix; }
void setReplacement(const QString &replacement);
void setReplacementPosition(int replacementPosition);
void clearReplacement();
QTextDocument *replacement() const { return m_replacement.get(); }
int replacementPosition() const { return m_replacementPosition; }
void insertSuggestion(std::unique_ptr<TextSuggestion> &&suggestion);
TextSuggestion *suggestion() const;
void clearSuggestion();
private:
TextMarks m_marks;
@@ -146,7 +162,7 @@ private:
KSyntaxHighlighting::State m_syntaxState;
QByteArray m_expectedRawStringSuffix; // A bit C++-specific, but let's be pragmatic.
std::unique_ptr<QTextDocument> m_replacement;
int m_replacementPosition = -1;
std::unique_ptr<TextSuggestion> m_suggestion;
};
@@ -180,14 +196,12 @@ public:
static void setFolded(const QTextBlock &block, bool folded);
static void setExpectedRawStringSuffix(const QTextBlock &block, const QByteArray &suffix);
static QByteArray expectedRawStringSuffix(const QTextBlock &block);
static void updateReplacementFormats(const QTextBlock &block,
static TextSuggestion *suggestion(const QTextBlock &block);
static void updateSuggestionFormats(const QTextBlock &block,
const FontSettings &fontSettings);
static QString replacement(const QTextBlock &block);
static QTextDocument *replacementDocument(const QTextBlock &block);
static int replacementPosition(const QTextBlock &block);
static bool updateReplacement(const QTextBlock &block,
int position,
const FontSettings &fontSettings);
static bool updateSuggestion(const QTextBlock &block,
int position,
const FontSettings &fontSettings);
class TEXTEDITOR_EXPORT FoldValidator
{