Loading...
Searching...
No Matches
ValueDisplay.hpp
1#pragma once
2#include <Process/Dataflow/Port.hpp>
3#include <Process/Dataflow/PortFactory.hpp>
4#include <Process/Dataflow/PortItem.hpp>
5#include <Process/Process.hpp>
6
7#include <Effect/EffectLayer.hpp>
8#include <Effect/EffectLayout.hpp>
9
10#include <score/application/ApplicationContext.hpp>
11#include <score/model/Skin.hpp>
12
13#include <ossia/network/value/format_value.hpp>
14
15#include <boost/container/devector.hpp>
16
17#include <QApplication>
18#include <QClipboard>
19#include <QMenu>
20#include <QPainter>
21
22#include <halp/controls.hpp>
23#include <halp/meta.hpp>
24namespace Ui::ValueDisplay
25{
26struct Node
27{
28 halp_meta(name, "Value display")
29 halp_meta(c_name, "Display")
30 halp_meta(category, "Monitoring")
31 halp_meta(author, "ossia score")
32 halp_meta(manual_url, "")
33 halp_meta(description, "Visualize an input value")
34 halp_meta(uuid, "3f4a41f2-fa39-420f-ab0f-0af6b8409edb")
35 halp_flag(fully_custom_item);
36 struct
37 {
38 struct : halp::val_port<"in", ossia::value>
39 {
40 enum widget
41 {
42 control
43 };
44 } port;
45
46 halp::spinbox_i32<"Log", halp::range{1, 100, 1}> log;
47 } inputs;
48
50 {
51 public:
52 boost::container::devector<ossia::value> values;
53
54 Process::ControlInlet* value_inlet;
55 Process::ControlInlet* log_inlet;
56
57 mutable QString txt_cache;
58
59 int logging() const noexcept
60 {
61 return std::max(1, ossia::convert<int>(log_inlet->value()));
62 }
63 Layer(
64 const Process::ProcessModel& process, const Process::Context& doc,
65 QGraphicsItem* parent)
67 {
68 setAcceptedMouseButtons(Qt::NoButton);
69
70 const Process::PortFactoryList& portFactory
72
73 value_inlet = static_cast<Process::ControlInlet*>(process.inlets()[0]);
74 log_inlet = static_cast<Process::ControlInlet*>(process.inlets()[1]);
75
76 auto fact = portFactory.get(value_inlet->concreteKey());
77 auto port = fact->makePortItem(*value_inlet, doc, this, this);
78 port->setPos(0, 5);
79
80 connect(
81 value_inlet, &Process::ControlInlet::executionValueChanged, this,
82 [this](const ossia::value& v) {
83 if(values.size() >= logging())
84 values.pop_back();
85 values.push_front(v);
86 update();
87 });
88
89 connect(
90 log_inlet, &Process::ControlInlet::valueChanged, this,
91 [this](const ossia::value& v) {
92 const int N = std::max(1, ossia::convert<int>(v));
93 if(values.size() >= N)
94 values.resize(N);
95 update();
96 });
97 }
98
99 void reset()
100 {
101 values.clear();
102 update();
103 }
104
105 void paint_impl(QPainter* p) const override
106 {
107 if(values.empty())
108 return;
109
110 p->setRenderHint(QPainter::Antialiasing, true);
111 p->setPen(score::Skin::instance().Light.main.pen1_solid_flat_miter);
112
113 {
114 txt_cache.clear();
115 for(auto& line : this->values)
116 txt_cache += QString::fromStdString(fmt::format("{}\n", line));
117 p->drawText(boundingRect().adjusted(10, 0, 0, 0), txt_cache);
118 }
119
120 p->setRenderHint(QPainter::Antialiasing, false);
121 }
122 };
123
125 {
126 using Process::EffectLayerPresenter::EffectLayerPresenter;
127 void fillContextMenu(
128 QMenu& menu, QPoint pos, QPointF scenepos,
129 const Process::LayerContextMenuManager& ) override
130 {
131 auto cp = menu.addAction(tr("Copy value"));
132 connect(cp, &QAction::triggered, this, [this] {
133 auto& v = *static_cast<Layer*>(this->m_view);
134 qApp->clipboard()->setText(v.txt_cache);
135 });
136 }
137 };
138};
139}
Definition Port.hpp:205
Definition EffectLayer.hpp:32
Definition EffectLayer.hpp:16
Definition LayerContextMenu.hpp:38
Definition PortFactory.hpp:82
The Process class.
Definition score-lib-process/Process/Process.hpp:61
FactoryType * get(const key_type &k) const noexcept
Get a particular factory from its ConcreteKey.
Definition InterfaceList.hpp:128
Definition ProcessContext.hpp:12
Definition ValueDisplay.hpp:50
Definition ValueDisplay.hpp:125
Definition ValueDisplay.hpp:27
const T & interfaces() const
Access to a specific interface list.
Definition ApplicationContext.hpp:67