From 745d16b47d2cae2bb5596fda8094f18e0c4dfe41 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Tue, 10 Aug 2010 16:33:23 +0200 Subject: QmlOutline: Add support UiArrayBinding, UiObjectBinding --- src/plugins/qmljseditor/qmloutlinemodel.cpp | 101 +++++++++++++++++++++++++--- 1 file changed, 93 insertions(+), 8 deletions(-) (limited to 'src/plugins/qmljseditor/qmloutlinemodel.cpp') diff --git a/src/plugins/qmljseditor/qmloutlinemodel.cpp b/src/plugins/qmljseditor/qmloutlinemodel.cpp index ea1eed01fb..441fd99c7e 100644 --- a/src/plugins/qmljseditor/qmloutlinemodel.cpp +++ b/src/plugins/qmljseditor/qmloutlinemodel.cpp @@ -211,6 +211,31 @@ private: m_model->leaveObjectDefiniton(); } + bool visit(AST::UiObjectBinding *objBinding) + { + QModelIndex index = m_model->enterObjectBinding(objBinding); + m_nodeToIndex.insert(objBinding, index); + return true; + } + + void endVisit(AST::UiObjectBinding * /*objBinding*/) + { + m_model->leaveObjectBinding(); + } + + bool visit(AST::UiArrayBinding *arrayBinding) + { + QModelIndex index = m_model->enterArrayBinding(arrayBinding); + m_nodeToIndex.insert(arrayBinding, index); + + return true; + } + + void endVisit(AST::UiArrayBinding * /*arrayBinding*/) + { + m_model->leaveArrayBinding(); + } + bool visit(AST::UiScriptBinding *scriptBinding) { QModelIndex index = m_model->enterScriptBinding(scriptBinding); @@ -373,9 +398,9 @@ QModelIndex QmlOutlineModel::enterObjectDefinition(AST::UiObjectDefinition *objD if (typeName.at(0).isUpper()) { prototype.setText(typeName); - prototype.setAnnotation(getAnnotation(objDef)); + prototype.setAnnotation(getAnnotation(objDef->initializer)); if (!m_typeToIcon.contains(typeName)) { - m_typeToIcon.insert(typeName, getIcon(objDef)); + m_typeToIcon.insert(typeName, getIcon(objDef->qualifiedTypeNameId)); } prototype.setIcon(m_typeToIcon.value(typeName)); prototype.setData(ElementType, ItemTypeRole); @@ -397,6 +422,65 @@ void QmlOutlineModel::leaveObjectDefiniton() leaveNode(); } +QModelIndex QmlOutlineModel::enterObjectBinding(AST::UiObjectBinding *objBinding) +{ + QmlOutlineItem bindingPrototype(this); + + bindingPrototype.setText(asString(objBinding->qualifiedId)); + bindingPrototype.setIcon(m_icons->scriptBindingIcon()); + bindingPrototype.setData(PropertyType, ItemTypeRole); + bindingPrototype.setNode(objBinding); + bindingPrototype.setSourceLocation(getLocation(objBinding)); + bindingPrototype.setIdNode(objBinding->qualifiedId); + + enterNode(bindingPrototype); + + QmlOutlineItem objectPrototype(this); + + const QString typeName = asString(objBinding->qualifiedTypeNameId); + objectPrototype.setText(typeName); + objectPrototype.setAnnotation(getAnnotation(objBinding->initializer)); + if (!m_typeToIcon.contains(typeName)) { + m_typeToIcon.insert(typeName, getIcon(objBinding->qualifiedTypeNameId)); + } + objectPrototype.setIcon(m_typeToIcon.value(typeName)); + objectPrototype.setData(ElementType, ItemTypeRole); + objectPrototype.setIdNode(objBinding->qualifiedTypeNameId); + objectPrototype.setNode(objBinding); + objectPrototype.setSourceLocation(getLocation(objBinding)); + + enterNode(objectPrototype); + + return bindingPrototype.index(); +} + +void QmlOutlineModel::leaveObjectBinding() +{ + leaveNode(); + leaveNode(); +} + +QModelIndex QmlOutlineModel::enterArrayBinding(AST::UiArrayBinding *arrayBinding) +{ + QmlOutlineItem bindingPrototype(this); + + bindingPrototype.setText(asString(arrayBinding->qualifiedId)); + bindingPrototype.setIcon(m_icons->scriptBindingIcon()); + bindingPrototype.setData(PropertyType, ItemTypeRole); + bindingPrototype.setNode(arrayBinding); + bindingPrototype.setSourceLocation(getLocation(arrayBinding)); + bindingPrototype.setIdNode(arrayBinding->qualifiedId); + + enterNode(bindingPrototype); + + return bindingPrototype.index(); +} + +void QmlOutlineModel::leaveArrayBinding() +{ + leaveNode(); +} + QModelIndex QmlOutlineModel::enterScriptBinding(AST::UiScriptBinding *scriptBinding) { QmlOutlineItem prototype(this); @@ -666,8 +750,8 @@ AST::SourceLocation QmlOutlineModel::getLocation(AST::UiObjectMember *objMember) return location; } -QIcon QmlOutlineModel::getIcon(AST::UiObjectDefinition *objDef) { - const QmlJS::Interpreter::Value *value = m_context->evaluate(objDef->qualifiedTypeNameId); +QIcon QmlOutlineModel::getIcon(AST::UiQualifiedId *qualifiedId) { + const QmlJS::Interpreter::Value *value = m_context->evaluate(qualifiedId); if (const Interpreter::ObjectValue *objectValue = value->asObjectValue()) { do { @@ -689,8 +773,8 @@ QIcon QmlOutlineModel::getIcon(AST::UiObjectDefinition *objDef) { return QIcon(); } -QString QmlOutlineModel::getAnnotation(AST::UiObjectDefinition *objDef) { - const QHash bindings = getScriptBindings(objDef); +QString QmlOutlineModel::getAnnotation(AST::UiObjectInitializer *objectInitializer) { + const QHash bindings = getScriptBindings(objectInitializer); if (bindings.contains("id")) return bindings.value("id"); @@ -701,12 +785,13 @@ QString QmlOutlineModel::getAnnotation(AST::UiObjectDefinition *objDef) { if (bindings.contains("target")) return bindings.value("target"); + return QString(); } -QHash QmlOutlineModel::getScriptBindings(AST::UiObjectDefinition *objDef) { +QHash QmlOutlineModel::getScriptBindings(AST::UiObjectInitializer *objectInitializer) { QHash scriptBindings; - for (AST::UiObjectMemberList *it = objDef->initializer->members; it; it = it->next) { + for (AST::UiObjectMemberList *it = objectInitializer->members; it; it = it->next) { if (AST::UiScriptBinding *binding = AST::cast(it->member)) { const QString bindingName = asString(binding->qualifiedId); AST::ExpressionStatement *expr = AST::cast(binding->statement); -- cgit v1.2.1