Loading...
Searching...
No Matches
Process/Execution/ProcessComponent.hpp
1#pragma once
2#include <Process/ExecutionComponent.hpp>
3#include <Process/ExecutionContext.hpp>
4#include <Process/ExecutionTransaction.hpp>
5#include <Process/Process.hpp>
6#include <Process/ProcessComponent.hpp>
7
8#include <score/model/ComponentFactory.hpp>
9#include <score/plugins/ModelFactory.hpp>
10
11#include <ossia/dataflow/graph_node.hpp>
12#include <ossia/editor/scenario/time_process.hpp>
13
14#include <QObject>
15
16#include <score_lib_process_export.h>
17
18#include <memory>
19#include <verdigris>
20
21#if __cpp_lib_concepts >= 202002L
22#include <concepts>
23#endif
24
25namespace ossia
26{
27class scenario;
28class time_process;
29}
30
31namespace Execution
32{
33struct Context;
34struct Transaction;
35template <typename T>
36class InvalidProcessException : public std::runtime_error
37{
38public:
39 InvalidProcessException(const QString& s)
40 : std::runtime_error{(Metadata<PrettyName_k, T>::get() + ": " + s).toStdString()}
41 {
42 }
43};
44
45class SCORE_LIB_PROCESS_EXPORT ProcessComponent
46 : public Process::GenericProcessComponent<const Context>
47 , public std::enable_shared_from_this<ProcessComponent>
48{
49 W_OBJECT(ProcessComponent)
50 ABSTRACT_COMPONENT_METADATA(
51 Execution::ProcessComponent, "d0f714de-c832-42d8-a605-60f5ffd0b7af")
52
53public:
54 static constexpr bool is_unique = true;
55
57 Process::ProcessModel& proc, const Context& ctx, const QString& name,
58 QObject* parent);
59
61 virtual void lazy_init();
62
63 virtual ~ProcessComponent();
64
65 virtual void cleanup();
66 virtual void stop()
67 {
68 process().setExecuting(false);
69 process().stopExecution();
70 }
71
72 const std::shared_ptr<ossia::time_process>& OSSIAProcessPtr()
73 {
74 return m_ossia_process;
75 }
76 ossia::time_process& OSSIAProcess() const { return *m_ossia_process; }
77
78 std::shared_ptr<ossia::graph_node> node;
79
80public:
81 void nodeChanged(
82 const ossia::node_ptr& old_node, const ossia::node_ptr& new_node,
83 Execution::Transaction* commands)
84 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, nodeChanged, old_node, new_node, commands)
85
86
91 void portsReplaced(Execution::Transaction* commands)
92 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, portsReplaced, commands)
93
94protected:
95 std::shared_ptr<ossia::time_process> m_ossia_process;
96};
97
98template <typename Process_T, typename OSSIA_Process_T>
100 : public Process::GenericProcessComponent_T<ProcessComponent, Process_T>
101{
103 ProcessComponent, Process_T>::GenericProcessComponent_T;
104
105 OSSIA_Process_T& OSSIAProcess() const
106 {
107 return static_cast<OSSIA_Process_T&>(ProcessComponent::OSSIAProcess());
108 }
109};
110
111class SCORE_LIB_PROCESS_EXPORT ProcessComponentFactory
113 Process::ProcessModel, Execution::Context, Execution::ProcessComponentFactory>
114{
115 SCORE_ABSTRACT_COMPONENT_FACTORY(Execution::ProcessComponent)
116public:
117 virtual ~ProcessComponentFactory() override;
118 virtual std::shared_ptr<ProcessComponent>
119 make(Process::ProcessModel& proc, const Context& ctx, QObject* parent) const = 0;
120};
121
122template <typename ProcessComponent_T>
123#if __cpp_lib_concepts >= 202002L
124requires std::constructible_from<
125 ProcessComponent_T, typename ProcessComponent_T::model_type&, const Context&,
126 QObject*>
127#endif
130 ProcessComponent_T, ProcessComponentFactory>
131{
132public:
133 using model_type = typename ProcessComponent_T::model_type;
134 std::shared_ptr<ProcessComponent> make(
135 Process::ProcessModel& proc, const Context& ctx,
136 QObject* parent) const final override
137 {
138 try
139 {
140#if defined(SCORE_DEBUG)
141 // A bit slower but really makes backtraces simpler
142 auto comp = std::shared_ptr<ProcessComponent_T>(
143 new ProcessComponent_T{static_cast<model_type&>(proc), ctx, parent});
144#else
145 auto comp = std::make_shared<ProcessComponent_T>(
146 static_cast<model_type&>(proc), ctx, parent);
147#endif
148 comp->lazy_init();
149 return comp;
150 }
151 catch(const std::runtime_error& e)
152 {
153 qDebug() << "Error during plug-in creation: " << e.what();
154 return {};
155 }
156 catch(...)
157 {
158 return {};
159 }
160 }
161};
162
163class SCORE_LIB_PROCESS_EXPORT ProcessComponentFactoryList final
165 Process::ProcessModel, Execution::Context, Execution::ProcessComponentFactory>
166{
167public:
169};
170}
171
172W_REGISTER_ARGTYPE(ossia::node_ptr)
173Q_DECLARE_METATYPE(std::shared_ptr<Execution::ProcessComponent>)
174W_REGISTER_ARGTYPE(std::shared_ptr<Execution::ProcessComponent>)
175W_REGISTER_ARGTYPE(const std::shared_ptr<Execution::ProcessComponent>&)
Definition Process/Execution/ProcessComponent.hpp:37
Definition Process/Execution/ProcessComponent.hpp:131
Definition Process/Execution/ProcessComponent.hpp:114
Definition Process/Execution/ProcessComponent.hpp:166
Definition Process/Execution/ProcessComponent.hpp:48
Definition Process/ProcessComponent.hpp:34
Definition Process/ProcessComponent.hpp:10
The Process class.
Definition score-lib-process/Process/Process.hpp:75
Definition ComponentFactory.hpp:29
Definition ModelFactory.hpp:8
Definition ComponentFactory.hpp:48
Components used for the execution of a score.
Definition ProcessComponent.cpp:14
Base classes and tools to implement processes and layers.
Definition JSONVisitor.hpp:1115
STL namespace.
Definition ExecutionContext.hpp:196
Definition Process/Execution/ProcessComponent.hpp:101
Definition ExecutionTransaction.hpp:21
Static metadata implementation.
Definition lib/score/tools/Metadata.hpp:36