2 #include <Process/Dataflow/Port.hpp>
3 #include <Process/Process.hpp>
4 #include <Process/Script/ScriptEditor.hpp>
5 #include <Process/Script/ScriptProcess.hpp>
7 #include <Scenario/Document/ScenarioDocument/ScenarioDocumentModel.hpp>
9 #include <Dataflow/Commands/CableHelpers.hpp>
11 #include <ossia/detail/algorithms.hpp>
17 Process::PortType type;
21 template <
typename Process_T,
typename Property_T>
25 using param_type =
typename Property_T::param_type;
26 using score::Command::Command;
30 , m_newScript{std::move(newScript)}
31 , m_oldScript{(model.*Property_T::get)()}
33 m_oldCables = Dataflow::saveCables({
const_cast<Process_T*
>(&model)}, ctx);
35 for(
auto& port : model.inlets())
36 m_oldInlets.emplace_back(
SavedPort{port->name(), port->type(), port->saveData()});
37 for(
auto& port : model.outlets())
38 m_oldOutlets.emplace_back(
SavedPort{port->name(), port->type(), port->saveData()});
44 auto& cmt = m_path.find(ctx);
47 Dataflow::removeCables(m_oldCables, ctx);
55 SCORE_ASSERT(m_oldInlets.size() == cmt.inlets().size());
56 SCORE_ASSERT(m_oldOutlets.size() == cmt.outlets().size());
59 for(std::size_t i = 0; i < m_oldInlets.size(); i++)
61 cmt.inlets()[i]->loadData(m_oldInlets[i].data);
63 for(std::size_t i = 0; i < m_oldOutlets.size(); i++)
65 cmt.outlets()[i]->loadData(m_oldOutlets[i].data);
69 Dataflow::restoreCables(m_oldCables, ctx);
72 if constexpr(requires { cmt.isGpu(); })
77 static
void restoreCables(
79 const
score::DocumentContext& ctx, const Dataflow::SerializedCables& cables)
81 for(
auto& cable : new_p.cables())
83 SCORE_ASSERT(!cable.unsafePath().vec().empty());
84 auto cable_id = cable.unsafePath().vec().back().id();
85 auto it = ossia::find_if(
86 cables, [cable_id](
auto& c) {
return c.first.val() == cable_id; });
88 SCORE_ASSERT(it != cables.end());
89 SCORE_ASSERT(doc.cables.find(it->first) == doc.cables.end());
93 c->source().find(ctx).addCable(*c);
97 static void restoreCables(
101 for(
auto& cable : new_p.cables())
103 SCORE_ASSERT(!cable.unsafePath().vec().empty());
104 auto cable_id = cable.unsafePath().vec().back().id();
105 auto it = ossia::find_if(
106 cables, [cable_id](
auto& c) {
return c.first.val() == cable_id; });
108 SCORE_ASSERT(it != cables.end());
109 SCORE_ASSERT(doc.cables.find(it->first) == doc.cables.end());
113 c->sink().find(ctx).addCable(*c);
120 Dataflow::removeCables(m_oldCables, ctx);
122 auto& cmt = m_path.find(ctx);
124 cmt.programChanged();
127 auto& doc = score::IDocument::get<Scenario::ScenarioDocumentModel>(ctx.document);
129 std::size_t min_inlets = std::min(m_oldInlets.size(), cmt.inlets().size());
130 std::size_t min_outlets = std::min(m_oldOutlets.size(), cmt.outlets().size());
131 for(std::size_t i = 0; i < min_inlets; i++)
133 auto new_p = cmt.inlets()[i];
134 auto& old_p = m_oldInlets[i];
136 if(new_p->type() == old_p.type && new_p->name() == old_p.name)
138 new_p->loadData(old_p.data);
139 restoreCables(*new_p, doc, ctx, m_oldCables);
143 for(std::size_t i = 0; i < min_outlets; i++)
145 auto new_p = cmt.outlets()[i];
146 auto& old_p = m_oldOutlets[i];
148 if(new_p->type() == old_p.type && new_p->name() == old_p.name)
150 new_p->loadData(old_p.data);
151 restoreCables(*new_p, doc, ctx, m_oldCables);
156 cmt.outletsChanged();
157 if constexpr(requires { cmt.isGpu(); })
159 cmt.programChanged();
168 s << m_path << m_newScript << m_oldScript << m_oldInlets << m_oldOutlets
174 s >> m_path >> m_newScript >> m_oldScript >> m_oldInlets >> m_oldOutlets
179 param_type m_newScript;
180 param_type m_oldScript;
182 std::vector<SavedPort> m_oldInlets, m_oldOutlets;
184 Dataflow::SerializedCables m_oldCables;
189 struct is_custom_serialized<
Scenario::SavedPort> : std::true_type
198 s.stream() << tv.name << tv.type << tv.data;
203 s.stream() >> tv.name >> tv.type >> tv.data;
Definition: VisitorInterface.hpp:53
Definition: DataStreamVisitor.hpp:27
Definition: DataStreamVisitor.hpp:202
Definition: score-lib-process/Process/Dataflow/Port.hpp:264
Definition: ScriptEditCommand.hpp:23
Definition: ScenarioDocumentModel.hpp:29
The Command class.
Definition: Command.hpp:34
Base classes and tools to implement processes and layers.
Definition: JSONVisitor.hpp:1324
Main plug-in of score.
Definition: score-plugin-dataflow/Dataflow/PortItem.hpp:14
Base toolkit upon which the software is built.
Definition: Application.cpp:90
Definition: DataStreamHelpers.hpp:103
Definition: ScriptProcess.hpp:14
Definition: ScriptEditCommand.hpp:15
Definition: VisitorInterface.hpp:13
Definition: DocumentContext.hpp:18