KTextEditor::CodeCompletionModel Class
class KTextEditor::CodeCompletionModelAn item model for providing code completion, and meta information for enhanced presentation. More...
Header: | #include <KTextEditor/CodeCompletionModel> |
CMake: | find_package(KF6 REQUIRED COMPONENTS TextEditor) target_link_libraries(mytarget PRIVATE KF6::TextEditor) |
Inherits: | QAbstractItemModel |
Public Types
enum | Columns { Prefix, Icon, Scope, Name, Arguments, Postfix } |
flags | CompletionProperties |
enum | CompletionProperty { NoProperty, FirstProperty, Public, Protected, Private, …, LastProperty } |
enum | ExtraItemDataRoles { CompletionRole, ScopeIndex, MatchQuality, SetMatchContext, HighlightingMethod, …, ExpandingWidget } |
enum | HighlightMethod { NoHighlighting, InternalHighlighting, CustomHighlighting } |
flags | HighlightMethods |
enum | InvocationType { AutomaticInvocation, UserInvocation, ManualInvocation } |
Public Functions
CodeCompletionModel(QObject *parent) | |
virtual void | completionInvoked(KTextEditor::View *view, const KTextEditor::Range &range, KTextEditor::CodeCompletionModel::InvocationType invocationType) |
virtual void | executeCompletionItem(KTextEditor::View *view, const KTextEditor::Range &word, const QModelIndex &index) const |
bool | hasGroups() const |
Reimplemented Public Functions
virtual int | columnCount(const QModelIndex &parent = QModelIndex()) const override |
virtual QModelIndex | index(int row, int column, const QModelIndex &parent = QModelIndex()) const override |
virtual QMap<int, QVariant> | itemData(const QModelIndex &index) const override |
virtual QModelIndex | parent(const QModelIndex &index) const override |
virtual int | rowCount(const QModelIndex &parent = QModelIndex()) const override |
Signals
void | waitForReset() |
Detailed Description
Introduction
The CodeCompletionModel is the actual workhorse to provide code completions in a KTextEditor::View. It is meant to be used in conjunction with the View. The CodeCompletionModel is not meant to be used as is. Rather you need to implement a subclass of CodeCompletionModel to actually generate completions appropriate for your type of Document.
Implementing a CodeCompletionModel
The CodeCompletionModel is a QAbstractItemModel, and can be subclassed in the same way. It provides default implementations of several members, however, so in most cases (if your completions are essentially a non-hierarchical, flat list of matches) you will only need to overload few virtual functions.
Implementing a CodeCompletionModel for a flat list
For the simple case of a flat list of completions, you will need to:
- Implement completionInvoked() to actually generate/update the list of completion matches
- implement itemData() (or QAbstractItemModel::data()) to return the information that should be displayed for each match.
- use setRowCount() to reflect the number of matches.
Columns and roles
TODO document the meaning and usage of the columns and roles used by the
Completion Interface
Using the new CodeCompletionModel
To start using your KTextEditor::View Completion Interface.
ControllerInterface to get more control
To have more control over code completion implement CodeCompletionModelControllerInterface in your CodeCompletionModel.
See also KTextEditor::CodeCompletionModelControllerInterface.
Member Type Documentation
enum CodeCompletionModel::Columns
Constant | Value | Description |
---|---|---|
KTextEditor::CodeCompletionModel::Prefix | 0 | |
KTextEditor::CodeCompletionModel::Icon | 1 | Icon representing the type of completion. We have a separate icon field so that names remain aligned where only some completions have icons, and so that they can be rearranged by the user. |
KTextEditor::CodeCompletionModel::Scope | 2 | |
KTextEditor::CodeCompletionModel::Name | 3 | |
KTextEditor::CodeCompletionModel::Arguments | 4 | |
KTextEditor::CodeCompletionModel::Postfix | 5 |
enum CodeCompletionModel::CompletionProperty
flags CodeCompletionModel::CompletionProperties
Constant | Value |
---|---|
KTextEditor::CodeCompletionModel::NoProperty | 0x0 |
KTextEditor::CodeCompletionModel::FirstProperty | 0x1 |
KTextEditor::CodeCompletionModel::Public | 0x1 |
KTextEditor::CodeCompletionModel::Protected | 0x2 |
KTextEditor::CodeCompletionModel::Private | 0x4 |
KTextEditor::CodeCompletionModel::Static | 0x8 |
KTextEditor::CodeCompletionModel::Const | 0x10 |
KTextEditor::CodeCompletionModel::Namespace | 0x20 |
KTextEditor::CodeCompletionModel::Class | 0x40 |
KTextEditor::CodeCompletionModel::Struct | 0x80 |
KTextEditor::CodeCompletionModel::Union | 0x100 |
KTextEditor::CodeCompletionModel::Function | 0x200 |
KTextEditor::CodeCompletionModel::Variable | 0x400 |
KTextEditor::CodeCompletionModel::Enum | 0x800 |
KTextEditor::CodeCompletionModel::Template | 0x1000 |
KTextEditor::CodeCompletionModel::TypeAlias | 0x2000 |
KTextEditor::CodeCompletionModel::Virtual | 0x4000 |
KTextEditor::CodeCompletionModel::Override | 0x8000 |
KTextEditor::CodeCompletionModel::Inline | 0x10000 |
KTextEditor::CodeCompletionModel::Friend | 0x20000 |
KTextEditor::CodeCompletionModel::Signal | 0x40000 |
KTextEditor::CodeCompletionModel::Slot | 0x80000 |
KTextEditor::CodeCompletionModel::LocalScope | 0x100000 |
KTextEditor::CodeCompletionModel::NamespaceScope | 0x200000 |
KTextEditor::CodeCompletionModel::GlobalScope | 0x400000 |
KTextEditor::CodeCompletionModel::LastProperty | GlobalScope |
The CompletionProperties type is a typedef for QFlags<CompletionProperty>. It stores an OR combination of CompletionProperty values.
enum CodeCompletionModel::ExtraItemDataRoles
Meta information is passed through extra {Qt::ItemDataRole}s. This information should be returned when requested on the Name column.
Constant | Value | Description |
---|---|---|
KTextEditor::CodeCompletionModel::CompletionRole | Qt::UserRole | The model should return a set of CompletionProperties. |
KTextEditor::CodeCompletionModel::ScopeIndex | Qt::UserRole + 1 | The model should return an index to the scope -1 represents no scope. TODO how to sort scope? |
KTextEditor::CodeCompletionModel::MatchQuality | Qt::UserRole + 2 | If requested, your model should try to determine whether the completion in question is a suitable match for the context (ie. is accessible, exported, + returns the data type required). The returned data should ideally be matched against the argument-hint context set earlier by SetMatchContext. Return an integer value that should be positive if the completion is suitable, and zero if the completion is not suitable. The value should be between 0 an 10, where 10 means perfect match. Return QVariant::Invalid if you are unable to determine this. |
KTextEditor::CodeCompletionModel::SetMatchContext | Qt::UserRole + 3 | Is requested before MatchQuality(..) is requested. The item on which this is requested is an argument-hint item When this role is requested, the item should be noted, and whenever MatchQuality is requested, it should be computed by matching the item given with MatchQuality into the context chosen by SetMatchContext. Feel free to ignore this, but ideally you should return QVariant::Invalid to make clear that your model does not support this. |
KTextEditor::CodeCompletionModel::HighlightingMethod | Qt::UserRole + 4 | Define which highlighting method will be used:
|
KTextEditor::CodeCompletionModel::CustomHighlight | Qt::UserRole + 5 | Allows an item to provide custom highlighting. Return a QList<QVariant> in the following format (repeat this triplet as many times as required, however each column must be >= the previous, and startColumn != endColumn):
|
KTextEditor::CodeCompletionModel::InheritanceDepth | Qt::UserRole + 6 | Returns the inheritance depth of the completion. For example, a completion which comes from the base class would have depth 0, one from a parent class would have depth 1, one from that class' parent 2, etc. you can use this to symbolize the general distance of a completion-item from a user. It will be used for sorting. |
KTextEditor::CodeCompletionModel::IsExpandable | Qt::UserRole + 7 | This allows items in the completion-list to be expandable. If a model returns an QVariant bool value that evaluates to true, the completion-widget will draw a handle to expand the item, and will also make that action accessible through keyboard. |
KTextEditor::CodeCompletionModel::ExpandingWidget | Qt::UserRole + 8 | After a model returned true for a row on IsExpandable, the row may be expanded by the user. When this happens, ExpandingWidget is requested. The model may return two types of values:
|
Constant | Value |
---|---|
KTextEditor::CodeCompletionModel::NoHighlighting | 0x0 |
KTextEditor::CodeCompletionModel::InternalHighlighting | 0x1 |
KTextEditor::CodeCompletionModel::CustomHighlighting | 0x2 |
The HighlightMethods type is a typedef for QFlags<HighlightMethod>. It stores an OR combination of HighlightMethod values.
enum CodeCompletionModel::InvocationType
Constant | Value |
---|---|
KTextEditor::CodeCompletionModel::AutomaticInvocation | 0 |
KTextEditor::CodeCompletionModel::UserInvocation | 1 |
KTextEditor::CodeCompletionModel::ManualInvocation | 2 |
Member Function Documentation
[explicit]
CodeCompletionModel::CodeCompletionModel(QObject *parent)
[override virtual]
int CodeCompletionModel::columnCount(const QModelIndex &parent = QModelIndex()) const
Reimplements: QAbstractItemModel::columnCount(const QModelIndex &parent) const.
Reimplemented from QAbstractItemModel::columnCount(). The default implementation returns ColumnCount for all indices.
[virtual]
void CodeCompletionModel::completionInvoked(KTextEditor::View *view, const KTextEditor::Range &range, KTextEditor::CodeCompletionModel::InvocationType invocationType)
This function is responsible to generating / updating the list of current completions. The default implementation does nothing.
When implementing this function, remember to call setRowCount() (or implement rowCount()), and to generate the appropriate change notifications (for instance by calling QAbstractItemModel::reset()).
view is the view to generate completions for
range is the range of text to generate completions for
invocationType describes how the code completion was triggered
[virtual]
void CodeCompletionModel::executeCompletionItem(KTextEditor::View *view, const KTextEditor::Range &word, const QModelIndex &index) const
This function is responsible for inserting a selected completion into the view. The default implementation replaces the text that the completions were based on with the Qt::DisplayRole of the Name column of the given match.
view is the view to insert the completion into
word is the Range that the completions are based on (what the user entered so far)
index identifies the completion match to insert
bool CodeCompletionModel::hasGroups() const
This function returns true if the model needs grouping, otherwise false. The default is false if not changed via setHasGroups().
[override virtual]
QModelIndex CodeCompletionModel::index(int row, int column, const QModelIndex &parent = QModelIndex()) const
Reimplements: QAbstractItemModel::index(int row, int column, const QModelIndex &parent) const.
Reimplemented from QAbstractItemModel::index(). The default implementation returns a standard QModelIndex as long as the row and column are valid.
[override virtual]
QMap<int, QVariant> CodeCompletionModel::itemData(const QModelIndex &index) const
Reimplements: QAbstractItemModel::itemData(const QModelIndex &index) const.
Reimplemented from QAbstractItemModel::itemData(). The default implementation returns a map with the QAbstractItemModel::data() for all roles that are used by the CodeCompletionInterface. You will need to reimplement either this function or QAbstractItemModel::data() in your CodeCompletionModel.
[override virtual]
QModelIndex CodeCompletionModel::parent(const QModelIndex &index) const
Reimplements: QAbstractItemModel::parent(const QModelIndex &index) const.
Reimplemented from QAbstractItemModel::parent(). The default implementation returns an invalid QModelIndex for all items. This is appropriate for non-hierarchical / flat lists of completions.
[override virtual]
int CodeCompletionModel::rowCount(const QModelIndex &parent = QModelIndex()) const
Reimplements: QAbstractItemModel::rowCount(const QModelIndex &parent) const.
Reimplemented from QAbstractItemModel::rowCount(). The default implementation returns the value set by setRowCount() for invalid (toplevel) indices, and 0 for all other indices. This is appropriate for non-hierarchical / flat lists of completions
[signal]
void CodeCompletionModel::waitForReset()
Emit this if the code-completion for this model was invoked, some time is needed in order to get the data, and the model is reset once the data is available.
This only has an effect if emitted from within completionInvoked(..).
This prevents the code-completion list from showing until this model is reset, so there is no annoying flashing in the user-interface resulting from other models supplying their data earlier.
Note: The implementation may choose to show the completion-list anyway after some timeout
Warning: If you emit this, you _must_ also reset the model at some point, else the code-completion will be completely broken to the user. Consider that there may always be additional completion-models apart from yours.