66 QPointer<Scenario::ScenarioDocumentView> m_view;
69 ossia::net::parameter_base* scaled_win{};
70 ossia::net::parameter_base* gl_win{};
71 ossia::net::parameter_base* abs_win{};
72 ossia::net::parameter_base* abs_tablet_win{};
73 ossia::net::parameter_base* size_param{};
74 ossia::net::parameter_base* rendersize_param{};
76 ossia::net::parameter_base* press_param{};
77 ossia::net::parameter_base* text_param{};
79 boost::container::static_vector<QMetaObject::Connection, 8> con;
85 struct PixelRatioWatcher final : QObject
93 bool eventFilter(QObject*, QEvent* e)
override
97#if QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)
98 case QEvent::DevicePixelRatioChange:
99 self.updatePixelSize();
105 case QEvent::ParentChange:
106 case QEvent::WinIdChange:
115 std::unique_ptr<PixelRatioWatcher> m_pixelRatioWatcher;
116 QPointer<QWindow> m_window;
117 QMetaObject::Connection m_screenChanged;
120 ossia::vec2f m_logicalSize{};
122 void update_viewport()
124 auto v = rendersize_param->value();
125 if(
auto val = v.target<ossia::vec2f>())
127 auto dom = abs_win->get_domain();
128 if((*val)[0] >= 1.f && (*val)[1] >= 1.f)
130 ossia::set_max(dom, *val);
131 abs_win->set_domain(std::move(dom));
132 abs_tablet_win->set_domain(std::move(dom));
137 v = size_param->value();
138 if(
auto val = v.target<ossia::vec2f>())
140 auto dom = abs_win->get_domain();
141 if((*val)[0] >= 1.f && (*val)[1] >= 1.f)
143 ossia::set_max(dom, *val);
144 abs_win->set_domain(std::move(dom));
145 abs_tablet_win->set_domain(std::move(dom));
152 v = size_param->value();
153 if(
auto val = v.target<ossia::vec2f>())
155 auto dom = abs_win->get_domain();
156 if((*val)[0] >= 1.f && (*val)[1] >= 1.f)
158 ossia::set_max(dom, *val);
159 abs_win->set_domain(std::move(dom));
160 abs_tablet_win->set_domain(std::move(dom));
169 QSize pixelSize(ossia::vec2f logical)
const
171 const qreal dpr = m_view ? m_view->view().devicePixelRatioF() : 1.;
172 return QSize{qRound(logical[0] * dpr), qRound(logical[1] * dpr)};
175 void updatePixelSize()
178 m_screen->setSize(pixelSize(m_logicalSize));
185 if(
auto* top = m_view->view().window())
186 w = top->windowHandle();
190 QObject::disconnect(m_screenChanged);
193 m_screenChanged = QObject::connect(
194 w, &QWindow::screenChanged, &m_qtContext, [
this] { updatePixelSize(); });
202 : ossia::net::device_base{std::move(proto)}
204 , m_root{*
this, *
static_cast<gfx_protocol_base*
>(m_protocol.get()), m_screen, name}
207 this->m_capabilities.change_tree =
true;
209 view.addBackgroundRenderer(m_renderer);
211 auto& v = view.view();
214 auto size_node = std::make_unique<ossia::net::generic_node>(
"size", *
this, m_root);
215 size_param = size_node->create_parameter(ossia::val_type::VEC2F);
216 const auto sz = view.view().size();
217 const ossia::vec2f logical{(float)sz.width(), (float)sz.height()};
218 m_logicalSize = logical;
219 m_screen->setSize(pixelSize(logical));
220 size_param->push_value(logical);
221 size_param->add_callback([
this](
const ossia::value& v) {
222 if(
auto val = v.target<ossia::vec2f>())
224 ossia::qt::run_async(&m_qtContext, [
this, v = *val] {
226 m_screen->setSize(pixelSize(v));
235 &v, &Scenario::ProcessGraphicsView::sizeChanged, &m_qtContext,
236 [
this, v = QPointer{&view}, ptr = QPointer{m_screen}](QSize e) {
239 size_param->push_value(ossia::vec2f{(float)e.width(), (float)e.height()});
241 }, Qt::DirectConnection));
243 m_root.add_child(std::move(size_node));
245 m_pixelRatioWatcher = std::make_unique<PixelRatioWatcher>(*
this);
246 v.installEventFilter(m_pixelRatioWatcher.get());
251 = std::make_unique<ossia::net::generic_node>(
"rendersize", *
this, m_root);
253 rendersize_param = size_node->create_parameter(ossia::val_type::VEC2F);
254 rendersize_param->push_value(ossia::vec2f{0.f, 0.f});
255 rendersize_param->add_callback([
this](
const ossia::value& v) {
256 if(
auto val = v.target<ossia::vec2f>())
258 ossia::qt::run_async(&m_qtContext, [screen = m_screen, v = *val] {
259 screen->setRenderSize({(int)v[0], (int)v[1]});
266 m_root.add_child(std::move(size_node));
271 auto node = std::make_unique<ossia::net::generic_node>(
"cursor", *
this, m_root);
274 = std::make_unique<ossia::net::generic_node>(
"scaled", *
this, *node);
275 scaled_win = scale_node->create_parameter(ossia::val_type::VEC2F);
276 scaled_win->set_domain(ossia::make_domain(0.f, 1.f));
277 scaled_win->push_value(ossia::vec2f{0.f, 0.f});
278 node->add_child(std::move(scale_node));
281 auto scale_node = std::make_unique<ossia::net::generic_node>(
"gl", *
this, *node);
282 gl_win = scale_node->create_parameter(ossia::val_type::VEC2F);
283 gl_win->set_domain(ossia::make_domain(0.f, 1.f));
284 gl_win->push_value(ossia::vec2f{0.f, 0.f});
285 node->add_child(std::move(scale_node));
289 = std::make_unique<ossia::net::generic_node>(
"absolute", *
this, *node);
290 abs_win = abs_node->create_parameter(ossia::val_type::VEC2F);
292 ossia::make_domain(ossia::vec2f{0.f, 0.f}, ossia::vec2f{1280, 270.f}));
293 abs_win->push_value(ossia::vec2f{0.f, 0.f});
294 node->add_child(std::move(abs_node));
300 &v, &Scenario::ProcessGraphicsView::hoverMove, &m_qtContext,
301 [
this, v = QPointer{&view}, ptr = QPointer{m_screen}](QHoverEvent* e) {
304 const auto win = e->position();
305 const auto sz = v->view().size();
306 scaled_win->push_value(
307 ossia::vec2f{float(win.x() / sz.width()), float(win.y() / sz.height())});
310 float(win.x() / sz.width()), 1.f - float(win.y() / sz.height())});
312 m_pointers.set_clip(
float(clip.x()),
float(clip.y()));
314 m_pointers.
move_slot(0,
float(clip.x()),
float(clip.y()));
315 abs_win->push_value(ossia::vec2f{float(win.x()), float(win.y())});
317 }, Qt::DirectConnection));
319 m_root.add_child(std::move(node));
325 ossia::net::parameter_base* scaled_tablet_win{};
327 auto node = std::make_unique<ossia::net::generic_node>(
"tablet", *
this, m_root);
328 ossia::net::parameter_base* tablet_pressure{};
329 ossia::net::parameter_base* tablet_z{};
330 ossia::net::parameter_base* tablet_tan{};
331 ossia::net::parameter_base* tablet_rot{};
332 ossia::net::parameter_base* tablet_tilt_x{};
333 ossia::net::parameter_base* tablet_tilt_y{};
336 = std::make_unique<ossia::net::generic_node>(
"scaled", *
this, *node);
337 scaled_tablet_win = scale_node->create_parameter(ossia::val_type::VEC2F);
338 scaled_tablet_win->set_domain(ossia::make_domain(0.f, 1.f));
339 scaled_tablet_win->push_value(ossia::vec2f{0.f, 0.f});
340 node->add_child(std::move(scale_node));
344 = std::make_unique<ossia::net::generic_node>(
"absolute", *
this, *node);
345 abs_tablet_win = abs_node->create_parameter(ossia::val_type::VEC2F);
346 abs_tablet_win->set_domain(
347 ossia::make_domain(ossia::vec2f{0.f, 0.f}, ossia::vec2f{1280, 270.f}));
348 abs_tablet_win->push_value(ossia::vec2f{0.f, 0.f});
349 node->add_child(std::move(abs_node));
352 auto scale_node = std::make_unique<ossia::net::generic_node>(
"z", *
this, *node);
353 tablet_z = scale_node->create_parameter(ossia::val_type::INT);
354 node->add_child(std::move(scale_node));
358 = std::make_unique<ossia::net::generic_node>(
"pressure", *
this, *node);
359 tablet_pressure = scale_node->create_parameter(ossia::val_type::FLOAT);
362 node->add_child(std::move(scale_node));
366 = std::make_unique<ossia::net::generic_node>(
"tangential", *
this, *node);
367 tablet_tan = scale_node->create_parameter(ossia::val_type::FLOAT);
368 tablet_tan->set_domain(ossia::make_domain(-1.f, 1.f));
370 node->add_child(std::move(scale_node));
374 = std::make_unique<ossia::net::generic_node>(
"rotation", *
this, *node);
375 tablet_rot = scale_node->create_parameter(ossia::val_type::FLOAT);
376 tablet_rot->set_unit(ossia::degree_u{});
377 tablet_rot->set_domain(ossia::make_domain(-180.f, 180.f));
378 node->add_child(std::move(scale_node));
382 = std::make_unique<ossia::net::generic_node>(
"tilt_x", *
this, *node);
383 tablet_tilt_x = scale_node->create_parameter(ossia::val_type::FLOAT);
384 tablet_tilt_x->set_domain(ossia::make_domain(-60.f, 60.f));
385 tablet_tilt_x->set_unit(ossia::degree_u{});
386 node->add_child(std::move(scale_node));
390 = std::make_unique<ossia::net::generic_node>(
"tilt_y", *
this, *node);
391 tablet_tilt_y = scale_node->create_parameter(ossia::val_type::FLOAT);
392 tablet_tilt_y->set_domain(ossia::make_domain(-60.f, 60.f));
393 tablet_tilt_y->set_unit(ossia::degree_u{});
394 node->add_child(std::move(scale_node));
399 &v, &Scenario::ProcessGraphicsView::tabletMove, m_screen,
400 [=,
this, v = QPointer{&view},
401 ptr = QPointer{m_screen}](QTabletEvent* ev) {
404 auto win = ev->position();
405 auto sz = v->view().size();
406 scaled_tablet_win->push_value(
407 ossia::vec2f{float(win.x() / sz.width()), float(win.y() / sz.height())});
408 abs_tablet_win->push_value(ossia::vec2f{float(win.x()), float(win.y())});
409 tablet_pressure->push_value(ev->pressure());
410 tablet_tan->push_value(ev->tangentialPressure());
411 tablet_rot->push_value(ev->rotation());
412 tablet_z->push_value(ev->z());
413 tablet_tilt_x->push_value(ev->xTilt());
414 tablet_tilt_y->push_value(ev->yTilt());
417 Qt::DirectConnection));
418 m_root.add_child(std::move(node));
423 auto node = std::make_unique<ossia::net::generic_node>(
"key", *
this, m_root);
426 = std::make_unique<ossia::net::generic_node>(
"press", *
this, *node);
429 = std::make_unique<ossia::net::generic_node>(
"code", *
this, *press_node);
430 press_param = code_node->create_parameter(ossia::val_type::INT);
431 press_param->push_value(ossia::vec2f{0.f, 0.f});
432 press_node->add_child(std::move(code_node));
436 = std::make_unique<ossia::net::generic_node>(
"text", *
this, *press_node);
437 text_param = text_node->create_parameter(ossia::val_type::STRING);
438 press_node->add_child(std::move(text_node));
443 &v, &Scenario::ProcessGraphicsView::keyPress, m_screen,
444 [
this, v = QPointer{&view}, ptr = QPointer{m_screen}](QKeyEvent* ev) {
447 if(!ev->isAutoRepeat())
449 press_param->push_value(ev->key());
450 text_param->push_value(ev->text().toStdString());
453 }, Qt::DirectConnection));
454 node->add_child(std::move(press_node));
458 = std::make_unique<ossia::net::generic_node>(
"release", *
this, *node);
459 ossia::net::parameter_base* press_param{};
460 ossia::net::parameter_base* text_param{};
463 = std::make_unique<ossia::net::generic_node>(
"code", *
this, *release_node);
464 press_param = code_node->create_parameter(ossia::val_type::INT);
465 press_param->push_value(ossia::vec2f{0.f, 0.f});
466 release_node->add_child(std::move(code_node));
470 = std::make_unique<ossia::net::generic_node>(
"text", *
this, *release_node);
471 text_param = text_node->create_parameter(ossia::val_type::STRING);
472 release_node->add_child(std::move(text_node));
477 &v, &Scenario::ProcessGraphicsView::keyRelease, m_screen,
478 [=, v = QPointer{&view}, ptr = QPointer{m_screen}](QKeyEvent* ev) {
481 if(!ev->isAutoRepeat())
483 press_param->push_value(ev->key());
484 text_param->push_value(ev->text().toStdString());
487 }, Qt::DirectConnection));
488 node->add_child(std::move(release_node));
491 m_root.add_child(std::move(node));
502 QObject::disconnect(c);
504 QObject::disconnect(m_screenChanged);
506 m_view->view().removeEventFilter(m_pixelRatioWatcher.get());
507 m_pixelRatioWatcher.reset();
511 m_view->removeBackgroundRenderer(m_renderer);
516 m_root.clear_children();
521 const gfx_node_base& get_root_node()
const override {
return m_root; }
522 gfx_node_base& get_root_node()
override {
return m_root; }