summaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-11-19 16:19:36 +0100
committerRoberto Raggi <roberto.raggi@nokia.com>2010-11-19 16:20:03 +0100
commit4ce1f056b6d49df96ad5c00fb393158574ad4c6d (patch)
treeb79c07009fedcafc89497a9f63f83b7e01fe299e /src/plugins
parent1b9b962b2c580d72e5ad42672dcad609bc5c9e96 (diff)
downloadqt-creator-4ce1f056b6d49df96ad5c00fb393158574ad4c6d.tar.gz
Added support for automatic completion.
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/glsleditor/glslcodecompletion.cpp73
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;
}