diff --git a/src/libs/qmljs/qmljsicontextpane.h b/src/libs/qmljs/qmljsicontextpane.h index ab66b4bf19817d18dd1c1f0863c81ea7d91f4016..3444fe3daaa2700d3c24f9749ff6e3e36f09ae49 100644 --- a/src/libs/qmljs/qmljsicontextpane.h +++ b/src/libs/qmljs/qmljsicontextpane.h @@ -54,6 +54,7 @@ public: virtual ~IContextPane() {} virtual void apply(TextEditor::BaseTextEditorEditable *editor, Document::Ptr doc, const QmlJS::Snapshot &snapshot, AST::Node *node, bool update, bool force = false) = 0; virtual void setEnabled(bool) = 0; + virtual bool isAvailable(TextEditor::BaseTextEditorEditable *editor, Document::Ptr doc, const QmlJS::Snapshot &snapshot, AST::Node *node) = 0; virtual QWidget* widget() = 0; }; diff --git a/src/plugins/qmldesigner/qmlcontextpane.cpp b/src/plugins/qmldesigner/qmlcontextpane.cpp index 8b69e1eea0ed5ca35b5cb0ccc22d54d08e5a921d..0d3b5a7c38058affd794040f2dd88baefd2cab85 100644 --- a/src/plugins/qmldesigner/qmlcontextpane.cpp +++ b/src/plugins/qmldesigner/qmlcontextpane.cpp @@ -68,8 +68,10 @@ QmlContextPane::~QmlContextPane() void QmlContextPane::apply(TextEditor::BaseTextEditorEditable *editor, Document::Ptr doc, const QmlJS::Snapshot &snapshot, AST::Node *node, bool update, bool force) { - if (!Internal::BauhausPlugin::pluginInstance()->settings().enableContextPane && !force) + if (!Internal::BauhausPlugin::pluginInstance()->settings().enableContextPane && !force && !update) { + contextWidget()->hide(); return; + } if (doc.isNull()) return; @@ -169,6 +171,36 @@ void QmlContextPane::apply(TextEditor::BaseTextEditorEditable *editor, Document: } +bool QmlContextPane::isAvailable(TextEditor::BaseTextEditorEditable *, Document::Ptr doc, const QmlJS::Snapshot &snapshot, AST::Node *node) +{ + if (doc.isNull()) + return false; + + if (!node) + return false; + + LookupContext::Ptr lookupContext = LookupContext::create(doc, snapshot, QList<Node*>()); + const Interpreter::ObjectValue *scopeObject = doc->bind()->findQmlObject(node); + + QStringList prototypes; + + while (scopeObject) { + prototypes.append(scopeObject->className()); + scopeObject = scopeObject->prototype(lookupContext->context()); + } + + if (prototypes.contains("Rectangle") || + prototypes.contains("Image") || + prototypes.contains("BorderImage") || + prototypes.contains("TextEdit") || + prototypes.contains("TextInput") || + prototypes.contains("PropertyAnimation") || + prototypes.contains("Text")) + return true; + + return false; +} + void QmlContextPane::setProperty(const QString &propertyName, const QVariant &value) { diff --git a/src/plugins/qmldesigner/qmlcontextpane.h b/src/plugins/qmldesigner/qmlcontextpane.h index 04006a38aa68d9a57f5a8303ee641fc2bae5b9b2..eac2aa85ec2a625d341f5a99cbe4bc6da9d81e95 100644 --- a/src/plugins/qmldesigner/qmlcontextpane.h +++ b/src/plugins/qmldesigner/qmlcontextpane.h @@ -29,6 +29,7 @@ public: QmlContextPane(QObject *parent = 0); ~QmlContextPane(); void apply(TextEditor::BaseTextEditorEditable *editor, QmlJS::Document::Ptr doc, const QmlJS::Snapshot &snapshot, QmlJS::AST::Node *node, bool update, bool force = 0); + bool isAvailable(TextEditor::BaseTextEditorEditable *editor, QmlJS::Document::Ptr doc, const QmlJS::Snapshot &snapshot, QmlJS::AST::Node *node); void setProperty(const QString &propertyName, const QVariant &value); void removeProperty(const QString &propertyName); void setEnabled(bool);