51 , m_context{m_context}
56 void createPreset(QPointF pos,
const QByteArray& presetData)
59 if(
auto preset = Process::Preset::fromJson(procs, presetData))
61 Scenario::loadPresetInCable(m_context, sm, *preset, cable);
67 Scenario::createProcessInCable(
68 m_context, sm, proc.creation, proc.duration, proc.setup, cable);
71 void drop(
const QPointF& pos,
const QMimeData& mime)
74 auto source_itv = Scenario::closestParentInterval(&source);
79 m_interval = source_itv;
87 if(mime.hasFormat(score::mime::layerdata()))
91 else if(mime.hasFormat(score::mime::processpreset()))
93 const auto presetData = mime.data(score::mime::processpreset());
95 QMetaObject::invokeMethod(
this, [pos, presetData,
this]() {
96 createPreset(pos, presetData);
97 }, Qt::QueuedConnection);
99 else if(
auto res = handlers.getDrop(mime, m_context); !res.empty())
103 QMetaObject::invokeMethod(
this, [pos, proc = res.front(),
this]() {
104 createProcess(pos, proc);
105 }, Qt::QueuedConnection);
108 else if(mime.hasFormat(score::mime::port()))
112 auto base_port = Dataflow::portDragMovedCables().empty()
113 ? Dataflow::PortItem::clickedPort
117 auto& new_port = base_port->port();
118 QMetaObject::invokeMethod(
this, [&new_port,
this]() {
119 Dataflow::replaceCable(this->m_context, cable, new_port);
120 }, Qt::QueuedConnection);
123 else if(mime.hasUrls())
129 qDebug()<<mime.formats();
139 QPointer<const Process::NodeItem> item;
147 , m_context{m_context}
152 void createPreset(
const QByteArray& presetData)
156 auto& old = item->model();
158 if(
auto preset = Process::Preset::fromJson(procs, presetData))
160 if(preset->key.key == old.concreteKey())
162 if(old.effect() == preset->data)
165 auto& load_preset_ifaces
168 auto cmd = load_preset_ifaces.
make(
169 &Process::LoadPresetCommandFactory::make, old, *preset, m_context);
178 if(
auto p = m.loadProcessFromPreset(*m_interval, *preset, old.position()))
180 linkNewProcess(p, m);
182 m.removeProcess(*m_interval, old.id());
196 if(!item->model().folded())
197 m.setProperty<Process::ProcessModel::p_foldMode>(*p, Process::FoldMode::Unfolded);
204 auto& old = item->model();
208 if(
auto p = m.createProcessInNewSlot(*m_interval, proc.creation, old.position()))
211 proc.setup(*p, disp);
214 linkNewProcess(p, m);
218 m.removeProcess(*m_interval, old.id());
228 auto& old = item->model();
229 if(p->inlets().size() > 0)
231 const auto dst = p->inlets()[0];
232 const auto type = dst->type();
234 if(old.inlets().size() > 0)
236 auto& old_dst = old.inlets()[0];
237 if(old_dst->type() == type && !qobject_cast<Process::ControlInlet*>(dst)
238 && !qobject_cast<Process::ControlInlet*>(old_dst))
240 for(
auto& edge : old.inlets()[0]->cables())
242 auto& cable = edge.find(m_context);
243 auto* src = cable.source().try_find(m_context);
244 if(src && src->type() == type)
246 m.createCable(sm, *src, *dst, cable.type());
249 m.setProperty<Process::Port::p_address>(*dst, old_dst->address());
254 if(p->outlets().size() > 0)
256 const auto src = p->outlets()[0];
257 const auto type = src->type();
259 if(old.outlets().size() > 0)
261 auto& old_src = old.outlets()[0];
262 if(old_src->type() == type && !qobject_cast<Process::ControlInlet*>(src)
263 && !qobject_cast<Process::ControlInlet*>(old_src))
265 for(
auto& edge : old.outlets()[0]->cables())
267 auto& cable = edge.find(m_context);
268 auto* dst = cable.sink().try_find(m_context);
269 if(dst && dst->type() == type)
271 m.createCable(sm, *src, *dst, cable.type());
274 m.setProperty<Process::Port::p_address>(*src, old_src->address());
275 if(type == Process::PortType::Audio)
277 auto old_audio_src = safe_cast<Process::AudioOutlet*>(old_src);
278 auto audio_src = safe_cast<Process::AudioOutlet*>(src);
279 m.setProperty<Process::AudioOutlet::p_propagate>(
280 *audio_src, old_audio_src->propagate());
283 src->setAddress(old_src->address());
288 relinkNamedPorts(p, m);
299 auto& old = item->model();
301 const auto new_in_count = p->inlets().size();
302 const auto old_in_count = old.inlets().size();
303 for(std::size_t i = 1; i < old_in_count; ++i)
305 auto* old_in = old.inlets()[i];
307 for(std::size_t j = 1; j < new_in_count; ++j)
309 auto* candidate = p->inlets()[j];
310 if(candidate->name() == old_in->name()
311 && candidate->type() == old_in->type())
320 const auto type = dst->type();
321 for(
auto& edge : old_in->cables())
323 auto& cable = edge.find(m_context);
324 auto* src = cable.source().try_find(m_context);
325 if(src && src->type() == type)
327 m.createCable(sm, *src, *dst, cable.type());
330 m.setProperty<Process::Port::p_address>(*dst, old_in->address());
333 const auto new_out_count = p->outlets().size();
334 const auto old_out_count = old.outlets().size();
335 for(std::size_t i = 1; i < old_out_count; ++i)
337 auto* old_out = old.outlets()[i];
339 for(std::size_t j = 1; j < new_out_count; ++j)
341 auto* candidate = p->outlets()[j];
342 if(candidate->name() == old_out->name()
343 && candidate->type() == old_out->type())
352 const auto type = src->type();
353 for(
auto& edge : old_out->cables())
355 auto& cable = edge.find(m_context);
356 auto* dst = cable.sink().try_find(m_context);
357 if(dst && dst->type() == type)
359 m.createCable(sm, *src, *dst, cable.type());
362 m.setProperty<Process::Port::p_address>(*src, old_out->address());
363 if(type == Process::PortType::Audio)
365 auto* old_audio = qobject_cast<Process::AudioOutlet*>(old_out);
366 auto* new_audio = qobject_cast<Process::AudioOutlet*>(src);
367 if(old_audio && new_audio)
369 m.setProperty<Process::AudioOutlet::p_propagate>(
370 *new_audio, old_audio->propagate());
373 src->setAddress(old_out->address());
377 void drop(
const QMimeData& mime)
382 auto& model = item->model();
383 m_interval = qobject_cast<Scenario::IntervalModel*>(model.parent());
393 if(mime.hasFormat(score::mime::layerdata()))
397 else if(mime.hasFormat(score::mime::processpreset()))
399 const auto presetData = mime.data(score::mime::processpreset());
400 QMetaObject::invokeMethod(
this, [presetData,
this]() {
401 createPreset(presetData);
402 }, Qt::QueuedConnection);
404 else if(
auto res = handlers.getDrop(mime, m_context); !res.empty())
408 QMetaObject::invokeMethod(
this, [proc = res.front(),
this]() {
410 }, Qt::QueuedConnection);
413 else if(mime.hasUrls())