OSDN Git Service

Show different icons for GLSL variable categories
authorRhys Weatherley <rhys.weatherley@nokia.com>
Wed, 1 Dec 2010 05:44:50 +0000 (15:44 +1000)
committerRhys Weatherley <rhys.weatherley@nokia.com>
Wed, 1 Dec 2010 05:44:50 +0000 (15:44 +1000)
Attributes, uniforms, varyings, and constants are shown with a
distinguished icon that is different from regular variables.

12 files changed:
src/libs/glsl/glslengine.cpp
src/libs/glsl/glslengine.h
src/libs/glsl/glslsemantic.cpp
src/libs/glsl/glslsymbols.cpp
src/libs/glsl/glslsymbols.h
src/plugins/glsleditor/glslcodecompletion.cpp
src/plugins/glsleditor/glslcodecompletion.h
src/plugins/glsleditor/glsleditor.qrc
src/plugins/glsleditor/images/attribute.png [new file with mode: 0644]
src/plugins/glsleditor/images/const.png [new file with mode: 0644]
src/plugins/glsleditor/images/uniform.png [new file with mode: 0644]
src/plugins/glsleditor/images/varying.png [new file with mode: 0644]

index 73938e9..2b6ec6e 100644 (file)
@@ -266,11 +266,12 @@ Argument *Engine::newArgument(Function *function, const QString &name, const Typ
     return a;
 }
 
-Variable *Engine::newVariable(Scope *scope, const QString &name, const Type *type)
+Variable *Engine::newVariable(Scope *scope, const QString &name, const Type *type, int qualifiers)
 {
     Variable *var = new Variable(scope);
     var->setName(name);
     var->setType(type);
+    var->setQualifiers(qualifiers);
     _symbols.append(var);
     return var;
 }
index ab73deb..2d668ba 100644 (file)
@@ -120,7 +120,7 @@ public:
     Block *newBlock(Scope *scope = 0);
     Function *newFunction(Scope *scope = 0);
     Argument *newArgument(Function *function, const QString &name, const Type *type);
-    Variable *newVariable(Scope *scope, const QString &name, const Type *type);
+    Variable *newVariable(Scope *scope, const QString &name, const Type *type, int qualifiers = 0);
 
     MemoryPool *pool();
 
index 29760e2..ac07911 100644 (file)
@@ -751,7 +751,11 @@ bool Semantic::visit(VariableDeclarationAST *ast)
     const Type *ty = type(ast->type);
     ExprResult initializer = expression(ast->initializer);
     if (ast->name) {
-        Variable *var = _engine->newVariable(_scope, *ast->name, ty);
+        QualifiedTypeAST *qtype = ast->type->asQualifiedType();
+        int qualifiers = 0;
+        if (qtype)
+            qualifiers = qtype->qualifiers;
+        Variable *var = _engine->newVariable(_scope, *ast->name, ty, qualifiers);
         _scope->add(var);
     }
     return false;
index e4ede5f..2160862 100644 (file)
@@ -78,6 +78,7 @@ Symbol *Block::find(const QString &name) const
 Variable::Variable(Scope *scope)
     : Symbol(scope)
     , _type(0)
+    , _qualifiers(0)
 {
 }
 
index 6506c62..bf610dd 100644 (file)
@@ -59,10 +59,14 @@ public:
     virtual const Type *type() const;
     void setType(const Type *type);
 
+    int qualifiers() const { return _qualifiers; }
+    void setQualifiers(int qualifiers) { _qualifiers = qualifiers; }
+
     virtual Variable *asVariable() { return this; }
 
 private:
     const Type *_type;
+    int _qualifiers;
 };
 
 class GLSL_EXPORT Block: public Scope
index ff89180..042f4c8 100644 (file)
@@ -492,6 +492,10 @@ CodeCompletion::CodeCompletion(QObject *parent)
       m_varIcon(":/glsleditor/images/var.png"),
       m_functionIcon(":/glsleditor/images/func.png"),
       m_typeIcon(":/glsleditor/images/type.png"),
+      m_constIcon(":/glsleditor/images/const.png"),
+      m_attributeIcon(":/glsleditor/images/attribute.png"),
+      m_uniformIcon(":/glsleditor/images/uniform.png"),
+      m_varyingIcon(":/glsleditor/images/varying.png"),
       m_otherIcon(":/glsleditor/images/other.png")
 {
     const QIcon keywordIcon(QLatin1String(":/glsleditor/images/keyword.png"));
@@ -678,14 +682,28 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
 
     foreach (GLSL::Symbol *s, members) {
         TextEditor::CompletionItem item(this);
-        if (s->asVariable() || s->asArgument())
+        GLSL::Variable *var = s->asVariable();
+        if (var) {
+            int storageType = var->qualifiers() & GLSL::QualifiedTypeAST::StorageMask;
+            if (storageType == GLSL::QualifiedTypeAST::Attribute)
+                item.icon = m_attributeIcon;
+            else if (storageType == GLSL::QualifiedTypeAST::Uniform)
+                item.icon = m_uniformIcon;
+            else if (storageType == GLSL::QualifiedTypeAST::Varying)
+                item.icon = m_varyingIcon;
+            else if (storageType == GLSL::QualifiedTypeAST::Const)
+                item.icon = m_constIcon;
+            else
+                item.icon = m_varIcon;
+        } else if (s->asArgument()) {
             item.icon = m_varIcon;
-        else if (s->asFunction() || s->asOverloadSet())
+        } else if (s->asFunction() || s->asOverloadSet()) {
             item.icon = m_functionIcon;
-        else if (s->asStruct())
+        } else if (s->asStruct()) {
             item.icon = m_typeIcon;
-        else
+        } else {
             item.icon = m_otherIcon;
+        }
         item.text = s->name();
         if (specialMembers.contains(item.text))
             item.order = SpecialMemberOrder;
index f8110bc..7eb3796 100644 (file)
@@ -110,6 +110,10 @@ private:
     QIcon m_varIcon;
     QIcon m_functionIcon;
     QIcon m_typeIcon;
+    QIcon m_constIcon;
+    QIcon m_attributeIcon;
+    QIcon m_uniformIcon;
+    QIcon m_varyingIcon;
     QIcon m_otherIcon;
 };
 
index 4003791..3455048 100644 (file)
@@ -6,6 +6,10 @@
         <file>images/var.png</file>
         <file>images/func.png</file>
         <file>images/type.png</file>
+        <file>images/const.png</file>
+        <file>images/attribute.png</file>
+        <file>images/uniform.png</file>
+        <file>images/varying.png</file>
         <file>images/other.png</file>
     </qresource>
 </RCC>
diff --git a/src/plugins/glsleditor/images/attribute.png b/src/plugins/glsleditor/images/attribute.png
new file mode 100644 (file)
index 0000000..94f20ac
Binary files /dev/null and b/src/plugins/glsleditor/images/attribute.png differ
diff --git a/src/plugins/glsleditor/images/const.png b/src/plugins/glsleditor/images/const.png
new file mode 100644 (file)
index 0000000..25fc49c
Binary files /dev/null and b/src/plugins/glsleditor/images/const.png differ
diff --git a/src/plugins/glsleditor/images/uniform.png b/src/plugins/glsleditor/images/uniform.png
new file mode 100644 (file)
index 0000000..c6452fc
Binary files /dev/null and b/src/plugins/glsleditor/images/uniform.png differ
diff --git a/src/plugins/glsleditor/images/varying.png b/src/plugins/glsleditor/images/varying.png
new file mode 100644 (file)
index 0000000..c2551c0
Binary files /dev/null and b/src/plugins/glsleditor/images/varying.png differ