• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

ossia / score / 35416597303

19 Sep 2026 02:45AM UTC coverage: 40.008% (+0.1%) from 39.907%
35416597303

push

github

jcelerier
comments: trim

Keep what explains something hard, drop what restates the code or recounts
what it used to do.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UJxoBxUZoKvE4U9ehBGefA

115353 of 288325 relevant lines covered (40.01%)

77476.2 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

58.77
/src/plugins/score-lib-process/Process/Dataflow/WidgetInlets.cpp
1
#include <Process/Dataflow/WidgetInlets.hpp>
2

3
#include <score/plugins/SerializableHelpers.hpp>
4
#include <score/tools/FileWatch.hpp>
5

6
#include <ossia/dataflow/port.hpp>
7
#include <ossia/detail/parse_strict.hpp>
8
#include <ossia/detail/ssize.hpp>
9
#include <ossia/network/value/value_conversion.hpp>
10

11
#include <ossia-qt/invoke.hpp>
12

13
#include <QCoreApplication>
14
#include <QDir>
15
#include <QFileSystemWatcher>
16

17
#include <cmath>
18
#include <optional>
19

20
#include <wobjectimpl.h>
21

22
W_OBJECT_IMPL(Process::ComboBox)
17,821✔
23
W_OBJECT_IMPL(Process::FileChooserBase)
2✔
24
W_OBJECT_IMPL(Process::FileChooser)
861✔
25
W_OBJECT_IMPL(Process::FolderChooser)
3✔
26
W_OBJECT_IMPL(Process::AudioFileChooser)
3✔
27
W_OBJECT_IMPL(Process::VideoFileChooser)
×
28
W_OBJECT_IMPL(Process::ImpulseButton)
120✔
29
namespace Process
30
{
31
namespace
32
{
33
struct entry_index_visitor
34
{
35
  int n;
36

37
  std::optional<int> operator()(int32_t i) const noexcept
6✔
38
  {
39
    return i >= 0 && i < n ? std::optional<int>(i) : std::nullopt;
6✔
40
  }
41
  std::optional<int> operator()(float f) const noexcept
9✔
42
  {
43
    // Bounded before narrowing: int32_t(1e30f) and int32_t(NaN) are undefined.
44
    // Whole numbers only, so a float and the same number spelled as a string
45
    // agree, and nothing in (-1, 1) truncates onto the first entry.
46
    const double d = f;
9✔
47
    if(!(d >= 0. && d < double(n)) || d != std::floor(d))
9✔
48
      return std::nullopt;
7✔
49
    return std::optional<int>(int(d));
2✔
50
  }
9✔
51
  std::optional<int> operator()(const std::string& s) const noexcept
6✔
52
  {
53
    // Exactly the digits a coerced integer becomes, not even surrounding
54
    // blanks: anything looser eats names that merely begin with a number.
55
    const auto parsed = ossia::parse_strict<int64_t>(s);
6✔
56
    if(!parsed)
6✔
57
      return std::nullopt;
4✔
58
    // Bounded here: narrowing first could fold a huge number back into range.
59
    return *parsed >= 0 && *parsed < n ? std::optional<int>(int(*parsed))
2✔
60
                                       : std::nullopt;
1✔
61
  }
6✔
62
  std::optional<int> operator()(const auto&) const noexcept { return std::nullopt; }
×
63
  std::optional<int> operator()() const noexcept { return std::nullopt; }
×
64
};
65

66
bool entriesAreNames(
8✔
67
    const std::vector<std::pair<QString, ossia::value>>& alternatives) noexcept
68
{
69
  for(const auto& [name, value] : alternatives)
8✔
70
    if(value.valid())
8✔
71
      return value.get_type() == ossia::val_type::STRING;
8✔
72
  return false;
×
73
}
8✔
74
}
75

76
std::optional<int> readEntryIndex(const ossia::value& v, int n) noexcept
21✔
77
{
78
  return v.apply(entry_index_visitor{n});
21✔
79
}
80

81
int ComboBox::indexOfValue(const ossia::value& v) const noexcept
155✔
82
{
83
  // Two invalid values compare equal, so one would select a valueless entry.
84
  if(!v.valid())
155✔
85
    return -1;
1✔
86

87
  const int n = std::ssize(alternatives);
154✔
88
  for(int i = 0; i < n; i++)
432✔
89
    if(alternatives[i].second == v)
424✔
90
      return i;
146✔
91

92
  if(!entriesAreNames(alternatives))
8✔
93
    return -1;
3✔
94

95
  return readEntryIndex(v, n).value_or(-1);
5✔
96
}
155✔
97

98
ossia::value ComboBox::valueAtIndex(int i) const noexcept
4✔
99
{
100
  if(i < 0 || i >= std::ssize(alternatives))
4✔
101
    return {};
2✔
102
  return alternatives[i].second;
2✔
103
}
4✔
104

105
int Enum::indexOfValue(const ossia::value& v) const noexcept
64✔
106
{
107
  if(!v.valid())
64✔
108
    return -1;
1✔
109

110
  const int n = std::ssize(values);
63✔
111
  const auto name = QString::fromStdString(ossia::convert<std::string>(v));
63✔
112
  for(int i = 0; i < n; i++)
144✔
113
    if(values[i] == name)
128✔
114
      return i;
47✔
115

116
  return readEntryIndex(v, n).value_or(-1);
16✔
117
}
64✔
118

119
ossia::value Enum::valueAtIndex(int i) const noexcept
4✔
120
{
121
  if(i < 0 || i >= std::ssize(values))
4✔
122
    return {};
1✔
123
  return values[i].toStdString();
3✔
124
}
4✔
125

126
Enum::Enum(
165✔
127
    const std::vector<std::string>& dom, std::vector<QString> pixmaps, std::string init,
128
    const QString& name, Id<Port> id, QObject* parent)
129
    : ControlInlet{name, id, parent}
165✔
130
    , pixmaps{std::move(pixmaps)}
165✔
131
{
165✔
132
  for(auto& val : dom)
866✔
133
    values.push_back(QString::fromStdString(val));
701✔
134

135
  displayHandledExplicitly = true;
165✔
136
  setInit(init);
165✔
137
  setValue(init);
165✔
138
  setDomain(State::Domain{ossia::domain_base<std::string>{dom}});
165✔
139
}
165✔
140

141
Enum::Enum(
×
142
    const QStringList& values, std::vector<QString> pixmaps, std::string init,
143
    const QString& name, Id<Port> id, QObject* parent)
144
    : ControlInlet{name, id, parent}
×
145
    , values{values.begin(), values.end()}
×
146
    , pixmaps{std::move(pixmaps)}
×
147
{
×
148
  displayHandledExplicitly = true;
×
149
  setInit(init);
×
150
  setValue(init);
×
151
  ossia::domain_base<std::string> dom;
×
152
  for(auto& val : values)
×
153
    dom.values.push_back(val.toStdString());
×
154
  setDomain(State::Domain{dom});
×
155
}
×
156

157
Enum::~Enum() { }
825✔
158

159
Enum::Enum(DataStream::Deserializer& vis, QObject* parent)
250✔
160
    : ControlInlet{vis, parent}
125✔
161
{
125✔
162
  vis.writeTo(*this);
125✔
163
}
125✔
164
Enum::Enum(JSONObject::Deserializer& vis, QObject* parent)
250✔
165
    : ControlInlet{vis, parent}
125✔
166
{
125✔
167
  vis.writeTo(*this);
125✔
168
}
125✔
169
Enum::Enum(DataStream::Deserializer&& vis, QObject* parent)
×
170
    : ControlInlet{vis, parent}
×
171
{
×
172
  vis.writeTo(*this);
×
173
}
×
174
Enum::Enum(JSONObject::Deserializer&& vis, QObject* parent)
×
175
    : ControlInlet{vis, parent}
×
176
{
×
177
  vis.writeTo(*this);
×
178
}
×
179

180
void Enum::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
181
{
182
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
183
  port.type = ossia::val_type::STRING;
×
184
  port.domain = domain().get();
×
185
}
×
186

187
ComboBox::ComboBox(DataStream::Deserializer& vis, QObject* parent)
352✔
188
    : ControlInlet{vis, parent}
176✔
189
{
176✔
190
  vis.writeTo(*this);
176✔
191
}
×
192
ComboBox::ComboBox(
638✔
193
    std::vector<std::pair<QString, ossia::value>> values, ossia::value init,
194
    const QString& name, Id<Port> id, QObject* parent)
195
    : ControlInlet{name, id, parent}
638✔
196
    , alternatives{std::move(values)}
638✔
197
{
638✔
198
  displayHandledExplicitly = true;
638✔
199
  setInit(init);
638✔
200
  setValue(init);
638✔
201
  std::vector<ossia::value> vals;
638✔
202
  for(auto& v : alternatives)
5,425✔
203
    vals.push_back(v.second);
4,787✔
204
  setDomain(State::Domain{ossia::make_domain(vals)});
638✔
205
}
×
206

207
void ComboBox::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
297✔
208
{
209
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
297✔
210
  port.domain = domain().get();
297✔
211
}
297✔
212

213
void ComboBox::repopulateFromFolder(const QString& folderPath)
6✔
214
{
215
  std::vector<std::pair<QString, ossia::value>> alts;
6✔
216
  if(!folderPath.isEmpty())
6✔
217
  {
218
    QDir dir(folderPath);
5✔
219
    const auto files = fileExtensions.isEmpty()
10✔
220
                           ? dir.entryList(QDir::Files, QDir::Name)
4✔
221
                           : dir.entryList(fileExtensions, QDir::Files, QDir::Name);
1✔
222
    for(const auto& f : files)
13✔
223
      alts.emplace_back(f, f.toStdString()); // value = the file name itself
8✔
224
  }
5✔
225
  if(alts.empty())
6✔
226
    alts.emplace_back(QStringLiteral("-"), std::string("-"));
3✔
227
  setAlternatives(std::move(alts));
6✔
228

229
  // Watch the folder so files created while the document is open (e.g. by an
230
  // upstream process writing its analysis) appear in the list right away.
231
  if(folderPath != m_watchedFolder)
6✔
232
  {
233
    if(m_folderWatcher)
6✔
234
    {
235
      delete m_folderWatcher;
1✔
236
      m_folderWatcher = nullptr;
1✔
237
    }
1✔
238
    m_watchedFolder = folderPath;
6✔
239
    if(!folderPath.isEmpty() && QDir{folderPath}.exists())
11✔
240
    {
241
      m_folderWatcher = new QFileSystemWatcher{{folderPath}, this};
4✔
242
      connect(
4✔
243
          m_folderWatcher, &QFileSystemWatcher::directoryChanged, this,
4✔
244
          [this](const QString& path) { repopulateFromFolder(path); });
4✔
245
    }
4✔
246
  }
6✔
247
}
6✔
248

249
void ComboBox::setAlternatives(std::vector<std::pair<QString, ossia::value>> values)
11✔
250
{
251
  if(values == alternatives)
11✔
252
    return;
5✔
253
  alternatives = std::move(values);
6✔
254

255
  std::vector<ossia::value> vals;
6✔
256
  for(auto& v : alternatives)
22✔
257
    vals.push_back(v.second);
16✔
258
  // Not setDomain(): what changed is the item list, and alternativesChanged
259
  // below says exactly that. Announcing a domain change instead makes the
260
  // effect item rebuild every control of the process, which kills whatever
261
  // edit is in flight -- and for a combo box refilled from the running score,
262
  // that includes the control the user is dragging to refill it.
263
  setDomainWithoutNotifying(State::Domain{ossia::make_domain(vals)});
6✔
264

265
  // Keep the current value if it is still in the list; otherwise fall back to
266
  // the init value when available. A value absent from the list is left
267
  // untouched: for folder-backed comboboxes it may name a file that simply
268
  // does not exist *yet* — it becomes selectable (and shows up as selected)
269
  // once the file appears.
270
  if(!alternatives.empty())
6✔
271
  {
272
    auto in_list = [this](const ossia::value& v) {
16✔
273
      return ossia::find_if(
20✔
274
                 alternatives, [&](const auto& pair) { return pair.second == v; })
31✔
275
             != alternatives.end();
10✔
276
    };
277
    if(!in_list(value()) && in_list(init()))
6✔
278
      setValue(init());
1✔
279
  }
6✔
280

281
  alternativesChanged();
6✔
282
}
11✔
283

284
ComboBox::~ComboBox() { }
2,004✔
285

286
ComboBox::ComboBox(JSONObject::Deserializer& vis, QObject* parent)
402✔
287
    : ControlInlet{vis, parent}
201✔
288
{
201✔
289
  vis.writeTo(*this);
201✔
290
}
×
291
ComboBox::ComboBox(DataStream::Deserializer&& vis, QObject* parent)
×
292
    : ControlInlet{vis, parent}
×
293
{
×
294
  vis.writeTo(*this);
×
295
}
×
296
ComboBox::ComboBox(JSONObject::Deserializer&& vis, QObject* parent)
×
297
    : ControlInlet{vis, parent}
×
298
{
×
299
  vis.writeTo(*this);
×
300
}
×
301

302
HSVSlider::HSVSlider(
28✔
303
    ossia::vec4f init, const QString& name, Id<Port> id, QObject* parent)
304
    : ControlInlet{name, id, parent}
28✔
305
{
28✔
306
  displayHandledExplicitly = true;
28✔
307
  setInit(init);
28✔
308
  setValue(init);
28✔
309
}
28✔
310

311
HSVSlider::~HSVSlider() { }
78✔
312

313
const State::Unit& HSVSlider::unit() const noexcept
40✔
314
{
315
  static const State::Unit u{ossia::unit_t{ossia::rgba_u{}}};
40✔
316
  return u;
40✔
317
}
318

319
void HSVSlider::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
20✔
320
{
321
  // The unit, not just the value type: it is what makes an address declared
322
  // color.rgb (or hsv, or any other colour unit) arrive here as the rgba this
323
  // control reads. Without it value_port::effective_type() is empty and
324
  // adapt_value() has nothing to convert towards.
325
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
20✔
326
  port.type = unit().get();
20✔
327
}
20✔
328

329
FloatSlider::FloatSlider(
1,213✔
330
    float min, float max, float init, const QString& name, Id<Port> id, QObject* parent)
331
    : ControlInlet{name, id, parent}
1,213✔
332
{
1,213✔
333
  displayHandledExplicitly = true;
1,213✔
334
  setInit(init);
1,213✔
335
  setValue(init);
1,213✔
336
  setDomain(ossia::make_domain(min, max));
1,213✔
337
}
1,213✔
338

339
FloatSlider::~FloatSlider() { }
4,348✔
340

341
void FloatSlider::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
155✔
342
{
343
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
155✔
344
  port.type = ossia::val_type::FLOAT;
155✔
345
  port.domain = domain().get();
155✔
346
}
155✔
347

348
FloatKnob::FloatKnob(
645✔
349
    float min, float max, float init, const QString& name, Id<Port> id, QObject* parent)
350
    : ControlInlet{name, id, parent}
645✔
351
{
645✔
352
  displayHandledExplicitly = true;
645✔
353
  setInit(init);
645✔
354
  setValue(init);
645✔
355
  setDomain(ossia::make_domain(min, max));
645✔
356
}
645✔
357

358
FloatKnob::~FloatKnob() { }
3,374✔
359

360
void FloatKnob::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
361
{
362
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
363
  port.type = ossia::val_type::FLOAT;
×
364
  port.domain = domain().get();
×
365
}
×
366

367
LogFloatSlider::LogFloatSlider(
49✔
368
    float min, float max, float init, const QString& name, Id<Port> id, QObject* parent)
369
    : ControlInlet{name, id, parent}
49✔
370
{
49✔
371
  displayHandledExplicitly = true;
49✔
372
  setInit(init);
49✔
373
  setValue(init);
49✔
374
  setDomain(ossia::make_domain(min, max));
49✔
375
}
49✔
376

377
LogFloatSlider::~LogFloatSlider() { }
216✔
378

379
void LogFloatSlider::setupExecution(
×
380
    ossia::inlet& inl, QObject* exec_context) const noexcept
381
{
382
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
383
  port.type = ossia::val_type::FLOAT;
×
384
  port.domain = domain().get();
×
385
}
×
386

387
IntSlider::IntSlider(
209✔
388
    int min, int max, int init, const QString& name, Id<Port> id, QObject* parent)
389
    : ControlInlet{name, id, parent}
209✔
390
{
209✔
391
  displayHandledExplicitly = true;
209✔
392
  setInit(init);
209✔
393
  setValue(init);
209✔
394
  setDomain(ossia::make_domain(min, max));
209✔
395
}
209✔
396

397
IntSlider::~IntSlider() { }
800✔
398

399
void IntSlider::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
59✔
400
{
401
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
59✔
402
  port.type = ossia::val_type::INT;
59✔
403
  port.domain = domain().get();
59✔
404
}
59✔
405

406
IntRangeSlider::IntRangeSlider(
×
407
    int min, int max, ossia::vec2f init, const QString& name, Id<Port> id,
408
    QObject* parent)
409
    : ControlInlet{name, id, parent}
×
410
{
×
411
  displayHandledExplicitly = true;
×
412
  setInit(init);
×
413
  setValue(init);
×
414
  setDomain(ossia::make_domain(min, max));
×
415
}
×
416

417
IntRangeSlider::~IntRangeSlider() { }
×
418

419
void IntRangeSlider::setupExecution(
×
420
    ossia::inlet& inl, QObject* exec_context) const noexcept
421
{
422
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
423
  port.type = ossia::val_type::VEC2F;
×
424
  port.domain = domain().get();
×
425
}
×
426

427
FloatRangeSlider::FloatRangeSlider(
6✔
428
    float min, float max, ossia::vec2f init, const QString& name, Id<Port> id,
429
    QObject* parent)
430
    : ControlInlet{name, id, parent}
6✔
431
{
6✔
432
  displayHandledExplicitly = true;
6✔
433
  setInit(init);
6✔
434
  setValue(init);
6✔
435
  setDomain(ossia::make_domain(min, max));
6✔
436
}
6✔
437

438
FloatRangeSlider::~FloatRangeSlider() { }
36✔
439

440
void FloatRangeSlider::setupExecution(
×
441
    ossia::inlet& inl, QObject* exec_context) const noexcept
442
{
443
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
444
  port.type = ossia::val_type::VEC2F;
×
445
  port.domain = domain().get();
×
446
}
×
447

448
IntRangeSpinBox::IntRangeSpinBox(
×
449
    int min, int max, ossia::vec2f init, const QString& name, Id<Port> id,
450
    QObject* parent)
451
    : ControlInlet{name, id, parent}
×
452
{
×
453
  displayHandledExplicitly = true;
×
454
  setInit(init);
×
455
  setValue(init);
×
456
  setDomain(ossia::make_domain(min, max));
×
457
}
×
458
IntRangeSpinBox::~IntRangeSpinBox() { }
×
459

460
void IntRangeSpinBox::setupExecution(
×
461
    ossia::inlet& inl, QObject* exec_context) const noexcept
462
{
463
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
464
  port.type = ossia::val_type::VEC2F;
×
465
  port.domain = domain().get();
×
466
}
×
467

468
FloatRangeSpinBox::FloatRangeSpinBox(
×
469
    float min, float max, ossia::vec2f init, const QString& name, Id<Port> id,
470
    QObject* parent)
471
    : ControlInlet{name, id, parent}
×
472
{
×
473
  displayHandledExplicitly = true;
×
474
  setInit(init);
×
475
  setValue(init);
×
476
  setDomain(ossia::make_domain(min, max));
×
477
}
×
478

479
FloatRangeSpinBox::~FloatRangeSpinBox() { }
×
480

481
void FloatRangeSpinBox::setupExecution(
×
482
    ossia::inlet& inl, QObject* exec_context) const noexcept
483
{
484
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
485
  port.type = ossia::val_type::VEC2F;
×
486
  port.domain = domain().get();
×
487
}
×
488

489
IntSpinBox::IntSpinBox(
503✔
490
    int min, int max, int init, const QString& name, Id<Port> id, QObject* parent)
491
    : ControlInlet{name, id, parent}
503✔
492
{
503✔
493
  displayHandledExplicitly = true;
503✔
494
  setInit(init);
503✔
495
  setValue(init);
503✔
496
  setDomain(ossia::make_domain(min, max));
503✔
497
}
503✔
498

499
void IntSpinBox::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
29✔
500
{
501
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
29✔
502
  port.type = ossia::val_type::INT;
29✔
503
  port.domain = domain().get();
29✔
504
}
29✔
505

506
IntSpinBox::~IntSpinBox() { }
1,917✔
507

508
FloatSpinBox::FloatSpinBox(
107✔
509
    float min, float max, float init, const QString& name, Id<Port> id, QObject* parent)
510
    : ControlInlet{name, id, parent}
107✔
511
{
107✔
512
  displayHandledExplicitly = true;
107✔
513
  setInit(init);
107✔
514
  setValue(init);
107✔
515
  setDomain(ossia::make_domain(min, max));
107✔
516
}
107✔
517

518
void FloatSpinBox::setupExecution(
12✔
519
    ossia::inlet& inl, QObject* exec_context) const noexcept
520
{
521
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
12✔
522
  port.type = ossia::val_type::FLOAT;
12✔
523
  port.domain = domain().get();
12✔
524
}
12✔
525

526
FloatSpinBox::~FloatSpinBox() { }
546✔
527

528
TimeChooser::TimeChooser(
132✔
529
    float min, float max, float init, const QString& name, Id<Port> id, QObject* parent)
530
    : ControlInlet{name, id, parent}
132✔
531
{
132✔
532
  displayHandledExplicitly = true;
132✔
533
  // The second component is the mode: 0 is a time in seconds, anything else is
534
  // a musical denomination. It starts at 0, which is what the object declaring
535
  // the control says too -- halp::time_chooser_t has `bool sync{false}`.
536
  //
537
  // It used to start synced, and that made every such control's default wrong:
538
  // the value the process declared as its init was read as a number of quarter
539
  // notes and converted to seconds against the tempo, so a control asking for
540
  // two seconds got two quarters instead. Deuterium's sampler carries a
541
  // work-around for exactly this.
542
  setValue(ossia::vec2f{init, 0.f});
132✔
543
  setInit(value());
132✔
544
  setDomain(ossia::make_domain(ossia::vec2f{min, 0.f}, ossia::vec2f{max, 1.f}));
132✔
545
}
132✔
546

547
TimeChooser::~TimeChooser() { }
481✔
548

549
void TimeChooser::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
550
{
551
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
552
  port.type = ossia::val_type::VEC2F;
×
553
  // port.type = ossia::second_u{};
554
  // port.domain = domain().get();
555
}
×
556

557
Toggle::Toggle(bool init, const QString& name, Id<Port> id, QObject* parent)
431✔
558
    : ControlInlet{name, id, parent}
431✔
559
{
431✔
560
  displayHandledExplicitly = true;
431✔
561
  setInit(init);
431✔
562
  setValue(init);
431✔
563
  setDomain(State::Domain{ossia::domain_base<bool>{}});
431✔
564
}
431✔
565

566
void Toggle::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
46✔
567
{
568
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
46✔
569
  port.type = ossia::val_type::BOOL;
46✔
570
  port.domain = domain().get();
46✔
571
}
46✔
572

573
Toggle::~Toggle() { }
1,754✔
574

575
ChooserToggle::ChooserToggle(
×
576
    QStringList alternatives, bool init, const QString& name, Id<Port> id,
577
    QObject* parent)
578
    : ControlInlet{name, id, parent}
×
579
{
×
580
  displayHandledExplicitly = true;
×
581
  setValue(init ? alternatives[1].toStdString() : alternatives[0].toStdString());
×
582
  setInit(value());
×
583
  setDomain(
×
584
      State::Domain{ossia::domain_base<std::string>{
×
585
          {alternatives[0].toStdString(), alternatives[1].toStdString()}}});
×
586
}
×
587

588
void ChooserToggle::setupExecution(
×
589
    ossia::inlet& inl, QObject* exec_context) const noexcept
590
{
591
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
592
  port.type = ossia::val_type::STRING;
×
593
  port.domain = domain().get();
×
594
}
×
595

596
ChooserToggle::~ChooserToggle() { }
×
597

598
QStringList ChooserToggle::alternatives() const noexcept
×
599
{
600
  const auto& dom = *this->domain().get().v.target<ossia::domain_base<std::string>>();
×
601
  auto it = dom.values.begin();
×
602
  auto& s1 = *it;
×
603
  auto& s2 = *(++it);
×
604
  return {QString::fromStdString(s1), QString::fromStdString(s2)};
×
605
}
606

607
LineEdit::LineEdit(QString init, const QString& name, Id<Port> id, QObject* parent)
207✔
608
    : ControlInlet{name, id, parent}
207✔
609
{
207✔
610
  displayHandledExplicitly = true;
207✔
611
  setValue(init.toStdString());
207✔
612
  setInit(value());
207✔
613
}
207✔
614

615
void LineEdit::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
92✔
616
{
617
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
92✔
618
  port.type = ossia::val_type::STRING;
92✔
619
  port.domain = domain().get();
92✔
620
}
92✔
621

622
LineEdit::~LineEdit() { }
717✔
623

624
ProgramEdit::ProgramEdit(QString init, const QString& name, Id<Port> id, QObject* parent)
10✔
625
    : ControlInlet{name, id, parent}
10✔
626
{
10✔
627
  displayHandledExplicitly = true;
10✔
628
  setValue(init.toStdString());
10✔
629
  setInit(value());
10✔
630
}
10✔
631

632
void ProgramEdit::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
633
{
634
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
635
  port.type = ossia::val_type::STRING;
×
636
  port.domain = domain().get();
×
637
}
×
638

639
ProgramEdit::~ProgramEdit() { }
36✔
640

641
FileChooserBase::FileChooserBase(
91✔
642
    QString init, QString filters, const QString& name, Id<Port> id, QObject* parent)
643
    : ControlInlet{name, id, parent}
91✔
644
{
91✔
645
  displayHandledExplicitly = true;
91✔
646
  setValue(init.toStdString());
91✔
647
  setInit(value());
91✔
648
  m_filters = filters;
91✔
649
}
91✔
650

651
void FileChooserBase::setupExecution(
×
652
    ossia::inlet& inl, QObject* exec_context) const noexcept
653
{
654
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
655
  port.type = ossia::val_type::STRING;
×
656
  port.domain = domain().get();
×
657
}
×
658

659
void FileChooserBase::enableFileWatch()
2✔
660
{
661
  auto fun = std::make_shared<std::function<void()>>([ptr = QPointer{this}]() mutable {
2✔
662
    ossia::qt::run_async(qApp, [ptr] {
×
663
      if(ptr)
×
664
      {
665
        // This will trigger a reload
666
        // FIXME make it work with execution value changes
667
        ptr->valueChanged(ptr->value());
×
668
      }
×
669
    });
×
670
  });
×
671

672
  auto& f = score::FileWatch::instance();
2✔
673
  f.add(QString::fromStdString(ossia::convert<std::string>(this->value())), fun);
2✔
674

675
  connect(
2✔
676
      this, &Process::FileChooser::valueChanged, this,
677
      [cur_s = ossia::convert<std::string>(this->value()),
2✔
678
       fun](const ossia::value& v) mutable {
2✔
679
    auto new_s = ossia::convert<std::string>(v);
×
680
    if(new_s != cur_s)
×
681
    {
682
      auto& f = score::FileWatch::instance();
×
683
      f.remove(QString::fromStdString(cur_s), fun);
×
684
      f.add(QString::fromStdString(new_s), fun);
×
685
      cur_s = new_s;
×
686
    }
×
687
      });
×
688

689
  connect(this, &Process::FileChooser::destroying, this, [this, fun] {
4✔
690
    auto& f = score::FileWatch::instance();
2✔
691
    f.remove(QString::fromStdString(ossia::convert<std::string>(this->value())), fun);
2✔
692
  });
2✔
693
}
2✔
694

695
FileChooserBase::~FileChooserBase()
200✔
696
{
200✔
697
  destroying();
200✔
698
}
200✔
699

700
FileChooser::FileChooser(
89✔
701
    QString init, QString filters, const QString& name, Id<Port> id, QObject* parent)
702
    : FileChooserBase{init, filters, name, id, parent}
89✔
703
{
89✔
704
}
89✔
705

706
FileChooser::~FileChooser() { }
387✔
707

708
FileChooser::FileChooser(DataStream::Deserializer& vis, QObject* parent)
51✔
709
    : FileChooserBase{vis, parent}
51✔
710
{
51✔
711
  vis.writeTo(*this);
51✔
712
}
51✔
713
FileChooser::FileChooser(JSONObject::Deserializer& vis, QObject* parent)
54✔
714
    : FileChooserBase{vis, parent}
54✔
715
{
54✔
716
  vis.writeTo(*this);
54✔
717
}
54✔
718
FileChooser::FileChooser(DataStream::Deserializer&& vis, QObject* parent)
×
719
    : FileChooserBase{vis, parent}
×
720
{
×
721
  vis.writeTo(*this);
×
722
}
×
723
FileChooser::FileChooser(JSONObject::Deserializer&& vis, QObject* parent)
×
724
    : FileChooserBase{vis, parent}
×
725
{
×
726
  vis.writeTo(*this);
×
727
}
×
728

729
FolderChooser::FolderChooser(
1✔
730
    QString init, const QString& name, Id<Port> id, QObject* parent)
731
    : Process::ControlInlet{name, id, parent}
1✔
732
{
1✔
733
  displayHandledExplicitly = true;
1✔
734
  setValue(init.toStdString());
1✔
735
  setInit(value());
1✔
736
}
1✔
737

738
void FolderChooser::setupExecution(
×
739
    ossia::inlet& inl, QObject* exec_context) const noexcept
740
{
741
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
742
  port.type = ossia::val_type::STRING;
×
743
  port.domain = domain().get();
×
744
}
×
745

746
FolderChooser::~FolderChooser() { }
6✔
747

748
AudioFileChooser::AudioFileChooser(
2✔
749
    QString init, QString filters, const QString& name, Id<Port> id, QObject* parent)
750
    : FileChooserBase{init, filters, name, id, parent}
2✔
751
{
2✔
752
}
2✔
753

754
AudioFileChooser::~AudioFileChooser() { }
11✔
755

756
AudioFileChooser::AudioFileChooser(DataStream::Deserializer& vis, QObject* parent)
2✔
757
    : FileChooserBase{vis, parent}
2✔
758
{
2✔
759
  vis.writeTo(*this);
2✔
760
}
2✔
761
AudioFileChooser::AudioFileChooser(JSONObject::Deserializer& vis, QObject* parent)
2✔
762
    : FileChooserBase{vis, parent}
2✔
763
{
2✔
764
  vis.writeTo(*this);
2✔
765
}
2✔
766
AudioFileChooser::AudioFileChooser(DataStream::Deserializer&& vis, QObject* parent)
×
767
    : FileChooserBase{vis, parent}
×
768
{
×
769
  vis.writeTo(*this);
×
770
}
×
771
AudioFileChooser::AudioFileChooser(JSONObject::Deserializer&& vis, QObject* parent)
×
772
    : FileChooserBase{vis, parent}
×
773
{
×
774
  vis.writeTo(*this);
×
775
}
×
776

777
static QString toFilters(const QSet<QString>& exts)
×
778
{
779
  QString res;
×
780
  for(const auto& s : exts)
×
781
  {
782
    res += "*.";
×
783
    res += s;
×
784
    res += " ";
×
785
  }
786
  if(!res.isEmpty())
×
787
    res.resize(res.size() - 1);
×
788
  return res;
×
789
}
×
790

791
static QString videoFilesTypes()
×
792
{
793
  // FIXME refactor supported formats with Video process
794
  QSet<QString> files = {"mkv", "mov", "mp4", "h264", "avi", "hap",  "mpg", "mpeg",
×
795
                          "imf", "mxf", "mts", "m2ts", "mj2", "webm", "y4m", "nut", "ts"};
×
796
  return QString{"Videos (%1)"}.arg(toFilters(files));
×
797
}
×
798

799
VideoFileChooser::VideoFileChooser(
×
800
    QString init, QString filters, const QString& name, Id<Port> id, QObject* parent)
801
    : FileChooserBase{init, videoFilesTypes(), name, id, parent}
×
802
{
×
803
}
×
804

805
VideoFileChooser::~VideoFileChooser() { }
×
806

807
VideoFileChooser::VideoFileChooser(DataStream::Deserializer& vis, QObject* parent)
×
808
    : FileChooserBase{vis, parent}
×
809
{
×
810
  vis.writeTo(*this);
×
811
}
×
812
VideoFileChooser::VideoFileChooser(JSONObject::Deserializer& vis, QObject* parent)
×
813
    : FileChooserBase{vis, parent}
×
814
{
×
815
  vis.writeTo(*this);
×
816
}
×
817
VideoFileChooser::VideoFileChooser(DataStream::Deserializer&& vis, QObject* parent)
×
818
    : FileChooserBase{vis, parent}
×
819
{
×
820
  vis.writeTo(*this);
×
821
}
×
822
VideoFileChooser::VideoFileChooser(JSONObject::Deserializer&& vis, QObject* parent)
×
823
    : FileChooserBase{vis, parent}
×
824
{
×
825
  vis.writeTo(*this);
×
826
}
×
827

828
Button::Button(const QString& name, Id<Port> id, QObject* parent)
10✔
829
    : ControlInlet{name, id, parent}
10✔
830
{
10✔
831
  displayHandledExplicitly = true;
10✔
832
  setValue(false);
10✔
833
  setInit(false);
10✔
834
  setDomain(State::Domain{ossia::domain_base<bool>{}});
10✔
835
}
10✔
836

837
void Button::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
838
{
839
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
840
  port.type = ossia::val_type::BOOL;
×
841
  port.domain = domain().get();
×
842
}
×
843

844
Button::~Button() { }
60✔
845

846
ImpulseButton::ImpulseButton(const QString& name, Id<Port> id, QObject* parent)
44✔
847
    : ControlInlet{name, id, parent}
44✔
848
{
44✔
849
  displayHandledExplicitly = true;
44✔
850
  setValue(ossia::impulse{});
44✔
851
  setInit(ossia::impulse{});
44✔
852
  setDomain(State::Domain{ossia::domain_base<ossia::impulse>{}});
44✔
853
}
44✔
854

855
void ImpulseButton::setupExecution(
×
856
    ossia::inlet& inl, QObject* exec_context) const noexcept
857
{
858
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
859
  port.type = ossia::val_type::IMPULSE;
×
860
  port.domain = domain().get();
×
861
}
×
862

863
ImpulseButton::~ImpulseButton() { }
240✔
864

865
XYSlider::XYSlider(ossia::vec2f init, const QString& name, Id<Port> id, QObject* parent)
×
866
    : ControlInlet{name, id, parent}
×
867
{
×
868
  displayHandledExplicitly = true;
×
869
  setValue(init);
×
870
  setInit(init);
×
871
  setDomain(ossia::make_domain(ossia::vec2f{0., 0.}, ossia::vec2f{1., 1.}));
×
872
}
×
873

874
XYSlider::XYSlider(
9✔
875
    ossia::vec2f min, ossia::vec2f max, ossia::vec2f init, const QString& name,
876
    Id<Port> id, QObject* parent)
877
    : ControlInlet{name, id, parent}
9✔
878
{
9✔
879
  displayHandledExplicitly = true;
9✔
880
  setValue(init);
9✔
881
  setInit(init);
9✔
882
  setDomain(ossia::make_domain(min, max));
9✔
883
}
9✔
884

885
void XYSlider::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
886
{
887
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
888
  port.type = ossia::val_type::VEC2F;
×
889
  port.domain = domain().get();
×
890
}
×
891

892
XYSlider::~XYSlider() { }
46✔
893

894
XYZSlider::XYZSlider(
×
895
    ossia::vec3f init, const QString& name, Id<Port> id, QObject* parent)
896
    : ControlInlet{name, id, parent}
×
897
{
×
898
  displayHandledExplicitly = true;
×
899
  setValue(init);
×
900
  setInit(init);
×
901
  setDomain(ossia::make_domain(ossia::vec3f{0., 0., 0.}, ossia::vec3f{1., 1., 1.}));
×
902
}
×
903

904
XYZSlider::XYZSlider(
×
905
    ossia::vec3f min, ossia::vec3f max, ossia::vec3f init, const QString& name,
906
    Id<Port> id, QObject* parent)
907
    : ControlInlet{name, id, parent}
×
908
{
×
909
  displayHandledExplicitly = true;
×
910
  setValue(init);
×
911
  setInit(init);
×
912
  setDomain(ossia::make_domain(min, max));
×
913
}
×
914

915
XYZSlider::~XYZSlider() { }
2✔
916

917
void XYZSlider::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
918
{
919
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
920
  port.type = ossia::val_type::VEC3F;
×
921
  port.domain = domain().get();
×
922
}
×
923

924
XYZSpinboxes::XYZSpinboxes(
×
925
    ossia::vec3f init, const QString& name, Id<Port> id, QObject* parent)
926
    : ControlInlet{name, id, parent}
×
927
{
×
928
  displayHandledExplicitly = true;
×
929
  setValue(init);
×
930
  setInit(init);
×
931
  setDomain(ossia::make_domain(ossia::vec3f{0., 0., 0.}, ossia::vec3f{1., 1., 1.}));
×
932
}
×
933

934
XYSpinboxes::XYSpinboxes(
×
935
    ossia::vec2f init, const QString& name, Id<Port> id, QObject* parent)
936
    : ControlInlet{name, id, parent}
×
937
    , integral{false}
×
938
{
×
939
  displayHandledExplicitly = true;
×
940
  setValue(init);
×
941
  setInit(init);
×
942
}
×
943
XYSpinboxes::XYSpinboxes(
48✔
944
    ossia::vec2f min, ossia::vec2f max, ossia::vec2f init, bool integral,
945
    const QString& name, Id<Port> id, QObject* parent)
946
    : ControlInlet{name, id, parent}
48✔
947
    , integral{integral}
48✔
948
{
48✔
949
  displayHandledExplicitly = true;
48✔
950
  setValue(init);
48✔
951
  setInit(init);
48✔
952
  setDomain(ossia::make_domain(min, max));
48✔
953
}
48✔
954

955
XYSpinboxes::XYSpinboxes(DataStream::Deserializer& vis, QObject* parent)
46✔
956
    : ControlInlet{vis, parent}
46✔
957
{
46✔
958
  vis.writeTo(*this);
46✔
959
}
×
960
XYSpinboxes::XYSpinboxes(JSONObject::Deserializer& vis, QObject* parent)
46✔
961
    : ControlInlet{vis, parent}
46✔
962
{
46✔
963
  vis.writeTo(*this);
46✔
964
}
×
965
XYSpinboxes::XYSpinboxes(DataStream::Deserializer&& vis, QObject* parent)
×
966
    : ControlInlet{vis, parent}
×
967
{
×
968
  vis.writeTo(*this);
×
969
}
×
970
XYSpinboxes::XYSpinboxes(JSONObject::Deserializer&& vis, QObject* parent)
×
971
    : ControlInlet{vis, parent}
×
972
{
×
973
  vis.writeTo(*this);
×
974
}
×
975

976
XYSpinboxes::~XYSpinboxes() { }
280✔
977

978
void XYSpinboxes::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
979
{
980
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
981
  port.type = ossia::val_type::VEC2F;
×
982
  port.domain = domain().get();
×
983
}
×
984

985
XYZSpinboxes::XYZSpinboxes(
428✔
986
    ossia::vec3f min, ossia::vec3f max, ossia::vec3f init, bool integral,
987
    const QString& name, Id<Port> id, QObject* parent)
988
    : ControlInlet{name, id, parent}
428✔
989
    , integral{integral}
428✔
990
{
428✔
991
  displayHandledExplicitly = true;
428✔
992
  setValue(init);
428✔
993
  setInit(init);
428✔
994
  setDomain(ossia::make_domain(min, max));
428✔
995
}
428✔
996

997
XYZSpinboxes::~XYZSpinboxes() { }
1,212✔
998

999
void XYZSpinboxes::setupExecution(
50✔
1000
    ossia::inlet& inl, QObject* exec_context) const noexcept
1001
{
1002
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
50✔
1003
  port.type = ossia::val_type::VEC3F;
50✔
1004
  port.domain = domain().get();
50✔
1005
}
50✔
1006

1007
MultiSlider::MultiSlider(
34✔
1008
    ossia::value init, const QString& name, Id<Port> id, QObject* parent)
1009
    : ControlInlet{name, id, parent}
34✔
1010
{
34✔
1011
  displayHandledExplicitly = true;
34✔
1012
  setValue(std::move(init));
34✔
1013
  setInit(value());
34✔
1014
  setDomain(ossia::make_domain(0., 1.));
34✔
1015
}
34✔
1016

1017
MultiSlider::~MultiSlider() { }
50✔
1018

1019
ossia::value MultiSlider::getMin() const noexcept
×
1020
{
1021
  return domain().get().get_min();
×
1022
}
1023

1024
ossia::value MultiSlider::getMax() const noexcept
×
1025
{
1026
  return domain().get().get_max();
×
1027
}
1028

1029
void MultiSlider::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
1030
{
1031
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
1032
  port.type = ossia::val_type::LIST;
×
1033
  port.domain = domain().get();
×
1034
}
×
1035

1036
MultiSliderXY::MultiSliderXY(
1✔
1037
    ossia::value init, const QString& name, Id<Port> id, QObject* parent)
1038
    : ControlInlet{name, id, parent}
1✔
1039
{
1✔
1040
  displayHandledExplicitly = true;
1✔
1041
  setValue(std::move(init));
1✔
1042
  setInit(value());
1✔
1043
  setDomain(ossia::make_domain(0., 1.));
1✔
1044
}
1✔
1045

1046
MultiSliderXY::~MultiSliderXY() { }
6✔
1047

1048
ossia::value MultiSliderXY::getMin() const noexcept
×
1049
{
1050
  return domain().get().get_min();
×
1051
}
1052

1053
ossia::value MultiSliderXY::getMax() const noexcept
×
1054
{
1055
  return domain().get().get_max();
×
1056
}
1057

1058
void MultiSliderXY::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
1059
{
1060
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
1061
  port.type = ossia::val_type::LIST;
×
1062
  port.domain = domain().get();
×
1063
}
×
1064

1065
PathGeneratorXY::PathGeneratorXY(
1✔
1066
    ossia::value init, const QString& name, Id<Port> id, QObject* parent)
1067
    : ControlInlet{name, id, parent}
1✔
1068
{
1✔
1069
  displayHandledExplicitly = true;
1✔
1070
  setValue(std::move(init));
1✔
1071
  setInit(value());
1✔
1072
  setDomain(ossia::make_domain(0., 1.));
1✔
1073
}
1✔
1074

1075
PathGeneratorXY::~PathGeneratorXY() { }
6✔
1076

1077
ossia::value PathGeneratorXY::getMin() const noexcept
×
1078
{
1079
  return domain().get().get_min();
×
1080
}
1081

1082
ossia::value PathGeneratorXY::getMax() const noexcept
×
1083
{
1084
  return domain().get().get_max();
×
1085
}
1086

1087
void PathGeneratorXY::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
1088
{
1089
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
1090
  port.type = ossia::val_type::LIST;
×
1091
  port.domain = domain().get();
×
1092
}
×
1093

1094
Bargraph::Bargraph(
2✔
1095
    float min, float max, float init, const QString& name, Id<Port> id, QObject* parent)
1096
    : ControlOutlet{name, id, parent}
2✔
1097
{
2✔
1098
  displayHandledExplicitly = true;
2✔
1099
  setValue(init);
2✔
1100
  setDomain(ossia::make_domain(min, max));
2✔
1101
}
2✔
1102

1103
Bargraph::~Bargraph() { }
12✔
1104

1105
}
1106
template <>
1107
SCORE_LIB_PROCESS_EXPORT void
1108
DataStreamReader::read(const Process::FloatSlider& p)
752✔
1109
{
1110
  read((const Process::ControlInlet&)p);
752✔
1111
}
752✔
1112
template <>
1113
SCORE_LIB_PROCESS_EXPORT void
1114
DataStreamWriter::write(Process::FloatSlider& p)
×
1115
{
1116
}
×
1117
template <>
1118
SCORE_LIB_PROCESS_EXPORT void
1119
JSONReader::read(const Process::FloatSlider& p)
834✔
1120
{
1121
  read((const Process::ControlInlet&)p);
834✔
1122
}
834✔
1123
template <>
1124
SCORE_LIB_PROCESS_EXPORT void
1125
JSONWriter::write(Process::FloatSlider& p)
×
1126
{
1127
}
×
1128

1129
template <>
1130
SCORE_LIB_PROCESS_EXPORT void
1131
DataStreamReader::read(const Process::FloatKnob& p)
1,050✔
1132
{
1133
  read((const Process::ControlInlet&)p);
1,050✔
1134
}
1,050✔
1135
template <>
1136
SCORE_LIB_PROCESS_EXPORT void
1137
DataStreamWriter::write(Process::FloatKnob& p)
×
1138
{
1139
}
×
1140
template <>
1141
SCORE_LIB_PROCESS_EXPORT void
1142
JSONReader::read(const Process::FloatKnob& p)
1,034✔
1143
{
1144
  read((const Process::ControlInlet&)p);
1,034✔
1145
}
1,034✔
1146
template <>
1147
SCORE_LIB_PROCESS_EXPORT void
1148
JSONWriter::write(Process::FloatKnob& p)
×
1149
{
1150
}
×
1151

1152
template <>
1153
SCORE_LIB_PROCESS_EXPORT void
1154
DataStreamReader::read(const Process::LogFloatSlider& p)
58✔
1155
{
1156
  read((const Process::ControlInlet&)p);
58✔
1157
}
58✔
1158
template <>
1159
SCORE_LIB_PROCESS_EXPORT void
1160
DataStreamWriter::write(Process::LogFloatSlider& p)
×
1161
{
1162
}
×
1163
template <>
1164
SCORE_LIB_PROCESS_EXPORT void
1165
JSONReader::read(const Process::LogFloatSlider& p)
58✔
1166
{
1167
  read((const Process::ControlInlet&)p);
58✔
1168
}
58✔
1169
template <>
1170
SCORE_LIB_PROCESS_EXPORT void
1171
JSONWriter::write(Process::LogFloatSlider& p)
×
1172
{
1173
}
×
1174

1175
template <>
1176
SCORE_LIB_PROCESS_EXPORT void
1177
DataStreamReader::read(const Process::IntSlider& p)
179✔
1178
{
1179
  read((const Process::ControlInlet&)p);
179✔
1180
}
179✔
1181
template <>
1182
SCORE_LIB_PROCESS_EXPORT void
1183
DataStreamWriter::write(Process::IntSlider& p)
×
1184
{
1185
}
×
1186
template <>
1187
SCORE_LIB_PROCESS_EXPORT void
1188
JSONReader::read(const Process::IntSlider& p)
194✔
1189
{
1190
  read((const Process::ControlInlet&)p);
194✔
1191
}
194✔
1192
template <>
1193
SCORE_LIB_PROCESS_EXPORT void
1194
JSONWriter::write(Process::IntSlider& p)
×
1195
{
1196
}
×
1197

1198
template <>
1199
SCORE_LIB_PROCESS_EXPORT void
1200
DataStreamReader::read(const Process::IntRangeSlider& p)
×
1201
{
1202
  read((const Process::ControlInlet&)p);
×
1203
}
×
1204
template <>
1205
SCORE_LIB_PROCESS_EXPORT void
1206
DataStreamWriter::write(Process::IntRangeSlider& p)
×
1207
{
1208
}
×
1209
template <>
1210
SCORE_LIB_PROCESS_EXPORT void
1211
JSONReader::read(const Process::IntRangeSlider& p)
×
1212
{
1213
  read((const Process::ControlInlet&)p);
×
1214
}
×
1215
template <>
1216
SCORE_LIB_PROCESS_EXPORT void
1217
JSONWriter::write(Process::IntRangeSlider& p)
×
1218
{
1219
}
×
1220
template <>
1221
SCORE_LIB_PROCESS_EXPORT void
1222
DataStreamReader::read(const Process::FloatRangeSlider& p)
12✔
1223
{
1224
  read((const Process::ControlInlet&)p);
12✔
1225
}
12✔
1226
template <>
1227
SCORE_LIB_PROCESS_EXPORT void
1228
DataStreamWriter::write(Process::FloatRangeSlider& p)
×
1229
{
1230
}
×
1231
template <>
1232
SCORE_LIB_PROCESS_EXPORT void
1233
JSONReader::read(const Process::FloatRangeSlider& p)
12✔
1234
{
1235
  read((const Process::ControlInlet&)p);
12✔
1236
}
12✔
1237
template <>
1238
SCORE_LIB_PROCESS_EXPORT void
1239
JSONWriter::write(Process::FloatRangeSlider& p)
×
1240
{
1241
}
×
1242

1243
template <>
1244
SCORE_LIB_PROCESS_EXPORT void
1245
DataStreamReader::read(const Process::IntRangeSpinBox& p)
×
1246
{
1247
  read((const Process::ControlInlet&)p);
×
1248
}
×
1249
template <>
1250
SCORE_LIB_PROCESS_EXPORT void
1251
DataStreamWriter::write(Process::IntRangeSpinBox& p)
×
1252
{
1253
}
×
1254
template <>
1255
SCORE_LIB_PROCESS_EXPORT void
1256
JSONReader::read(const Process::IntRangeSpinBox& p)
×
1257
{
1258
  read((const Process::ControlInlet&)p);
×
1259
}
×
1260
template <>
1261
SCORE_LIB_PROCESS_EXPORT void
1262
JSONWriter::write(Process::IntRangeSpinBox& p)
×
1263
{
1264
}
×
1265
template <>
1266
SCORE_LIB_PROCESS_EXPORT void
1267
DataStreamReader::read(const Process::FloatRangeSpinBox& p)
×
1268
{
1269
  read((const Process::ControlInlet&)p);
×
1270
}
×
1271
template <>
1272
SCORE_LIB_PROCESS_EXPORT void
1273
DataStreamWriter::write(Process::FloatRangeSpinBox& p)
×
1274
{
1275
}
×
1276
template <>
1277
SCORE_LIB_PROCESS_EXPORT void
1278
JSONReader::read(const Process::FloatRangeSpinBox& p)
×
1279
{
1280
  read((const Process::ControlInlet&)p);
×
1281
}
×
1282
template <>
1283
SCORE_LIB_PROCESS_EXPORT void
1284
JSONWriter::write(Process::FloatRangeSpinBox& p)
×
1285
{
1286
}
×
1287

1288
template <>
1289
SCORE_LIB_PROCESS_EXPORT void
1290
DataStreamReader::read(const Process::IntSpinBox& p)
541✔
1291
{
1292
  read((const Process::ControlInlet&)p);
541✔
1293
}
541✔
1294
template <>
1295
SCORE_LIB_PROCESS_EXPORT void
1296
DataStreamWriter::write(Process::IntSpinBox& p)
×
1297
{
1298
}
×
1299
template <>
1300
SCORE_LIB_PROCESS_EXPORT void
1301
JSONReader::read(const Process::IntSpinBox& p)
535✔
1302
{
1303
  read((const Process::ControlInlet&)p);
535✔
1304
}
535✔
1305
template <>
1306
SCORE_LIB_PROCESS_EXPORT void
1307
JSONWriter::write(Process::IntSpinBox& p)
×
1308
{
1309
}
×
1310

1311
template <>
1312
SCORE_LIB_PROCESS_EXPORT void
1313
DataStreamReader::read(const Process::FloatSpinBox& p)
166✔
1314
{
1315
  read((const Process::ControlInlet&)p);
166✔
1316
}
166✔
1317
template <>
1318
SCORE_LIB_PROCESS_EXPORT void
1319
DataStreamWriter::write(Process::FloatSpinBox& p)
×
1320
{
1321
}
×
1322
template <>
1323
SCORE_LIB_PROCESS_EXPORT void
1324
JSONReader::read(const Process::FloatSpinBox& p)
166✔
1325
{
1326
  read((const Process::ControlInlet&)p);
166✔
1327
}
166✔
1328
template <>
1329
SCORE_LIB_PROCESS_EXPORT void
1330
JSONWriter::write(Process::FloatSpinBox& p)
×
1331
{
1332
}
×
1333

1334
template <>
1335
SCORE_LIB_PROCESS_EXPORT void
1336
DataStreamReader::read(const Process::TimeChooser& p)
73✔
1337
{
1338
  read((const Process::ControlInlet&)p);
73✔
1339
}
73✔
1340
template <>
1341
SCORE_LIB_PROCESS_EXPORT void
1342
DataStreamWriter::write(Process::TimeChooser& p)
×
1343
{
1344
}
×
1345
template <>
1346
SCORE_LIB_PROCESS_EXPORT void
1347
JSONReader::read(const Process::TimeChooser& p)
109✔
1348
{
1349
  read((const Process::ControlInlet&)p);
109✔
1350
}
109✔
1351
template <>
1352
SCORE_LIB_PROCESS_EXPORT void
1353
JSONWriter::write(Process::TimeChooser& p)
×
1354
{
1355
}
×
1356

1357
template <>
1358
SCORE_LIB_PROCESS_EXPORT void
1359
DataStreamReader::read(const Process::Toggle& p)
433✔
1360
{
1361
  read((const Process::ControlInlet&)p);
433✔
1362
}
433✔
1363
template <>
1364
SCORE_LIB_PROCESS_EXPORT void
1365
DataStreamWriter::write(Process::Toggle& p)
×
1366
{
1367
}
×
1368
template <>
1369
SCORE_LIB_PROCESS_EXPORT void JSONReader::read(const Process::Toggle& p)
442✔
1370
{
1371
  read((const Process::ControlInlet&)p);
442✔
1372
}
442✔
1373
template <>
1374
SCORE_LIB_PROCESS_EXPORT void JSONWriter::write(Process::Toggle& p)
×
1375
{
1376
}
×
1377

1378
template <>
1379
SCORE_LIB_PROCESS_EXPORT void
1380
DataStreamReader::read(const Process::ChooserToggle& p)
×
1381
{
1382
  read((const Process::ControlInlet&)p);
×
1383
}
×
1384
template <>
1385
SCORE_LIB_PROCESS_EXPORT void
1386
DataStreamWriter::write(Process::ChooserToggle& p)
×
1387
{
1388
}
×
1389
template <>
1390
SCORE_LIB_PROCESS_EXPORT void
1391
JSONReader::read(const Process::ChooserToggle& p)
×
1392
{
1393
  read((const Process::ControlInlet&)p);
×
1394
}
×
1395
template <>
1396
SCORE_LIB_PROCESS_EXPORT void
1397
JSONWriter::write(Process::ChooserToggle& p)
×
1398
{
1399
}
×
1400

1401
template <>
1402
SCORE_LIB_PROCESS_EXPORT void
1403
DataStreamReader::read(const Process::LineEdit& p)
152✔
1404
{
1405
  read((const Process::ControlInlet&)p);
152✔
1406
}
152✔
1407
template <>
1408
SCORE_LIB_PROCESS_EXPORT void
1409
DataStreamWriter::write(Process::LineEdit& p)
×
1410
{
1411
}
×
1412
template <>
1413
SCORE_LIB_PROCESS_EXPORT void
1414
JSONReader::read(const Process::LineEdit& p)
148✔
1415
{
1416
  read((const Process::ControlInlet&)p);
148✔
1417
}
148✔
1418
template <>
1419
SCORE_LIB_PROCESS_EXPORT void JSONWriter::write(Process::LineEdit& p)
×
1420
{
1421
}
×
1422

1423
template <>
1424
SCORE_LIB_PROCESS_EXPORT void
1425
DataStreamReader::read(const Process::ProgramEdit& p)
8✔
1426
{
1427
  read((const Process::ControlInlet&)p);
8✔
1428
}
8✔
1429
template <>
1430
SCORE_LIB_PROCESS_EXPORT void
1431
DataStreamWriter::write(Process::ProgramEdit& p)
×
1432
{
1433
}
×
1434
template <>
1435
SCORE_LIB_PROCESS_EXPORT void
1436
JSONReader::read(const Process::ProgramEdit& p)
8✔
1437
{
1438
  read((const Process::ControlInlet&)p);
8✔
1439
}
8✔
1440
template <>
1441
SCORE_LIB_PROCESS_EXPORT void
1442
JSONWriter::write(Process::ProgramEdit& p)
×
1443
{
1444
}
×
1445

1446
template <>
1447
SCORE_LIB_PROCESS_EXPORT void
1448
DataStreamReader::read(const Process::FileChooser& p)
100✔
1449
{
1450
  read((const Process::ControlInlet&)p);
100✔
1451
  m_stream << p.filters();
100✔
1452
}
100✔
1453
template <>
1454
SCORE_LIB_PROCESS_EXPORT void
1455
DataStreamWriter::write(Process::FileChooser& p)
51✔
1456
{
1457
  QString f;
51✔
1458
  m_stream >> f;
51✔
1459
  p.setFilters(f);
51✔
1460
}
51✔
1461
template <>
1462
SCORE_LIB_PROCESS_EXPORT void
1463
JSONReader::read(const Process::FileChooser& p)
104✔
1464
{
1465
  read((const Process::ControlInlet&)p);
104✔
1466
  obj["Filters"] = p.filters();
104✔
1467
}
104✔
1468
template <>
1469
SCORE_LIB_PROCESS_EXPORT void
1470
JSONWriter::write(Process::FileChooser& p)
54✔
1471
{
1472
  // tryGet: these three writers are reachable through the deserializing
1473
  // constructors, and documents older than the "Filters" key exist.
1474
  if(auto it = obj.tryGet("Filters"))
54✔
1475
  {
1476
    QString f;
54✔
1477
    f <<= *it;
54✔
1478
    p.setFilters(f);
54✔
1479
  }
54✔
1480
}
54✔
1481

1482
template <>
1483
SCORE_LIB_PROCESS_EXPORT void
1484
DataStreamReader::read(const Process::FolderChooser& p)
2✔
1485
{
1486
  read((const Process::ControlInlet&)p);
2✔
1487
}
2✔
1488
template <>
1489
SCORE_LIB_PROCESS_EXPORT void
1490
DataStreamWriter::write(Process::FolderChooser& p)
×
1491
{
1492
}
×
1493
template <>
1494
SCORE_LIB_PROCESS_EXPORT void
1495
JSONReader::read(const Process::FolderChooser& p)
2✔
1496
{
1497
  read((const Process::ControlInlet&)p);
2✔
1498
}
2✔
1499
template <>
1500
SCORE_LIB_PROCESS_EXPORT void
1501
JSONWriter::write(Process::FolderChooser& p)
×
1502
{
1503
}
×
1504

1505
template <>
1506
SCORE_LIB_PROCESS_EXPORT void
1507
DataStreamReader::read(const Process::AudioFileChooser& p)
3✔
1508
{
1509
  read((const Process::ControlInlet&)p);
3✔
1510
  m_stream << p.filters();
3✔
1511
}
3✔
1512
template <>
1513
SCORE_LIB_PROCESS_EXPORT void
1514
DataStreamWriter::write(Process::AudioFileChooser& p)
2✔
1515
{
1516
  QString f;
2✔
1517
  m_stream >> f;
2✔
1518
  p.setFilters(f);
2✔
1519
}
2✔
1520
template <>
1521
SCORE_LIB_PROCESS_EXPORT void
1522
JSONReader::read(const Process::AudioFileChooser& p)
3✔
1523
{
1524
  read((const Process::ControlInlet&)p);
3✔
1525
  obj["Filters"] = p.filters();
3✔
1526
}
3✔
1527
template <>
1528
SCORE_LIB_PROCESS_EXPORT void
1529
JSONWriter::write(Process::AudioFileChooser& p)
2✔
1530
{
1531
  if(auto it = obj.tryGet("Filters"))
2✔
1532
  {
1533
    QString f;
2✔
1534
    f <<= *it;
2✔
1535
    p.setFilters(f);
2✔
1536
  }
2✔
1537
}
2✔
1538

1539
template <>
1540
SCORE_LIB_PROCESS_EXPORT void DataStreamReader::read(const Process::VideoFileChooser& p)
×
1541
{
1542
  read((const Process::ControlInlet&)p);
×
1543
  m_stream << p.filters();
×
1544
}
×
1545
template <>
1546
SCORE_LIB_PROCESS_EXPORT void DataStreamWriter::write(Process::VideoFileChooser& p)
×
1547
{
1548
  QString f;
×
1549
  m_stream >> f;
×
1550
  p.setFilters(f);
×
1551
}
×
1552
template <>
1553
SCORE_LIB_PROCESS_EXPORT void JSONReader::read(const Process::VideoFileChooser& p)
×
1554
{
1555
  read((const Process::ControlInlet&)p);
×
1556
  obj["Filters"] = p.filters();
×
1557
}
×
1558
template <>
1559
SCORE_LIB_PROCESS_EXPORT void JSONWriter::write(Process::VideoFileChooser& p)
×
1560
{
1561
  if(auto it = obj.tryGet("Filters"))
×
1562
  {
1563
    QString f;
×
1564
    f <<= *it;
×
1565
    p.setFilters(f);
×
1566
  }
×
1567
}
×
1568

1569
template <>
1570
SCORE_LIB_PROCESS_EXPORT void
1571
DataStreamReader::read(const Process::Enum& p)
252✔
1572
{
1573
  read((const Process::ControlInlet&)p);
252✔
1574
  m_stream << p.values << p.pixmaps;
252✔
1575
}
252✔
1576
template <>
1577
SCORE_LIB_PROCESS_EXPORT void DataStreamWriter::write(Process::Enum& p)
125✔
1578
{
1579
  m_stream >> p.values >> p.pixmaps;
125✔
1580
}
125✔
1581
template <>
1582
SCORE_LIB_PROCESS_EXPORT void JSONReader::read(const Process::Enum& p)
248✔
1583
{
1584
  read((const Process::ControlInlet&)p);
248✔
1585
  obj["Values"] = p.values;
248✔
1586
  obj["Pixmaps"] = p.pixmaps;
248✔
1587
}
248✔
1588
template <>
1589
SCORE_LIB_PROCESS_EXPORT void JSONWriter::write(Process::Enum& p)
125✔
1590
{
1591
  p.values <<= obj["Values"];
125✔
1592
  p.pixmaps <<= obj["Pixmaps"];
125✔
1593
}
125✔
1594

1595
template <>
1596
SCORE_LIB_PROCESS_EXPORT void
1597
DataStreamReader::read(const Process::ComboBox& p)
348✔
1598
{
1599
  read((const Process::ControlInlet&)p);
348✔
1600
  m_stream << p.alternatives << p.folderPortName << p.fileExtensions;
348✔
1601
}
348✔
1602
template <>
1603
SCORE_LIB_PROCESS_EXPORT void
1604
DataStreamWriter::write(Process::ComboBox& p)
176✔
1605
{
1606
  m_stream >> p.alternatives >> p.folderPortName >> p.fileExtensions;
176✔
1607
}
176✔
1608
template <>
1609
SCORE_LIB_PROCESS_EXPORT void
1610
JSONReader::read(const Process::ComboBox& p)
375✔
1611
{
1612
  read((const Process::ControlInlet&)p);
375✔
1613
  obj["Values"] = p.alternatives;
375✔
1614
  // Folder-backed combobox metadata (empty for a plain combobox). Persisted so
1615
  // a loaded document can re-scan the folder and re-establish live refresh;
1616
  // see ProcessModel::init_folder_comboboxes. Extensions are stored as one
1617
  // space-joined string ("*.json *.wav"), like FileChooser's filters.
1618
  obj["FolderPort"] = p.folderPortName;
375✔
1619
  obj["FileExtensions"] = p.fileExtensions.join(QChar(' '));
375✔
1620
}
375✔
1621
template <>
1622
SCORE_LIB_PROCESS_EXPORT void JSONWriter::write(Process::ComboBox& p)
201✔
1623
{
1624
  p.alternatives <<= obj["Values"];
201✔
1625
  // Guarded for documents saved before these fields existed.
1626
  if(obj.tryGet("FolderPort"))
201✔
1627
    p.folderPortName <<= obj["FolderPort"];
200✔
1628
  if(obj.tryGet("FileExtensions"))
201✔
1629
  {
1630
    QString exts;
200✔
1631
    exts <<= obj["FileExtensions"];
200✔
1632
    p.fileExtensions
400✔
1633
        = exts.isEmpty() ? QStringList{} : exts.split(QChar(' '), Qt::SkipEmptyParts);
200✔
1634
  }
200✔
1635
}
201✔
1636
template <>
1637
SCORE_LIB_PROCESS_EXPORT void
1638
DataStreamReader::read(const Process::Button& p)
20✔
1639
{
1640
  read((const Process::ControlInlet&)p);
20✔
1641
}
20✔
1642
template <>
1643
SCORE_LIB_PROCESS_EXPORT void
1644
DataStreamWriter::write(Process::Button& p)
×
1645
{
1646
}
×
1647
template <>
1648
SCORE_LIB_PROCESS_EXPORT void JSONReader::read(const Process::Button& p)
20✔
1649
{
1650
  read((const Process::ControlInlet&)p);
20✔
1651
}
20✔
1652
template <>
1653
SCORE_LIB_PROCESS_EXPORT void JSONWriter::write(Process::Button& p)
×
1654
{
1655
}
×
1656
template <>
1657
SCORE_LIB_PROCESS_EXPORT void
1658
DataStreamReader::read(const Process::ImpulseButton& p)
76✔
1659
{
1660
  read((const Process::ControlInlet&)p);
76✔
1661
}
76✔
1662
template <>
1663
SCORE_LIB_PROCESS_EXPORT void
1664
DataStreamWriter::write(Process::ImpulseButton& p)
×
1665
{
1666
}
×
1667
template <>
1668
SCORE_LIB_PROCESS_EXPORT void
1669
JSONReader::read(const Process::ImpulseButton& p)
76✔
1670
{
1671
  read((const Process::ControlInlet&)p);
76✔
1672
}
76✔
1673
template <>
1674
SCORE_LIB_PROCESS_EXPORT void
1675
JSONWriter::write(Process::ImpulseButton& p)
×
1676
{
1677
}
×
1678

1679
template <>
1680
SCORE_LIB_PROCESS_EXPORT void
1681
DataStreamReader::read(const Process::HSVSlider& p)
14✔
1682
{
1683
  read((const Process::ControlInlet&)p);
14✔
1684
}
14✔
1685
template <>
1686
SCORE_LIB_PROCESS_EXPORT void
1687
DataStreamWriter::write(Process::HSVSlider& p)
×
1688
{
1689
}
×
1690
template <>
1691
SCORE_LIB_PROCESS_EXPORT void
1692
JSONReader::read(const Process::HSVSlider& p)
10✔
1693
{
1694
  read((const Process::ControlInlet&)p);
10✔
1695
}
10✔
1696
template <>
1697
SCORE_LIB_PROCESS_EXPORT void
1698
JSONWriter::write(Process::HSVSlider& p)
×
1699
{
1700
}
×
1701

1702
template <>
1703
SCORE_LIB_PROCESS_EXPORT void
1704
DataStreamReader::read(const Process::XYSlider& p)
12✔
1705
{
1706
  read((const Process::ControlInlet&)p);
12✔
1707
}
12✔
1708
template <>
1709
SCORE_LIB_PROCESS_EXPORT void
1710
DataStreamWriter::write(Process::XYSlider& p)
×
1711
{
1712
}
×
1713
template <>
1714
SCORE_LIB_PROCESS_EXPORT void
1715
JSONReader::read(const Process::XYSlider& p)
10✔
1716
{
1717
  read((const Process::ControlInlet&)p);
10✔
1718
}
10✔
1719
template <>
1720
SCORE_LIB_PROCESS_EXPORT void JSONWriter::write(Process::XYSlider& p)
×
1721
{
1722
}
×
1723

1724
template <>
1725
SCORE_LIB_PROCESS_EXPORT void
1726
DataStreamReader::read(const Process::XYZSlider& p)
×
1727
{
1728
  read((const Process::ControlInlet&)p);
×
1729
}
×
1730
template <>
1731
SCORE_LIB_PROCESS_EXPORT void
1732
DataStreamWriter::write(Process::XYZSlider& p)
×
1733
{
1734
}
×
1735
template <>
1736
SCORE_LIB_PROCESS_EXPORT void
1737
JSONReader::read(const Process::XYZSlider& p)
×
1738
{
1739
  read((const Process::ControlInlet&)p);
×
1740
}
×
1741
template <>
1742
SCORE_LIB_PROCESS_EXPORT void
1743
JSONWriter::write(Process::XYZSlider& p)
×
1744
{
1745
}
×
1746

1747
template <>
1748
SCORE_LIB_PROCESS_EXPORT void
1749
DataStreamReader::read(const Process::XYSpinboxes& p)
92✔
1750
{
1751
  read((const Process::ControlInlet&)p);
92✔
1752
  m_stream << p.integral;
92✔
1753
}
92✔
1754
template <>
1755
SCORE_LIB_PROCESS_EXPORT void
1756
DataStreamWriter::write(Process::XYSpinboxes& p)
46✔
1757
{
1758
  m_stream >> p.integral;
46✔
1759
}
46✔
1760
template <>
1761
SCORE_LIB_PROCESS_EXPORT void
1762
JSONReader::read(const Process::XYSpinboxes& p)
92✔
1763
{
1764
  read((const Process::ControlInlet&)p);
92✔
1765
  obj["Integral"] = p.integral;
92✔
1766
}
92✔
1767
template <>
1768
SCORE_LIB_PROCESS_EXPORT void
1769
JSONWriter::write(Process::XYSpinboxes& p)
46✔
1770
{
1771
  if(auto val = obj.tryGet("Integral"))
46✔
1772
    p.integral = val->toBool();
46✔
1773
}
46✔
1774

1775
template <>
1776
SCORE_LIB_PROCESS_EXPORT void
1777
DataStreamReader::read(const Process::XYZSpinboxes& p)
190✔
1778
{
1779
  read((const Process::ControlInlet&)p);
190✔
1780
}
190✔
1781
template <>
1782
SCORE_LIB_PROCESS_EXPORT void
1783
DataStreamWriter::write(Process::XYZSpinboxes& p)
×
1784
{
1785
}
×
1786
template <>
1787
SCORE_LIB_PROCESS_EXPORT void
1788
JSONReader::read(const Process::XYZSpinboxes& p)
168✔
1789
{
1790
  read((const Process::ControlInlet&)p);
168✔
1791
}
168✔
1792
template <>
1793
SCORE_LIB_PROCESS_EXPORT void
1794
JSONWriter::write(Process::XYZSpinboxes& p)
×
1795
{
1796
}
×
1797

1798
template <>
1799
SCORE_LIB_PROCESS_EXPORT void
1800
DataStreamReader::read(const Process::MultiSlider& p)
9✔
1801
{
1802
  read((const Process::ControlInlet&)p);
9✔
1803
}
9✔
1804
template <>
1805
SCORE_LIB_PROCESS_EXPORT void
1806
DataStreamWriter::write(Process::MultiSlider& p)
×
1807
{
1808
}
×
1809
template <>
1810
SCORE_LIB_PROCESS_EXPORT void
1811
JSONReader::read(const Process::MultiSlider& p)
9✔
1812
{
1813
  read((const Process::ControlInlet&)p);
9✔
1814
}
9✔
1815
template <>
1816
SCORE_LIB_PROCESS_EXPORT void
1817
JSONWriter::write(Process::MultiSlider& p)
×
1818
{
1819
}
×
1820

1821
template <>
1822
SCORE_LIB_PROCESS_EXPORT void
1823
DataStreamReader::read(const Process::MultiSliderXY& p)
2✔
1824
{
1825
  read((const Process::ControlInlet&)p);
2✔
1826
}
2✔
1827
template <>
1828
SCORE_LIB_PROCESS_EXPORT void
1829
DataStreamWriter::write(Process::MultiSliderXY& p)
×
1830
{
1831
}
×
1832
template <>
1833
SCORE_LIB_PROCESS_EXPORT void
1834
JSONReader::read(const Process::MultiSliderXY& p)
2✔
1835
{
1836
  read((const Process::ControlInlet&)p);
2✔
1837
}
2✔
1838
template <>
1839
SCORE_LIB_PROCESS_EXPORT void
1840
JSONWriter::write(Process::MultiSliderXY& p)
×
1841
{
1842
}
×
1843

1844

1845
template <>
1846
SCORE_LIB_PROCESS_EXPORT void
1847
DataStreamReader::read(const Process::PathGeneratorXY& p)
2✔
1848
{
1849
  read((const Process::ControlInlet&)p);
2✔
1850
}
2✔
1851
template <>
1852
SCORE_LIB_PROCESS_EXPORT void
1853
DataStreamWriter::write(Process::PathGeneratorXY& p)
×
1854
{
1855
}
×
1856
template <>
1857
SCORE_LIB_PROCESS_EXPORT void
1858
JSONReader::read(const Process::PathGeneratorXY& p)
2✔
1859
{
1860
  read((const Process::ControlInlet&)p);
2✔
1861
}
2✔
1862
template <>
1863
SCORE_LIB_PROCESS_EXPORT void
1864
JSONWriter::write(Process::PathGeneratorXY& p)
×
1865
{
1866
}
×
1867

1868
template <>
1869
SCORE_LIB_PROCESS_EXPORT void
1870
DataStreamReader::read(const Process::Bargraph& p)
4✔
1871
{
1872
  read((const Process::ControlOutlet&)p);
4✔
1873
}
4✔
1874
template <>
1875
SCORE_LIB_PROCESS_EXPORT void
1876
DataStreamWriter::write(Process::Bargraph& p)
×
1877
{
1878
}
×
1879
template <>
1880
SCORE_LIB_PROCESS_EXPORT void
1881
JSONReader::read(const Process::Bargraph& p)
4✔
1882
{
1883
  read((const Process::ControlOutlet&)p);
4✔
1884
}
4✔
1885
template <>
1886
SCORE_LIB_PROCESS_EXPORT void JSONWriter::write(Process::Bargraph& p)
×
1887
{
1888
}
×
1889

1890
template <>
1891
SCORE_LIB_PROCESS_EXPORT void DataStreamReader::read(const QString& p)
1,052✔
1892
{
1893
  m_stream << p;
1,052✔
1894
}
1,052✔
1895
template <>
1896
SCORE_LIB_PROCESS_EXPORT void DataStreamWriter::write(QString& p)
494✔
1897
{
1898
  m_stream >> p;
494✔
1899
}
494✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc