diff --git a/src/libs/glsl/glslsymbol.cpp b/src/libs/glsl/glslsymbol.cpp index 96300eb76defdacd62da9231d746e14cf2dec369..903ff2bb63f3c3c3dcfb922b1ccbbcbb7b2eae6e 100644 --- a/src/libs/glsl/glslsymbol.cpp +++ b/src/libs/glsl/glslsymbol.cpp @@ -76,7 +76,7 @@ Symbol *Scope::lookup(const QString &name) const return 0; } -QStringList Scope::members() const +QList<Symbol *> Scope::members() const { - return QStringList(); + return QList<Symbol *>(); } diff --git a/src/libs/glsl/glslsymbol.h b/src/libs/glsl/glslsymbol.h index 1f7ce9dfcff937d7c94c0f290110e0dd17fd1e79..6782afb58432df509adcd6681b3933b496d50dd1 100644 --- a/src/libs/glsl/glslsymbol.h +++ b/src/libs/glsl/glslsymbol.h @@ -73,7 +73,7 @@ public: Symbol *lookup(const QString &name) const; - virtual QStringList members() const; + virtual QList<Symbol *> members() const; virtual void add(Symbol *symbol) = 0; virtual Symbol *find(const QString &name) const = 0; diff --git a/src/libs/glsl/glslsymbols.cpp b/src/libs/glsl/glslsymbols.cpp index d1b4d623194b092c5fcd3ec28b23f0404a6d1adb..e4ede5f6c5ed5b80ce622d9cd6910b081c1a30d4 100644 --- a/src/libs/glsl/glslsymbols.cpp +++ b/src/libs/glsl/glslsymbols.cpp @@ -54,9 +54,9 @@ Block::Block(Scope *enclosingScope) { } -QStringList Block::members() const +QList<Symbol *> Block::members() const { - return _members.keys(); + return _members.values(); } void Block::add(Symbol *symbol) @@ -100,9 +100,9 @@ Namespace::~Namespace() qDeleteAll(_overloadSets); } -QStringList Namespace::members() const +QList<Symbol *> Namespace::members() const { - return _members.keys(); + return _members.values(); } void Namespace::add(Symbol *symbol) @@ -116,6 +116,7 @@ void Namespace::add(Symbol *symbol) } else if (Function *firstFunction = sym->asFunction()) { OverloadSet *o = new OverloadSet(this); _overloadSets.append(o); + o->setName(symbol->name()); o->addFunction(firstFunction); o->addFunction(fun); sym = o; diff --git a/src/libs/glsl/glslsymbols.h b/src/libs/glsl/glslsymbols.h index 2c35a123fa8064ab435c949c858a8bb36156b97f..6506c62fa7dbe1e7c5a7f4a62bbfa8bf3688decb 100644 --- a/src/libs/glsl/glslsymbols.h +++ b/src/libs/glsl/glslsymbols.h @@ -70,7 +70,7 @@ class GLSL_EXPORT Block: public Scope public: Block(Scope *enclosingScope = 0); - virtual QStringList members() const; + virtual QList<Symbol *> members() const; virtual void add(Symbol *symbol); virtual Block *asBlock() { return this; } @@ -92,7 +92,7 @@ public: virtual Namespace *asNamespace() { return this; } - virtual QStringList members() const; + virtual QList<Symbol *> members() const; virtual const Type *type() const; virtual Symbol *find(const QString &name) const; diff --git a/src/libs/glsl/glsltypes.cpp b/src/libs/glsl/glsltypes.cpp index c4f9e577c34456c02cec955c763fa8fde8fa31e1..fe66540e6286dd5a8da61381ffd235f35c4683d5 100644 --- a/src/libs/glsl/glsltypes.cpp +++ b/src/libs/glsl/glsltypes.cpp @@ -331,12 +331,12 @@ bool ArrayType::isLessThan(const Type *other) const return elementType() < array->elementType(); } -QStringList Struct::members() const +QList<Symbol *> Struct::members() const { - QStringList m; + QList<Symbol *> m; foreach (Symbol *s, _members) { if (! s->name().isEmpty()) - m.append(s->name()); + m.append(s); } return m; } @@ -438,12 +438,12 @@ bool Function::isLessThan(const Type *other) const return false; } -QStringList Function::members() const +QList<Symbol *> Function::members() const { - QStringList m; + QList<Symbol *> m; foreach (Argument *arg, _arguments) { if (! arg->name().isEmpty()) - m.append(arg->name()); + m.append(arg); } return m; } diff --git a/src/libs/glsl/glsltypes.h b/src/libs/glsl/glsltypes.h index fd0b934a748ea7c8dcfc179c3c0bedb75672ab4d..f96171e905fd3f1f7768afcdff7764bb0792e0ac 100644 --- a/src/libs/glsl/glsltypes.h +++ b/src/libs/glsl/glsltypes.h @@ -131,7 +131,7 @@ public: const Type *elementType() const { return indexElementType(); } int dimension() const { return _dimension; } - QStringList members() const { return _members.keys(); } + QList<Symbol *> members() const { return _members.values(); } virtual void add(Symbol *symbol); virtual Symbol *find(const QString &name) const; @@ -193,7 +193,7 @@ public: Struct(Scope *scope = 0) : Scope(scope) {} - QStringList members() const; + QList<Symbol *> members() const; virtual void add(Symbol *member); virtual Symbol *find(const QString &name) const; @@ -238,7 +238,7 @@ public: virtual Symbol *find(const QString &name) const; - virtual QStringList members() const; + virtual QList<Symbol *> members() const; virtual void add(Symbol *symbol) { if (! symbol) return; diff --git a/src/plugins/glsleditor/glslcodecompletion.cpp b/src/plugins/glsleditor/glslcodecompletion.cpp index 9ae1505918636cfe7076cd183174f100588c4de3..ff891802759e9ac48802bd68e37e66cb579a4ffc 100644 --- a/src/plugins/glsleditor/glslcodecompletion.cpp +++ b/src/plugins/glsleditor/glslcodecompletion.cpp @@ -95,37 +95,6 @@ static bool checkStartOfIdentifier(const QString &word) return false; } -// Temporary workaround until we have proper icons for QML completion items -static QIcon iconForColor(const QColor &color) -{ - QPixmap pix(6, 6); - - int pixSize = 20; - QBrush br(color); - - QPixmap pm(2 * pixSize, 2 * pixSize); - QPainter pmp(&pm); - pmp.fillRect(0, 0, pixSize, pixSize, Qt::lightGray); - pmp.fillRect(pixSize, pixSize, pixSize, pixSize, Qt::lightGray); - pmp.fillRect(0, pixSize, pixSize, pixSize, Qt::darkGray); - pmp.fillRect(pixSize, 0, pixSize, pixSize, Qt::darkGray); - pmp.fillRect(0, 0, 2 * pixSize, 2 * pixSize, color); - br = QBrush(pm); - - QPainter p(&pix); - int corr = 1; - QRect r = pix.rect().adjusted(corr, corr, -corr, -corr); - p.setBrushOrigin((r.width() % pixSize + pixSize) / 2 + corr, (r.height() % pixSize + pixSize) / 2 + corr); - p.fillRect(r, br); - - p.fillRect(r.width() / 4 + corr, r.height() / 4 + corr, - r.width() / 2, r.height() / 2, - QColor(color.rgb())); - p.drawRect(pix.rect().adjusted(0, 0, -1, -1)); - - return pix; -} - static const char *glsl_keywords[] = { // ### TODO: get the keywords from the lexer "attribute", @@ -519,9 +488,13 @@ CodeCompletion::CodeCompletion(QObject *parent) : ICompletionCollector(parent), m_editor(0), m_startPosition(-1), - m_restartCompletion(false) + m_restartCompletion(false), + m_varIcon(":/glsleditor/images/var.png"), + m_functionIcon(":/glsleditor/images/func.png"), + m_typeIcon(":/glsleditor/images/type.png"), + m_otherIcon(":/glsleditor/images/other.png") { - const QIcon keywordIcon = iconForColor(Qt::darkYellow); + const QIcon keywordIcon(QLatin1String(":/glsleditor/images/keyword.png")); for (const char **it = glsl_keywords; *it; ++it) { TextEditor::CompletionItem item(this); item.text = QString::fromLatin1(*it); @@ -599,9 +572,7 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor) CPlusPlus::ExpressionUnderCursor expressionUnderCursor; GLSLTextEditor *edit = qobject_cast<GLSLTextEditor *>(editor->widget()); - const QIcon symbolIcon = iconForColor(Qt::darkCyan); - - QStringList members; + QList<GLSL::Symbol *> members; QStringList specialMembers; bool functionCall = (ch == QLatin1Char('(') && pos == editor->position() - 1); @@ -705,11 +676,18 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor) m_completions += m_keywordCompletions; } - foreach (const QString &s, members) { + foreach (GLSL::Symbol *s, members) { TextEditor::CompletionItem item(this); - item.icon = symbolIcon; - item.text = s; - if (specialMembers.contains(s)) + if (s->asVariable() || s->asArgument()) + item.icon = m_varIcon; + else if (s->asFunction() || s->asOverloadSet()) + item.icon = m_functionIcon; + else if (s->asStruct()) + item.icon = m_typeIcon; + else + item.icon = m_otherIcon; + item.text = s->name(); + if (specialMembers.contains(item.text)) item.order = SpecialMemberOrder; m_completions.append(item); } diff --git a/src/plugins/glsleditor/glslcodecompletion.h b/src/plugins/glsleditor/glslcodecompletion.h index d3b110f13111b014bf72bfd30c70b26f48d58c0d..f8110bcffcb012e36917f11d95fac86845571f51 100644 --- a/src/plugins/glsleditor/glslcodecompletion.h +++ b/src/plugins/glsleditor/glslcodecompletion.h @@ -106,6 +106,11 @@ private: QPointer<FunctionArgumentWidget> m_functionArgumentWidget; static bool glslCompletionItemLessThan(const TextEditor::CompletionItem &l, const TextEditor::CompletionItem &r); + + QIcon m_varIcon; + QIcon m_functionIcon; + QIcon m_typeIcon; + QIcon m_otherIcon; }; } // namespace Internal diff --git a/src/plugins/glsleditor/glsleditor.qrc b/src/plugins/glsleditor/glsleditor.qrc index cb1c737c9a1602fc40b70e4f5267b8275765b559..40037911254e812a5e89ff5b169510845e133755 100644 --- a/src/plugins/glsleditor/glsleditor.qrc +++ b/src/plugins/glsleditor/glsleditor.qrc @@ -2,5 +2,10 @@ <qresource prefix="/glsleditor"> <file>GLSLEditor.mimetypes.xml</file> <file>images/glslfile.png</file> + <file>images/keyword.png</file> + <file>images/var.png</file> + <file>images/func.png</file> + <file>images/type.png</file> + <file>images/other.png</file> </qresource> </RCC> diff --git a/src/plugins/glsleditor/images/func.png b/src/plugins/glsleditor/images/func.png new file mode 100644 index 0000000000000000000000000000000000000000..e515e76e61f64cd285a4c67aaf1feaca38e84f8b Binary files /dev/null and b/src/plugins/glsleditor/images/func.png differ diff --git a/src/plugins/glsleditor/images/keyword.png b/src/plugins/glsleditor/images/keyword.png new file mode 100644 index 0000000000000000000000000000000000000000..e5a51858d9ed96ab65bf6544891cb48730607fa4 Binary files /dev/null and b/src/plugins/glsleditor/images/keyword.png differ diff --git a/src/plugins/glsleditor/images/other.png b/src/plugins/glsleditor/images/other.png new file mode 100644 index 0000000000000000000000000000000000000000..18d2941572e8a62e65954c4900aa9b1bdf21766f Binary files /dev/null and b/src/plugins/glsleditor/images/other.png differ diff --git a/src/plugins/glsleditor/images/type.png b/src/plugins/glsleditor/images/type.png new file mode 100644 index 0000000000000000000000000000000000000000..88432d2cb10c43de91fdb7ec7989285090747b0a Binary files /dev/null and b/src/plugins/glsleditor/images/type.png differ diff --git a/src/plugins/glsleditor/images/var.png b/src/plugins/glsleditor/images/var.png new file mode 100644 index 0000000000000000000000000000000000000000..089cfb45e5fc0f9629c508538ffc5886f79f84c1 Binary files /dev/null and b/src/plugins/glsleditor/images/var.png differ