Loading...
Searching...
No Matches
LayerHelpers.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#include <Process/ProcessContext.hpp>
7
8#include <score/application/GUIApplicationContext.hpp>
9
10#include <ossia/network/value/value_conversion.hpp>
11
12#include <Process/Commands/SetControlValue.hpp>
13
14#include <score/command/Dispatchers/MultiOngoingCommandDispatcher.hpp>
15
16#include <QElapsedTimer>
17#include <QGraphicsItem>
18#include <QGraphicsSceneMouseEvent>
19#include <QGuiApplication>
20#include <QLineF>
21#include <QStyleHints>
22
23#include <Ui/Monitor/ModeSwitch.hpp>
24
25#include <algorithm>
26
31namespace Ui::Monitor
32{
35inline const Process::ControlInlet*
36controlInlet(const Process::ProcessModel& p, std::size_t index) noexcept
37{
38 if(index < p.inlets().size())
39 return qobject_cast<const Process::ControlInlet*>(p.inlets()[index]);
40 return nullptr;
41}
42
43template <typename E>
44E enumValue(const Process::ControlInlet* c, E fallback, E last) noexcept
45{
46 if(!c)
47 return fallback;
48 return static_cast<E>(std::clamp(ossia::convert<int>(c->value()), 0, int(last)));
49}
50
51inline float floatValue(const Process::ControlInlet* c, float fallback) noexcept
52{
53 return c ? ossia::convert<float>(c->value()) : fallback;
54}
55
56inline bool boolValue(const Process::ControlInlet* c, bool fallback) noexcept
57{
58 return c ? ossia::convert<bool>(c->value()) : fallback;
59}
60
63inline void showInlet(
64 const Process::ProcessModel& p, std::size_t index, const Process::Context& doc,
65 QGraphicsItem* parent, QObject* owner, double y = 5.)
66{
67 if(index >= p.inlets().size())
68 return;
69 auto* inlet = p.inlets()[index];
70 const auto& factories = doc.app.interfaces<Process::PortFactoryList>();
71 if(auto fact = factories.get(inlet->concreteKey()))
72 if(auto port = fact->makePortItem(*inlet, doc, parent, owner))
73 port->setPos(0, y);
74}
75
77template <typename Item, typename... C>
78void repaintOn(Item* item, C*... controls)
79{
80 for(const Process::ControlInlet* c : {controls...})
81 if(c)
82 QObject::connect(
83 c, &Process::ControlInlet::valueChanged, item, [item] { item->update(); });
84}
85
94{
95public:
96 bool operator()(const QGraphicsSceneMouseEvent& ev)
97 {
98 if(ev.button() != Qt::LeftButton)
99 return false;
100 const bool second
101 = m_last.isValid()
102 && m_last.elapsed() < QGuiApplication::styleHints()->mouseDoubleClickInterval()
103 && QLineF(ev.screenPos(), m_pos).length() < 6.;
104 if(second)
105 {
106 m_last.invalidate();
107 return true;
108 }
109 m_last.restart();
110 m_pos = ev.screenPos();
111 return false;
112 }
113
114private:
115 QElapsedTimer m_last;
116 QPoint m_pos;
117};
118
120inline void setControls(
121 const score::CommandStackFacade& stack,
122 std::initializer_list<std::pair<const Process::ControlInlet*, ossia::value>> values)
123{
125 bool any = false;
126 for(const auto& [c, v] : values)
127 if(c)
128 {
129 disp.submit(new Process::SetControlValue{*c, v});
130 any = true;
131 }
132 if(any)
133 disp.commit<Process::SetControlValues>();
134}
135}
The MultiOngoingCommandDispatcher class.
Definition MultiOngoingCommandDispatcher.hpp:37
Definition Port.hpp:242
Definition PortFactory.hpp:110
The Process class.
Definition score-lib-process/Process/Process.hpp:82
Definition SetControlValue.hpp:14
Several controls changed by one gesture: one undo step.
Definition SetControlValue.hpp:38
Definition LayerHelpers.hpp:94
A small abstraction layer over the score::CommandStack.
Definition CommandStackFacade.hpp:21
Definition BufferDecode.hpp:16
void repaintOn(Item *item, C *... controls)
Repaints item whenever one of the given controls changes in the model.
Definition LayerHelpers.hpp:78
const Process::ControlInlet * controlInlet(const Process::ProcessModel &p, std::size_t index) noexcept
Definition LayerHelpers.hpp:36
void showInlet(const Process::ProcessModel &p, std::size_t index, const Process::Context &doc, QGraphicsItem *parent, QObject *owner, double y=5.)
Definition LayerHelpers.hpp:63
void setControls(const score::CommandStackFacade &stack, std::initializer_list< std::pair< const Process::ControlInlet *, ossia::value > > values)
Sets several controls as one undoable edit.
Definition LayerHelpers.hpp:120
Definition ProcessContext.hpp:12
const T & interfaces() const
Access to a specific interface list.
Definition ApplicationContext.hpp:87