1 | /* |
---|---|
2 | SPDX-FileCopyrightText: 2013-2016 Simon St James <kdedevel@etotheipiplusone.com> |
3 | |
4 | SPDX-License-Identifier: LGPL-2.0-or-later |
5 | */ |
6 | |
7 | #ifndef KATEVI_EMULATED_COMMAND_BAR_COMPLETER_H |
8 | #define KATEVI_EMULATED_COMMAND_BAR_COMPLETER_H |
9 | |
10 | #include <functional> |
11 | |
12 | #include <QStringList> |
13 | |
14 | namespace KTextEditor |
15 | { |
16 | class ViewPrivate; |
17 | } |
18 | |
19 | class QLineEdit; |
20 | class QCompleter; |
21 | class QStringListModel; |
22 | class QKeyEvent; |
23 | |
24 | namespace KateVi |
25 | { |
26 | class ActiveMode; |
27 | class EmulatedCommandBar; |
28 | |
29 | struct CompletionStartParams { |
30 | static CompletionStartParams createModeSpecific(const QStringList &completions, |
31 | int wordStartPos, |
32 | std::function<QString(const QString &)> completionTransform = std::function<QString(const QString &)>()) |
33 | { |
34 | CompletionStartParams completionStartParams; |
35 | completionStartParams.completionType = ModeSpecific; |
36 | completionStartParams.completions = completions; |
37 | completionStartParams.wordStartPos = wordStartPos; |
38 | completionStartParams.completionTransform = completionTransform; |
39 | return completionStartParams; |
40 | } |
41 | static CompletionStartParams invalid() |
42 | { |
43 | CompletionStartParams completionStartParams; |
44 | completionStartParams.completionType = None; |
45 | return completionStartParams; |
46 | } |
47 | enum CompletionType { |
48 | None, |
49 | ModeSpecific, |
50 | WordFromDocument |
51 | }; |
52 | CompletionType completionType = None; |
53 | int wordStartPos = -1; |
54 | QStringList completions; |
55 | std::function<QString(const QString &)> completionTransform; |
56 | }; |
57 | |
58 | class Completer |
59 | { |
60 | public: |
61 | enum class CompletionInvocation { |
62 | ExtraContext, |
63 | NormalContext |
64 | }; |
65 | Completer(EmulatedCommandBar *emulatedCommandBar, KTextEditor::ViewPrivate *view, QLineEdit *edit); |
66 | void startCompletion(const CompletionStartParams &completionStartParams); |
67 | void deactivateCompletion(); |
68 | bool isCompletionActive() const; |
69 | bool isNextTextChangeDueToCompletionChange() const; |
70 | bool completerHandledKeypress(const QKeyEvent *keyEvent); |
71 | void editTextChanged(const QString &newText); |
72 | void setCurrentMode(ActiveMode *currentMode); |
73 | |
74 | private: |
75 | QLineEdit *m_edit; |
76 | KTextEditor::ViewPrivate *m_view; |
77 | ActiveMode *m_currentMode = nullptr; |
78 | |
79 | void setCompletionIndex(int index); |
80 | void currentCompletionChanged(); |
81 | void updateCompletionPrefix(); |
82 | CompletionStartParams activateWordFromDocumentCompletion(); |
83 | QString wordBeforeCursor(); |
84 | int wordBeforeCursorBegin(); |
85 | void abortCompletionAndResetToPreCompletion(); |
86 | |
87 | QCompleter *m_completer; |
88 | QStringListModel *m_completionModel; |
89 | QString m_textToRevertToIfCompletionAborted; |
90 | int m_cursorPosToRevertToIfCompletionAborted = 0; |
91 | bool m_isNextTextChangeDueToCompletionChange = false; |
92 | CompletionStartParams m_currentCompletionStartParams; |
93 | CompletionStartParams::CompletionType m_currentCompletionType = CompletionStartParams::None; |
94 | }; |
95 | } |
96 | #endif |
97 |