diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2010-11-19 16:19:36 +0100 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2010-11-19 16:20:03 +0100 |
commit | 4ce1f056b6d49df96ad5c00fb393158574ad4c6d (patch) | |
tree | b79c07009fedcafc89497a9f63f83b7e01fe299e /src/plugins | |
parent | 1b9b962b2c580d72e5ad42672dcad609bc5c9e96 (diff) | |
download | qt-creator-4ce1f056b6d49df96ad5c00fb393158574ad4c6d.tar.gz |
Added support for automatic completion.
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/glsleditor/glslcodecompletion.cpp | 73 |
1 files changed, 72 insertions, 1 deletions
diff --git a/src/plugins/glsleditor/glslcodecompletion.cpp b/src/plugins/glsleditor/glslcodecompletion.cpp index 79e7b1548d..c0ab60c58b 100644 --- a/src/plugins/glsleditor/glslcodecompletion.cpp +++ b/src/plugins/glsleditor/glslcodecompletion.cpp @@ -28,12 +28,53 @@ **************************************************************************/ #include "glslcodecompletion.h" #include "glsleditor.h" +#include <texteditor/completionsettings.h> #include <QtGui/QIcon> #include <QtGui/QPainter> #include <QtCore/QDebug> using namespace GLSLEditor; +static bool isIdentifierChar(QChar ch) +{ + return ch.isLetterOrNumber() || ch == QLatin1Char('_'); +} + +static bool isDelimiter(QChar ch) +{ + switch (ch.unicode()) { + case '{': + case '}': + case '[': + case ']': + case ')': + case '?': + case '!': + case ':': + case ';': + case ',': + case '+': + case '-': + case '*': + case '/': + return true; + + default: + return false; + } +} + +static bool checkStartOfIdentifier(const QString &word) +{ + if (! word.isEmpty()) { + const QChar ch = word.at(0); + if (ch.isLetter() || ch == QLatin1Char('_')) + return true; + } + + return false; +} + // Temporary workaround until we have proper icons for QML completion items static QIcon iconForColor(const QColor &color) { @@ -229,7 +270,37 @@ bool CodeCompletion::supportsEditor(TextEditor::ITextEditable *editor) bool CodeCompletion::triggersCompletion(TextEditor::ITextEditable *editor) { - Q_UNUSED(editor); + const int cursorPosition = editor->position(); + const QChar ch = editor->characterAt(cursorPosition - 1); + + if (completionSettings().m_completionTrigger == TextEditor::AutomaticCompletion) { + const QChar characterUnderCursor = editor->characterAt(cursorPosition); + + if (isIdentifierChar(ch) && (characterUnderCursor.isSpace() || + characterUnderCursor.isNull() || + isDelimiter(characterUnderCursor))) { + int pos = editor->position() - 1; + for (; pos != -1; --pos) { + if (! isIdentifierChar(editor->characterAt(pos))) + break; + } + ++pos; + + const QString word = editor->textAt(pos, cursorPosition - pos); + if (word.length() > 2 && checkStartOfIdentifier(word)) { + for (int i = 0; i < word.length(); ++i) { + if (! isIdentifierChar(word.at(i))) + return false; + } + return true; + } + } + } + + // if (ch == QLatin1Char('(') || ch == QLatin1Char('.') || ch == QLatin1Char('/')) + // return true; + + return false; } |