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 <functional>
16#include <mutex>
17#include <span>
18
19#include <verdigris>
20
21namespace ossia
22{
23struct value_port;
24namespace net
25{
26class device_base;
27}
28}
29namespace ossia::qt
30{
31using qml_device_cache = ossia::small_vector<ossia::net::device_base*, 4>;
32using qml_device_push_function
33 = smallfun::function<void(ossia::net::parameter_base&, const ossia::value_port&)>;
34
35class OSSIA_EXPORT qml_engine_functions : public QObject
36{
37 W_OBJECT(qml_engine_functions)
38public:
39 qml_engine_functions(
40 const qml_device_cache& state, qml_device_push_function push, QQmlEngine& engine, QObject* parent)
41 : QObject{parent}
42 , on_push{std::move(push)}
43 , m_engine{engine}
44 , m_devices{state}
45 {
46 }
47
48 ~qml_engine_functions() override;
49
50 QVariant read(const QString& address);
51 W_SLOT(read);
52 void write(const QString& address, const QVariant& value);
53 W_SLOT(write);
54 void exec(const QString& code) E_SIGNAL(OSSIA_EXPORT, exec, code);
55 void compute(const QString& code, const QString& cb)
56 E_SIGNAL(OSSIA_EXPORT, compute, code, cb);
57 void system(const QString& code) E_SIGNAL(OSSIA_EXPORT, system, code);
58
60 QVariant asArray(QVariant) const noexcept;
61 W_SLOT(asArray)
62 QVariant asColor(QVariant) const noexcept;
63 W_SLOT(asColor)
64 QVariant asVec2(QVariant) const noexcept;
65 W_SLOT(asVec2)
66 QVariant asVec3(QVariant) const noexcept;
67 W_SLOT(asVec3)
68 QVariant asVec4(QVariant) const noexcept;
69 W_SLOT(asVec4)
70
71 QJSValue toValue(QJSValue) const noexcept;
72 W_SLOT(toValue)
73
74 static ossia::net::node_base*
75 find_node(qml_device_cache& devices, std::string_view name);
76
79 ossia::net::node_base* find(const QString& address);
80
88 void setDevice(ossia::net::device_base*);
89
95 void setDevices(qml_device_cache devices);
96 void addDevice(ossia::net::device_base* device);
97 void removeDevice(ossia::net::device_base* device);
98
102 void disable();
103
104private:
105 using device_span = std::span<ossia::net::device_base* const>;
106
109 struct resolved_address
110 {
111 const ossia::destination_t& destination;
112 device_span scope;
113 };
114
118 resolved_address find_address(const QString&);
119
120 qml_device_push_function on_push;
121 QQmlEngine& m_engine;
122
123 ossia::hash_map<QString, ossia::destination_t> m_address_cache;
124 ossia::value_port m_port_cache;
125
126protected:
129 void clear_address_cache() { m_address_cache.clear(); }
130
133 std::recursive_mutex m_mutex;
134 qml_device_cache m_devices;
135 ossia::net::device_base* m_own_device{};
136 bool m_enabled{true};
137};
138
139class OSSIA_EXPORT qml_device_engine_functions : public qml_engine_functions
140{
141 W_OBJECT(qml_device_engine_functions)
142
143public:
144 using qml_engine_functions::qml_engine_functions;
145 ~qml_device_engine_functions();
146
149 void addNode(QString address, QString type);
150 W_SLOT(addNode)
151
152 void removeNode(QString address, QString type);
153 W_SLOT(removeNode)
154
155
159 using tree_editor = std::function<void(std::function<void()>)>;
160 void setTreeEditor(tree_editor);
161
162private:
163 void editTree(std::function<void(ossia::net::node_base& root)> edit);
164
165 tree_editor m_tree_editor;
166};
167}
Root of a device tree.
Definition ossia/network/base/device.hpp:58
Definition qml_device.cpp:43
Definition git_info.h:7