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

ossia / score / 34154826796

07 Sep 2026 07:14PM UTC coverage: 28.003% (+1.6%) from 26.366%
34154826796

push

github

jcelerier
dataflow: refilling a combo box's items is not a domain change

Dragging a control that causes a combo box to be refilled moved the value by
one step and then stopped, left a widget behind, and could leave a right-click
editor on the scene that nothing would close again.

setAlternatives restated the domain, and DefaultEffectItem answers
domainChanged by deleting every control of the process and rebuilding them from
the event loop. So the sequence was: drag the control -> the running object
refills the combo box -> setDomain -> domainChanged -> the control being
dragged is destroyed. The pointer then had nothing to drag, and anything the
destroyed control had put on the scene outlived the item that knew how to take
it down.

The item list is what changed, and alternativesChanged already says so -- the
widgets rebuild from it in place. The domain still follows the items for
whoever reads it later; it just no longer claims the control's shape changed.

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

2 of 2 new or added lines in 2 files covered. (100.0%)

1657 existing lines in 32 files now uncovered.

66180 of 236333 relevant lines covered (28.0%)

63513.54 hits per line

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

52.34
/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

8
#include <ossia-qt/invoke.hpp>
9

10
#include <QCoreApplication>
11
#include <QDir>
12
#include <QFileSystemWatcher>
13

14
#include <wobjectimpl.h>
15

16
W_OBJECT_IMPL(Process::ComboBox)
582✔
17
W_OBJECT_IMPL(Process::FileChooserBase)
2✔
18
W_OBJECT_IMPL(Process::FileChooser)
252✔
19
W_OBJECT_IMPL(Process::FolderChooser)
3✔
20
W_OBJECT_IMPL(Process::AudioFileChooser)
3✔
UNCOV
21
W_OBJECT_IMPL(Process::VideoFileChooser)
×
22
W_OBJECT_IMPL(Process::ImpulseButton)
111✔
23
namespace Process
24
{
25
Enum::Enum(
155✔
26
    const std::vector<std::string>& dom, std::vector<QString> pixmaps, std::string init,
27
    const QString& name, Id<Port> id, QObject* parent)
28
    : ControlInlet{name, id, parent}
155✔
29
    , pixmaps{std::move(pixmaps)}
155✔
30
{
155✔
31
  for(auto& val : dom)
821✔
32
    values.push_back(QString::fromStdString(val));
666✔
33

34
  displayHandledExplicitly = true;
155✔
35
  setInit(init);
155✔
36
  setValue(init);
155✔
37
  setDomain(State::Domain{ossia::domain_base<std::string>{dom}});
155✔
38
}
155✔
39

40
Enum::Enum(
×
41
    const QStringList& values, std::vector<QString> pixmaps, std::string init,
42
    const QString& name, Id<Port> id, QObject* parent)
43
    : ControlInlet{name, id, parent}
×
44
    , values{values.begin(), values.end()}
×
45
    , pixmaps{std::move(pixmaps)}
×
46
{
×
47
  displayHandledExplicitly = true;
×
48
  setInit(init);
×
49
  setValue(init);
×
50
  ossia::domain_base<std::string> dom;
×
51
  for(auto& val : values)
×
UNCOV
52
    dom.values.push_back(val.toStdString());
×
UNCOV
53
  setDomain(State::Domain{dom});
×
UNCOV
54
}
×
55

56
Enum::~Enum() { }
794✔
57

58
Enum::Enum(DataStream::Deserializer& vis, QObject* parent)
242✔
59
    : ControlInlet{vis, parent}
121✔
60
{
121✔
61
  vis.writeTo(*this);
121✔
62
}
121✔
63
Enum::Enum(JSONObject::Deserializer& vis, QObject* parent)
242✔
64
    : ControlInlet{vis, parent}
121✔
65
{
121✔
66
  vis.writeTo(*this);
121✔
67
}
121✔
68
Enum::Enum(DataStream::Deserializer&& vis, QObject* parent)
×
69
    : ControlInlet{vis, parent}
×
70
{
×
71
  vis.writeTo(*this);
×
72
}
×
73
Enum::Enum(JSONObject::Deserializer&& vis, QObject* parent)
×
74
    : ControlInlet{vis, parent}
×
UNCOV
75
{
×
76
  vis.writeTo(*this);
×
UNCOV
77
}
×
78

79
void Enum::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
80
{
81
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
UNCOV
82
  port.type = ossia::val_type::STRING;
×
UNCOV
83
  port.domain = domain().get();
×
UNCOV
84
}
×
85

86
ComboBox::ComboBox(DataStream::Deserializer& vis, QObject* parent)
308✔
87
    : ControlInlet{vis, parent}
154✔
88
{
154✔
89
  vis.writeTo(*this);
154✔
UNCOV
90
}
×
91
ComboBox::ComboBox(
259✔
92
    std::vector<std::pair<QString, ossia::value>> values, ossia::value init,
93
    const QString& name, Id<Port> id, QObject* parent)
94
    : ControlInlet{name, id, parent}
259✔
95
    , alternatives{std::move(values)}
259✔
96
{
259✔
97
  displayHandledExplicitly = true;
259✔
98
  setInit(init);
259✔
99
  setValue(init);
259✔
100
  std::vector<ossia::value> vals;
259✔
101
  for(auto& v : alternatives)
1,935✔
102
    vals.push_back(v.second);
1,676✔
103
  setDomain(State::Domain{ossia::make_domain(vals)});
259✔
UNCOV
104
}
×
105

106
void ComboBox::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
107
{
UNCOV
108
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
UNCOV
109
  port.domain = domain().get();
×
UNCOV
110
}
×
111

112
void ComboBox::repopulateFromFolder(const QString& folderPath)
6✔
113
{
114
  std::vector<std::pair<QString, ossia::value>> alts;
6✔
115
  if(!folderPath.isEmpty())
6✔
116
  {
117
    QDir dir(folderPath);
5✔
118
    const auto files = fileExtensions.isEmpty()
10✔
119
                           ? dir.entryList(QDir::Files, QDir::Name)
4✔
120
                           : dir.entryList(fileExtensions, QDir::Files, QDir::Name);
1✔
121
    for(const auto& f : files)
13✔
122
      alts.emplace_back(f, f.toStdString()); // value = the file name itself
8✔
123
  }
5✔
124
  if(alts.empty())
6✔
125
    alts.emplace_back(QStringLiteral("-"), std::string("-"));
3✔
126
  setAlternatives(std::move(alts));
6✔
127

128
  // Watch the folder so files created while the document is open (e.g. by an
129
  // upstream process writing its analysis) appear in the list right away.
130
  if(folderPath != m_watchedFolder)
6✔
131
  {
132
    if(m_folderWatcher)
6✔
133
    {
134
      delete m_folderWatcher;
1✔
135
      m_folderWatcher = nullptr;
1✔
136
    }
1✔
137
    m_watchedFolder = folderPath;
6✔
138
    if(!folderPath.isEmpty() && QDir{folderPath}.exists())
11✔
139
    {
140
      m_folderWatcher = new QFileSystemWatcher{{folderPath}, this};
4✔
141
      connect(
4✔
142
          m_folderWatcher, &QFileSystemWatcher::directoryChanged, this,
4✔
143
          [this](const QString& path) { repopulateFromFolder(path); });
4✔
144
    }
4✔
145
  }
6✔
146
}
6✔
147

148
void ComboBox::setAlternatives(std::vector<std::pair<QString, ossia::value>> values)
11✔
149
{
150
  if(values == alternatives)
11✔
151
    return;
5✔
152
  alternatives = std::move(values);
6✔
153

154
  std::vector<ossia::value> vals;
6✔
155
  for(auto& v : alternatives)
22✔
156
    vals.push_back(v.second);
16✔
157
  // Not setDomain(): what changed is the item list, and alternativesChanged
158
  // below says exactly that. Announcing a domain change instead makes the
159
  // effect item rebuild every control of the process, which kills whatever
160
  // edit is in flight -- and for a combo box refilled from the running score,
161
  // that includes the control the user is dragging to refill it.
162
  setDomainWithoutNotifying(State::Domain{ossia::make_domain(vals)});
6✔
163

164
  // Keep the current value if it is still in the list; otherwise fall back to
165
  // the init value when available. A value absent from the list is left
166
  // untouched: for folder-backed comboboxes it may name a file that simply
167
  // does not exist *yet* — it becomes selectable (and shows up as selected)
168
  // once the file appears.
169
  if(!alternatives.empty())
6✔
170
  {
171
    auto in_list = [this](const ossia::value& v) {
16✔
172
      return ossia::find_if(
20✔
173
                 alternatives, [&](const auto& pair) { return pair.second == v; })
31✔
174
             != alternatives.end();
10✔
175
    };
176
    if(!in_list(value()) && in_list(init()))
6✔
177
      setValue(init());
1✔
178
  }
6✔
179

180
  alternativesChanged();
6✔
181
}
11✔
182

183
ComboBox::~ComboBox() { }
1,173✔
184

185
ComboBox::ComboBox(JSONObject::Deserializer& vis, QObject* parent)
362✔
186
    : ControlInlet{vis, parent}
181✔
187
{
181✔
188
  vis.writeTo(*this);
181✔
UNCOV
189
}
×
UNCOV
190
ComboBox::ComboBox(DataStream::Deserializer&& vis, QObject* parent)
×
UNCOV
191
    : ControlInlet{vis, parent}
×
UNCOV
192
{
×
UNCOV
193
  vis.writeTo(*this);
×
UNCOV
194
}
×
UNCOV
195
ComboBox::ComboBox(JSONObject::Deserializer&& vis, QObject* parent)
×
UNCOV
196
    : ControlInlet{vis, parent}
×
UNCOV
197
{
×
UNCOV
198
  vis.writeTo(*this);
×
199
}
×
200

201
HSVSlider::HSVSlider(
8✔
202
    ossia::vec4f init, const QString& name, Id<Port> id, QObject* parent)
203
    : ControlInlet{name, id, parent}
8✔
204
{
8✔
205
  displayHandledExplicitly = true;
8✔
206
  setInit(init);
8✔
207
  setValue(init);
8✔
208
}
8✔
209

210
HSVSlider::~HSVSlider() { }
38✔
211

212
const State::Unit& HSVSlider::unit() const noexcept
3✔
213
{
214
  static const State::Unit u{ossia::unit_t{ossia::rgba_u{}}};
3✔
215
  return u;
3✔
216
}
217

218
FloatSlider::FloatSlider(
815✔
219
    float min, float max, float init, const QString& name, Id<Port> id, QObject* parent)
220
    : ControlInlet{name, id, parent}
815✔
221
{
815✔
222
  displayHandledExplicitly = true;
815✔
223
  setInit(init);
815✔
224
  setValue(init);
815✔
225
  setDomain(ossia::make_domain(min, max));
815✔
226
}
815✔
227

228
FloatSlider::~FloatSlider() { }
3,188✔
229

230
void FloatSlider::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
231
{
232
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
233
  port.type = ossia::val_type::FLOAT;
×
234
  port.domain = domain().get();
×
235
}
×
236

237
FloatKnob::FloatKnob(
636✔
238
    float min, float max, float init, const QString& name, Id<Port> id, QObject* parent)
239
    : ControlInlet{name, id, parent}
636✔
240
{
636✔
241
  displayHandledExplicitly = true;
636✔
242
  setInit(init);
636✔
243
  setValue(init);
636✔
244
  setDomain(ossia::make_domain(min, max));
636✔
245
}
636✔
246

247
FloatKnob::~FloatKnob() { }
3,356✔
248

UNCOV
249
void FloatKnob::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
250
{
UNCOV
251
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
UNCOV
252
  port.type = ossia::val_type::FLOAT;
×
UNCOV
253
  port.domain = domain().get();
×
UNCOV
254
}
×
255

256
LogFloatSlider::LogFloatSlider(
48✔
257
    float min, float max, float init, const QString& name, Id<Port> id, QObject* parent)
258
    : ControlInlet{name, id, parent}
48✔
259
{
48✔
260
  displayHandledExplicitly = true;
48✔
261
  setInit(init);
48✔
262
  setValue(init);
48✔
263
  setDomain(ossia::make_domain(min, max));
48✔
264
}
48✔
265

266
LogFloatSlider::~LogFloatSlider() { }
214✔
267

268
void LogFloatSlider::setupExecution(
×
269
    ossia::inlet& inl, QObject* exec_context) const noexcept
270
{
271
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
272
  port.type = ossia::val_type::FLOAT;
×
273
  port.domain = domain().get();
×
274
}
×
275

276
IntSlider::IntSlider(
129✔
277
    int min, int max, int init, const QString& name, Id<Port> id, QObject* parent)
278
    : ControlInlet{name, id, parent}
129✔
279
{
129✔
280
  displayHandledExplicitly = true;
129✔
281
  setInit(init);
129✔
282
  setValue(init);
129✔
283
  setDomain(ossia::make_domain(min, max));
129✔
284
}
129✔
285

286
IntSlider::~IntSlider() { }
640✔
287

288
void IntSlider::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
289
{
UNCOV
290
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
291
  port.type = ossia::val_type::INT;
×
292
  port.domain = domain().get();
×
293
}
×
294

295
IntRangeSlider::IntRangeSlider(
×
296
    int min, int max, ossia::vec2f init, const QString& name, Id<Port> id,
297
    QObject* parent)
UNCOV
298
    : ControlInlet{name, id, parent}
×
299
{
×
UNCOV
300
  displayHandledExplicitly = true;
×
301
  setInit(init);
×
UNCOV
302
  setValue(init);
×
UNCOV
303
  setDomain(ossia::make_domain(min, max));
×
304
}
×
305

306
IntRangeSlider::~IntRangeSlider() { }
×
307

UNCOV
308
void IntRangeSlider::setupExecution(
×
309
    ossia::inlet& inl, QObject* exec_context) const noexcept
310
{
UNCOV
311
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
UNCOV
312
  port.type = ossia::val_type::VEC2F;
×
UNCOV
313
  port.domain = domain().get();
×
UNCOV
314
}
×
315

316
FloatRangeSlider::FloatRangeSlider(
6✔
317
    float min, float max, ossia::vec2f init, const QString& name, Id<Port> id,
318
    QObject* parent)
319
    : ControlInlet{name, id, parent}
6✔
320
{
6✔
321
  displayHandledExplicitly = true;
6✔
322
  setInit(init);
6✔
323
  setValue(init);
6✔
324
  setDomain(ossia::make_domain(min, max));
6✔
325
}
6✔
326

327
FloatRangeSlider::~FloatRangeSlider() { }
36✔
328

UNCOV
329
void FloatRangeSlider::setupExecution(
×
330
    ossia::inlet& inl, QObject* exec_context) const noexcept
331
{
UNCOV
332
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
UNCOV
333
  port.type = ossia::val_type::VEC2F;
×
UNCOV
334
  port.domain = domain().get();
×
UNCOV
335
}
×
336

UNCOV
337
IntRangeSpinBox::IntRangeSpinBox(
×
338
    int min, int max, ossia::vec2f init, const QString& name, Id<Port> id,
339
    QObject* parent)
UNCOV
340
    : ControlInlet{name, id, parent}
×
341
{
×
342
  displayHandledExplicitly = true;
×
343
  setInit(init);
×
344
  setValue(init);
×
UNCOV
345
  setDomain(ossia::make_domain(min, max));
×
UNCOV
346
}
×
UNCOV
347
IntRangeSpinBox::~IntRangeSpinBox() { }
×
348

UNCOV
349
void IntRangeSpinBox::setupExecution(
×
350
    ossia::inlet& inl, QObject* exec_context) const noexcept
351
{
UNCOV
352
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
UNCOV
353
  port.type = ossia::val_type::VEC2F;
×
UNCOV
354
  port.domain = domain().get();
×
UNCOV
355
}
×
356

UNCOV
357
FloatRangeSpinBox::FloatRangeSpinBox(
×
358
    float min, float max, ossia::vec2f init, const QString& name, Id<Port> id,
359
    QObject* parent)
360
    : ControlInlet{name, id, parent}
×
UNCOV
361
{
×
362
  displayHandledExplicitly = true;
×
363
  setInit(init);
×
UNCOV
364
  setValue(init);
×
UNCOV
365
  setDomain(ossia::make_domain(min, max));
×
366
}
×
367

UNCOV
368
FloatRangeSpinBox::~FloatRangeSpinBox() { }
×
369

UNCOV
370
void FloatRangeSpinBox::setupExecution(
×
371
    ossia::inlet& inl, QObject* exec_context) const noexcept
372
{
UNCOV
373
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
UNCOV
374
  port.type = ossia::val_type::VEC2F;
×
UNCOV
375
  port.domain = domain().get();
×
UNCOV
376
}
×
377

378
IntSpinBox::IntSpinBox(
404✔
379
    int min, int max, int init, const QString& name, Id<Port> id, QObject* parent)
380
    : ControlInlet{name, id, parent}
404✔
381
{
404✔
382
  displayHandledExplicitly = true;
404✔
383
  setInit(init);
404✔
384
  setValue(init);
404✔
385
  setDomain(ossia::make_domain(min, max));
404✔
386
}
404✔
387

UNCOV
388
void IntSpinBox::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
389
{
390
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
391
  port.type = ossia::val_type::INT;
×
392
  port.domain = domain().get();
×
393
}
×
394

395
IntSpinBox::~IntSpinBox() { }
1,647✔
396

397
FloatSpinBox::FloatSpinBox(
83✔
398
    float min, float max, float init, const QString& name, Id<Port> id, QObject* parent)
399
    : ControlInlet{name, id, parent}
83✔
400
{
83✔
401
  displayHandledExplicitly = true;
83✔
402
  setInit(init);
83✔
403
  setValue(init);
83✔
404
  setDomain(ossia::make_domain(min, max));
83✔
405
}
83✔
406

407
void FloatSpinBox::setupExecution(
×
408
    ossia::inlet& inl, QObject* exec_context) const noexcept
409
{
UNCOV
410
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
411
  port.type = ossia::val_type::FLOAT;
×
412
  port.domain = domain().get();
×
413
}
×
414

415
FloatSpinBox::~FloatSpinBox() { }
498✔
416

417
TimeChooser::TimeChooser(
128✔
418
    float min, float max, float init, const QString& name, Id<Port> id, QObject* parent)
419
    : ControlInlet{name, id, parent}
128✔
420
{
128✔
421
  displayHandledExplicitly = true;
128✔
422
  setValue(ossia::vec2f{init, 1.f});
128✔
423
  setInit(value());
128✔
424
  setDomain(ossia::make_domain(ossia::vec2f{min, 0.f}, ossia::vec2f{max, 1.f}));
128✔
425
}
128✔
426

427
TimeChooser::~TimeChooser() { }
462✔
428

429
void TimeChooser::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
430
{
431
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
UNCOV
432
  port.type = ossia::val_type::VEC2F;
×
433
  // port.type = ossia::second_u{};
434
  // port.domain = domain().get();
UNCOV
435
}
×
436

437
Toggle::Toggle(bool init, const QString& name, Id<Port> id, QObject* parent)
340✔
438
    : ControlInlet{name, id, parent}
340✔
439
{
340✔
440
  displayHandledExplicitly = true;
340✔
441
  setInit(init);
340✔
442
  setValue(init);
340✔
443
  setDomain(State::Domain{ossia::domain_base<bool>{}});
340✔
444
}
340✔
445

446
void Toggle::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
447
{
448
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
UNCOV
449
  port.type = ossia::val_type::BOOL;
×
UNCOV
450
  port.domain = domain().get();
×
UNCOV
451
}
×
452

453
Toggle::~Toggle() { }
1,492✔
454

UNCOV
455
ChooserToggle::ChooserToggle(
×
456
    QStringList alternatives, bool init, const QString& name, Id<Port> id,
457
    QObject* parent)
UNCOV
458
    : ControlInlet{name, id, parent}
×
UNCOV
459
{
×
UNCOV
460
  displayHandledExplicitly = true;
×
UNCOV
461
  setValue(init ? alternatives[1].toStdString() : alternatives[0].toStdString());
×
462
  setInit(value());
×
UNCOV
463
  setDomain(
×
UNCOV
464
      State::Domain{ossia::domain_base<std::string>{
×
465
          {alternatives[0].toStdString(), alternatives[1].toStdString()}}});
×
466
}
×
467

468
void ChooserToggle::setupExecution(
×
469
    ossia::inlet& inl, QObject* exec_context) const noexcept
470
{
UNCOV
471
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
UNCOV
472
  port.type = ossia::val_type::STRING;
×
473
  port.domain = domain().get();
×
474
}
×
475

UNCOV
476
ChooserToggle::~ChooserToggle() { }
×
477

478
QStringList ChooserToggle::alternatives() const noexcept
×
479
{
480
  const auto& dom = *this->domain().get().v.target<ossia::domain_base<std::string>>();
×
481
  auto it = dom.values.begin();
×
UNCOV
482
  auto& s1 = *it;
×
UNCOV
483
  auto& s2 = *(++it);
×
UNCOV
484
  return {QString::fromStdString(s1), QString::fromStdString(s2)};
×
485
}
486

487
LineEdit::LineEdit(QString init, const QString& name, Id<Port> id, QObject* parent)
65✔
488
    : ControlInlet{name, id, parent}
65✔
489
{
65✔
490
  displayHandledExplicitly = true;
65✔
491
  setValue(init.toStdString());
65✔
492
  setInit(value());
65✔
493
}
65✔
494

495
void LineEdit::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
496
{
497
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
498
  port.type = ossia::val_type::STRING;
×
UNCOV
499
  port.domain = domain().get();
×
UNCOV
500
}
×
501

502
LineEdit::~LineEdit() { }
373✔
503

504
ProgramEdit::ProgramEdit(QString init, const QString& name, Id<Port> id, QObject* parent)
4✔
505
    : ControlInlet{name, id, parent}
4✔
506
{
4✔
507
  displayHandledExplicitly = true;
4✔
508
  setValue(init.toStdString());
4✔
509
  setInit(value());
4✔
510
}
4✔
511

UNCOV
512
void ProgramEdit::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
513
{
UNCOV
514
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
UNCOV
515
  port.type = ossia::val_type::STRING;
×
UNCOV
516
  port.domain = domain().get();
×
UNCOV
517
}
×
518

519
ProgramEdit::~ProgramEdit() { }
24✔
520

521
FileChooserBase::FileChooserBase(
62✔
522
    QString init, QString filters, const QString& name, Id<Port> id, QObject* parent)
523
    : ControlInlet{name, id, parent}
62✔
524
{
62✔
525
  displayHandledExplicitly = true;
62✔
526
  setValue(init.toStdString());
62✔
527
  setInit(value());
62✔
528
  m_filters = filters;
62✔
529
}
62✔
530

531
void FileChooserBase::setupExecution(
×
532
    ossia::inlet& inl, QObject* exec_context) const noexcept
533
{
534
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
UNCOV
535
  port.type = ossia::val_type::STRING;
×
UNCOV
536
  port.domain = domain().get();
×
UNCOV
537
}
×
538

539
void FileChooserBase::enableFileWatch()
2✔
540
{
541
  auto fun = std::make_shared<std::function<void()>>([ptr = QPointer{this}]() mutable {
2✔
UNCOV
542
    ossia::qt::run_async(qApp, [ptr] {
×
UNCOV
543
      if(ptr)
×
544
      {
545
        // This will trigger a reload
546
        // FIXME make it work with execution value changes
UNCOV
547
        ptr->valueChanged(ptr->value());
×
548
      }
×
549
    });
×
UNCOV
550
  });
×
551

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

555
  connect(
2✔
556
      this, &Process::FileChooser::valueChanged, this,
557
      [cur_s = ossia::convert<std::string>(this->value()),
2✔
558
       fun](const ossia::value& v) mutable {
2✔
UNCOV
559
    auto new_s = ossia::convert<std::string>(v);
×
560
    if(new_s != cur_s)
×
561
    {
UNCOV
562
      auto& f = score::FileWatch::instance();
×
563
      f.remove(QString::fromStdString(cur_s), fun);
×
564
      f.add(QString::fromStdString(new_s), fun);
×
565
      cur_s = new_s;
×
566
    }
×
UNCOV
567
      });
×
568

569
  connect(this, &Process::FileChooser::destroying, this, [this, fun] {
4✔
570
    auto& f = score::FileWatch::instance();
2✔
571
    f.remove(QString::fromStdString(ossia::convert<std::string>(this->value())), fun);
2✔
572
  });
2✔
573
}
2✔
574

575
FileChooserBase::~FileChooserBase()
161✔
576
{
161✔
577
  destroying();
161✔
578
}
161✔
579

580
FileChooser::FileChooser(
61✔
581
    QString init, QString filters, const QString& name, Id<Port> id, QObject* parent)
582
    : FileChooserBase{init, filters, name, id, parent}
61✔
583
{
61✔
584
}
61✔
585

586
FileChooser::~FileChooser() { }
316✔
587

588
FolderChooser::FolderChooser(
1✔
589
    QString init, const QString& name, Id<Port> id, QObject* parent)
590
    : Process::ControlInlet{name, id, parent}
1✔
591
{
1✔
592
  displayHandledExplicitly = true;
1✔
593
  setValue(init.toStdString());
1✔
594
  setInit(value());
1✔
595
}
1✔
596

UNCOV
597
void FolderChooser::setupExecution(
×
598
    ossia::inlet& inl, QObject* exec_context) const noexcept
599
{
UNCOV
600
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
UNCOV
601
  port.type = ossia::val_type::STRING;
×
UNCOV
602
  port.domain = domain().get();
×
603
}
×
604

605
FolderChooser::~FolderChooser() { }
6✔
606

607
AudioFileChooser::AudioFileChooser(
1✔
608
    QString init, QString filters, const QString& name, Id<Port> id, QObject* parent)
609
    : FileChooserBase{init, filters, name, id, parent}
1✔
610
{
1✔
611
}
1✔
612

613
AudioFileChooser::~AudioFileChooser() { }
6✔
614

615
static QString toFilters(const QSet<QString>& exts)
×
616
{
617
  QString res;
×
618
  for(const auto& s : exts)
×
619
  {
620
    res += "*.";
×
UNCOV
621
    res += s;
×
UNCOV
622
    res += " ";
×
623
  }
UNCOV
624
  if(!res.isEmpty())
×
UNCOV
625
    res.resize(res.size() - 1);
×
UNCOV
626
  return res;
×
UNCOV
627
}
×
628

UNCOV
629
static QString videoFilesTypes()
×
630
{
631
  // FIXME refactor supported formats with Video process
UNCOV
632
  QSet<QString> files = {"mkv", "mov", "mp4", "h264", "avi", "hap",  "mpg", "mpeg",
×
633
                          "imf", "mxf", "mts", "m2ts", "mj2", "webm", "y4m", "nut", "ts"};
×
UNCOV
634
  return QString{"Videos (%1)"}.arg(toFilters(files));
×
635
}
×
636

637
VideoFileChooser::VideoFileChooser(
×
638
    QString init, QString filters, const QString& name, Id<Port> id, QObject* parent)
UNCOV
639
    : FileChooserBase{init, videoFilesTypes(), name, id, parent}
×
UNCOV
640
{
×
UNCOV
641
}
×
642

UNCOV
643
VideoFileChooser::~VideoFileChooser() { }
×
644

645
Button::Button(const QString& name, Id<Port> id, QObject* parent)
10✔
646
    : ControlInlet{name, id, parent}
10✔
647
{
10✔
648
  displayHandledExplicitly = true;
10✔
649
  setValue(false);
10✔
650
  setInit(false);
10✔
651
  setDomain(State::Domain{ossia::domain_base<bool>{}});
10✔
652
}
10✔
653

UNCOV
654
void Button::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
655
{
656
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
657
  port.type = ossia::val_type::BOOL;
×
658
  port.domain = domain().get();
×
659
}
×
660

661
Button::~Button() { }
60✔
662

663
ImpulseButton::ImpulseButton(const QString& name, Id<Port> id, QObject* parent)
37✔
664
    : ControlInlet{name, id, parent}
37✔
665
{
37✔
666
  displayHandledExplicitly = true;
37✔
667
  setValue(ossia::impulse{});
37✔
668
  setInit(ossia::impulse{});
37✔
669
  setDomain(State::Domain{ossia::domain_base<ossia::impulse>{}});
37✔
670
}
37✔
671

672
void ImpulseButton::setupExecution(
×
673
    ossia::inlet& inl, QObject* exec_context) const noexcept
674
{
675
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
676
  port.type = ossia::val_type::IMPULSE;
×
677
  port.domain = domain().get();
×
678
}
×
679

680
ImpulseButton::~ImpulseButton() { }
222✔
681

682
XYSlider::XYSlider(ossia::vec2f init, const QString& name, Id<Port> id, QObject* parent)
×
UNCOV
683
    : ControlInlet{name, id, parent}
×
684
{
×
685
  displayHandledExplicitly = true;
×
686
  setValue(init);
×
687
  setInit(init);
×
688
  setDomain(ossia::make_domain(ossia::vec2f{0., 0.}, ossia::vec2f{1., 1.}));
×
689
}
×
690

691
XYSlider::XYSlider(
5✔
692
    ossia::vec2f min, ossia::vec2f max, ossia::vec2f init, const QString& name,
693
    Id<Port> id, QObject* parent)
694
    : ControlInlet{name, id, parent}
5✔
695
{
5✔
696
  displayHandledExplicitly = true;
5✔
697
  setValue(init);
5✔
698
  setInit(init);
5✔
699
  setDomain(ossia::make_domain(min, max));
5✔
700
}
5✔
701

UNCOV
702
void XYSlider::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
703
{
UNCOV
704
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
UNCOV
705
  port.type = ossia::val_type::VEC2F;
×
UNCOV
706
  port.domain = domain().get();
×
707
}
×
708

709
XYSlider::~XYSlider() { }
32✔
710

UNCOV
711
XYZSlider::XYZSlider(
×
712
    ossia::vec3f init, const QString& name, Id<Port> id, QObject* parent)
713
    : ControlInlet{name, id, parent}
×
714
{
×
715
  displayHandledExplicitly = true;
×
716
  setValue(init);
×
717
  setInit(init);
×
718
  setDomain(ossia::make_domain(ossia::vec3f{0., 0., 0.}, ossia::vec3f{1., 1., 1.}));
×
719
}
×
720

721
XYZSlider::XYZSlider(
×
722
    ossia::vec3f min, ossia::vec3f max, ossia::vec3f init, const QString& name,
723
    Id<Port> id, QObject* parent)
UNCOV
724
    : ControlInlet{name, id, parent}
×
UNCOV
725
{
×
726
  displayHandledExplicitly = true;
×
UNCOV
727
  setValue(init);
×
728
  setInit(init);
×
729
  setDomain(ossia::make_domain(min, max));
×
730
}
×
731

732
XYZSlider::~XYZSlider() { }
2✔
733

UNCOV
734
void XYZSlider::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
735
{
UNCOV
736
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
UNCOV
737
  port.type = ossia::val_type::VEC3F;
×
UNCOV
738
  port.domain = domain().get();
×
UNCOV
739
}
×
740

UNCOV
741
XYZSpinboxes::XYZSpinboxes(
×
742
    ossia::vec3f init, const QString& name, Id<Port> id, QObject* parent)
UNCOV
743
    : ControlInlet{name, id, parent}
×
UNCOV
744
{
×
UNCOV
745
  displayHandledExplicitly = true;
×
UNCOV
746
  setValue(init);
×
747
  setInit(init);
×
UNCOV
748
  setDomain(ossia::make_domain(ossia::vec3f{0., 0., 0.}, ossia::vec3f{1., 1., 1.}));
×
UNCOV
749
}
×
750

751
XYSpinboxes::XYSpinboxes(
×
752
    ossia::vec2f init, const QString& name, Id<Port> id, QObject* parent)
753
    : ControlInlet{name, id, parent}
×
UNCOV
754
    , integral{false}
×
UNCOV
755
{
×
UNCOV
756
  displayHandledExplicitly = true;
×
UNCOV
757
  setValue(init);
×
UNCOV
758
  setInit(init);
×
UNCOV
759
}
×
760
XYSpinboxes::XYSpinboxes(
48✔
761
    ossia::vec2f min, ossia::vec2f max, ossia::vec2f init, bool integral,
762
    const QString& name, Id<Port> id, QObject* parent)
763
    : ControlInlet{name, id, parent}
48✔
764
    , integral{integral}
48✔
765
{
48✔
766
  displayHandledExplicitly = true;
48✔
767
  setValue(init);
48✔
768
  setInit(init);
48✔
769
  setDomain(ossia::make_domain(min, max));
48✔
770
}
48✔
771

772
XYSpinboxes::XYSpinboxes(DataStream::Deserializer& vis, QObject* parent)
46✔
773
    : ControlInlet{vis, parent}
46✔
774
{
46✔
775
  vis.writeTo(*this);
46✔
UNCOV
776
}
×
777
XYSpinboxes::XYSpinboxes(JSONObject::Deserializer& vis, QObject* parent)
46✔
778
    : ControlInlet{vis, parent}
46✔
779
{
46✔
780
  vis.writeTo(*this);
46✔
781
}
×
782
XYSpinboxes::XYSpinboxes(DataStream::Deserializer&& vis, QObject* parent)
×
UNCOV
783
    : ControlInlet{vis, parent}
×
UNCOV
784
{
×
UNCOV
785
  vis.writeTo(*this);
×
UNCOV
786
}
×
UNCOV
787
XYSpinboxes::XYSpinboxes(JSONObject::Deserializer&& vis, QObject* parent)
×
UNCOV
788
    : ControlInlet{vis, parent}
×
UNCOV
789
{
×
UNCOV
790
  vis.writeTo(*this);
×
UNCOV
791
}
×
792

793
XYSpinboxes::~XYSpinboxes() { }
280✔
794

UNCOV
795
void XYSpinboxes::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
796
{
UNCOV
797
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
798
  port.type = ossia::val_type::VEC2F;
×
UNCOV
799
  port.domain = domain().get();
×
UNCOV
800
}
×
801

802
XYZSpinboxes::XYZSpinboxes(
67✔
803
    ossia::vec3f min, ossia::vec3f max, ossia::vec3f init, bool integral,
804
    const QString& name, Id<Port> id, QObject* parent)
805
    : ControlInlet{name, id, parent}
67✔
806
    , integral{integral}
67✔
807
{
67✔
808
  displayHandledExplicitly = true;
67✔
809
  setValue(init);
67✔
810
  setInit(init);
67✔
811
  setDomain(ossia::make_domain(min, max));
67✔
812
}
67✔
813

814
XYZSpinboxes::~XYZSpinboxes() { }
354✔
815

UNCOV
816
void XYZSpinboxes::setupExecution(
×
817
    ossia::inlet& inl, QObject* exec_context) const noexcept
818
{
UNCOV
819
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
UNCOV
820
  port.type = ossia::val_type::VEC3F;
×
UNCOV
821
  port.domain = domain().get();
×
UNCOV
822
}
×
823

824
MultiSlider::MultiSlider(
34✔
825
    ossia::value init, const QString& name, Id<Port> id, QObject* parent)
826
    : ControlInlet{name, id, parent}
34✔
827
{
34✔
828
  displayHandledExplicitly = true;
34✔
829
  setValue(std::move(init));
34✔
830
  setInit(value());
34✔
831
  setDomain(ossia::make_domain(0., 1.));
34✔
832
}
34✔
833

834
MultiSlider::~MultiSlider() { }
50✔
835

UNCOV
836
ossia::value MultiSlider::getMin() const noexcept
×
837
{
838
  return domain().get().get_min();
×
839
}
840

UNCOV
841
ossia::value MultiSlider::getMax() const noexcept
×
842
{
UNCOV
843
  return domain().get().get_max();
×
844
}
845

UNCOV
846
void MultiSlider::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
847
{
UNCOV
848
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
UNCOV
849
  port.type = ossia::val_type::LIST;
×
UNCOV
850
  port.domain = domain().get();
×
UNCOV
851
}
×
852

853
MultiSliderXY::MultiSliderXY(
1✔
854
    ossia::value init, const QString& name, Id<Port> id, QObject* parent)
855
    : ControlInlet{name, id, parent}
1✔
856
{
1✔
857
  displayHandledExplicitly = true;
1✔
858
  setValue(std::move(init));
1✔
859
  setInit(value());
1✔
860
  setDomain(ossia::make_domain(0., 1.));
1✔
861
}
1✔
862

863
MultiSliderXY::~MultiSliderXY() { }
6✔
864

UNCOV
865
ossia::value MultiSliderXY::getMin() const noexcept
×
866
{
UNCOV
867
  return domain().get().get_min();
×
868
}
869

UNCOV
870
ossia::value MultiSliderXY::getMax() const noexcept
×
871
{
UNCOV
872
  return domain().get().get_max();
×
873
}
874

875
void MultiSliderXY::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
876
{
UNCOV
877
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
UNCOV
878
  port.type = ossia::val_type::LIST;
×
UNCOV
879
  port.domain = domain().get();
×
UNCOV
880
}
×
881

882
PathGeneratorXY::PathGeneratorXY(
1✔
883
    ossia::value init, const QString& name, Id<Port> id, QObject* parent)
884
    : ControlInlet{name, id, parent}
1✔
885
{
1✔
886
  displayHandledExplicitly = true;
1✔
887
  setValue(std::move(init));
1✔
888
  setInit(value());
1✔
889
  setDomain(ossia::make_domain(0., 1.));
1✔
890
}
1✔
891

892
PathGeneratorXY::~PathGeneratorXY() { }
6✔
893

UNCOV
894
ossia::value PathGeneratorXY::getMin() const noexcept
×
895
{
896
  return domain().get().get_min();
×
897
}
898

UNCOV
899
ossia::value PathGeneratorXY::getMax() const noexcept
×
900
{
UNCOV
901
  return domain().get().get_max();
×
902
}
903

UNCOV
904
void PathGeneratorXY::setupExecution(ossia::inlet& inl, QObject* exec_context) const noexcept
×
905
{
UNCOV
906
  auto& port = **safe_cast<ossia::value_inlet*>(&inl);
×
UNCOV
907
  port.type = ossia::val_type::LIST;
×
908
  port.domain = domain().get();
×
UNCOV
909
}
×
910

911
Bargraph::Bargraph(
2✔
912
    float min, float max, float init, const QString& name, Id<Port> id, QObject* parent)
913
    : ControlOutlet{name, id, parent}
2✔
914
{
2✔
915
  displayHandledExplicitly = true;
2✔
916
  setValue(init);
2✔
917
  setDomain(ossia::make_domain(min, max));
2✔
918
}
2✔
919

920
Bargraph::~Bargraph() { }
12✔
921

922
}
923
template <>
924
SCORE_LIB_PROCESS_EXPORT void
925
DataStreamReader::read(const Process::FloatSlider& p)
583✔
926
{
927
  read((const Process::ControlInlet&)p);
583✔
928
}
583✔
929
template <>
930
SCORE_LIB_PROCESS_EXPORT void
931
DataStreamWriter::write(Process::FloatSlider& p)
×
932
{
933
}
×
934
template <>
935
SCORE_LIB_PROCESS_EXPORT void
936
JSONReader::read(const Process::FloatSlider& p)
688✔
937
{
938
  read((const Process::ControlInlet&)p);
688✔
939
}
688✔
940
template <>
941
SCORE_LIB_PROCESS_EXPORT void
942
JSONWriter::write(Process::FloatSlider& p)
×
943
{
944
}
×
945

946
template <>
947
SCORE_LIB_PROCESS_EXPORT void
948
DataStreamReader::read(const Process::FloatKnob& p)
1,050✔
949
{
950
  read((const Process::ControlInlet&)p);
1,050✔
951
}
1,050✔
952
template <>
953
SCORE_LIB_PROCESS_EXPORT void
954
DataStreamWriter::write(Process::FloatKnob& p)
×
955
{
956
}
×
957
template <>
958
SCORE_LIB_PROCESS_EXPORT void
959
JSONReader::read(const Process::FloatKnob& p)
1,034✔
960
{
961
  read((const Process::ControlInlet&)p);
1,034✔
962
}
1,034✔
963
template <>
964
SCORE_LIB_PROCESS_EXPORT void
965
JSONWriter::write(Process::FloatKnob& p)
×
966
{
967
}
×
968

969
template <>
970
SCORE_LIB_PROCESS_EXPORT void
971
DataStreamReader::read(const Process::LogFloatSlider& p)
58✔
972
{
973
  read((const Process::ControlInlet&)p);
58✔
974
}
58✔
975
template <>
976
SCORE_LIB_PROCESS_EXPORT void
UNCOV
977
DataStreamWriter::write(Process::LogFloatSlider& p)
×
978
{
UNCOV
979
}
×
980
template <>
981
SCORE_LIB_PROCESS_EXPORT void
982
JSONReader::read(const Process::LogFloatSlider& p)
58✔
983
{
984
  read((const Process::ControlInlet&)p);
58✔
985
}
58✔
986
template <>
987
SCORE_LIB_PROCESS_EXPORT void
UNCOV
988
JSONWriter::write(Process::LogFloatSlider& p)
×
989
{
UNCOV
990
}
×
991

992
template <>
993
SCORE_LIB_PROCESS_EXPORT void
994
DataStreamReader::read(const Process::IntSlider& p)
179✔
995
{
996
  read((const Process::ControlInlet&)p);
179✔
997
}
179✔
998
template <>
999
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1000
DataStreamWriter::write(Process::IntSlider& p)
×
1001
{
UNCOV
1002
}
×
1003
template <>
1004
SCORE_LIB_PROCESS_EXPORT void
1005
JSONReader::read(const Process::IntSlider& p)
194✔
1006
{
1007
  read((const Process::ControlInlet&)p);
194✔
1008
}
194✔
1009
template <>
1010
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1011
JSONWriter::write(Process::IntSlider& p)
×
1012
{
UNCOV
1013
}
×
1014

1015
template <>
1016
SCORE_LIB_PROCESS_EXPORT void
1017
DataStreamReader::read(const Process::IntRangeSlider& p)
×
1018
{
UNCOV
1019
  read((const Process::ControlInlet&)p);
×
UNCOV
1020
}
×
1021
template <>
1022
SCORE_LIB_PROCESS_EXPORT void
1023
DataStreamWriter::write(Process::IntRangeSlider& p)
×
1024
{
UNCOV
1025
}
×
1026
template <>
1027
SCORE_LIB_PROCESS_EXPORT void
1028
JSONReader::read(const Process::IntRangeSlider& p)
×
1029
{
UNCOV
1030
  read((const Process::ControlInlet&)p);
×
UNCOV
1031
}
×
1032
template <>
1033
SCORE_LIB_PROCESS_EXPORT void
1034
JSONWriter::write(Process::IntRangeSlider& p)
×
1035
{
UNCOV
1036
}
×
1037
template <>
1038
SCORE_LIB_PROCESS_EXPORT void
1039
DataStreamReader::read(const Process::FloatRangeSlider& p)
12✔
1040
{
1041
  read((const Process::ControlInlet&)p);
12✔
1042
}
12✔
1043
template <>
1044
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1045
DataStreamWriter::write(Process::FloatRangeSlider& p)
×
1046
{
UNCOV
1047
}
×
1048
template <>
1049
SCORE_LIB_PROCESS_EXPORT void
1050
JSONReader::read(const Process::FloatRangeSlider& p)
12✔
1051
{
1052
  read((const Process::ControlInlet&)p);
12✔
1053
}
12✔
1054
template <>
1055
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1056
JSONWriter::write(Process::FloatRangeSlider& p)
×
1057
{
UNCOV
1058
}
×
1059

1060
template <>
1061
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1062
DataStreamReader::read(const Process::IntRangeSpinBox& p)
×
1063
{
UNCOV
1064
  read((const Process::ControlInlet&)p);
×
UNCOV
1065
}
×
1066
template <>
1067
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1068
DataStreamWriter::write(Process::IntRangeSpinBox& p)
×
1069
{
UNCOV
1070
}
×
1071
template <>
1072
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1073
JSONReader::read(const Process::IntRangeSpinBox& p)
×
1074
{
UNCOV
1075
  read((const Process::ControlInlet&)p);
×
UNCOV
1076
}
×
1077
template <>
1078
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1079
JSONWriter::write(Process::IntRangeSpinBox& p)
×
1080
{
UNCOV
1081
}
×
1082
template <>
1083
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1084
DataStreamReader::read(const Process::FloatRangeSpinBox& p)
×
1085
{
UNCOV
1086
  read((const Process::ControlInlet&)p);
×
UNCOV
1087
}
×
1088
template <>
1089
SCORE_LIB_PROCESS_EXPORT void
1090
DataStreamWriter::write(Process::FloatRangeSpinBox& p)
×
1091
{
1092
}
×
1093
template <>
1094
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1095
JSONReader::read(const Process::FloatRangeSpinBox& p)
×
1096
{
UNCOV
1097
  read((const Process::ControlInlet&)p);
×
UNCOV
1098
}
×
1099
template <>
1100
SCORE_LIB_PROCESS_EXPORT void
1101
JSONWriter::write(Process::FloatRangeSpinBox& p)
×
1102
{
1103
}
×
1104

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

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

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

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

1195
template <>
1196
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1197
DataStreamReader::read(const Process::ChooserToggle& p)
×
1198
{
UNCOV
1199
  read((const Process::ControlInlet&)p);
×
UNCOV
1200
}
×
1201
template <>
1202
SCORE_LIB_PROCESS_EXPORT void
1203
DataStreamWriter::write(Process::ChooserToggle& p)
×
1204
{
1205
}
×
1206
template <>
1207
SCORE_LIB_PROCESS_EXPORT void
1208
JSONReader::read(const Process::ChooserToggle& p)
×
1209
{
UNCOV
1210
  read((const Process::ControlInlet&)p);
×
UNCOV
1211
}
×
1212
template <>
1213
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1214
JSONWriter::write(Process::ChooserToggle& p)
×
1215
{
UNCOV
1216
}
×
1217

1218
template <>
1219
SCORE_LIB_PROCESS_EXPORT void
1220
DataStreamReader::read(const Process::LineEdit& p)
120✔
1221
{
1222
  read((const Process::ControlInlet&)p);
120✔
1223
}
120✔
1224
template <>
1225
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1226
DataStreamWriter::write(Process::LineEdit& p)
×
1227
{
UNCOV
1228
}
×
1229
template <>
1230
SCORE_LIB_PROCESS_EXPORT void
1231
JSONReader::read(const Process::LineEdit& p)
120✔
1232
{
1233
  read((const Process::ControlInlet&)p);
120✔
1234
}
120✔
1235
template <>
UNCOV
1236
SCORE_LIB_PROCESS_EXPORT void JSONWriter::write(Process::LineEdit& p)
×
1237
{
UNCOV
1238
}
×
1239

1240
template <>
1241
SCORE_LIB_PROCESS_EXPORT void
1242
DataStreamReader::read(const Process::ProgramEdit& p)
8✔
1243
{
1244
  read((const Process::ControlInlet&)p);
8✔
1245
}
8✔
1246
template <>
1247
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1248
DataStreamWriter::write(Process::ProgramEdit& p)
×
1249
{
UNCOV
1250
}
×
1251
template <>
1252
SCORE_LIB_PROCESS_EXPORT void
1253
JSONReader::read(const Process::ProgramEdit& p)
8✔
1254
{
1255
  read((const Process::ControlInlet&)p);
8✔
1256
}
8✔
1257
template <>
1258
SCORE_LIB_PROCESS_EXPORT void
1259
JSONWriter::write(Process::ProgramEdit& p)
×
1260
{
1261
}
×
1262

1263
template <>
1264
SCORE_LIB_PROCESS_EXPORT void
1265
DataStreamReader::read(const Process::FileChooser& p)
93✔
1266
{
1267
  read((const Process::ControlInlet&)p);
93✔
1268
  m_stream << p.filters();
93✔
1269
}
93✔
1270
template <>
1271
SCORE_LIB_PROCESS_EXPORT void
1272
DataStreamWriter::write(Process::FileChooser& p)
×
1273
{
1274
  QString f;
×
1275
  m_stream >> f;
×
1276
  p.setFilters(f);
×
1277
}
×
1278
template <>
1279
SCORE_LIB_PROCESS_EXPORT void
1280
JSONReader::read(const Process::FileChooser& p)
97✔
1281
{
1282
  read((const Process::ControlInlet&)p);
97✔
1283
  obj["Filters"] = p.filters();
97✔
1284
}
97✔
1285
template <>
1286
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1287
JSONWriter::write(Process::FileChooser& p)
×
1288
{
1289
  QString f;
×
1290
  f <<= obj["Filters"];
×
1291
  p.setFilters(f);
×
UNCOV
1292
}
×
1293

1294
template <>
1295
SCORE_LIB_PROCESS_EXPORT void
1296
DataStreamReader::read(const Process::FolderChooser& p)
2✔
1297
{
1298
  read((const Process::ControlInlet&)p);
2✔
1299
}
2✔
1300
template <>
1301
SCORE_LIB_PROCESS_EXPORT void
1302
DataStreamWriter::write(Process::FolderChooser& p)
×
1303
{
1304
}
×
1305
template <>
1306
SCORE_LIB_PROCESS_EXPORT void
1307
JSONReader::read(const Process::FolderChooser& p)
2✔
1308
{
1309
  read((const Process::ControlInlet&)p);
2✔
1310
}
2✔
1311
template <>
1312
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1313
JSONWriter::write(Process::FolderChooser& p)
×
1314
{
UNCOV
1315
}
×
1316

1317
template <>
1318
SCORE_LIB_PROCESS_EXPORT void
1319
DataStreamReader::read(const Process::AudioFileChooser& p)
2✔
1320
{
1321
  read((const Process::ControlInlet&)p);
2✔
1322
  m_stream << p.filters();
2✔
1323
}
2✔
1324
template <>
1325
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1326
DataStreamWriter::write(Process::AudioFileChooser& p)
×
1327
{
UNCOV
1328
  QString f;
×
UNCOV
1329
  m_stream >> f;
×
UNCOV
1330
  p.setFilters(f);
×
UNCOV
1331
}
×
1332
template <>
1333
SCORE_LIB_PROCESS_EXPORT void
1334
JSONReader::read(const Process::AudioFileChooser& p)
2✔
1335
{
1336
  read((const Process::ControlInlet&)p);
2✔
1337
  obj["Filters"] = p.filters();
2✔
1338
}
2✔
1339
template <>
1340
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1341
JSONWriter::write(Process::AudioFileChooser& p)
×
1342
{
UNCOV
1343
  QString f;
×
UNCOV
1344
  f <<= obj["Filters"];
×
UNCOV
1345
  p.setFilters(f);
×
UNCOV
1346
}
×
1347

1348
template <>
UNCOV
1349
SCORE_LIB_PROCESS_EXPORT void DataStreamReader::read(const Process::VideoFileChooser& p)
×
1350
{
UNCOV
1351
  read((const Process::ControlInlet&)p);
×
UNCOV
1352
  m_stream << p.filters();
×
UNCOV
1353
}
×
1354
template <>
UNCOV
1355
SCORE_LIB_PROCESS_EXPORT void DataStreamWriter::write(Process::VideoFileChooser& p)
×
1356
{
UNCOV
1357
  QString f;
×
UNCOV
1358
  m_stream >> f;
×
UNCOV
1359
  p.setFilters(f);
×
UNCOV
1360
}
×
1361
template <>
UNCOV
1362
SCORE_LIB_PROCESS_EXPORT void JSONReader::read(const Process::VideoFileChooser& p)
×
1363
{
UNCOV
1364
  read((const Process::ControlInlet&)p);
×
1365
  obj["Filters"] = p.filters();
×
UNCOV
1366
}
×
1367
template <>
UNCOV
1368
SCORE_LIB_PROCESS_EXPORT void JSONWriter::write(Process::VideoFileChooser& p)
×
1369
{
UNCOV
1370
  QString f;
×
UNCOV
1371
  f <<= obj["Filters"];
×
UNCOV
1372
  p.setFilters(f);
×
UNCOV
1373
}
×
1374

1375
template <>
1376
SCORE_LIB_PROCESS_EXPORT void
1377
DataStreamReader::read(const Process::Enum& p)
244✔
1378
{
1379
  read((const Process::ControlInlet&)p);
244✔
1380
  m_stream << p.values << p.pixmaps;
244✔
1381
}
244✔
1382
template <>
1383
SCORE_LIB_PROCESS_EXPORT void DataStreamWriter::write(Process::Enum& p)
121✔
1384
{
1385
  m_stream >> p.values >> p.pixmaps;
121✔
1386
}
121✔
1387
template <>
1388
SCORE_LIB_PROCESS_EXPORT void JSONReader::read(const Process::Enum& p)
240✔
1389
{
1390
  read((const Process::ControlInlet&)p);
240✔
1391
  obj["Values"] = p.values;
240✔
1392
  obj["Pixmaps"] = p.pixmaps;
240✔
1393
}
240✔
1394
template <>
1395
SCORE_LIB_PROCESS_EXPORT void JSONWriter::write(Process::Enum& p)
121✔
1396
{
1397
  p.values <<= obj["Values"];
121✔
1398
  p.pixmaps <<= obj["Pixmaps"];
121✔
1399
}
121✔
1400

1401
template <>
1402
SCORE_LIB_PROCESS_EXPORT void
1403
DataStreamReader::read(const Process::ComboBox& p)
302✔
1404
{
1405
  read((const Process::ControlInlet&)p);
302✔
1406
  m_stream << p.alternatives << p.folderPortName << p.fileExtensions;
302✔
1407
}
302✔
1408
template <>
1409
SCORE_LIB_PROCESS_EXPORT void
1410
DataStreamWriter::write(Process::ComboBox& p)
154✔
1411
{
1412
  m_stream >> p.alternatives >> p.folderPortName >> p.fileExtensions;
154✔
1413
}
154✔
1414
template <>
1415
SCORE_LIB_PROCESS_EXPORT void
1416
JSONReader::read(const Process::ComboBox& p)
335✔
1417
{
1418
  read((const Process::ControlInlet&)p);
335✔
1419
  obj["Values"] = p.alternatives;
335✔
1420
  // Folder-backed combobox metadata (empty for a plain combobox). Persisted so
1421
  // a loaded document can re-scan the folder and re-establish live refresh;
1422
  // see ProcessModel::init_folder_comboboxes. Extensions are stored as one
1423
  // space-joined string ("*.json *.wav"), like FileChooser's filters.
1424
  obj["FolderPort"] = p.folderPortName;
335✔
1425
  obj["FileExtensions"] = p.fileExtensions.join(QChar(' '));
335✔
1426
}
335✔
1427
template <>
1428
SCORE_LIB_PROCESS_EXPORT void JSONWriter::write(Process::ComboBox& p)
181✔
1429
{
1430
  p.alternatives <<= obj["Values"];
181✔
1431
  // Guarded for documents saved before these fields existed.
1432
  if(obj.tryGet("FolderPort"))
181✔
1433
    p.folderPortName <<= obj["FolderPort"];
180✔
1434
  if(obj.tryGet("FileExtensions"))
181✔
1435
  {
1436
    QString exts;
180✔
1437
    exts <<= obj["FileExtensions"];
180✔
1438
    p.fileExtensions
360✔
1439
        = exts.isEmpty() ? QStringList{} : exts.split(QChar(' '), Qt::SkipEmptyParts);
180✔
1440
  }
180✔
1441
}
181✔
1442
template <>
1443
SCORE_LIB_PROCESS_EXPORT void
1444
DataStreamReader::read(const Process::Button& p)
20✔
1445
{
1446
  read((const Process::ControlInlet&)p);
20✔
1447
}
20✔
1448
template <>
1449
SCORE_LIB_PROCESS_EXPORT void
1450
DataStreamWriter::write(Process::Button& p)
×
1451
{
UNCOV
1452
}
×
1453
template <>
1454
SCORE_LIB_PROCESS_EXPORT void JSONReader::read(const Process::Button& p)
20✔
1455
{
1456
  read((const Process::ControlInlet&)p);
20✔
1457
}
20✔
1458
template <>
UNCOV
1459
SCORE_LIB_PROCESS_EXPORT void JSONWriter::write(Process::Button& p)
×
1460
{
1461
}
×
1462
template <>
1463
SCORE_LIB_PROCESS_EXPORT void
1464
DataStreamReader::read(const Process::ImpulseButton& p)
74✔
1465
{
1466
  read((const Process::ControlInlet&)p);
74✔
1467
}
74✔
1468
template <>
1469
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1470
DataStreamWriter::write(Process::ImpulseButton& p)
×
1471
{
UNCOV
1472
}
×
1473
template <>
1474
SCORE_LIB_PROCESS_EXPORT void
1475
JSONReader::read(const Process::ImpulseButton& p)
74✔
1476
{
1477
  read((const Process::ControlInlet&)p);
74✔
1478
}
74✔
1479
template <>
1480
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1481
JSONWriter::write(Process::ImpulseButton& p)
×
1482
{
UNCOV
1483
}
×
1484

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

1508
template <>
1509
SCORE_LIB_PROCESS_EXPORT void
1510
DataStreamReader::read(const Process::XYSlider& p)
10✔
1511
{
1512
  read((const Process::ControlInlet&)p);
10✔
1513
}
10✔
1514
template <>
1515
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1516
DataStreamWriter::write(Process::XYSlider& p)
×
1517
{
UNCOV
1518
}
×
1519
template <>
1520
SCORE_LIB_PROCESS_EXPORT void
1521
JSONReader::read(const Process::XYSlider& p)
10✔
1522
{
1523
  read((const Process::ControlInlet&)p);
10✔
1524
}
10✔
1525
template <>
UNCOV
1526
SCORE_LIB_PROCESS_EXPORT void JSONWriter::write(Process::XYSlider& p)
×
1527
{
UNCOV
1528
}
×
1529

1530
template <>
1531
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1532
DataStreamReader::read(const Process::XYZSlider& p)
×
1533
{
UNCOV
1534
  read((const Process::ControlInlet&)p);
×
UNCOV
1535
}
×
1536
template <>
1537
SCORE_LIB_PROCESS_EXPORT void
1538
DataStreamWriter::write(Process::XYZSlider& p)
×
1539
{
1540
}
×
1541
template <>
1542
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1543
JSONReader::read(const Process::XYZSlider& p)
×
1544
{
UNCOV
1545
  read((const Process::ControlInlet&)p);
×
UNCOV
1546
}
×
1547
template <>
1548
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1549
JSONWriter::write(Process::XYZSlider& p)
×
1550
{
UNCOV
1551
}
×
1552

1553
template <>
1554
SCORE_LIB_PROCESS_EXPORT void
1555
DataStreamReader::read(const Process::XYSpinboxes& p)
92✔
1556
{
1557
  read((const Process::ControlInlet&)p);
92✔
1558
  m_stream << p.integral;
92✔
1559
}
92✔
1560
template <>
1561
SCORE_LIB_PROCESS_EXPORT void
1562
DataStreamWriter::write(Process::XYSpinboxes& p)
46✔
1563
{
1564
  m_stream >> p.integral;
46✔
1565
}
46✔
1566
template <>
1567
SCORE_LIB_PROCESS_EXPORT void
1568
JSONReader::read(const Process::XYSpinboxes& p)
92✔
1569
{
1570
  read((const Process::ControlInlet&)p);
92✔
1571
  obj["Integral"] = p.integral;
92✔
1572
}
92✔
1573
template <>
1574
SCORE_LIB_PROCESS_EXPORT void
1575
JSONWriter::write(Process::XYSpinboxes& p)
46✔
1576
{
1577
  if(auto val = obj.tryGet("Integral"))
46✔
1578
    p.integral = val->toBool();
46✔
1579
}
46✔
1580

1581
template <>
1582
SCORE_LIB_PROCESS_EXPORT void
1583
DataStreamReader::read(const Process::XYZSpinboxes& p)
110✔
1584
{
1585
  read((const Process::ControlInlet&)p);
110✔
1586
}
110✔
1587
template <>
1588
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1589
DataStreamWriter::write(Process::XYZSpinboxes& p)
×
1590
{
UNCOV
1591
}
×
1592
template <>
1593
SCORE_LIB_PROCESS_EXPORT void
1594
JSONReader::read(const Process::XYZSpinboxes& p)
110✔
1595
{
1596
  read((const Process::ControlInlet&)p);
110✔
1597
}
110✔
1598
template <>
1599
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1600
JSONWriter::write(Process::XYZSpinboxes& p)
×
1601
{
UNCOV
1602
}
×
1603

1604
template <>
1605
SCORE_LIB_PROCESS_EXPORT void
1606
DataStreamReader::read(const Process::MultiSlider& p)
9✔
1607
{
1608
  read((const Process::ControlInlet&)p);
9✔
1609
}
9✔
1610
template <>
1611
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1612
DataStreamWriter::write(Process::MultiSlider& p)
×
1613
{
UNCOV
1614
}
×
1615
template <>
1616
SCORE_LIB_PROCESS_EXPORT void
1617
JSONReader::read(const Process::MultiSlider& p)
9✔
1618
{
1619
  read((const Process::ControlInlet&)p);
9✔
1620
}
9✔
1621
template <>
1622
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1623
JSONWriter::write(Process::MultiSlider& p)
×
1624
{
UNCOV
1625
}
×
1626

1627
template <>
1628
SCORE_LIB_PROCESS_EXPORT void
1629
DataStreamReader::read(const Process::MultiSliderXY& p)
2✔
1630
{
1631
  read((const Process::ControlInlet&)p);
2✔
1632
}
2✔
1633
template <>
1634
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1635
DataStreamWriter::write(Process::MultiSliderXY& p)
×
1636
{
UNCOV
1637
}
×
1638
template <>
1639
SCORE_LIB_PROCESS_EXPORT void
1640
JSONReader::read(const Process::MultiSliderXY& p)
2✔
1641
{
1642
  read((const Process::ControlInlet&)p);
2✔
1643
}
2✔
1644
template <>
1645
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1646
JSONWriter::write(Process::MultiSliderXY& p)
×
1647
{
UNCOV
1648
}
×
1649

1650

1651
template <>
1652
SCORE_LIB_PROCESS_EXPORT void
1653
DataStreamReader::read(const Process::PathGeneratorXY& p)
2✔
1654
{
1655
  read((const Process::ControlInlet&)p);
2✔
1656
}
2✔
1657
template <>
1658
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1659
DataStreamWriter::write(Process::PathGeneratorXY& p)
×
1660
{
UNCOV
1661
}
×
1662
template <>
1663
SCORE_LIB_PROCESS_EXPORT void
1664
JSONReader::read(const Process::PathGeneratorXY& p)
2✔
1665
{
1666
  read((const Process::ControlInlet&)p);
2✔
1667
}
2✔
1668
template <>
1669
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1670
JSONWriter::write(Process::PathGeneratorXY& p)
×
1671
{
UNCOV
1672
}
×
1673

1674
template <>
1675
SCORE_LIB_PROCESS_EXPORT void
1676
DataStreamReader::read(const Process::Bargraph& p)
4✔
1677
{
1678
  read((const Process::ControlOutlet&)p);
4✔
1679
}
4✔
1680
template <>
1681
SCORE_LIB_PROCESS_EXPORT void
UNCOV
1682
DataStreamWriter::write(Process::Bargraph& p)
×
1683
{
UNCOV
1684
}
×
1685
template <>
1686
SCORE_LIB_PROCESS_EXPORT void
1687
JSONReader::read(const Process::Bargraph& p)
4✔
1688
{
1689
  read((const Process::ControlOutlet&)p);
4✔
1690
}
4✔
1691
template <>
UNCOV
1692
SCORE_LIB_PROCESS_EXPORT void JSONWriter::write(Process::Bargraph& p)
×
1693
{
UNCOV
1694
}
×
1695

1696
template <>
1697
SCORE_LIB_PROCESS_EXPORT void DataStreamReader::read(const QString& p)
1,028✔
1698
{
1699
  m_stream << p;
1,028✔
1700
}
1,028✔
1701
template <>
1702
SCORE_LIB_PROCESS_EXPORT void DataStreamWriter::write(QString& p)
482✔
1703
{
1704
  m_stream >> p;
482✔
1705
}
482✔
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