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

ossia / score / 35899133125

23 Sep 2026 05:57PM UTC coverage: 41.488% (+1.2%) from 40.337%
35899133125

push

github

jcelerier
3rdparty: follow the merged libossia

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

123236 of 297041 relevant lines covered (41.49%)

113626.05 hits per line

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

58.72
/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)
13,041✔
23
W_OBJECT_IMPL(Process::FileChooserBase)
2✔
24
W_OBJECT_IMPL(Process::FileChooser)
268✔
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)
186✔
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
156✔
82
{
83
  // Two invalid values compare equal, so one would select a valueless entry.
84
  if(!v.valid())
156✔
85
    return -1;
1✔
86

87
  const int n = std::ssize(alternatives);
155✔
88
  for(int i = 0; i < n; i++)
436✔
89
    if(alternatives[i].second == v)
428✔
90
      return i;
147✔
91

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

95
  return readEntryIndex(v, n).value_or(-1);
5✔
96
}
156✔
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
65✔
106
{
107
  if(!v.valid())
65✔
108
    return -1;
1✔
109

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

116
  return readEntryIndex(v, n).value_or(-1);
16✔
117
}
65✔
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(
169✔
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}
169✔
130
    , pixmaps{std::move(pixmaps)}
169✔
131
{
169✔
132
  for(auto& val : dom)
900✔
133
    values.push_back(QString::fromStdString(val));
731✔
134

135
  displayHandledExplicitly = true;
169✔
136
  setInit(init);
169✔
137
  setValue(init);
169✔
138
  setDomain(State::Domain{ossia::domain_base<std::string>{dom}});
169✔
139
}
169✔
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() { }
837✔
158

159
Enum::Enum(DataStream::Deserializer& vis, QObject* parent)
252✔
160
    : ControlInlet{vis, parent}
126✔
161
{
126✔
162
  vis.writeTo(*this);
126✔
163
}
126✔
164
Enum::Enum(JSONObject::Deserializer& vis, QObject* parent)
252✔
165
    : ControlInlet{vis, parent}
126✔
166
{
126✔
167
  vis.writeTo(*this);
126✔
168
}
126✔
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)
354✔
188
    : ControlInlet{vis, parent}
177✔
189
{
177✔
190
  vis.writeTo(*this);
177✔
191
}
×
192
ComboBox::ComboBox(
451✔
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}
451✔
196
    , alternatives{std::move(values)}
451✔
197
{
451✔
198
  displayHandledExplicitly = true;
451✔
199
  setInit(init);
451✔
200
  setValue(init);
451✔
201
  std::vector<ossia::value> vals;
451✔
202
  for(auto& v : alternatives)
3,413✔
203
    vals.push_back(v.second);
2,962✔
204
  setDomain(State::Domain{ossia::make_domain(vals)});
451✔
205
}
×
206

207
void ComboBox::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
83✔
208
{
209
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
83✔
210
  port.domain = domain().get();
83✔
211
}
83✔
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() { }
1,636✔
285

286
ComboBox::ComboBox(JSONObject::Deserializer& vis, QObject* parent)
406✔
287
    : ControlInlet{vis, parent}
203✔
288
{
203✔
289
  vis.writeTo(*this);
203✔
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
41✔
314
{
315
  static const State::Unit u{ossia::unit_t{ossia::rgba_u{}}};
41✔
316
  return u;
41✔
317
}
318

319
void HSVSlider::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
21✔
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);
21✔
326
  port.type = unit().get();
21✔
327
}
21✔
328

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

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

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

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

358
FloatKnob::~FloatKnob() { }
3,452✔
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(
54✔
368
    float min, float max, float init, const QString& name, Id<Port> id, QObject* parent)
369
    : ControlInlet{name, id, parent}
54✔
370
{
54✔
371
  displayHandledExplicitly = true;
54✔
372
  setInit(init);
54✔
373
  setValue(init);
54✔
374
  setDomain(ossia::make_domain(min, max));
54✔
375
}
54✔
376

377
LogFloatSlider::~LogFloatSlider() { }
226✔
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(
215✔
388
    int min, int max, int init, const QString& name, Id<Port> id, QObject* parent)
389
    : ControlInlet{name, id, parent}
215✔
390
{
215✔
391
  displayHandledExplicitly = true;
215✔
392
  setInit(init);
215✔
393
  setValue(init);
215✔
394
  setDomain(ossia::make_domain(min, max));
215✔
395
}
215✔
396

397
IntSlider::~IntSlider() { }
812✔
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(
517✔
490
    int min, int max, int init, const QString& name, Id<Port> id, QObject* parent)
491
    : ControlInlet{name, id, parent}
517✔
492
{
517✔
493
  displayHandledExplicitly = true;
517✔
494
  setInit(init);
517✔
495
  setValue(init);
517✔
496
  setDomain(ossia::make_domain(min, max));
517✔
497
}
517✔
498

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

506
IntSpinBox::~IntSpinBox() { }
1,959✔
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(
150✔
529
    float min, float max, float init, const QString& name, Id<Port> id, QObject* parent)
530
    : ControlInlet{name, id, parent}
150✔
531
{
150✔
532
  displayHandledExplicitly = true;
150✔
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});
150✔
543
  setInit(value());
150✔
544
  setDomain(ossia::make_domain(ossia::vec2f{min, 0.f}, ossia::vec2f{max, 1.f}));
150✔
545
}
150✔
546

547
TimeChooser::~TimeChooser() { }
517✔
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)
417✔
558
    : ControlInlet{name, id, parent}
417✔
559
{
417✔
560
  displayHandledExplicitly = true;
417✔
561
  setInit(init);
417✔
562
  setValue(init);
417✔
563
  setDomain(State::Domain{ossia::domain_base<bool>{}});
417✔
564
}
417✔
565

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

573
Toggle::~Toggle() { }
1,730✔
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)
211✔
608
    : ControlInlet{name, id, parent}
211✔
609
{
211✔
610
  displayHandledExplicitly = true;
211✔
611
  setValue(init.toStdString());
211✔
612
  setInit(value());
211✔
613
}
211✔
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() { }
729✔
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(
69✔
642
    QString init, QString filters, const QString& name, Id<Port> id, QObject* parent)
643
    : ControlInlet{name, id, parent}
69✔
644
{
69✔
645
  displayHandledExplicitly = true;
69✔
646
  setValue(init.toStdString());
69✔
647
  setInit(value());
69✔
648
  m_filters = filters;
69✔
649
}
69✔
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()
178✔
696
{
178✔
697
  destroying();
178✔
698
}
178✔
699

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

706
FileChooser::~FileChooser() { }
343✔
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)
16✔
829
    : ControlInlet{name, id, parent}
16✔
830
{
16✔
831
  displayHandledExplicitly = true;
16✔
832
  setValue(false);
16✔
833
  setInit(false);
16✔
834
  setDomain(State::Domain{ossia::domain_base<bool>{}});
16✔
835
}
16✔
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() { }
72✔
845

846
ImpulseButton::ImpulseButton(const QString& name, Id<Port> id, QObject* parent)
52✔
847
    : ControlInlet{name, id, parent}
52✔
848
{
52✔
849
  displayHandledExplicitly = true;
52✔
850
  setValue(ossia::impulse{});
52✔
851
  setInit(ossia::impulse{});
52✔
852
  setDomain(State::Domain{ossia::domain_base<ossia::impulse>{}});
52✔
853
}
52✔
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
  // A bang happens, it is not a state: an address mapped here delivers what it
862
  // received, instead of having its current value copied in on every tick.
863
  port.is_event = true;
×
864
}
×
865

866
ImpulseButton::~ImpulseButton() { }
256✔
867

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

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

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

895
XYSlider::~XYSlider() { }
46✔
896

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

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

918
XYZSlider::~XYZSlider() { }
2✔
919

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

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

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

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

979
XYSpinboxes::~XYSpinboxes() { }
280✔
980

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

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

1000
XYZSpinboxes::~XYZSpinboxes() { }
1,008✔
1001

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

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

1020
MultiSlider::~MultiSlider() { }
50✔
1021

1022
ossia::value MultiSlider::getMin() const noexcept
×
1023
{
1024
  return domain().get().get_min();
×
1025
}
1026

1027
ossia::value MultiSlider::getMax() const noexcept
×
1028
{
1029
  return domain().get().get_max();
×
1030
}
1031

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

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

1049
MultiSliderXY::~MultiSliderXY() { }
6✔
1050

1051
ossia::value MultiSliderXY::getMin() const noexcept
×
1052
{
1053
  return domain().get().get_min();
×
1054
}
1055

1056
ossia::value MultiSliderXY::getMax() const noexcept
×
1057
{
1058
  return domain().get().get_max();
×
1059
}
1060

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

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

1078
PathGeneratorXY::~PathGeneratorXY() { }
6✔
1079

1080
ossia::value PathGeneratorXY::getMin() const noexcept
×
1081
{
1082
  return domain().get().get_min();
×
1083
}
1084

1085
ossia::value PathGeneratorXY::getMax() const noexcept
×
1086
{
1087
  return domain().get().get_max();
×
1088
}
1089

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

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

1106
Bargraph::~Bargraph() { }
12✔
1107

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1847

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

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

1893
template <>
1894
SCORE_LIB_PROCESS_EXPORT void DataStreamReader::read(const QString& p)
1,064✔
1895
{
1896
  m_stream << p;
1,064✔
1897
}
1,064✔
1898
template <>
1899
SCORE_LIB_PROCESS_EXPORT void DataStreamWriter::write(QString& p)
500✔
1900
{
1901
  m_stream >> p;
500✔
1902
}
500✔
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