50 , m_context{m_context}
55 void createPreset(QPointF pos,
const QByteArray& presetData)
58 if(
auto preset = Process::Preset::fromJson(procs, presetData))
60 Scenario::loadPresetInCable(m_context, sm, *preset, cable);
66 Scenario::createProcessInCable(
67 m_context, sm, proc.creation, proc.duration, proc.setup, cable);
70 void drop(
const QPointF& pos,
const QMimeData& mime)
73 auto source_itv = Scenario::closestParentInterval(&source);
78 m_interval = source_itv;
86 if(mime.hasFormat(score::mime::layerdata()))
90 else if(mime.hasFormat(score::mime::processpreset()))
92 const auto presetData = mime.data(score::mime::processpreset());
94 QMetaObject::invokeMethod(
this, [pos, presetData,
this]() {
95 createPreset(pos, presetData);
96 }, Qt::QueuedConnection);
98 else if(
auto res = handlers.getDrop(mime, m_context); !res.empty())
102 QMetaObject::invokeMethod(
this, [pos, proc = res.front(),
this]() {
103 createProcess(pos, proc);
104 }, Qt::QueuedConnection);
107 else if(mime.hasFormat(score::mime::port()))
109 auto base_port = Dataflow::PortItem::clickedPort;
112 auto& new_port = base_port->port();
113 QMetaObject::invokeMethod(
this, [&new_port,
this]() {
114 Dataflow::replaceCable(this->m_context, cable, new_port);
115 }, Qt::QueuedConnection);
118 else if(mime.hasUrls())
124 qDebug()<<mime.formats();
134 QPointer<const Process::NodeItem> item;
142 , m_context{m_context}
147 void createPreset(
const QByteArray& presetData)
151 auto& old = item->model();
153 if(
auto preset = Process::Preset::fromJson(procs, presetData))
155 if(preset->key.key == old.concreteKey())
157 if(old.effect() == preset->data)
160 auto& load_preset_ifaces
163 auto cmd = load_preset_ifaces.
make(
164 &Process::LoadPresetCommandFactory::make, old, *preset, m_context);
173 if(
auto p = m.loadProcessFromPreset(*m_interval, *preset, old.position()))
175 linkNewProcess(p, m);
176 m.removeProcess(*m_interval, old.id());
186 auto& old = item->model();
190 if(
auto p = m.createProcessInNewSlot(*m_interval, proc.creation, old.position()))
193 proc.setup(*p, disp);
196 linkNewProcess(p, m);
199 m.removeProcess(*m_interval, old.id());
209 auto& old = item->model();
210 if(p->inlets().size() > 0)
212 const auto dst = p->inlets()[0];
213 const auto type = dst->type();
215 if(old.inlets().size() > 0)
217 auto& old_dst = old.inlets()[0];
218 if(old_dst->type() == type && !qobject_cast<Process::ControlInlet*>(dst)
219 && !qobject_cast<Process::ControlInlet*>(old_dst))
221 for(
auto& edge : old.inlets()[0]->cables())
223 auto& cable = edge.find(m_context);
224 auto* src = cable.source().try_find(m_context);
225 if(src && src->type() == type)
227 m.createCable(sm, *src, *dst, cable.type());
230 m.setProperty<Process::Port::p_address>(*dst, old_dst->address());
235 if(p->outlets().size() > 0)
237 const auto src = p->outlets()[0];
238 const auto type = src->type();
240 if(old.outlets().size() > 0)
242 auto& old_src = old.outlets()[0];
243 if(old_src->type() == type && !qobject_cast<Process::ControlInlet*>(src)
244 && !qobject_cast<Process::ControlInlet*>(old_src))
246 for(
auto& edge : old.outlets()[0]->cables())
248 auto& cable = edge.find(m_context);
249 auto* dst = cable.sink().try_find(m_context);
250 if(dst && dst->type() == type)
252 m.createCable(sm, *src, *dst, cable.type());
255 m.setProperty<Process::Port::p_address>(*src, old_src->address());
256 if(type == Process::PortType::Audio)
258 auto old_audio_src = safe_cast<Process::AudioOutlet*>(old_src);
259 auto audio_src = safe_cast<Process::AudioOutlet*>(src);
260 m.setProperty<Process::AudioOutlet::p_propagate>(
261 *audio_src, old_audio_src->propagate());
264 src->setAddress(old_src->address());
269 relinkNamedPorts(p, m);
280 auto& old = item->model();
282 const auto new_in_count = p->inlets().size();
283 const auto old_in_count = old.inlets().size();
284 for(std::size_t i = 1; i < old_in_count; ++i)
286 auto* old_in = old.inlets()[i];
288 for(std::size_t j = 1; j < new_in_count; ++j)
290 auto* candidate = p->inlets()[j];
291 if(candidate->name() == old_in->name()
292 && candidate->type() == old_in->type())
301 const auto type = dst->type();
302 for(
auto& edge : old_in->cables())
304 auto& cable = edge.find(m_context);
305 auto* src = cable.source().try_find(m_context);
306 if(src && src->type() == type)
308 m.createCable(sm, *src, *dst, cable.type());
311 m.setProperty<Process::Port::p_address>(*dst, old_in->address());
314 const auto new_out_count = p->outlets().size();
315 const auto old_out_count = old.outlets().size();
316 for(std::size_t i = 1; i < old_out_count; ++i)
318 auto* old_out = old.outlets()[i];
320 for(std::size_t j = 1; j < new_out_count; ++j)
322 auto* candidate = p->outlets()[j];
323 if(candidate->name() == old_out->name()
324 && candidate->type() == old_out->type())
333 const auto type = src->type();
334 for(
auto& edge : old_out->cables())
336 auto& cable = edge.find(m_context);
337 auto* dst = cable.sink().try_find(m_context);
338 if(dst && dst->type() == type)
340 m.createCable(sm, *src, *dst, cable.type());
343 m.setProperty<Process::Port::p_address>(*src, old_out->address());
344 if(type == Process::PortType::Audio)
346 auto* old_audio = qobject_cast<Process::AudioOutlet*>(old_out);
347 auto* new_audio = qobject_cast<Process::AudioOutlet*>(src);
348 if(old_audio && new_audio)
350 m.setProperty<Process::AudioOutlet::p_propagate>(
351 *new_audio, old_audio->propagate());
354 src->setAddress(old_out->address());
358 void drop(
const QMimeData& mime)
363 auto& model = item->model();
364 m_interval = qobject_cast<Scenario::IntervalModel*>(model.parent());
374 if(mime.hasFormat(score::mime::layerdata()))
378 else if(mime.hasFormat(score::mime::processpreset()))
380 const auto presetData = mime.data(score::mime::processpreset());
381 QMetaObject::invokeMethod(
this, [presetData,
this]() {
382 createPreset(presetData);
383 }, Qt::QueuedConnection);
385 else if(
auto res = handlers.getDrop(mime, m_context); !res.empty())
389 QMetaObject::invokeMethod(
this, [proc = res.front(),
this]() {
391 }, Qt::QueuedConnection);
394 else if(mime.hasUrls())