diff --git a/src/plugins/glsleditor/glslcodecompletion.cpp b/src/plugins/glsleditor/glslcodecompletion.cpp index 968d8d54fc118fc777e5549fbb53df2a7282a3f7..7ab46dea583476d4042c0871c7b398742ccc9505 100644 --- a/src/plugins/glsleditor/glslcodecompletion.cpp +++ b/src/plugins/glsleditor/glslcodecompletion.cpp @@ -43,6 +43,10 @@ using namespace GLSLEditor; using namespace GLSLEditor::Internal; +enum CompletionOrder { + SpecialMemberOrder = -5 +}; + static bool isIdentifierChar(QChar ch) { return ch.isLetterOrNumber() || ch == QLatin1Char('_'); @@ -326,6 +330,7 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor) const QIcon symbolIcon = iconForColor(Qt::darkCyan); QStringList members; + QStringList specialMembers; if (ch == QLatin1Char('.')) { QTextCursor tc(edit->document()); @@ -359,6 +364,16 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor) if (const GLSL::VectorType *vecTy = exprTy.type->asVectorType()) { members = vecTy->members(); + // Sort the most relevant swizzle orderings to the top. + specialMembers += QLatin1String("xy"); + specialMembers += QLatin1String("xyz"); + specialMembers += QLatin1String("xyzw"); + specialMembers += QLatin1String("rgb"); + specialMembers += QLatin1String("rgba"); + specialMembers += QLatin1String("st"); + specialMembers += QLatin1String("stp"); + specialMembers += QLatin1String("stpq"); + } else if (const GLSL::Struct *structTy = exprTy.type->asStructType()) { members = structTy->members(); @@ -391,6 +406,8 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor) TextEditor::CompletionItem item(this); item.icon = symbolIcon; item.text = s; + if (specialMembers.contains(s)) + item.order = SpecialMemberOrder; m_completions.append(item); } @@ -442,6 +459,37 @@ bool CodeCompletion::partiallyComplete(const QList<TextEditor::CompletionItem> & return ICompletionCollector::partiallyComplete(completionItems); } +bool CodeCompletion::glslCompletionItemLessThan(const TextEditor::CompletionItem &l, const TextEditor::CompletionItem &r) +{ + if (l.order != r.order) + return l.order < r.order; + return completionItemLessThan(l, r); +} + +QList<TextEditor::CompletionItem> CodeCompletion::getCompletions() +{ + QList<TextEditor::CompletionItem> completionItems; + + completions(&completionItems); + + qStableSort(completionItems.begin(), completionItems.end(), glslCompletionItemLessThan); + + // Remove duplicates + QString lastKey; + QVariant lastData; + QList<TextEditor::CompletionItem> uniquelist; + + foreach (const TextEditor::CompletionItem &item, completionItems) { + if (item.text != lastKey || item.data.type() != lastData.type()) { + uniquelist.append(item); + lastKey = item.text; + lastData = item.data; + } + } + + return uniquelist; +} + bool CodeCompletion::shouldRestartCompletion() { return m_restartCompletion; diff --git a/src/plugins/glsleditor/glslcodecompletion.h b/src/plugins/glsleditor/glslcodecompletion.h index 4e2d424ae4ced18ceb264b8d8089ed4a483013b8..11b8f02a45ae1fe18a38fbf3a44c2326811aaa08 100644 --- a/src/plugins/glsleditor/glslcodecompletion.h +++ b/src/plugins/glsleditor/glslcodecompletion.h @@ -87,6 +87,7 @@ public: */ virtual bool partiallyComplete(const QList<TextEditor::CompletionItem> &completionItems); + virtual QList<TextEditor::CompletionItem> getCompletions(); virtual bool shouldRestartCompletion(); /* Called when it's safe to clean up the completion items. @@ -99,6 +100,8 @@ private: TextEditor::ITextEditable *m_editor; int m_startPosition; bool m_restartCompletion; + + static bool glslCompletionItemLessThan(const TextEditor::CompletionItem &l, const TextEditor::CompletionItem &r); }; } // namespace Internal