From ecf4baec663e5c2368056a6a79efa7078719026c Mon Sep 17 00:00:00 2001
From: Rhys Weatherley <rhys.weatherley@nokia.com>
Date: Wed, 1 Dec 2010 14:00:30 +1000
Subject: [PATCH] Better icons for the GLSL code completer

---
 src/libs/glsl/glslsymbol.cpp                  |   4 +-
 src/libs/glsl/glslsymbol.h                    |   2 +-
 src/libs/glsl/glslsymbols.cpp                 |   9 +--
 src/libs/glsl/glslsymbols.h                   |   4 +-
 src/libs/glsl/glsltypes.cpp                   |  12 ++--
 src/libs/glsl/glsltypes.h                     |   6 +-
 src/plugins/glsleditor/glslcodecompletion.cpp |  58 ++++++------------
 src/plugins/glsleditor/glslcodecompletion.h   |   5 ++
 src/plugins/glsleditor/glsleditor.qrc         |   5 ++
 src/plugins/glsleditor/images/func.png        | Bin 0 -> 583 bytes
 src/plugins/glsleditor/images/keyword.png     | Bin 0 -> 341 bytes
 src/plugins/glsleditor/images/other.png       | Bin 0 -> 377 bytes
 src/plugins/glsleditor/images/type.png        | Bin 0 -> 573 bytes
 src/plugins/glsleditor/images/var.png         | Bin 0 -> 530 bytes
 14 files changed, 47 insertions(+), 58 deletions(-)
 create mode 100644 src/plugins/glsleditor/images/func.png
 create mode 100644 src/plugins/glsleditor/images/keyword.png
 create mode 100644 src/plugins/glsleditor/images/other.png
 create mode 100644 src/plugins/glsleditor/images/type.png
 create mode 100644 src/plugins/glsleditor/images/var.png

diff --git a/src/libs/glsl/glslsymbol.cpp b/src/libs/glsl/glslsymbol.cpp
index 96300eb76de..903ff2bb63f 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 1f7ce9dfcff..6782afb5843 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 d1b4d623194..e4ede5f6c5e 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 2c35a123fa8..6506c62fa7d 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 c4f9e577c34..fe66540e628 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 fd0b934a748..f96171e905f 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 9ae15059186..ff891802759 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 d3b110f1311..f8110bcffcb 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 cb1c737c9a1..40037911254 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
GIT binary patch
literal 583
zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7BuiW)N`mv#O3D+9QW+dm
z@{>{(JaZG%Q-e|yQz{EjrrIztFuwG3aSW-rwPf;ne_=<F<M+4R_DW6?_KZ2iD7;z1
z(?)`m)A2)!l5K~ah^@kr?s_)%M+dFz8O-zKd^!|oNiaWbDVoH*fo*l}cAYJ6%AUL5
ze*5l6S?ks-)8uBPnC;&D{`22+v%j}_Xg*YO=9K&FVy(aIdyv-GyWjs#iC%s8NWO7I
z%!H~R#@CK2w7fsRHz0n0?PNcd$-8%yt+iCR#yf9D^*TQLa{{VYna`)iEuHG}sE32|
z+yY;&`iGG%%Z*(AXf?gw6;S?qLi~TW`C<2N$1N6ICj9z|jh*${dvmKiDy}s|ZRPqF
zCswptI^gDiUgzsuOLXL}FLwUJU)T9zv8U5ln+x)m8u_meXqk1aI&jjFgYUs<i(}ul
z*M6{Vd7mOT;nH#64Q1aNgSq~&aIwr-FhTd(PW`6}MyyLE<z`o|x+f>8*t(SefQ)*P
zb?LGu$8#o55~m|Nf;^OLtp2*l?ken-c)zdVfewq)a{<0Nk|KS4O3#gZpH%mrW)A;-
z;^6c32Uvek&;D9+Tc+oe;&k1DE9||yR_p5PS*5OK=?PwN=b-1uxs0h>l<(Z}P`efy
zefw5HU#_;uL&hE_*VR`9^WM5#{%n)``*~mR!X3;uxtF({YrXxo@#W%<!kQJ{Yl_Wx
q%w?E!XPY+1_wwfEkM0eO42JdQ+?;~k(-;^S7(8A5T-G@yGywqqWCMr*

literal 0
HcmV?d00001

diff --git a/src/plugins/glsleditor/images/keyword.png b/src/plugins/glsleditor/images/keyword.png
new file mode 100644
index 0000000000000000000000000000000000000000..e5a51858d9ed96ab65bf6544891cb48730607fa4
GIT binary patch
literal 341
zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7Sc;uILpV4%IBGajIv5xj
zI14-?iy0VruY)k7lg8`{1_lPn64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xh
zq!<_&E_u2*hFJ8zy==JZumKO-gZ=*ber)L{(l}U*(lYrb>e)@wpDMRVyg(t+=|IKD
z3DYBA=*n`P6L=A(bwOzjzvqMQjt6spRIdJQ+;D&KBEx0jUXf{ed%iC&KDX|5l|8FO
z@~>^V>}ySDNPf17XXL4zcYj;1_XL&zugJBgyVfxqGc!1GXmlN7@@RO%cIJ+O@eE0q
zFSE|B6y5XvadD1-;Ivf79>L%H`j<02pTla<BH-ZCVVE>atwrFCAcLT%(dkY5R;_Z6
qy<VRhX~*!z{k;pz^!M=x>~ActNay&yX(9sy1B0ilpUXO@geCxM7=F+I

literal 0
HcmV?d00001

diff --git a/src/plugins/glsleditor/images/other.png b/src/plugins/glsleditor/images/other.png
new file mode 100644
index 0000000000000000000000000000000000000000..18d2941572e8a62e65954c4900aa9b1bdf21766f
GIT binary patch
literal 377
zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7BuiW)N`mv#O3D+9QW+dm
z@{>{(JaZG%Q-e|yQz{EjrrIztFiLy6IEGZ*Ix_iuR*QkavB$4s1;Qh%qW#5+J}}mB
z-cOJ}vigVEZ;xoPssdFx7ftW?UG<wKrB#<KvCUb?EPwLPiJp_@D+0YP8gF#=Z&Q4#
z@8iDA_Og2L!JTKaLYtE(sXX8J-Zu8Sr_6Enh8)}NxvwSL950#J{=JgGfAq4+!bAz1
zf1xZ#56oJ2bH*yhrsmH!`caEtTe)yJrbhnDdNeooGn?-X;k*gWpKR*2yO?G!t9+Ql
z?JM=TQTo}Z=0%-KzXNO&)$e%SJN-uc0bA1{jjnr!$4qz*Yd=|_z_G6HalrlW;oGj(
z%yycVy8f}nqFw7gzN!cfjYvDCx#6R36Vt@TjY`3O2RE(Z7P+x)uT@=nY<c2_e?LXG
g)c=>3XX0TnT)4fydl%Dv1_lNOPgg&ebxsLQ0H~IsW&i*H

literal 0
HcmV?d00001

diff --git a/src/plugins/glsleditor/images/type.png b/src/plugins/glsleditor/images/type.png
new file mode 100644
index 0000000000000000000000000000000000000000..88432d2cb10c43de91fdb7ec7989285090747b0a
GIT binary patch
literal 573
zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7BuiW)N`mv#O3D+9QW+dm
z@{>{(JaZG%Q-e|yQz{EjrrIztFy8lcaSW-rHD&U7Z)r!7<NNbtKQ8*Z?c)>A7c1La
z{;|7iR0MxnBB1-_-NG+Rn%d*M_`hbX5?}g{q1WDV;;+^0j)n^ymn@CY`k`znSZ2PF
z<#AvBvAYx2*mv;D8SnmVXMF$rJswWQfSmWYPCR&c=kFTnSt6b`sYT4^cSj{|uztCD
zzEbHfy(cmMwEI5perEsk^8vNc>w6l?_O{-e#~-rfnd9a6hqs<sCZ0IY|B#WcKx0Mh
z;}99i+uppYnpxi;Twyva%rpCklx5OPjvo&TN+#SZYnf{Gm+xM{CgYWrthc8f{a}CO
z|30UGZvHJ!iXl%~rFNz~%xF2Y)b`0D_9FjF9ljRkCt?h0%=k_liJlR=aqs5z<qBfm
zfysBo<{IBW5!a>sxmG-TrmX1VLRDt@-S;0n$p|^fJTZA|z#Y43>k17uZ1?uQiQv)x
zHm&QWc>N@m=!e%7A0C^2KquaVHSb@m1m|j*J>4qWy6)=}{_)zV#?OkA4iBBWJWl+>
z71fDyJZ!Dz?!~(gzB?oLPwaht4wvQiz&20OpIm%v>pOS)*G8D<u1PJ{V*a$h^>|N|
zl}uaa;eCe=9aXL4<vm?4aN%@I=<ey0r$_vquYDjXOXa5wD;u}p4*h_Gs<9g3osX8g
gan0Q&n!s>~&vMP;?~fH37#J8lUHx3vIVCg!04d1;cmMzZ

literal 0
HcmV?d00001

diff --git a/src/plugins/glsleditor/images/var.png b/src/plugins/glsleditor/images/var.png
new file mode 100644
index 0000000000000000000000000000000000000000..089cfb45e5fc0f9629c508538ffc5886f79f84c1
GIT binary patch
literal 530
zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7BuiW)N`mv#O3D+9QW+dm
z@{>{(JaZG%Q-e|yQz{EjrrIztFmCa5aSW-rwdC?yeP%}yh7a4f#%9jSn3C~G<LRM5
zrzQ=lLdA<}bLJd5%jqu2URYEp68=}*;`gdoD+L87D!HhvI{NNL|IN8&d)Gy|?pBHW
zWOVcH&%Hlmrf1IjF#ic-bGKikvq^>Ryvt4t9|UUV9)9lg(_P%6y;WRoapT#oq4NW@
zV;<~YwqH!+p+|y_%%c_24KEJu@fX-9R`|Egy`61`NMM5`+ZWSo&J}4=-8<eY>7~m!
z=`dd{wWzFWTYFmCVlu~%_V!wv^UJ&E{#;dIa71>$fQ2Zhiu`7UQ$`Z2*mkvfYCd7i
z+E8yC&)LuOrC7S0f5M@_&P56#x)}*slUN?To0nvCt?Su5{o|j7A2*)6Czto`4;RNG
z{~z~WS=1K(KXB}uP*;VSkyOUZcaNs&uXEhIY*m!<E#0J-2LD)ZvqsFT{44wRPSr25
zE&L0nMRj>{>^UZEzoC{Z#Js87Tf61SCI`_wrFRUvvX^Tu(+E5I^!N-z9_0$*Zb8%U
zDT#Lv37zOn3H|d|E<sSN=FUCESwEOW%A@_P9(#RPI4r@f)$X2|Hp_IvdFw}BtP8$u
jzp9w`k5~M$Zv!KP_b>mlc+-iX*k|x`^>bP0l+XkK26N@*

literal 0
HcmV?d00001

-- 
GitLab