diff --git a/src/plugins/glsleditor/glslcodecompletion.cpp b/src/plugins/glsleditor/glslcodecompletion.cpp index 79e7b1548d212eca556ac365f6aeb6e710558fcd..c0ab60c58bf41f445d40ec383e43a49555b3f4d1 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; }