OSSIA
Open Scenario System for Interactive Application
Loading...
Searching...
No Matches
qml_engine_functions.hpp
1#pragma once
2
3#include <ossia/dataflow/dataflow_fwd.hpp>
4#include <ossia/dataflow/value_port.hpp>
5#include <ossia/detail/hash_map.hpp>
7#include <ossia/network/common/path.hpp>
8
9#include <ossia-qt/js_utilities.hpp>
10
11#include <QObject>
12#include <QQmlContext>
13#include <QQmlEngine>
14
15#include <mutex>
16#include <span>
17
18#include <verdigris>
19
20namespace ossia
21{
22struct value_port;
23namespace net
24{
25class device_base;
26}
27}
28namespace ossia::qt
29{
30using qml_device_cache = ossia::small_vector<ossia::net::device_base*, 4>;
31using qml_device_push_function
32 = smallfun::function<void(ossia::net::parameter_base&, const ossia::value_port&)>;
33
34class OSSIA_EXPORT qml_engine_functions : public QObject
35{
36 W_OBJECT(qml_engine_functions)
37public:
38 qml_engine_functions(
39 const qml_device_cache& state, qml_device_push_function push, QQmlEngine& engine, QObject* parent)
40 : QObject{parent}
41 , on_push{std::move(push)}
42 , m_engine{engine}
43 , m_devices{state}
44 {
45 }
46
47 ~qml_engine_functions() override;
48
49 QVariant read(const QString& address);
50 W_SLOT(read);
51 void write(const QString& address, const QVariant& value);
52 W_SLOT(write);
53 void exec(const QString& code) E_SIGNAL(OSSIA_EXPORT, exec, code);
54 void compute(const QString& code, const QString& cb)
55 E_SIGNAL(OSSIA_EXPORT, compute, code, cb);
56 void system(const QString& code) E_SIGNAL(OSSIA_EXPORT, system, code);
57
59 QVariant asArray(QVariant) const noexcept;
60 W_SLOT(asArray)
61 QVariant asColor(QVariant) const noexcept;
62 W_SLOT(asColor)
63 QVariant asVec2(QVariant) const noexcept;
64 W_SLOT(asVec2)
65 QVariant asVec3(QVariant) const noexcept;
66 W_SLOT(asVec3)
67 QVariant asVec4(QVariant) const noexcept;
68 W_SLOT(asVec4)
69
70 QJSValue toValue(QJSValue) const noexcept;
71 W_SLOT(toValue)
72
74 find_node(qml_device_cache& devices, std::string_view name);
75
78 ossia::net::node_base* find(const QString& address);
79
87 void setDevice(ossia::net::device_base*);
88
94 void setDevices(qml_device_cache devices);
95 void addDevice(ossia::net::device_base* device);
96 void removeDevice(ossia::net::device_base* device);
97
101 void disable();
102
103private:
104 using device_span = std::span<ossia::net::device_base* const>;
105
108 struct resolved_address
109 {
110 const ossia::destination_t& destination;
111 device_span scope;
112 };
113
117 resolved_address find_address(const QString&);
118
119 qml_device_push_function on_push;
120 QQmlEngine& m_engine;
121
122 ossia::hash_map<QString, ossia::destination_t> m_address_cache;
123 ossia::value_port m_port_cache;
124
125protected:
128 std::recursive_mutex m_mutex;
129 qml_device_cache m_devices;
130 ossia::net::device_base* m_own_device{};
131 bool m_enabled{true};
132};
133
134class OSSIA_EXPORT qml_device_engine_functions : public qml_engine_functions
135{
136 W_OBJECT(qml_device_engine_functions)
137
138public:
139 using qml_engine_functions::qml_engine_functions;
140 ~qml_device_engine_functions();
141
144 void addNode(QString address, QString type);
145 W_SLOT(addNode)
146
147 void removeNode(QString address, QString type);
148 W_SLOT(removeNode)
149};
150}
Root of a device tree.
Definition ossia/network/base/device.hpp:58
The node_base class.
Definition node.hpp:48
The parameter_base class.
Definition ossia/network/base/parameter.hpp:48
Definition qml_device.cpp:43
Definition git_info.h:7