62 QPointer<Scenario::ScenarioDocumentView> m_view;
65 ossia::net::parameter_base* scaled_win{};
66 ossia::net::parameter_base* gl_win{};
67 ossia::net::parameter_base* abs_win{};
68 ossia::net::parameter_base* abs_tablet_win{};
69 ossia::net::parameter_base* size_param{};
70 ossia::net::parameter_base* rendersize_param{};
71 ossia::net::parameter_base* press_param{};
72 ossia::net::parameter_base* text_param{};
74 boost::container::static_vector<QMetaObject::Connection, 8> con;
76 void update_viewport()
78 auto v = rendersize_param->value();
79 if(
auto val = v.target<ossia::vec2f>())
81 auto dom = abs_win->get_domain();
82 if((*val)[0] >= 1.f && (*val)[1] >= 1.f)
84 ossia::set_max(dom, *val);
85 abs_win->set_domain(std::move(dom));
86 abs_tablet_win->set_domain(std::move(dom));
91 v = size_param->value();
92 if(
auto val = v.target<ossia::vec2f>())
94 auto dom = abs_win->get_domain();
95 if((*val)[0] >= 1.f && (*val)[1] >= 1.f)
97 ossia::set_max(dom, *val);
98 abs_win->set_domain(std::move(dom));
99 abs_tablet_win->set_domain(std::move(dom));
106 v = size_param->value();
107 if(
auto val = v.target<ossia::vec2f>())
109 auto dom = abs_win->get_domain();
110 if((*val)[0] >= 1.f && (*val)[1] >= 1.f)
112 ossia::set_max(dom, *val);
113 abs_win->set_domain(std::move(dom));
114 abs_tablet_win->set_domain(std::move(dom));
124 : ossia::net::device_base{std::move(proto)}
126 , m_root{*
this, *
static_cast<gfx_protocol_base*
>(m_protocol.get()), m_screen, name}
129 this->m_capabilities.change_tree =
true;
131 view.addBackgroundRenderer(m_renderer);
133 auto& v = view.view();
136 auto size_node = std::make_unique<ossia::net::generic_node>(
"size", *
this, m_root);
137 size_param = size_node->create_parameter(ossia::val_type::VEC2F);
138 const auto sz = view.view().size();
139 m_screen->setSize(sz);
140 size_param->push_value(ossia::vec2f{(float)sz.width(), (float)sz.height()});
141 size_param->add_callback([
this](
const ossia::value& v) {
142 if(
auto val = v.target<ossia::vec2f>())
144 ossia::qt::run_async(&m_qtContext, [screen = this->m_screen, v = *val] {
145 screen->setSize({(int)v[0], (
int)v[1]});
154 &v, &Scenario::ProcessGraphicsView::sizeChanged, &m_qtContext,
155 [
this, v = QPointer{&view}, ptr = QPointer{m_screen}](QSize e) {
158 size_param->push_value(ossia::vec2f{(float)e.width(), (float)e.height()});
160 }, Qt::DirectConnection));
162 m_root.add_child(std::move(size_node));
166 = std::make_unique<ossia::net::generic_node>(
"rendersize", *
this, m_root);
168 rendersize_param = size_node->create_parameter(ossia::val_type::VEC2F);
169 rendersize_param->push_value(ossia::vec2f{0.f, 0.f});
170 rendersize_param->add_callback([
this](
const ossia::value& v) {
171 if(
auto val = v.target<ossia::vec2f>())
173 ossia::qt::run_async(&m_qtContext, [screen = m_screen, v = *val] {
174 screen->setRenderSize({(int)v[0], (int)v[1]});
181 m_root.add_child(std::move(size_node));
186 auto node = std::make_unique<ossia::net::generic_node>(
"cursor", *
this, m_root);
189 = std::make_unique<ossia::net::generic_node>(
"scaled", *
this, *node);
190 scaled_win = scale_node->create_parameter(ossia::val_type::VEC2F);
191 scaled_win->set_domain(ossia::make_domain(0.f, 1.f));
192 scaled_win->push_value(ossia::vec2f{0.f, 0.f});
193 node->add_child(std::move(scale_node));
196 auto scale_node = std::make_unique<ossia::net::generic_node>(
"gl", *
this, *node);
197 gl_win = scale_node->create_parameter(ossia::val_type::VEC2F);
198 gl_win->set_domain(ossia::make_domain(0.f, 1.f));
199 gl_win->push_value(ossia::vec2f{0.f, 0.f});
200 node->add_child(std::move(scale_node));
204 = std::make_unique<ossia::net::generic_node>(
"absolute", *
this, *node);
205 abs_win = abs_node->create_parameter(ossia::val_type::VEC2F);
207 ossia::make_domain(ossia::vec2f{0.f, 0.f}, ossia::vec2f{1280, 270.f}));
208 abs_win->push_value(ossia::vec2f{0.f, 0.f});
209 node->add_child(std::move(abs_node));
214 &v, &Scenario::ProcessGraphicsView::hoverMove, &m_qtContext,
215 [
this, v = QPointer{&view}, ptr = QPointer{m_screen}](QHoverEvent* e) {
218 const auto win = e->position();
219 const auto sz = v->view().size();
220 scaled_win->push_value(
221 ossia::vec2f{float(win.x() / sz.width()), float(win.y() / sz.height())});
224 float(win.x() / sz.width()), 1.f - float(win.y() / sz.height())});
225 abs_win->push_value(ossia::vec2f{float(win.x()), float(win.y())});
227 }, Qt::DirectConnection));
229 m_root.add_child(std::move(node));
233 ossia::net::parameter_base* scaled_tablet_win{};
235 auto node = std::make_unique<ossia::net::generic_node>(
"tablet", *
this, m_root);
236 ossia::net::parameter_base* tablet_pressure{};
237 ossia::net::parameter_base* tablet_z{};
238 ossia::net::parameter_base* tablet_tan{};
239 ossia::net::parameter_base* tablet_rot{};
240 ossia::net::parameter_base* tablet_tilt_x{};
241 ossia::net::parameter_base* tablet_tilt_y{};
244 = std::make_unique<ossia::net::generic_node>(
"scaled", *
this, *node);
245 scaled_tablet_win = scale_node->create_parameter(ossia::val_type::VEC2F);
246 scaled_tablet_win->set_domain(ossia::make_domain(0.f, 1.f));
247 scaled_tablet_win->push_value(ossia::vec2f{0.f, 0.f});
248 node->add_child(std::move(scale_node));
252 = std::make_unique<ossia::net::generic_node>(
"absolute", *
this, *node);
253 abs_tablet_win = abs_node->create_parameter(ossia::val_type::VEC2F);
254 abs_tablet_win->set_domain(
255 ossia::make_domain(ossia::vec2f{0.f, 0.f}, ossia::vec2f{1280, 270.f}));
256 abs_tablet_win->push_value(ossia::vec2f{0.f, 0.f});
257 node->add_child(std::move(abs_node));
260 auto scale_node = std::make_unique<ossia::net::generic_node>(
"z", *
this, *node);
261 tablet_z = scale_node->create_parameter(ossia::val_type::INT);
262 node->add_child(std::move(scale_node));
266 = std::make_unique<ossia::net::generic_node>(
"pressure", *
this, *node);
267 tablet_pressure = scale_node->create_parameter(ossia::val_type::FLOAT);
270 node->add_child(std::move(scale_node));
274 = std::make_unique<ossia::net::generic_node>(
"tangential", *
this, *node);
275 tablet_tan = scale_node->create_parameter(ossia::val_type::FLOAT);
276 tablet_tan->set_domain(ossia::make_domain(-1.f, 1.f));
278 node->add_child(std::move(scale_node));
282 = std::make_unique<ossia::net::generic_node>(
"rotation", *
this, *node);
283 tablet_rot = scale_node->create_parameter(ossia::val_type::FLOAT);
284 tablet_rot->set_unit(ossia::degree_u{});
285 tablet_rot->set_domain(ossia::make_domain(-180.f, 180.f));
286 node->add_child(std::move(scale_node));
290 = std::make_unique<ossia::net::generic_node>(
"tilt_x", *
this, *node);
291 tablet_tilt_x = scale_node->create_parameter(ossia::val_type::FLOAT);
292 tablet_tilt_x->set_domain(ossia::make_domain(-60.f, 60.f));
293 tablet_tilt_x->set_unit(ossia::degree_u{});
294 node->add_child(std::move(scale_node));
298 = std::make_unique<ossia::net::generic_node>(
"tilt_y", *
this, *node);
299 tablet_tilt_y = scale_node->create_parameter(ossia::val_type::FLOAT);
300 tablet_tilt_y->set_domain(ossia::make_domain(-60.f, 60.f));
301 tablet_tilt_y->set_unit(ossia::degree_u{});
302 node->add_child(std::move(scale_node));
307 &v, &Scenario::ProcessGraphicsView::tabletMove, m_screen,
308 [=,
this, v = QPointer{&view},
309 ptr = QPointer{m_screen}](QTabletEvent* ev) {
312 auto win = ev->position();
313 auto sz = v->view().size();
314 scaled_tablet_win->push_value(
315 ossia::vec2f{float(win.x() / sz.width()), float(win.y() / sz.height())});
316 abs_tablet_win->push_value(ossia::vec2f{float(win.x()), float(win.y())});
317 tablet_pressure->push_value(ev->pressure());
318 tablet_tan->push_value(ev->tangentialPressure());
319 tablet_rot->push_value(ev->rotation());
320 tablet_z->push_value(ev->z());
321 tablet_tilt_x->push_value(ev->xTilt());
322 tablet_tilt_y->push_value(ev->yTilt());
325 Qt::DirectConnection));
326 m_root.add_child(std::move(node));
331 auto node = std::make_unique<ossia::net::generic_node>(
"key", *
this, m_root);
334 = std::make_unique<ossia::net::generic_node>(
"press", *
this, *node);
337 = std::make_unique<ossia::net::generic_node>(
"code", *
this, *press_node);
338 press_param = code_node->create_parameter(ossia::val_type::INT);
339 press_param->push_value(ossia::vec2f{0.f, 0.f});
340 press_node->add_child(std::move(code_node));
344 = std::make_unique<ossia::net::generic_node>(
"text", *
this, *press_node);
345 text_param = text_node->create_parameter(ossia::val_type::STRING);
346 press_node->add_child(std::move(text_node));
351 &v, &Scenario::ProcessGraphicsView::keyPress, m_screen,
352 [
this, v = QPointer{&view}, ptr = QPointer{m_screen}](QKeyEvent* ev) {
355 if(!ev->isAutoRepeat())
357 press_param->push_value(ev->key());
358 text_param->push_value(ev->text().toStdString());
361 }, Qt::DirectConnection));
362 node->add_child(std::move(press_node));
366 = std::make_unique<ossia::net::generic_node>(
"release", *
this, *node);
367 ossia::net::parameter_base* press_param{};
368 ossia::net::parameter_base* text_param{};
371 = std::make_unique<ossia::net::generic_node>(
"code", *
this, *release_node);
372 press_param = code_node->create_parameter(ossia::val_type::INT);
373 press_param->push_value(ossia::vec2f{0.f, 0.f});
374 release_node->add_child(std::move(code_node));
378 = std::make_unique<ossia::net::generic_node>(
"text", *
this, *release_node);
379 text_param = text_node->create_parameter(ossia::val_type::STRING);
380 release_node->add_child(std::move(text_node));
385 &v, &Scenario::ProcessGraphicsView::keyRelease, m_screen,
386 [=, v = QPointer{&view}, ptr = QPointer{m_screen}](QKeyEvent* ev) {
389 if(!ev->isAutoRepeat())
391 press_param->push_value(ev->key());
392 text_param->push_value(ev->text().toStdString());
395 }, Qt::DirectConnection));
396 node->add_child(std::move(release_node));
399 m_root.add_child(std::move(node));
407 m_view->removeBackgroundRenderer(m_renderer);
410 QObject::disconnect(c);
414 m_root.clear_children();
419 const gfx_node_base& get_root_node()
const override {
return m_root; }
420 gfx_node_base& get_root_node()
override {
return m_root; }