Added support for automatic completion.

This commit is contained in:
Roberto Raggi
2010-11-19 16:19:36 +01:00
parent 1b9b962b2c
commit 4ce1f056b6

View File

@@ -28,12 +28,53 @@
**************************************************************************/ **************************************************************************/
#include "glslcodecompletion.h" #include "glslcodecompletion.h"
#include "glsleditor.h" #include "glsleditor.h"
#include <texteditor/completionsettings.h>
#include <QtGui/QIcon> #include <QtGui/QIcon>
#include <QtGui/QPainter> #include <QtGui/QPainter>
#include <QtCore/QDebug> #include <QtCore/QDebug>
using namespace GLSLEditor; 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 // Temporary workaround until we have proper icons for QML completion items
static QIcon iconForColor(const QColor &color) static QIcon iconForColor(const QColor &color)
{ {
@@ -229,7 +270,37 @@ bool CodeCompletion::supportsEditor(TextEditor::ITextEditable *editor)
bool CodeCompletion::triggersCompletion(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; return false;
} }