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()))
110 auto base_port = Dataflow::PortItem::clickedPort;
113 auto& new_port = base_port->port();
114 QMetaObject::invokeMethod(
this, [&new_port,
this]() {
115 Dataflow::replaceCable(this->m_context, cable, new_port);
116 }, Qt::QueuedConnection);
119 else if(mime.hasUrls())
125 qDebug()<<mime.formats();
135 QPointer<const Process::NodeItem> item;
143 , m_context{m_context}
148 void createPreset(
const QByteArray& presetData)
152 auto& old = item->model();
154 if(
auto preset = Process::Preset::fromJson(procs, presetData))
156 if(preset->key.key == old.concreteKey())
158 if(old.effect() == preset->data)
161 auto& load_preset_ifaces
164 auto cmd = load_preset_ifaces.
make(
165 &Process::LoadPresetCommandFactory::make, old, *preset, m_context);
174 if(
auto p = m.loadProcessFromPreset(*m_interval, *preset, old.position()))
176 linkNewProcess(p, m);
178 m.removeProcess(*m_interval, old.id());
192 if(!item->model().folded())
193 m.setProperty<Process::ProcessModel::p_foldMode>(*p, Process::FoldMode::Unfolded);
200 auto& old = item->model();
204 if(
auto p = m.createProcessInNewSlot(*m_interval, proc.creation, old.position()))
207 proc.setup(*p, disp);
210 linkNewProcess(p, m);
214 m.removeProcess(*m_interval, old.id());
224 auto& old = item->model();
225 if(p->inlets().size() > 0)
227 const auto dst = p->inlets()[0];
228 const auto type = dst->type();
230 if(old.inlets().size() > 0)
232 auto& old_dst = old.inlets()[0];
233 if(old_dst->type() == type && !qobject_cast<Process::ControlInlet*>(dst)
234 && !qobject_cast<Process::ControlInlet*>(old_dst))
236 for(
auto& edge : old.inlets()[0]->cables())
238 auto& cable = edge.find(m_context);
239 auto* src = cable.source().try_find(m_context);
240 if(src && src->type() == type)
242 m.createCable(sm, *src, *dst, cable.type());
245 m.setProperty<Process::Port::p_address>(*dst, old_dst->address());
250 if(p->outlets().size() > 0)
252 const auto src = p->outlets()[0];
253 const auto type = src->type();
255 if(old.outlets().size() > 0)
257 auto& old_src = old.outlets()[0];
258 if(old_src->type() == type && !qobject_cast<Process::ControlInlet*>(src)
259 && !qobject_cast<Process::ControlInlet*>(old_src))
261 for(
auto& edge : old.outlets()[0]->cables())
263 auto& cable = edge.find(m_context);
264 auto* dst = cable.sink().try_find(m_context);
265 if(dst && dst->type() == type)
267 m.createCable(sm, *src, *dst, cable.type());
270 m.setProperty<Process::Port::p_address>(*src, old_src->address());
271 if(type == Process::PortType::Audio)
273 auto old_audio_src = safe_cast<Process::AudioOutlet*>(old_src);
274 auto audio_src = safe_cast<Process::AudioOutlet*>(src);
275 m.setProperty<Process::AudioOutlet::p_propagate>(
276 *audio_src, old_audio_src->propagate());
279 src->setAddress(old_src->address());
284 relinkNamedPorts(p, m);
295 auto& old = item->model();
297 const auto new_in_count = p->inlets().size();
298 const auto old_in_count = old.inlets().size();
299 for(std::size_t i = 1; i < old_in_count; ++i)
301 auto* old_in = old.inlets()[i];
303 for(std::size_t j = 1; j < new_in_count; ++j)
305 auto* candidate = p->inlets()[j];
306 if(candidate->name() == old_in->name()
307 && candidate->type() == old_in->type())
316 const auto type = dst->type();
317 for(
auto& edge : old_in->cables())
319 auto& cable = edge.find(m_context);
320 auto* src = cable.source().try_find(m_context);
321 if(src && src->type() == type)
323 m.createCable(sm, *src, *dst, cable.type());
326 m.setProperty<Process::Port::p_address>(*dst, old_in->address());
329 const auto new_out_count = p->outlets().size();
330 const auto old_out_count = old.outlets().size();
331 for(std::size_t i = 1; i < old_out_count; ++i)
333 auto* old_out = old.outlets()[i];
335 for(std::size_t j = 1; j < new_out_count; ++j)
337 auto* candidate = p->outlets()[j];
338 if(candidate->name() == old_out->name()
339 && candidate->type() == old_out->type())
348 const auto type = src->type();
349 for(
auto& edge : old_out->cables())
351 auto& cable = edge.find(m_context);
352 auto* dst = cable.sink().try_find(m_context);
353 if(dst && dst->type() == type)
355 m.createCable(sm, *src, *dst, cable.type());
358 m.setProperty<Process::Port::p_address>(*src, old_out->address());
359 if(type == Process::PortType::Audio)
361 auto* old_audio = qobject_cast<Process::AudioOutlet*>(old_out);
362 auto* new_audio = qobject_cast<Process::AudioOutlet*>(src);
363 if(old_audio && new_audio)
365 m.setProperty<Process::AudioOutlet::p_propagate>(
366 *new_audio, old_audio->propagate());
369 src->setAddress(old_out->address());
373 void drop(
const QMimeData& mime)
378 auto& model = item->model();
379 m_interval = qobject_cast<Scenario::IntervalModel*>(model.parent());
389 if(mime.hasFormat(score::mime::layerdata()))
393 else if(mime.hasFormat(score::mime::processpreset()))
395 const auto presetData = mime.data(score::mime::processpreset());
396 QMetaObject::invokeMethod(
this, [presetData,
this]() {
397 createPreset(presetData);
398 }, Qt::QueuedConnection);
400 else if(
auto res = handlers.getDrop(mime, m_context); !res.empty())
404 QMetaObject::invokeMethod(
this, [proc = res.front(),
this]() {
406 }, Qt::QueuedConnection);
409 else if(mime.hasUrls())