31 if(!f.open(QIODevice::ReadOnly))
36 auto [_, desc] = isf::parser::parse_isf_header(score::readFileAsString(f));
37 if(desc.credits.starts_with(
"Automatically converted from "))
38 desc.credits = desc.credits.substr(strlen(
"Automatically converted from "));
39 else if(desc.credits.starts_with(
"by "))
40 desc.credits = desc.credits.substr(strlen(
"by "));
41 if(!desc.credits.empty())
42 base.author = QString::fromStdString(desc.credits);
43 if(!desc.description.empty())
44 base.description = QString::fromStdString(desc.description);
45 for(
auto& cat : desc.categories)
46 base.tags.push_back(QString::fromStdString(cat));
56 static void setupISFModelPorts(
57 T& self,
const isf::descriptor& desc,
58 const ossia::flat_map<QString, ossia::value>& previous_values)
77 const ossia::flat_map<QString, ossia::value>& previous_values;
78 const isf::input& input;
84 auto nm = QString::fromStdString(input.name);
85 auto port =
new Process::FloatSlider(
88 self.m_inlets.push_back(port);
89 if(
auto it = previous_values.find(nm);
90 it != previous_values.end()
91 && it->second.get_type() == ossia::val_type::FLOAT)
92 port->setValue(it->second);
94 self.controlAdded(port->id());
100 auto nm = QString::fromStdString(input.name);
102 std::vector<std::pair<QString, ossia::value>> alternatives;
103 if(v.labels.size() == v.values.size())
106 for(std::size_t value_idx = 0; value_idx < v.values.size(); value_idx++)
108 auto& val = v.values[value_idx];
109 if(
auto int_ptr = ossia::get_if<int64_t>(&val))
111 alternatives.emplace_back(
112 QString::fromStdString(v.labels[value_idx]),
int(*int_ptr));
114 else if(
auto dbl_ptr = ossia::get_if<double>(&val))
116 alternatives.emplace_back(
117 QString::fromStdString(v.labels[value_idx]),
int(*dbl_ptr));
121 alternatives.emplace_back(
122 QString::fromStdString(v.labels[value_idx]),
int(value_idx));
128 for(std::size_t value_idx = 0; value_idx < v.values.size(); value_idx++)
130 auto& val = v.values[value_idx];
131 if(
auto int_ptr = ossia::get_if<int64_t>(&val))
133 alternatives.emplace_back(QString::number(*int_ptr),
int(*int_ptr));
135 else if(
auto dbl_ptr = ossia::get_if<double>(&val))
137 alternatives.emplace_back(QString::number(*dbl_ptr),
int(*dbl_ptr));
139 else if(
auto str_ptr = ossia::get_if<std::string>(&val))
141 alternatives.emplace_back(
142 QString::fromStdString(*str_ptr),
int(value_idx));
147 if(alternatives.empty())
149 alternatives.emplace_back(
"0", 0);
150 alternatives.emplace_back(
"1", 1);
151 alternatives.emplace_back(
"2", 2);
154 auto port =
new Process::ComboBox(
157 if(
auto it = previous_values.find(nm);
158 it != previous_values.end()
159 && it->second.get_type() == port->value().get_type())
160 port->setValue(it->second);
162 self.m_inlets.push_back(port);
163 self.controlAdded(port->id());
169 auto nm = QString::fromStdString(input.name);
172 self.m_inlets.push_back(port);
173 self.controlAdded(port->id());
179 auto nm = QString::fromStdString(input.name);
182 if(
auto it = previous_values.find(nm);
183 it != previous_values.end()
184 && it->second.get_type() == port->value().get_type())
185 port->setValue(it->second);
187 self.m_inlets.push_back(port);
188 self.controlAdded(port->id());
194 auto nm = QString::fromStdString(input.name);
195 ossia::vec2f min{-100., -100.};
196 ossia::vec2f max{100., 100.};
197 ossia::vec2f init{0.0, 0.0};
199 std::copy_n(v.def->begin(), 2, init.begin());
201 std::copy_n(v.min->begin(), 2, min.begin());
203 std::copy_n(v.max->begin(), 2, max.begin());
204 auto port =
new Process::XYSpinboxes{
207 auto& ctx = score::IDocument::documentContext(self);
208 auto& device_plug = ctx.template plugin<Explorer::DeviceDocumentPlugin>();
210 QString firstWindowDeviceName;
211 for(
auto dev : list.devices())
213 if(
auto win = qobject_cast<WindowDevice*>(dev))
215 firstWindowDeviceName = win->name();
220 if(!firstWindowDeviceName.isEmpty())
222 if(nm.contains(
"iMouse"))
226 else if(nm.contains(
"mouse", Qt::CaseInsensitive))
232 if(
auto it = previous_values.find(nm);
233 it != previous_values.end()
234 && it->second.get_type() == port->value().get_type())
235 port->setValue(it->second);
237 self.m_inlets.push_back(port);
238 self.controlAdded(port->id());
244 auto nm = QString::fromStdString(input.name);
245 ossia::vec3f min{-100., -100., -100.};
246 ossia::vec3f max{100., 100., 100.};
247 ossia::vec3f init{0., 0., 0.};
249 std::copy_n(v.def->begin(), 3, init.begin());
251 std::copy_n(v.min->begin(), 3, min.begin());
253 std::copy_n(v.max->begin(), 3, max.begin());
257 if(
auto it = previous_values.find(nm);
258 it != previous_values.end()
259 && it->second.get_type() == port->value().get_type())
260 port->setValue(it->second);
262 self.m_inlets.push_back(port);
263 self.controlAdded(port->id());
269 auto nm = QString::fromStdString(input.name);
270 ossia::vec4f init{0.5, 0.5, 0.5, 1.};
273 std::copy_n(v.def->begin(), 4, init.begin());
275 auto port =
new Process::HSVSlider(
278 if(
auto it = previous_values.find(nm);
279 it != previous_values.end()
280 && it->second.get_type() == port->value().get_type())
281 port->setValue(it->second);
283 self.m_inlets.push_back(port);
284 self.controlAdded(port->id());
290 port->setName(QString::fromStdString(input.name));
291 self.m_inlets.push_back(port);
297 port->setName(QString::fromStdString(input.name));
298 self.m_inlets.push_back(port);
304 port->setName(QString::fromStdString(input.name));
305 self.m_inlets.push_back(port);
311 port->setName(QString::fromStdString(input.name));
312 self.m_inlets.push_back(port);
317 Process::Inlet* operator()(
const storage_input& v) {
return nullptr; }
318 Process::Inlet* operator()(
const texture_input& v) {
return nullptr; }
319 Process::Inlet* operator()(
const csf_image_input& v) {
return nullptr; }
322 for(
const isf::input& input : desc.inputs)
324 ossia::visit(input_vis{previous_values, input, i, self}, input.data);