File indexing completed on 2024-05-05 03:58:35
0001 /* 0002 SPDX-FileCopyrightText: 2013-2016 Simon St James <kdedevel@etotheipiplusone.com> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #ifndef KATEVI_EMULATED_COMMAND_BAR_COMPLETER_H 0008 #define KATEVI_EMULATED_COMMAND_BAR_COMPLETER_H 0009 0010 #include <functional> 0011 0012 #include <QStringList> 0013 0014 namespace KTextEditor 0015 { 0016 class ViewPrivate; 0017 } 0018 0019 class QLineEdit; 0020 class QCompleter; 0021 class QStringListModel; 0022 class QKeyEvent; 0023 0024 namespace KateVi 0025 { 0026 class ActiveMode; 0027 class EmulatedCommandBar; 0028 0029 struct CompletionStartParams { 0030 static CompletionStartParams createModeSpecific(const QStringList &completions, 0031 int wordStartPos, 0032 std::function<QString(const QString &)> completionTransform = std::function<QString(const QString &)>()) 0033 { 0034 CompletionStartParams completionStartParams; 0035 completionStartParams.completionType = ModeSpecific; 0036 completionStartParams.completions = completions; 0037 completionStartParams.wordStartPos = wordStartPos; 0038 completionStartParams.completionTransform = completionTransform; 0039 return completionStartParams; 0040 } 0041 static CompletionStartParams invalid() 0042 { 0043 CompletionStartParams completionStartParams; 0044 completionStartParams.completionType = None; 0045 return completionStartParams; 0046 } 0047 enum CompletionType { None, ModeSpecific, WordFromDocument }; 0048 CompletionType completionType = None; 0049 int wordStartPos = -1; 0050 QStringList completions; 0051 std::function<QString(const QString &)> completionTransform; 0052 }; 0053 0054 class Completer 0055 { 0056 public: 0057 enum class CompletionInvocation { ExtraContext, NormalContext }; 0058 Completer(EmulatedCommandBar *emulatedCommandBar, KTextEditor::ViewPrivate *view, QLineEdit *edit); 0059 void startCompletion(const CompletionStartParams &completionStartParams); 0060 void deactivateCompletion(); 0061 bool isCompletionActive() const; 0062 bool isNextTextChangeDueToCompletionChange() const; 0063 bool completerHandledKeypress(const QKeyEvent *keyEvent); 0064 void editTextChanged(const QString &newText); 0065 void setCurrentMode(ActiveMode *currentMode); 0066 0067 private: 0068 QLineEdit *m_edit; 0069 KTextEditor::ViewPrivate *m_view; 0070 ActiveMode *m_currentMode = nullptr; 0071 0072 void setCompletionIndex(int index); 0073 void currentCompletionChanged(); 0074 void updateCompletionPrefix(); 0075 CompletionStartParams activateWordFromDocumentCompletion(); 0076 QString wordBeforeCursor(); 0077 int wordBeforeCursorBegin(); 0078 void abortCompletionAndResetToPreCompletion(); 0079 0080 QCompleter *m_completer; 0081 QStringListModel *m_completionModel; 0082 QString m_textToRevertToIfCompletionAborted; 0083 int m_cursorPosToRevertToIfCompletionAborted = 0; 0084 bool m_isNextTextChangeDueToCompletionChange = false; 0085 CompletionStartParams m_currentCompletionStartParams; 0086 CompletionStartParams::CompletionType m_currentCompletionType = CompletionStartParams::None; 0087 }; 0088 } 0089 #endif