Showing the changes to interface/src/scripting/ToolbarScriptingInterface.cpp (1 of 36 files). Show all
Unified · Split
| @@ -0,0 +1,124 @@ | |||
| 1 | // | ||
| 2 | // Created by Bradley Austin Davis on 2016-06-16 | ||
| 3 | // Copyright 2013-2016 High Fidelity, Inc. | ||
| 4 | // | ||
| 5 | // Distributed under the Apache License, Version 2.0. | ||
| 6 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 7 | // | ||
| 8 | |||
| 9 | #include "ToolbarScriptingInterface.h" | ||
| 10 | |||
| 11 | #include <OffscreenUi.h> | ||
| 12 | |||
| 13 | class QmlWrapper : public QObject { | ||
| 14 | Q_OBJECT | ||
| 15 | public: | ||
| 16 | QmlWrapper(QObject* qmlObject, QObject* parent = nullptr) | ||
| 17 | : QObject(parent), _qmlObject(qmlObject) { | ||
| 18 | |||
| 19 | const QMetaObject *metaobject = qmlObject->metaObject(); | ||
| 20 | int count = metaobject->propertyCount(); | ||
| 21 | qDebug() << "Scanning properties for " << qmlObject; | ||
| 22 | for (int i = 0; i < count; ++i) { | ||
| 23 | QMetaProperty metaproperty = metaobject->property(i); | ||
| 24 | const char *name = metaproperty.name(); | ||
| 25 | qDebug() << "Property " << name; | ||
| 26 | } | ||
| 27 | } | ||
| 28 | |||
| 29 | Q_INVOKABLE void writeProperty(QString propertyName, QVariant propertyValue) { | ||
| 30 | auto offscreenUi = DependencyManager::get<OffscreenUi>(); | ||
| 31 | offscreenUi->executeOnUiThread([=] { | ||
| 32 | _qmlObject->setProperty(propertyName.toStdString().c_str(), propertyValue); | ||
| 33 | }); | ||
| 34 | } | ||
| 35 | |||
| 36 | Q_INVOKABLE void writeProperties(QVariant propertyMap) { | ||
| 37 | auto offscreenUi = DependencyManager::get<OffscreenUi>(); | ||
| 38 | offscreenUi->executeOnUiThread([=] { | ||
| 39 | QVariantMap map = propertyMap.toMap(); | ||
| 40 | for (const QString& key : map.keys()) { | ||
| 41 | _qmlObject->setProperty(key.toStdString().c_str(), map[key]); | ||
| 42 | } | ||
| 43 | }); | ||
| 44 | } | ||
| 45 | |||
| 46 | Q_INVOKABLE QVariant readProperty(const QString& propertyName) { | ||
| 47 | auto offscreenUi = DependencyManager::get<OffscreenUi>(); | ||
| 48 | return offscreenUi->returnFromUiThread([&]()->QVariant { | ||
| 49 | return _qmlObject->property(propertyName.toStdString().c_str()); | ||
| 50 | }); | ||
| 51 | } | ||
| 52 | |||
| 53 | Q_INVOKABLE QVariant readProperties(const QVariant& propertyList) { | ||
| 54 | auto offscreenUi = DependencyManager::get<OffscreenUi>(); | ||
| 55 | return offscreenUi->returnFromUiThread([&]()->QVariant { | ||
| 56 | QVariantMap result; | ||
| 57 | for (const QVariant& property : propertyList.toList()) { | ||
| 58 | QString propertyString = property.toString(); | ||
| 59 | result.insert(propertyString, _qmlObject->property(propertyString.toStdString().c_str())); | ||
| 60 | } | ||
| 61 | return result; | ||
| 62 | }); | ||
| 63 | } | ||
| 64 | |||
| 65 | |||
| 66 | protected: | ||
| 67 | QObject* _qmlObject{ nullptr }; | ||
| 68 | }; | ||
| 69 | |||
| 70 | |||
| 71 | class ToolbarButtonProxy : public QmlWrapper { | ||
| 72 | Q_OBJECT | ||
| 73 | |||
| 74 | public: | ||
| 75 | ToolbarButtonProxy(QObject* qmlObject, QObject* parent = nullptr) : QmlWrapper(qmlObject, parent) { | ||
| 76 | connect(qmlObject, SIGNAL(clicked()), this, SIGNAL(clicked())); | ||
| 77 | } | ||
| 78 | |||
| 79 | signals: | ||
| 80 | void clicked(); | ||
| 81 | }; | ||
| 82 | |||
| 83 | class ToolbarProxy : public QmlWrapper { | ||
| 84 | Q_OBJECT | ||
| 85 | |||
| 86 | public: | ||
| 87 | ToolbarProxy(QObject* qmlObject, QObject* parent = nullptr) : QmlWrapper(qmlObject, parent) { } | ||
| 88 | |||
| 89 | Q_INVOKABLE QObject* addButton(const QVariant& properties) { | ||
| 90 | QVariant resultVar; | ||
| 91 | bool invokeResult = QMetaObject::invokeMethod(_qmlObject, "addButton", Qt::BlockingQueuedConnection, Q_RETURN_ARG(QVariant, resultVar), Q_ARG(QVariant, properties)); | ||
| 92 | if (!invokeResult) { | ||
| 93 | return nullptr; | ||
| 94 | } | ||
| 95 | |||
| 96 | QObject* rawButton = qvariant_cast<QObject *>(resultVar); | ||
| 97 | if (!rawButton) { | ||
| 98 | return nullptr; | ||
| 99 | } | ||
| 100 | |||
| 101 | return new ToolbarButtonProxy(rawButton, this); | ||
| 102 | } | ||
| 103 | }; | ||
| 104 | |||
| 105 | |||
| 106 | QObject* ToolbarScriptingInterface::getToolbar(const QString& toolbarId) { | ||
| 107 | auto offscreenUi = DependencyManager::get<OffscreenUi>(); | ||
| 108 | auto desktop = offscreenUi->getDesktop(); | ||
| 109 | QVariant resultVar; | ||
| 110 | bool invokeResult = QMetaObject::invokeMethod(desktop, "getToolbar", Qt::BlockingQueuedConnection, Q_RETURN_ARG(QVariant, resultVar), Q_ARG(QVariant, toolbarId)); | ||
| 111 | if (!invokeResult) { | ||
| 112 | return nullptr; | ||
| 113 | } | ||
| 114 | |||
| 115 | QObject* rawToolbar = qvariant_cast<QObject *>(resultVar); | ||
| 116 | if (!rawToolbar) { | ||
| 117 | return nullptr; | ||
| 118 | } | ||
| 119 | |||
| 120 | return new ToolbarProxy(rawToolbar); | ||
| 121 | } | ||
| 122 | |||
| 123 | |||
| 124 | #include "ToolbarScriptingInterface.moc" | ||