From bb64cc70057655de182e3d1698c744bcaeac7566 Mon Sep 17 00:00:00 2001
From: Thomas Hartmann <Thomas.Hartmann@nokia.com>
Date: Thu, 5 Aug 2010 10:43:44 +0200
Subject: [PATCH] QtQuickToolbar: adds isAvailable() to IContextPane

isAvailable() returns true if a Quick ToolBar is available
for that node
---
 src/libs/qmljs/qmljsicontextpane.h         |  1 +
 src/plugins/qmldesigner/qmlcontextpane.cpp | 34 +++++++++++++++++++++-
 src/plugins/qmldesigner/qmlcontextpane.h   |  1 +
 3 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/src/libs/qmljs/qmljsicontextpane.h b/src/libs/qmljs/qmljsicontextpane.h
index ab66b4bf198..3444fe3daaa 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 8b69e1eea0e..0d3b5a7c380 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 04006a38aa6..eac2aa85ec2 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);
-- 
GitLab