62 QPointer<Scenario::ScenarioDocumentView> m_view;
65 ossia::net::parameter_base* scaled_win{};
66 ossia::net::parameter_base* abs_win{};
67 ossia::net::parameter_base* abs_tablet_win{};
68 ossia::net::parameter_base* size_param{};
69 ossia::net::parameter_base* rendersize_param{};
70 ossia::net::parameter_base* press_param{};
71 ossia::net::parameter_base* text_param{};
73 boost::container::static_vector<QMetaObject::Connection, 8> con;
75 void update_viewport()
77 auto v = rendersize_param->value();
78 if(
auto val = v.target<ossia::vec2f>())
80 auto dom = abs_win->get_domain();
81 if((*val)[0] >= 1.f && (*val)[1] >= 1.f)
83 ossia::set_max(dom, *val);
84 abs_win->set_domain(std::move(dom));
85 abs_tablet_win->set_domain(std::move(dom));
90 v = size_param->value();
91 if(
auto val = v.target<ossia::vec2f>())
93 auto dom = abs_win->get_domain();
94 if((*val)[0] >= 1.f && (*val)[1] >= 1.f)
96 ossia::set_max(dom, *val);
97 abs_win->set_domain(std::move(dom));
98 abs_tablet_win->set_domain(std::move(dom));
105 v = size_param->value();
106 if(
auto val = v.target<ossia::vec2f>())
108 auto dom = abs_win->get_domain();
109 if((*val)[0] >= 1.f && (*val)[1] >= 1.f)
111 ossia::set_max(dom, *val);
112 abs_win->set_domain(std::move(dom));
113 abs_tablet_win->set_domain(std::move(dom));
123 : ossia::net::device_base{std::move(proto)}
125 , m_root{*
this, *
static_cast<gfx_protocol_base*
>(m_protocol.get()), m_screen, name}
128 this->m_capabilities.change_tree =
true;
130 view.addBackgroundRenderer(m_renderer);
132 auto& v = view.view();
135 auto size_node = std::make_unique<ossia::net::generic_node>(
"size", *
this, m_root);
136 size_param = size_node->create_parameter(ossia::val_type::VEC2F);
137 const auto sz = view.view().size();
138 m_screen->setSize(sz);
139 size_param->push_value(ossia::vec2f{(float)sz.width(), (float)sz.height()});
140 size_param->add_callback([
this](
const ossia::value& v) {
141 if(
auto val = v.target<ossia::vec2f>())
143 ossia::qt::run_async(&m_qtContext, [screen = this->m_screen, v = *val] {
144 screen->setSize({(int)v[0], (
int)v[1]});
153 &v, &Scenario::ProcessGraphicsView::sizeChanged, &m_qtContext,
154 [
this, v = QPointer{&view}, ptr = QPointer{m_screen}](QSize e) {
157 size_param->push_value(ossia::vec2f{(float)e.width(), (float)e.height()});
159 }, Qt::DirectConnection));
161 m_root.add_child(std::move(size_node));
165 = std::make_unique<ossia::net::generic_node>(
"rendersize", *
this, m_root);
167 rendersize_param = size_node->create_parameter(ossia::val_type::VEC2F);
168 rendersize_param->push_value(ossia::vec2f{0.f, 0.f});
169 rendersize_param->add_callback([
this](
const ossia::value& v) {
170 if(
auto val = v.target<ossia::vec2f>())
172 ossia::qt::run_async(&m_qtContext, [screen = m_screen, v = *val] {
173 screen->setRenderSize({(int)v[0], (int)v[1]});
180 m_root.add_child(std::move(size_node));
185 auto node = std::make_unique<ossia::net::generic_node>(
"cursor", *
this, m_root);
188 = std::make_unique<ossia::net::generic_node>(
"scaled", *
this, *node);
189 scaled_win = scale_node->create_parameter(ossia::val_type::VEC2F);
190 scaled_win->set_domain(ossia::make_domain(0.f, 1.f));
191 scaled_win->push_value(ossia::vec2f{0.f, 0.f});
192 node->add_child(std::move(scale_node));
196 = std::make_unique<ossia::net::generic_node>(
"absolute", *
this, *node);
197 abs_win = abs_node->create_parameter(ossia::val_type::VEC2F);
199 ossia::make_domain(ossia::vec2f{0.f, 0.f}, ossia::vec2f{1280, 270.f}));
200 abs_win->push_value(ossia::vec2f{0.f, 0.f});
201 node->add_child(std::move(abs_node));
206 &v, &Scenario::ProcessGraphicsView::hoverMove, &m_qtContext,
207 [
this, v = QPointer{&view}, ptr = QPointer{m_screen}](QHoverEvent* e) {
210 auto win = e->position();
211 auto sz = v->view().size();
212 scaled_win->push_value(
213 ossia::vec2f{float(win.x() / sz.width()), float(win.y() / sz.height())});
214 abs_win->push_value(ossia::vec2f{float(win.x()), float(win.y())});
216 }, Qt::DirectConnection));
218 m_root.add_child(std::move(node));
222 ossia::net::parameter_base* scaled_tablet_win{};
224 auto node = std::make_unique<ossia::net::generic_node>(
"tablet", *
this, m_root);
225 ossia::net::parameter_base* tablet_pressure{};
226 ossia::net::parameter_base* tablet_z{};
227 ossia::net::parameter_base* tablet_tan{};
228 ossia::net::parameter_base* tablet_rot{};
229 ossia::net::parameter_base* tablet_tilt_x{};
230 ossia::net::parameter_base* tablet_tilt_y{};
233 = std::make_unique<ossia::net::generic_node>(
"scaled", *
this, *node);
234 scaled_tablet_win = scale_node->create_parameter(ossia::val_type::VEC2F);
235 scaled_tablet_win->set_domain(ossia::make_domain(0.f, 1.f));
236 scaled_tablet_win->push_value(ossia::vec2f{0.f, 0.f});
237 node->add_child(std::move(scale_node));
241 = std::make_unique<ossia::net::generic_node>(
"absolute", *
this, *node);
242 abs_tablet_win = abs_node->create_parameter(ossia::val_type::VEC2F);
243 abs_tablet_win->set_domain(
244 ossia::make_domain(ossia::vec2f{0.f, 0.f}, ossia::vec2f{1280, 270.f}));
245 abs_tablet_win->push_value(ossia::vec2f{0.f, 0.f});
246 node->add_child(std::move(abs_node));
249 auto scale_node = std::make_unique<ossia::net::generic_node>(
"z", *
this, *node);
250 tablet_z = scale_node->create_parameter(ossia::val_type::INT);
251 node->add_child(std::move(scale_node));
255 = std::make_unique<ossia::net::generic_node>(
"pressure", *
this, *node);
256 tablet_pressure = scale_node->create_parameter(ossia::val_type::FLOAT);
259 node->add_child(std::move(scale_node));
263 = std::make_unique<ossia::net::generic_node>(
"tangential", *
this, *node);
264 tablet_tan = scale_node->create_parameter(ossia::val_type::FLOAT);
265 tablet_tan->set_domain(ossia::make_domain(-1.f, 1.f));
267 node->add_child(std::move(scale_node));
271 = std::make_unique<ossia::net::generic_node>(
"rotation", *
this, *node);
272 tablet_rot = scale_node->create_parameter(ossia::val_type::FLOAT);
273 tablet_rot->set_unit(ossia::degree_u{});
274 tablet_rot->set_domain(ossia::make_domain(-180.f, 180.f));
275 node->add_child(std::move(scale_node));
279 = std::make_unique<ossia::net::generic_node>(
"tilt_x", *
this, *node);
280 tablet_tilt_x = scale_node->create_parameter(ossia::val_type::FLOAT);
281 tablet_tilt_x->set_domain(ossia::make_domain(-60.f, 60.f));
282 tablet_tilt_x->set_unit(ossia::degree_u{});
283 node->add_child(std::move(scale_node));
287 = std::make_unique<ossia::net::generic_node>(
"tilt_y", *
this, *node);
288 tablet_tilt_y = scale_node->create_parameter(ossia::val_type::FLOAT);
289 tablet_tilt_y->set_domain(ossia::make_domain(-60.f, 60.f));
290 tablet_tilt_y->set_unit(ossia::degree_u{});
291 node->add_child(std::move(scale_node));
296 &v, &Scenario::ProcessGraphicsView::tabletMove, m_screen,
297 [=,
this, v = QPointer{&view},
298 ptr = QPointer{m_screen}](QTabletEvent* ev) {
301 auto win = ev->position();
302 auto sz = v->view().size();
303 scaled_tablet_win->push_value(
304 ossia::vec2f{float(win.x() / sz.width()), float(win.y() / sz.height())});
305 abs_tablet_win->push_value(ossia::vec2f{float(win.x()), float(win.y())});
306 tablet_pressure->push_value(ev->pressure());
307 tablet_tan->push_value(ev->tangentialPressure());
308 tablet_rot->push_value(ev->rotation());
309 tablet_z->push_value(ev->z());
310 tablet_tilt_x->push_value(ev->xTilt());
311 tablet_tilt_y->push_value(ev->yTilt());
314 Qt::DirectConnection));
315 m_root.add_child(std::move(node));
320 auto node = std::make_unique<ossia::net::generic_node>(
"key", *
this, m_root);
323 = std::make_unique<ossia::net::generic_node>(
"press", *
this, *node);
326 = std::make_unique<ossia::net::generic_node>(
"code", *
this, *press_node);
327 press_param = code_node->create_parameter(ossia::val_type::INT);
328 press_param->push_value(ossia::vec2f{0.f, 0.f});
329 press_node->add_child(std::move(code_node));
333 = std::make_unique<ossia::net::generic_node>(
"text", *
this, *press_node);
334 text_param = text_node->create_parameter(ossia::val_type::STRING);
335 press_node->add_child(std::move(text_node));
340 &v, &Scenario::ProcessGraphicsView::keyPress, m_screen,
341 [
this, v = QPointer{&view}, ptr = QPointer{m_screen}](QKeyEvent* ev) {
344 if(!ev->isAutoRepeat())
346 press_param->push_value(ev->key());
347 text_param->push_value(ev->text().toStdString());
350 }, Qt::DirectConnection));
351 node->add_child(std::move(press_node));
355 = std::make_unique<ossia::net::generic_node>(
"release", *
this, *node);
356 ossia::net::parameter_base* press_param{};
357 ossia::net::parameter_base* text_param{};
360 = std::make_unique<ossia::net::generic_node>(
"code", *
this, *release_node);
361 press_param = code_node->create_parameter(ossia::val_type::INT);
362 press_param->push_value(ossia::vec2f{0.f, 0.f});
363 release_node->add_child(std::move(code_node));
367 = std::make_unique<ossia::net::generic_node>(
"text", *
this, *release_node);
368 text_param = text_node->create_parameter(ossia::val_type::STRING);
369 release_node->add_child(std::move(text_node));
374 &v, &Scenario::ProcessGraphicsView::keyRelease, m_screen,
375 [=, v = QPointer{&view}, ptr = QPointer{m_screen}](QKeyEvent* ev) {
378 if(!ev->isAutoRepeat())
380 press_param->push_value(ev->key());
381 text_param->push_value(ev->text().toStdString());
384 }, Qt::DirectConnection));
385 node->add_child(std::move(release_node));
388 m_root.add_child(std::move(node));
396 m_view->removeBackgroundRenderer(m_renderer);
399 QObject::disconnect(c);
403 m_root.clear_children();
408 const gfx_node_base& get_root_node()
const override {
return m_root; }
409 gfx_node_base& get_root_node()
override {
return m_root; }