History

Support toolbar API

Bradley Austin Davis committed 10 years ago

Commit ec615ca1 parent 5bc8b5336 files · +862 −373Browse files

Showing the changes to interface/src/scripting/ToolbarScriptingInterface.cpp (1 of 36 files). Show all

Unified · Split

interface/src/scripting/ToolbarScriptingInterface.cpp+124−0
@@ -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"