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
13class QmlWrapper : public QObject {
14 Q_OBJECT
15public:
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
66protected:
67 QObject* _qmlObject{ nullptr };
68};
69
70
71class ToolbarButtonProxy : public QmlWrapper {
72 Q_OBJECT
73
74public:
75 ToolbarButtonProxy(QObject* qmlObject, QObject* parent = nullptr) : QmlWrapper(qmlObject, parent) {
76 connect(qmlObject, SIGNAL(clicked()), this, SIGNAL(clicked()));
77 }
78
79signals:
80 void clicked();
81};
82
83class ToolbarProxy : public QmlWrapper {
84 Q_OBJECT
85
86public:
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
106QObject* 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"