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

mcallegari / qlcplus / 19387633908

15 Nov 2025 09:14AM UTC coverage: 34.243% (-0.007%) from 34.25%
19387633908

push

github

mcallegari
engine: fix palette test unit

17722 of 51753 relevant lines covered (34.24%)

19533.45 hits per line

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

46.32
/engine/src/qlcpalette.cpp
1
/*
2
  Q Light Controller Plus
3
  qlcpalette.cpp
4

5
  Copyright (C) Massimo Callegari
6

7
  Licensed under the Apache License, Version 2.0 (the "License");
8
  you may not use this file except in compliance with the License.
9
  You may obtain a copy of the License at
10

11
      http://www.apache.org/licenses/LICENSE-2.0.txt
12

13
  Unless required by applicable law or agreed to in writing, software
14
  distributed under the License is distributed on an "AS IS" BASIS,
15
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
  See the License for the specific language governing permissions and
17
  limitations under the License.
18
*/
19

20
#include <QXmlStreamReader>
21
#include <QXmlStreamWriter>
22
#include <QtMath>
23
#include <QDebug>
24

25
#include "monitorproperties.h"
26
#include "qlcpalette.h"
27
#include "qlcchannel.h"
28
#include "scenevalue.h"
29
#include "doc.h"
30

31
#define KXMLQLCPaletteType      QStringLiteral("Type")
32
#define KXMLQLCPaletteName      QStringLiteral("Name")
33
#define KXMLQLCPaletteValue     QStringLiteral("Value")
34
#define KXMLQLCPaletteFanning   QStringLiteral("Fan")
35
#define KXMLQLCPaletteFanLayout QStringLiteral("Layout")
36
#define KXMLQLCPaletteFanAmount QStringLiteral("Amount")
37
#define KXMLQLCPaletteFanValue  QStringLiteral("FanValue")
38

39
QLCPalette::QLCPalette(QLCPalette::PaletteType type, QObject *parent)
18✔
40
    : QObject(parent)
41
    , m_id(QLCPalette::invalidId())
36✔
42
    , m_type(type)
18✔
43
    , m_fanningType(Flat)
18✔
44
    , m_fanningLayout(XAscending)
18✔
45
    , m_fanningAmount(100)
18✔
46
{
47
}
18✔
48

49
QLCPalette *QLCPalette::createCopy()
×
50
{
51
    QLCPalette *copy = new QLCPalette(type());
×
52
    copy->setValues(this->values());
×
53
    copy->setName(this->name());
×
54
    copy->setFanningType(this->fanningType());
×
55
    copy->setFanningLayout(this->fanningLayout());
×
56
    copy->setFanningAmount(this->fanningAmount());
×
57
    copy->setFanningValue(this->fanningValue());
×
58

59
    return copy;
×
60
}
61

62
QLCPalette::~QLCPalette()
20✔
63
{
64

65
}
20✔
66

67
/************************************************************************
68
 * Properties
69
 ************************************************************************/
70

71
quint32 QLCPalette::id() const
5✔
72
{
73
    return m_id;
5✔
74
}
75

76
void QLCPalette::setID(quint32 id)
5✔
77
{
78
    m_id = id;
5✔
79
}
5✔
80

81
quint32 QLCPalette::invalidId()
25✔
82
{
83
    return UINT_MAX;
25✔
84
}
85

86
QLCPalette::PaletteType QLCPalette::type() const
10✔
87
{
88
    return m_type;
10✔
89
}
90

91
QString QLCPalette::typeToString(QLCPalette::PaletteType type)
10✔
92
{
93
    switch (type)
10✔
94
    {
95
        case Dimmer:    return "Dimmer";
1✔
96
        case Color:     return "Color";
1✔
97
        case Pan:       return "Pan";
1✔
98
        case Tilt:      return "Tilt";
1✔
99
        case PanTilt:   return "PanTilt";
2✔
100
        case Shutter:   return "Shutter";
1✔
101
        case Gobo:      return "Gobo";
1✔
102
        case Zoom:      return "Zoom";
1✔
103
        case Undefined: return "";
1✔
104
    }
105

106
    return "";
×
107
}
108

109
QLCPalette::PaletteType QLCPalette::stringToType(const QString &str)
10✔
110
{
111
    if (str == "Dimmer")
10✔
112
        return Dimmer;
1✔
113
    else if (str == "Color")
9✔
114
        return Color;
2✔
115
    else if (str == "Pan")
7✔
116
        return Pan;
1✔
117
    else if (str == "Tilt")
6✔
118
        return Tilt;
1✔
119
    else if (str == "PanTilt")
5✔
120
        return PanTilt;
1✔
121
    else if (str == "Shutter")
4✔
122
        return Shutter;
1✔
123
    else if (str == "Gobo")
3✔
124
        return Gobo;
1✔
125
    else if (str == "Zoom")
2✔
126
        return Zoom;
1✔
127

128
    return Undefined;
1✔
129
}
130

131
QString QLCPalette::iconResource(bool svg) const
8✔
132
{
133
    QString prefix = svg ? "qrc" : "";
8✔
134
    QString ext = svg ? "svg" : "png";
8✔
135

136
    switch(type())
8✔
137
    {
138
        case Dimmer: return QString("%1:/intensity.%2").arg(prefix).arg(ext);
1✔
139
        case Color: return QString("%1:/color.%2").arg(prefix).arg(ext);
1✔
140
        case Pan: return QString("%1:/pan.%2").arg(prefix).arg(ext);
1✔
141
        case Tilt: return QString("%1:/tilt.%2").arg(prefix).arg(ext);
1✔
142
        case PanTilt: return QString("%1:/position.%2").arg(prefix).arg(ext);
1✔
143
        case Shutter: return QString("%1:/shutter.%2").arg(prefix).arg(ext);
1✔
144
        case Gobo: return QString("%1:/gobo.%2").arg(prefix).arg(ext);
1✔
145
        case Zoom: return QString("%1:/beam.%2").arg(prefix).arg(ext);
1✔
146
        default: return "";
×
147
    }
148
}
8✔
149

150
QString QLCPalette::name() const
4✔
151
{
152
    return m_name;
4✔
153
}
154

155
void QLCPalette::setName(const QString &name)
3✔
156
{
157
    if (name == m_name)
3✔
158
        return;
×
159

160
    m_name = QString(name);
3✔
161
    emit nameChanged();
3✔
162
}
163

164
QVariant QLCPalette::value() const
4✔
165
{
166
    if (m_values.isEmpty())
4✔
167
        return QVariant();
×
168

169
    return m_values.first();
4✔
170
}
171

172
int QLCPalette::intValue1() const
×
173
{
174
    if (m_values.isEmpty())
×
175
        return -1;
×
176

177
    return m_values.at(0).toInt();
×
178
}
179

180
int QLCPalette::intValue2() const
×
181
{
182
    if (m_values.count() < 2)
×
183
        return -1;
×
184

185
    return m_values.at(1).toInt();
×
186
}
187

188
float QLCPalette::floatValue1() const
×
189
{
190
    if (m_values.isEmpty())
×
191
        return -1;
×
192

193
    return m_values.at(0).toFloat();
×
194
}
195

196
QString QLCPalette::strValue1() const
×
197
{
198
    if (m_values.isEmpty())
×
199
        return QString();
×
200

201
    return m_values.at(0).toString();
×
202
}
203

204
QColor QLCPalette::rgbValue() const
×
205
{
206
    if (m_values.isEmpty())
×
207
        return QColor();
×
208

209
    QColor rgb, wauv;
×
210
    stringToColor(m_values.at(0).toString(), rgb, wauv);
×
211

212
    return rgb;
×
213
}
214

215
QColor QLCPalette::wauvValue() const
×
216
{
217
    if (m_values.isEmpty())
×
218
        return QColor();
×
219

220
    QColor rgb, wauv;
×
221
    stringToColor(m_values.at(0).toString(), rgb, wauv);
×
222

223
    return wauv;
×
224
}
225

226
void QLCPalette::setValue(QVariant val)
3✔
227
{
228
    m_values.clear();
3✔
229
    m_values.append(val);
3✔
230
}
3✔
231

232
void QLCPalette::setValue(QVariant val1, QVariant val2)
2✔
233
{
234
    m_values.clear();
2✔
235
    m_values.append(val1);
2✔
236
    m_values.append(val2);
2✔
237
}
2✔
238

239
QVariantList QLCPalette::values() const
6✔
240
{
241
    return m_values;
6✔
242
}
243

244
void QLCPalette::setValues(QVariantList values)
×
245
{
246
    m_values = values;
×
247
}
×
248

249
void QLCPalette::resetValues()
×
250
{
251
    m_values.clear();
×
252
}
×
253

254
QList<SceneValue> QLCPalette::valuesFromFixtures(Doc *doc, QList<quint32> fixtures)
×
255
{
256
    QList<SceneValue> list;
×
257

258
    int fxCount = fixtures.count();
×
259
    // normalized progress in [ 0.0, 1.0 ] range
260
    qreal progress = 0.0;
×
261
    int intFanValue = fanningValue().toInt();
×
262
    FanningType fType = fanningType();
×
263
    FanningLayout fLayout = fanningLayout();
×
264
    MonitorProperties *mProps = doc->monitorProperties();
×
265

266
    // sort the fixtures list based on selected layout
267
    std::sort(fixtures.begin(), fixtures.end(),
×
268
        [fLayout, mProps](quint32 a, quint32 b) {
×
269
            QVector3D posA = mProps->fixturePosition(a, 0, 0);
×
270
            QVector3D posB = mProps->fixturePosition(b, 0, 0);
×
271

272
            switch(fLayout)
×
273
            {
274
                case XAscending: return posA.x() < posB.x();
×
275
                case XDescending: return posB.x() < posA.x();
×
276
                case YAscending: return posA.y() < posB.y();
×
277
                case YDescending: return posB.y() < posA.y();
×
278
                case ZAscending: return posA.z() < posB.z();
×
279
                case ZDescending: return posB.z() < posA.z();
×
280
                default: return false;
×
281
            }
282
        });
283

284
    foreach (quint32 id, fixtures)
×
285
    {
286
        Fixture *fixture = doc->fixture(id);
×
287
        if (fixture == NULL)
×
288
            continue;
×
289

290
        qreal factor = valueFactor(progress);
×
291

292
        switch(type())
×
293
        {
294
            case Dimmer:
×
295
            {
296
                int dValue = value().toInt();
×
297
                quint32 masterIntensityChannel = fixture->type() == QLCFixtureDef::Dimmer ?
×
298
                            0 : fixture->masterIntensityChannel();
×
299

300
                if (fType != Flat)
×
301
                    dValue = int((qreal(intFanValue - dValue) * factor) + dValue);
×
302

303
                if (masterIntensityChannel != QLCChannel::invalid())
×
304
                    list << SceneValue(id, masterIntensityChannel, uchar(dValue));
×
305

306
                for (int i = 0; i < fixture->heads(); i++)
×
307
                {
308
                    quint32 headDimmerChannel = fixture->channelNumber(QLCChannel::Intensity, QLCChannel::MSB, i);
×
309
                    if (headDimmerChannel != QLCChannel::invalid())
×
310
                        list << SceneValue(id, headDimmerChannel, uchar(dValue));
×
311
                }
312
            }
313
            break;
×
314
            case Color:
×
315
            {
316
                QColor startColor = value().value<QColor>();
×
317
                QColor col = startColor;
×
318

319
                if (fType != Flat)
×
320
                {
321
                    QColor endColor = fanningValue().value<QColor>();
×
322
                    qreal rDelta = endColor.red() - startColor.red();
×
323
                    qreal gDelta = endColor.green() - startColor.green();
×
324
                    qreal bDelta = endColor.blue() - startColor.blue();
×
325
                    col.setRed(startColor.red() + qRound(rDelta * factor));
×
326
                    col.setGreen(startColor.green() + qRound(gDelta * factor));
×
327
                    col.setBlue(startColor.blue() + qRound(bDelta * factor));
×
328
                }
329

330
                for (int i = 0; i < fixture->heads(); i++)
×
331
                {
332
                    QVector<quint32> rgbCh = fixture->rgbChannels(i);
×
333
                    if (rgbCh.size() == 3)
×
334
                    {
335
                        list << SceneValue(id, rgbCh.at(0), uchar(col.red()));
×
336
                        list << SceneValue(id, rgbCh.at(1), uchar(col.green()));
×
337
                        list << SceneValue(id, rgbCh.at(2), uchar(col.blue()));
×
338
                    }
339
                    QVector<quint32> cmyCh = fixture->cmyChannels(i);
×
340
                    if (cmyCh.size() == 3)
×
341
                    {
342
                        list << SceneValue(id, cmyCh.at(0), uchar(col.cyan()));
×
343
                        list << SceneValue(id, cmyCh.at(1), uchar(col.magenta()));
×
344
                        list << SceneValue(id, cmyCh.at(2), uchar(col.yellow()));
×
345
                    }
346
                }
×
347
            }
348
            break;
×
349
            case Pan:
×
350
            {
351
                int degrees = value().toInt();
×
352

353
                if (fType != Flat)
×
354
                    degrees = int((qreal(degrees) + qreal(intFanValue) * factor));
×
355

356
                list << fixture->positionToValues(QLCChannel::Pan, degrees);
×
357
            }
358
            break;
×
359
            case Tilt:
×
360
            {
361
                int degrees = m_values.count() == 2 ? m_values.at(1).toInt() : value().toInt();
×
362

363
                if (fType != Flat)
×
364
                    degrees = int((qreal(degrees) + qreal(intFanValue) * factor));
×
365

366
                list << fixture->positionToValues(QLCChannel::Tilt, degrees);
×
367
            }
368
            break;
×
369
            case PanTilt:
×
370
            {
371
                if (m_values.count() == 2)
×
372
                {
373
                    int panDegrees = m_values.at(0).toInt();
×
374
                    int tiltDegrees = m_values.at(1).toInt();
×
375

376
                    if (fType != Flat)
×
377
                    {
378
                        panDegrees = int((qreal(panDegrees) + qreal(intFanValue) * factor));
×
379
                        tiltDegrees = int((qreal(tiltDegrees) + qreal(intFanValue) * factor));
×
380
                    }
381

382
                    list << fixture->positionToValues(QLCChannel::Pan, panDegrees);
×
383
                    list << fixture->positionToValues(QLCChannel::Tilt, tiltDegrees);
×
384
                }
385
            }
386
            break;
×
387
            case Shutter:
×
388
            {
389
                quint32 shCh = fixture->channelNumber(QLCChannel::Shutter, QLCChannel::MSB);
×
390
                if (shCh != QLCChannel::invalid())
×
391
                    list << SceneValue(id, shCh, uchar(value().toUInt()));
×
392
            }
393
            break;
×
394
            case Gobo:
×
395
            {
396
                quint32 goboCh = fixture->channelNumber(QLCChannel::Gobo, QLCChannel::MSB);
×
397
                if (goboCh != QLCChannel::invalid())
×
398
                    list << SceneValue(id, goboCh, uchar(value().toUInt()));
×
399
            }
400
            break;
×
401
            case Zoom:
×
402
            {
403
                for (int i = 0; i < int(fixture->channels()); i++)
×
404
                {
405
                    const QLCChannel *ch = fixture->channel(quint32(i));
×
406
                    if (ch == nullptr)
×
407
                        continue;
×
408

409
                    if (ch->group() == QLCChannel::Beam &&
×
410
                        (ch->preset() == QLCChannel::BeamZoomSmallBig || ch->preset() == QLCChannel::BeamZoomBigSmall))
×
411
                    {
412
                        list << SceneValue(id, i, uchar(value().toUInt()));
×
413
                        break;
×
414
                    }
415
                }
416
            }
417
            break;
×
418
            case Undefined:
×
419
            break;
×
420
        }
421

422
        progress += (1.0 / qreal(fxCount - 1));
×
423
    }
×
424

425
    return list;
×
426
}
×
427

428
QList<SceneValue> QLCPalette::valuesFromFixtureGroups(Doc *doc, QList<quint32> groups)
×
429
{
430
    QList<quint32> fixturesList;
×
431

432
    foreach (quint32 id, groups)
×
433
    {
434
        FixtureGroup *group = doc->fixtureGroup(id);
×
435
        if (group == NULL)
×
436
            continue;
×
437

438
        fixturesList.append(group->fixtureList());
×
439
    }
×
440

441
    return valuesFromFixtures(doc, fixturesList);
×
442
}
×
443

444
qreal QLCPalette::valueFactor(qreal progress)
×
445
{
446
    qreal factor = 1.0;
×
447
    qreal normalizedAmount = qreal(m_fanningAmount) / 100.0;
×
448

449
    switch (m_fanningType)
×
450
    {
451
        case Flat:
×
452
            // nothing to do. Factor is always 1.0
453
        break;
×
454
        case Linear:
×
455
        {
456
            if (normalizedAmount < 1.0)
×
457
            {
458
                if (progress > normalizedAmount)
×
459
                    factor = 1.0;
×
460
                else
461
                    factor = progress * normalizedAmount;
×
462
            }
463
            else if (normalizedAmount > 1.0)
×
464
            {
465
                factor = progress / normalizedAmount;
×
466
            }
467
            else
468
            {
469
                factor = progress;
×
470
            }
471
        }
472
        break;
×
473
        case Sine:
×
474
        {
475
            qreal degrees = (progress * 360.0) + 270.0;
×
476
            factor = (qSin(normalizedAmount * qDegreesToRadians(degrees)) + 1.0) / 2.0;
×
477
        }
478
        break;
×
479
        case Square:
×
480
        {
481
            factor = qSin(normalizedAmount * qDegreesToRadians(progress * 360.0)) < 0 ? 1 : 0;
×
482
        }
483
        break;
×
484
        case Saw:
×
485
        break;
×
486
    }
487

488
    return factor;
×
489
}
490

491
/************************************************************************
492
 * Fanning
493
 ************************************************************************/
494

495
QLCPalette::FanningType QLCPalette::fanningType() const
2✔
496
{
497
    return m_fanningType;
2✔
498
}
499

500
void QLCPalette::setFanningType(QLCPalette::FanningType type)
1✔
501
{
502
    if (type == m_fanningType)
1✔
503
        return;
×
504

505
    m_fanningType = type;
1✔
506

507
    emit fanningTypeChanged();
1✔
508
}
509

510
QString QLCPalette::fanningTypeToString(QLCPalette::FanningType type)
5✔
511
{
512
    switch (type)
5✔
513
    {
514
        case Flat:      return "Flat";
1✔
515
        case Linear:    return "Linear";
1✔
516
        case Sine:      return "Sine";
1✔
517
        case Square:    return "Square";
1✔
518
        case Saw:       return "Saw";
1✔
519
    }
520

521
    return "";
×
522
}
523

524
QLCPalette::FanningType QLCPalette::stringToFanningType(const QString &str)
7✔
525
{
526
    if (str == "Flat")
7✔
527
        return Flat;
1✔
528
    else if (str == "Linear")
6✔
529
        return Linear;
2✔
530
    else if (str == "Sine")
4✔
531
        return Sine;
1✔
532
    else if (str == "Square")
3✔
533
        return Square;
1✔
534
    else if (str == "Saw")
2✔
535
        return Saw;
1✔
536

537
    return Flat;
1✔
538
}
539

540
QLCPalette::FanningLayout QLCPalette::fanningLayout() const
2✔
541
{
542
    return m_fanningLayout;
2✔
543
}
544

545
void QLCPalette::setFanningLayout(QLCPalette::FanningLayout layout)
1✔
546
{
547
    if (layout == m_fanningLayout)
1✔
548
        return;
1✔
549

550
    m_fanningLayout = layout;
×
551

552
    emit fanningLayoutChanged();
×
553
}
554

555
QString QLCPalette::fanningLayoutToString(QLCPalette::FanningLayout layout)
9✔
556
{
557
    switch (layout)
9✔
558
    {
559
        case XAscending:    return "XAscending";
1✔
560
        case XDescending:   return "XDescending";
1✔
561
        case XCentered:     return "XCentered";
1✔
562
        case YAscending:    return "YAscending";
1✔
563
        case YDescending:   return "YDescending";
1✔
564
        case YCentered:     return "YCentered";
1✔
565
        case ZAscending:    return "ZAscending";
1✔
566
        case ZDescending:   return "ZDescending";
1✔
567
        case ZCentered:     return "ZCentered";
1✔
568
    }
569

570
    return "";
×
571
}
572

573
QLCPalette::FanningLayout QLCPalette::stringToFanningLayout(const QString &str)
11✔
574
{
575
    if (str == "XAscending")
11✔
576
        return XAscending;
1✔
577
    else if (str == "XDescending")
10✔
578
        return XDescending;
1✔
579
    else if (str == "XCentered")
9✔
580
        return XCentered;
1✔
581
    else     if (str == "YAscending")
8✔
582
        return YAscending;
1✔
583
    else if (str == "YDescending")
7✔
584
        return YDescending;
1✔
585
    else if (str == "YCentered")
6✔
586
        return YCentered;
1✔
587
    else if (str == "ZAscending")
5✔
588
        return ZAscending;
1✔
589
    else if (str == "ZDescending")
4✔
590
        return ZDescending;
1✔
591
    else if (str == "ZCentered")
3✔
592
        return ZCentered;
1✔
593

594
    return XAscending;
2✔
595
}
596

597
int QLCPalette::fanningAmount() const
3✔
598
{
599
    return m_fanningAmount;
3✔
600
}
601

602
void QLCPalette::setFanningAmount(int amount)
2✔
603
{
604
    if (amount == m_fanningAmount)
2✔
605
        return;
×
606

607
    m_fanningAmount = amount;
2✔
608

609
    emit fanningAmountChanged();
2✔
610
}
611

612
QVariant QLCPalette::fanningValue() const
2✔
613
{
614
    return m_fanningValue;
2✔
615
}
616

617
void QLCPalette::setFanningValue(QVariant value)
1✔
618
{
619
    if (value == m_fanningValue)
1✔
620
        return;
×
621

622
    m_fanningValue = value;
1✔
623

624
    emit fanningValueChanged();
1✔
625
}
626

627
/************************************************************************
628
 * Color helpers
629
 ************************************************************************/
630

631
QString QLCPalette::colorToString(QColor rgb, QColor wauv)
2✔
632
{
633
    QString final = rgb.name();
2✔
634
    final.append(wauv.name().right(6));
2✔
635
    return final;
2✔
636
}
×
637

638
bool QLCPalette::stringToColor(QString str, QColor &rgb, QColor &wauv)
3✔
639
{
640
    // string must be like #rrggbb or #rrggbbwwaauv
641
    if (str.length() != 7 && str.length() != 13)
3✔
642
        return false;
1✔
643

644
    rgb = QColor(str.left(7));
2✔
645

646
    if (str.length() == 13)
2✔
647
        wauv = QColor("#" + str.right(6));
2✔
648
    else
649
        wauv = QColor();
×
650

651
    return true;
2✔
652
}
653

654
/************************************************************************
655
 * Load & Save
656
 ************************************************************************/
657

658
bool QLCPalette::loader(QXmlStreamReader &xmlDoc, Doc *doc)
×
659
{
660
    QLCPalette *palette = new QLCPalette(Dimmer, doc);
×
661
    Q_ASSERT(palette != NULL);
×
662

663
    if (palette->loadXML(xmlDoc) == true)
×
664
    {
665
        doc->addPalette(palette, palette->id());
×
666
    }
667
    else
668
    {
669
        qWarning() << Q_FUNC_INFO << "QLCPalette" << palette->name() << "cannot be loaded.";
×
670
        delete palette;
×
671
        return false;
×
672
    }
673

674
    return true;
×
675
}
676

677
bool QLCPalette::loadXML(QXmlStreamReader &doc)
2✔
678
{
679
    if (doc.name() != KXMLQLCPalette)
2✔
680
    {
681
        qWarning() << Q_FUNC_INFO << "Palette node not found";
1✔
682
        return false;
1✔
683
    }
684

685
    QXmlStreamAttributes attrs = doc.attributes();
1✔
686

687
    bool ok = false;
1✔
688
    quint32 id = attrs.value(KXMLQLCPaletteID).toString().toUInt(&ok);
1✔
689
    if (ok == false)
1✔
690
    {
691
        qWarning() << "Invalid Palette ID:" << attrs.value(KXMLQLCPaletteID).toString();
×
692
        return false;
×
693
    }
694

695
    setID(id);
1✔
696

697
    if (attrs.hasAttribute(KXMLQLCPaletteType) == false)
1✔
698
    {
699
        qWarning() << "Palette type not found!";
×
700
        return false;
×
701
    }
702

703
    m_type = stringToType(attrs.value(KXMLQLCPaletteType).toString());
1✔
704

705
    if (attrs.hasAttribute(KXMLQLCPaletteName))
1✔
706
        setName(attrs.value(KXMLQLCPaletteName).toString());
1✔
707

708
    if (attrs.hasAttribute(KXMLQLCPaletteValue))
1✔
709
    {
710
        QString strVal = attrs.value(KXMLQLCPaletteValue).toString();
1✔
711
        switch (m_type)
1✔
712
        {
713
            case Dimmer:
×
714
            case Pan:
715
            case Tilt:
716
                setValue(strVal.toInt());
×
717
            break;
×
718
            case Color:
1✔
719
                setValue(strVal);
1✔
720
            break;
1✔
721
            case PanTilt:
×
722
            {
723
                QStringList posList = strVal.split(",");
×
724
                if (posList.count() == 2)
×
725
                    setValue(posList.at(0).toInt(), posList.at(1).toInt());
×
726
            }
×
727
            break;
×
728
            case Zoom:
×
729
                setValue(strVal.toFloat());
×
730
            break;
×
731
            case Shutter:   break;
×
732
            case Gobo:      break;
×
733
            case Undefined: break;
×
734
        }
735
    }
1✔
736

737
    if (attrs.hasAttribute(KXMLQLCPaletteFanning))
1✔
738
    {
739
        setFanningType(stringToFanningType(attrs.value(KXMLQLCPaletteFanning).toString()));
1✔
740

741
        if (attrs.hasAttribute(KXMLQLCPaletteFanLayout))
1✔
742
            setFanningLayout(stringToFanningLayout(attrs.value(KXMLQLCPaletteFanLayout).toString()));
1✔
743

744
        if (attrs.hasAttribute(KXMLQLCPaletteFanAmount))
1✔
745
            setFanningAmount(attrs.value(KXMLQLCPaletteFanAmount).toInt());
1✔
746

747
        if (attrs.hasAttribute(KXMLQLCPaletteFanValue))
1✔
748
        {
749
            QString strVal = attrs.value(KXMLQLCPaletteFanValue).toString();
1✔
750
            switch (m_type)
1✔
751
            {
752
                case Dimmer:
×
753
                case Pan:
754
                case Tilt:
755
                case PanTilt:
756
                case Zoom:
757
                    setFanningValue(strVal.toInt());
×
758
                break;
×
759
                case Color:
1✔
760
                    setFanningValue(strVal);
1✔
761
                break;
1✔
762
                case Shutter:   break;
×
763
                case Gobo:      break;
×
764
                case Undefined: break;
×
765
            }
766
        }
1✔
767
    }
768

769
    return true;
1✔
770
}
1✔
771

772
bool QLCPalette::saveXML(QXmlStreamWriter *doc)
1✔
773
{
774
    Q_ASSERT(doc != NULL);
1✔
775

776
    if (m_values.isEmpty())
1✔
777
    {
778
        qWarning() << "Unable to save a Palette without value!";
×
779
        return false;
×
780
    }
781

782
    /* write a Palette entry */
783
    doc->writeStartElement(KXMLQLCPalette);
2✔
784
    doc->writeAttribute(KXMLQLCPaletteID, QString::number(this->id()));
2✔
785
    doc->writeAttribute(KXMLQLCPaletteType, typeToString(m_type));
2✔
786
    doc->writeAttribute(KXMLQLCPaletteName, this->name());
2✔
787

788
    /* write value */
789
    switch (m_type)
1✔
790
    {
791
        case Dimmer:
×
792
        case Pan:
793
        case Tilt:
794
        case Zoom:
795
        case Color:
796
            doc->writeAttribute(KXMLQLCPaletteValue, value().toString());
×
797
        break;
×
798
        case PanTilt:
1✔
799
            doc->writeAttribute(KXMLQLCPaletteValue,
2✔
800
                                QString("%1,%2").arg(m_values.at(0).toInt()).arg(m_values.at(1).toInt()));
2✔
801
        break;
1✔
802
        case Shutter:   break;
×
803
        case Gobo:      break;
×
804
        case Undefined: break;
×
805
    }
806

807
    /* write fanning */
808
    if (m_fanningType != Flat)
1✔
809
    {
810
        doc->writeAttribute(KXMLQLCPaletteFanning, fanningTypeToString(m_fanningType));
×
811
        doc->writeAttribute(KXMLQLCPaletteFanLayout, fanningLayoutToString(m_fanningLayout));
×
812
        doc->writeAttribute(KXMLQLCPaletteFanAmount, QString::number(m_fanningAmount));
×
813
        doc->writeAttribute(KXMLQLCPaletteFanValue, fanningValue().toString());
×
814
    }
815

816
    doc->writeEndElement();
1✔
817

818
    return true;
1✔
819
}
820

STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc