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

mcallegari / qlcplus / 8961243534

05 May 2024 09:23PM UTC coverage: 32.068% (+4.0%) from 28.094%
8961243534

push

github

mcallegari
Merge branch 'master' into qmltoqt6

902 of 2557 new or added lines in 140 files covered. (35.28%)

166 existing lines in 76 files now uncovered.

15395 of 48008 relevant lines covered (32.07%)

22949.67 hits per line

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

0.0
/ui/src/virtualconsole/vcsliderproperties.cpp
1
/*
2
  Q Light Controller
3
  vcsliderproperties.cpp
4

5
  Copyright (c) Heikki Junnila
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 <QTreeWidgetItem>
21
#include <QInputDialog>
22
#include <QRadioButton>
23
#include <QTreeWidget>
24
#include <QHeaderView>
25
#include <QMessageBox>
26
#include <QPushButton>
27
#include <QComboBox>
28
#include <QLineEdit>
29
#include <QSpinBox>
30
#include <QLabel>
31
#include <QAction>
32

33
#include "qlccapability.h"
34
#include "qlcchannel.h"
35

36
#include "inputselectionwidget.h"
37
#include "vcsliderproperties.h"
38
#include "functionselection.h"
39
#include "vcslider.h"
40
#include "fixture.h"
41
#include "doc.h"
42

43
#define KColumnName  0
44
#define KColumnType  1
45
#define KColumnRange 2
46
#define KColumnID    3
47

48
VCSliderProperties::VCSliderProperties(VCSlider* slider, Doc* doc)
×
49
    : QDialog(slider)
50
    , m_doc(doc)
×
51
{
52
    Q_ASSERT(doc != NULL);
×
53
    Q_ASSERT(slider != NULL);
×
54
    m_slider = slider;
×
55
    m_ovrResetSelWidget = NULL;
×
56

57
    setupUi(this);
×
58

59
    QAction* action = new QAction(this);
×
60
    action->setShortcut(QKeySequence(QKeySequence::Close));
×
61
    connect(action, SIGNAL(triggered(bool)), this, SLOT(reject()));
×
62
    addAction(action);
×
63

64
    /* Level page connections */
65
    connect(m_levelLowLimitSpin, SIGNAL(valueChanged(int)),
×
66
            this, SLOT(slotLevelLowSpinChanged(int)));
67
    connect(m_levelHighLimitSpin, SIGNAL(valueChanged(int)),
×
68
            this, SLOT(slotLevelHighSpinChanged(int)));
69
    connect(m_levelCapabilityButton, SIGNAL(clicked()),
×
70
            this, SLOT(slotLevelCapabilityClicked()));
71
    connect(m_levelList, SIGNAL(itemClicked(QTreeWidgetItem*,int)),
×
72
            this, SLOT(slotLevelListClicked(QTreeWidgetItem*)));
73
    connect(m_levelAllButton, SIGNAL(clicked()),
×
74
            this, SLOT(slotLevelAllClicked()));
75
    connect(m_levelNoneButton, SIGNAL(clicked()),
×
76
            this, SLOT(slotLevelNoneClicked()));
77
    connect(m_levelInvertButton, SIGNAL(clicked()),
×
78
            this, SLOT(slotLevelInvertClicked()));
79
    connect(m_levelByGroupButton, SIGNAL(clicked()),
×
80
            this, SLOT(slotLevelByGroupClicked()));
81
    connect(m_switchToLevelModeButton, SIGNAL(clicked()),
×
82
            this, SLOT(slotModeLevelClicked()));
83

84
    /* Playback page connections */
85
    connect(m_switchToPlaybackModeButton, SIGNAL(clicked()),
×
86
            this, SLOT(slotModePlaybackClicked()));
87
    connect(m_attachPlaybackFunctionButton, SIGNAL(clicked()),
×
88
            this, SLOT(slotAttachPlaybackFunctionClicked()));
89
    connect(m_detachPlaybackFunctionButton, SIGNAL(clicked()),
×
90
            this, SLOT(slotDetachPlaybackFunctionClicked()));
91

92
    /* Submaster page connections */
93
    connect(m_switchToSubmasterModeButton, SIGNAL(clicked()),
×
94
            this, SLOT(slotModeSubmasterClicked()));
95

96
    /*********************************************************************
97
     * General page
98
     *********************************************************************/
99

100
    /* Name */
101
    m_nameEdit->setText(m_slider->caption());
×
102

103
    /* Widget appearance */
104
    if (m_slider->widgetStyle() == VCSlider::WKnob)
×
105
        m_widgetKnobRadio->setChecked(true);
×
106
    else
107
        m_widgetSliderRadio->setChecked(true);
×
108

109
    /* Slider mode */
110
    m_sliderMode = m_slider->sliderMode();
×
111
    switch (m_sliderMode)
×
112
    {
113
        default:
×
114
        case VCSlider::Level:
115
            slotModeLevelClicked();
×
116
        break;
×
117
        case VCSlider::Playback:
×
118
            slotModePlaybackClicked();
×
119
        break;
×
120
        case VCSlider::Submaster:
×
121
            slotModeSubmasterClicked();
×
122
        break;
×
123
    }
124

125
    /* Slider movement (Qt understands inverted appearance vice versa) */
126
    if (m_slider->invertedAppearance() == true)
×
127
        m_sliderMovementInvertedRadio->setChecked(true);
×
128
    else
129
        m_sliderMovementNormalRadio->setChecked(true);
×
130

131
    /* Value display style */
132
    switch (m_slider->valueDisplayStyle())
×
133
    {
134
        default:
×
135
        case VCSlider::ExactValue:
136
            m_valueExactRadio->setChecked(true);
×
137
        break;
×
138
        case VCSlider::PercentageValue:
×
139
            m_valuePercentageRadio->setChecked(true);
×
140
        break;
×
141
    }
142

143
    /* Values catching */
144
    if (m_slider->catchValues())
×
145
        m_catchValueCheck->setChecked(true);
×
146

147
    /********************************************************************
148
     * External input
149
     ********************************************************************/
150

151
    m_inputSelWidget = new InputSelectionWidget(m_doc, this);
×
152
    m_inputSelWidget->setKeyInputVisibility(false);
×
153
    m_inputSelWidget->setInputSource(m_slider->inputSource(VCSlider::sliderInputSourceId));
×
154
    m_inputSelWidget->setWidgetPage(m_slider->page());
×
155
    m_inputSelWidget->show();
×
156
    m_extControlLayout->addWidget(m_inputSelWidget);
×
157

158
    /*********************************************************************
159
     * Level page
160
     *********************************************************************/
161

162
    /* Level limit spins */
163
    m_levelLowLimitSpin->setValue(m_slider->levelLowLimit());
×
164
    m_levelHighLimitSpin->setValue(m_slider->levelHighLimit());
×
165

166
    /* Tree widget contents */
167
    levelUpdateFixtures();
×
168
    levelUpdateChannelSelections();
×
169

170
    connect(m_levelList, SIGNAL(expanded(QModelIndex)),
×
171
            this, SLOT(slotItemExpanded()));
172
    connect(m_levelList, SIGNAL(collapsed(QModelIndex)),
×
173
            this, SLOT(slotItemExpanded()));
174
    connect(m_monitorValuesCheck, SIGNAL(clicked(bool)),
×
175
            this, SLOT(slotMonitorCheckClicked(bool)));
176

177
    m_ovrResetSelWidget = new InputSelectionWidget(m_doc, this);
×
178
    m_ovrResetSelWidget->setTitle(tr("Override reset control"));
×
179
    m_ovrResetSelWidget->setCustomFeedbackVisibility(true);
×
180
    m_ovrResetSelWidget->setKeySequence(m_slider->overrideResetKeySequence());
×
181
    m_ovrResetSelWidget->setInputSource(m_slider->inputSource(VCSlider::overrideResetInputSourceId));
×
182
    m_ovrResetSelWidget->setWidgetPage(m_slider->page());
×
183
    m_monitorResetControl->addWidget(m_ovrResetSelWidget);
×
184

185
    if (m_sliderMode == VCSlider::Level && m_slider->channelsMonitorEnabled())
×
186
        m_ovrResetSelWidget->show();
×
187
    else
188
        m_ovrResetSelWidget->hide();
×
189
    m_monitorValuesCheck->setChecked(m_slider->channelsMonitorEnabled());
×
190

191
    /*********************************************************************
192
     * Playback page
193
     *********************************************************************/
194

195
    /* Function */
196
    m_playbackFunctionId = m_slider->playbackFunction();
×
197
    updatePlaybackFunctionName();
×
198
}
×
199

200
VCSliderProperties::~VCSliderProperties()
×
201
{
202
    delete m_inputSelWidget;
×
203
    delete m_ovrResetSelWidget;
×
204
}
×
205

206
/*****************************************************************************
207
 * General page
208
 *****************************************************************************/
209

210
void VCSliderProperties::slotModeLevelClicked()
×
211
{
212
    m_sliderMode = VCSlider::Level;
×
213

214
    m_nameEdit->setEnabled(true);
×
215

216
    setLevelPageVisibility(true);
×
217
    setPlaybackPageVisibility(false);
×
218
    setSubmasterPageVisibility(false);
×
219

220
    int cngType = m_slider->clickAndGoType();
×
221
    switch(cngType)
×
222
    {
223
        case ClickAndGoWidget::Red:
×
224
        case ClickAndGoWidget::Green:
225
        case ClickAndGoWidget::Blue:
226
        case ClickAndGoWidget::Cyan:
227
        case ClickAndGoWidget::Magenta:
228
        case ClickAndGoWidget::Yellow:
229
        case ClickAndGoWidget::Amber:
230
        case ClickAndGoWidget::White:
231
        case ClickAndGoWidget::UV:
232
        case ClickAndGoWidget::Lime:
233
        case ClickAndGoWidget::Indigo:
234
            m_cngColorCheck->setChecked(true);
×
235
        break;
×
236
        case ClickAndGoWidget::RGB:
×
237
            m_cngRGBCheck->setChecked(true);
×
238
        break;
×
239
        case ClickAndGoWidget::CMY:
×
240
            m_cngCMYCheck->setChecked(true);
×
241
        break;
×
242
        case ClickAndGoWidget::Preset:
×
243
            m_cngPresetCheck->setChecked(true);
×
244
        break;
×
245
        default:
×
246
        case ClickAndGoWidget::None:
247
            m_cngNoneCheck->setChecked(true);
×
248
        break;
×
249

250
    }
251
}
×
252

253
void VCSliderProperties::slotModePlaybackClicked()
×
254
{
255
    m_sliderMode = VCSlider::Playback;
×
256

257
    m_nameEdit->setEnabled(true);
×
258

259
    setLevelPageVisibility(false);
×
260
    setPlaybackPageVisibility(true);
×
261
    setSubmasterPageVisibility(false);
×
262
}
×
263

264
void VCSliderProperties::slotModeSubmasterClicked()
×
265
{
266
    m_sliderMode = VCSlider::Submaster;
×
267

268
    setLevelPageVisibility(false);
×
269
    setPlaybackPageVisibility(false);
×
270
    setSubmasterPageVisibility(true);
×
271
}
×
272

273
void VCSliderProperties::setLevelPageVisibility(bool visible)
×
274
{
275
    m_levelValueRangeGroup->setVisible(visible);
×
276
    m_levelList->setVisible(visible);
×
277
    m_levelAllButton->setVisible(visible);
×
278
    m_levelNoneButton->setVisible(visible);
×
279
    m_levelInvertButton->setVisible(visible);
×
280
    m_levelByGroupButton->setVisible(visible);
×
281
    m_clickngoGroup->setVisible(visible);
×
282
    m_monitorValuesCheck->setVisible(visible);
×
283
    if (m_monitorValuesCheck->isChecked() && m_ovrResetSelWidget != NULL)
×
284
        m_ovrResetSelWidget->setVisible(visible);
×
285

286
    if (visible == true)
×
287
    {
288
        m_switchToLevelModeButton->hide();
×
289
        //m_levelSpacer->changeSize(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding);
290
    }
291
    else
292
    {
293
        m_switchToLevelModeButton->show();
×
294
        //m_levelSpacer->changeSize(0, 0, QSizePolicy::Fixed, QSizePolicy::Fixed);
295
    }
296
}
×
297

298
void VCSliderProperties::setPlaybackPageVisibility(bool visible)
×
299
{
300
    m_playbackFunctionGroup->setVisible(visible);
×
301

302
    if (visible == true)
×
303
    {
304
        m_switchToPlaybackModeButton->hide();
×
305
        m_playbackSpacer->changeSize(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding);
×
306
    }
307
    else
308
    {
309
        m_switchToPlaybackModeButton->show();
×
310
        m_playbackSpacer->changeSize(0, 0, QSizePolicy::Fixed, QSizePolicy::Fixed);
×
311
    }
312
}
×
313

314
void VCSliderProperties::setSubmasterPageVisibility(bool visible)
×
315
{
316
    m_submasterInfo->setVisible(visible);
×
317

318
    if (visible == true)
×
319
    {
320
        m_switchToSubmasterModeButton->hide();
×
321
        m_submasterSpacer->changeSize(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding);
×
322
    }
323
    else
324
    {
325
        m_switchToSubmasterModeButton->show();
×
326
        m_submasterSpacer->changeSize(0, 0, QSizePolicy::Fixed, QSizePolicy::Fixed);
×
327
    }
328
}
×
329

330
/*****************************************************************************
331
 * Level page
332
 *****************************************************************************/
333

334
void VCSliderProperties::levelUpdateFixtures()
×
335
{
NEW
336
    foreach (Fixture* fixture, m_doc->fixtures())
×
337
    {
338
        Q_ASSERT(fixture != NULL);
×
339
        levelUpdateFixtureNode(fixture->id());
×
340
    }
341
    m_levelList->header()->resizeSections(QHeaderView::ResizeToContents);
×
342
}
×
343

344
void VCSliderProperties::levelUpdateFixtureNode(quint32 id)
×
345
{
346
    QTreeWidgetItem* item;
347
    Fixture* fxi;
348
    QString str;
×
349

350
    fxi = m_doc->fixture(id);
×
351
    Q_ASSERT(fxi != NULL);
×
352

353
    item = levelFixtureNode(id);
×
354
    if (item == NULL)
×
355
    {
356
        item = new QTreeWidgetItem(m_levelList);
×
357
        item->setText(KColumnID, str.setNum(id));
×
358
        item->setFlags(item->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsAutoTristate);
×
359
    }
360

361
    item->setText(KColumnName, fxi->name());
×
362
    item->setIcon(KColumnName, fxi->getIconFromType());
×
363
    item->setText(KColumnType, fxi->typeString());
×
364

365
    levelUpdateChannels(item, fxi);
×
366

367
}
×
368

369
QTreeWidgetItem* VCSliderProperties::levelFixtureNode(quint32 id)
×
370
{
371
    for (int i = 0; i < m_levelList->topLevelItemCount(); i++)
×
372
    {
373
        QTreeWidgetItem *item = m_levelList->topLevelItem(i);
×
374
        if (item->text(KColumnID).toUInt() == id)
×
375
            return item;
×
376
    }
377

378
    return NULL;
×
379
}
380

381
void VCSliderProperties::levelUpdateChannels(QTreeWidgetItem* parent,
×
382
                                             Fixture* fxi)
383
{
384
    quint32 channels = 0;
×
385
    quint32 ch = 0;
×
386

387
    Q_ASSERT(parent != NULL);
×
388
    Q_ASSERT(fxi != NULL);
×
389

390
    channels = fxi->channels();
×
391
    for (ch = 0; ch < channels; ch++)
×
392
        levelUpdateChannelNode(parent, fxi, ch);
×
393
}
×
394

395
void VCSliderProperties::levelUpdateChannelNode(QTreeWidgetItem* parent,
×
396
                                                Fixture* fxi, quint32 ch)
397
{
398
    Q_ASSERT(parent != NULL);
×
399

400
    if (fxi == NULL)
×
401
        return;
×
402

403
    const QLCChannel* channel = fxi->channel(ch);
×
404
    if (channel == NULL)
×
405
        return;
×
406

407
    QTreeWidgetItem* item = levelChannelNode(parent, ch);
×
408
    if (item == NULL)
×
409
    {
410
        item = new QTreeWidgetItem(parent);
×
411
        item->setText(KColumnID, QString::number(ch));
×
412
        item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
×
413
        item->setCheckState(KColumnName, Qt::Unchecked);
×
414
    }
415

416
    item->setText(KColumnName, QString("%1:%2").arg(ch + 1)
×
417
                  .arg(channel->name()));
×
418
    item->setIcon(KColumnName, channel->getIcon());
×
419
    if (channel->group() == QLCChannel::Intensity &&
×
420
        channel->colour() != QLCChannel::NoColour)
×
421
        item->setText(KColumnType, QLCChannel::colourToString(channel->colour()));
×
422
    else
423
        item->setText(KColumnType, QLCChannel::groupToString(channel->group()));
×
424

425

426
    levelUpdateCapabilities(item, channel);
×
427
}
428

429
QTreeWidgetItem* VCSliderProperties::levelChannelNode(QTreeWidgetItem* parent,
×
430
                                                      quint32 ch)
431
{
432
    Q_ASSERT(parent != NULL);
×
433

434
    for (int i = 0; i < parent->childCount(); i++)
×
435
    {
436
        QTreeWidgetItem* item = parent->child(i);
×
437
        if (item->text(KColumnID).toUInt() == ch)
×
438
            return item;
×
439
    }
440

441
    return NULL;
×
442
}
443

444
void VCSliderProperties::levelUpdateCapabilities(QTreeWidgetItem* parent,
×
445
                                                 const QLCChannel* channel)
446
{
447
    Q_ASSERT(parent != NULL);
×
448
    Q_ASSERT(channel != NULL);
×
449

450
    QListIterator <QLCCapability*> it(channel->capabilities());
×
451
    while (it.hasNext() == true)
×
452
        levelUpdateCapabilityNode(parent, it.next());
×
453
}
×
454

455
void VCSliderProperties::levelUpdateCapabilityNode(QTreeWidgetItem* parent,
×
456
        QLCCapability* cap)
457
{
458
    QTreeWidgetItem* item;
459
    QString str;
×
460

461
    Q_ASSERT(parent != NULL);
×
462
    Q_ASSERT(cap != NULL);
×
463

464
    item = new QTreeWidgetItem(parent);
×
465
    item->setText(KColumnName, cap->name());
×
466
    item->setText(KColumnRange, str.asprintf("%.3d - %.3d",
×
467
                                             cap->min(), cap->max()));
×
468
    item->setFlags(item->flags() & (~Qt::ItemIsUserCheckable));
×
469
}
×
470

471
void VCSliderProperties::levelUpdateChannelSelections()
×
472
{
473
    /* Check all items that are present in the slider's list of
474
       controlled channels. We don't need to set other items off,
475
       because this function is run only during init when everything
476
       is off. */
477
    QListIterator <VCSlider::LevelChannel> it(m_slider->m_levelChannels);
×
478
    while (it.hasNext() == true)
×
479
    {
480
        VCSlider::LevelChannel lch(it.next());
×
481

482
        QTreeWidgetItem* fxiNode = levelFixtureNode(lch.fixture);
×
483
        if (fxiNode == NULL)
×
484
            continue;
×
485

486
        QTreeWidgetItem* chNode = levelChannelNode(fxiNode, lch.channel);
×
487
        if (chNode == NULL)
×
488
            continue;
×
489

490
        chNode->setCheckState(KColumnName, Qt::Checked);
×
491
    }
492
}
×
493

494
void VCSliderProperties::levelSelectChannelsByGroup(QString group)
×
495
{
496
    QTreeWidgetItem* fxi_item;
497
    QTreeWidgetItem* ch_item;
498
    int i;
499
    int j;
500

501
    /* Go thru only channel items. Fixture items get (partially) selected
502
       according to their children's state */
503
    for (i = 0; i < m_levelList->topLevelItemCount(); i++)
×
504
    {
505
        fxi_item = m_levelList->topLevelItem(i);
×
506
        Q_ASSERT(fxi_item != NULL);
×
507

508
        for (j = 0; j < fxi_item->childCount(); j++)
×
509
        {
510
            ch_item = fxi_item->child(j);
×
511
            Q_ASSERT(ch_item != NULL);
×
512

513
            if (ch_item->text(KColumnType) == group)
×
514
                ch_item->setCheckState(KColumnName, Qt::Checked);
×
515
        }
516
    }
517
}
×
518

519
void VCSliderProperties::slotLevelLowSpinChanged(int value)
×
520
{
521
    if (value >= m_levelHighLimitSpin->value())
×
522
        m_levelHighLimitSpin->setValue(value + 1);
×
523
}
×
524

525
void VCSliderProperties::slotLevelHighSpinChanged(int value)
×
526
{
527
    if (value <= m_levelLowLimitSpin->value())
×
528
        m_levelLowLimitSpin->setValue(value - 1);
×
529
}
×
530

531
void VCSliderProperties::slotLevelCapabilityClicked()
×
532
{
533
    QTreeWidgetItem* item;
534
    QStringList list;
×
535

536
    item = m_levelList->currentItem();
×
537
    if (item == NULL || item->parent() == NULL ||
×
538
            item->parent()->parent() == NULL)
×
539
        return;
×
540

541
    list = item->text(KColumnRange).split("-");
×
542
    Q_ASSERT(list.size() == 2);
×
543

544
    m_levelLowLimitSpin->setValue(list[0].toInt());
×
545
    m_levelHighLimitSpin->setValue(list[1].toInt());
×
546
}
547

548
void VCSliderProperties::slotLevelListClicked(QTreeWidgetItem* item)
×
549
{
550
    /* Enable the capability button if a capability has been selected */
551
    if (item != NULL && item->parent() != NULL &&
×
552
            item->parent()->parent() != NULL)
×
553
    {
554
        m_levelCapabilityButton->setEnabled(true);
×
555
    }
556
    else
557
    {
558
        m_levelCapabilityButton->setEnabled(false);
×
559
    }
560
}
×
561

562
void VCSliderProperties::slotLevelAllClicked()
×
563
{
564
    /* Set all fixture items selected, their children should get selected
565
       as well because the fixture items are Controller items. */
566
    for (int i = 0; i < m_levelList->topLevelItemCount(); i++)
×
567
    {
568
        QTreeWidgetItem *fxi_item = m_levelList->topLevelItem(i);
×
569
        Q_ASSERT(fxi_item != NULL);
×
570

571
        fxi_item->setCheckState(KColumnName, Qt::Checked);
×
572
    }
573
}
×
574

575
void VCSliderProperties::slotLevelNoneClicked()
×
576
{
577
    /* Set all fixture items unselected, their children should get unselected
578
       as well because the fixture items are Controller items. */
579
    for (int i = 0; i < m_levelList->topLevelItemCount(); i++)
×
580
    {
581
        QTreeWidgetItem *fxi_item = m_levelList->topLevelItem(i);
×
582
        Q_ASSERT(fxi_item != NULL);
×
583

584
        fxi_item->setCheckState(KColumnName, Qt::Unchecked);
×
585
    }
586
}
×
587

588
void VCSliderProperties::slotLevelInvertClicked()
×
589
{
590
    /* Go through only channel items. Fixture items get (partially) selected
591
       according to their children's state */
592
    for (int i = 0; i < m_levelList->topLevelItemCount(); i++)
×
593
    {
594
        QTreeWidgetItem *fxi_item = m_levelList->topLevelItem(i);
×
595
        Q_ASSERT(fxi_item != NULL);
×
596

597
        for (int j = 0; j < fxi_item->childCount(); j++)
×
598
        {
599
            QTreeWidgetItem *ch_item = fxi_item->child(j);
×
600
            Q_ASSERT(ch_item != NULL);
×
601

602
            if (ch_item->checkState(KColumnName) == Qt::Checked)
×
603
                ch_item->setCheckState(KColumnName,
×
604
                                       Qt::Unchecked);
605
            else
606
                ch_item->setCheckState(KColumnName,
×
607
                                       Qt::Checked);
608
        }
609
    }
610
}
×
611

612
void VCSliderProperties::slotLevelByGroupClicked()
×
613
{
614
    bool ok = false;
×
615
    QString group;
×
616
    QStringList groups;
×
617

NEW
618
    foreach (Fixture* fixture, m_doc->fixtures())
×
619
    {
620
        Q_ASSERT(fixture != NULL);
×
621

NEW
622
        for (quint32 i = 0; i < fixture->channels(); i++)
×
623
        {
624
            const QLCChannel *channel = fixture->channel(i);
×
625

626
            QString property = QLCChannel::groupToString(channel->group());
×
627

628
            if (channel->group() == QLCChannel::Intensity &&
×
629
                channel->colour() != QLCChannel::NoColour)
×
630
            {
631
                property = QLCChannel::colourToString(channel->colour());
×
632
            }
633

634
            if (groups.contains(property) == false)
×
635
                groups.append(property);
×
636
        }
637
    }
638

639
    group = QInputDialog::getItem(this,
×
640
                                  tr("Select channels by group"),
×
641
                                  tr("Select a channel group"),
×
642
                                  groups, 0,
643
                                  false, &ok);
×
644

645
    if (ok == true)
×
646
        levelSelectChannelsByGroup(group);
×
647
}
×
648

649
void VCSliderProperties::slotItemExpanded()
×
650
{
651
    m_levelList->header()->resizeSections(QHeaderView::ResizeToContents);
×
652
}
×
653

654
void VCSliderProperties::slotMonitorCheckClicked(bool checked)
×
655
{
656
    if (checked == true)
×
657
        m_ovrResetSelWidget->show();
×
658
    else
659
        m_ovrResetSelWidget->hide();
×
660
}
×
661

662
/*****************************************************************************
663
 * Playback page
664
 *****************************************************************************/
665

666
void VCSliderProperties::slotAttachPlaybackFunctionClicked()
×
667
{
668
    FunctionSelection fs(this, m_doc);
×
669
    fs.setMultiSelection(false);
×
670
    fs.setFilter(Function::SceneType | Function::ChaserType | Function::SequenceType |
×
671
                 Function::EFXType | Function::AudioType | Function::RGBMatrixType |
672
                 Function::CollectionType | Function::VideoType, false);
673
    fs.disableFilters(Function::ScriptType | Function::ShowType);
×
674

675
    if (fs.exec() != QDialog::Accepted)
×
676
        return;
×
677

678
    if (fs.selection().size() == 0)
×
679
        return;
×
680

681
    m_playbackFunctionId = fs.selection().first();
×
682
    updatePlaybackFunctionName();
×
683
}
684

685
void VCSliderProperties::slotDetachPlaybackFunctionClicked()
×
686
{
687
    m_playbackFunctionId = Function::invalidId();
×
688
    updatePlaybackFunctionName();
×
689
}
×
690

691
void VCSliderProperties::updatePlaybackFunctionName()
×
692
{
693
    Function* function = m_doc->function(m_playbackFunctionId);
×
694
    if (function != NULL)
×
695
    {
696
        m_playbackFunctionEdit->setText(function->name());
×
697
        if (m_nameEdit->text().simplified().isEmpty() == true)
×
698
            m_nameEdit->setText(function->name());
×
699
    }
700
    else
701
    {
702
        m_playbackFunctionId = Function::invalidId(); // Ensure
×
703
        m_playbackFunctionEdit->setText(tr("No function"));
×
704
    }
705
}
×
706

707
/*****************************************************************************
708
 * OK & Cancel
709
 *****************************************************************************/
710

711
void VCSliderProperties::checkMajorColor(int *comp, int *max, int type)
×
712
{
713
    if (*comp > *max)
×
714
    {
715
        *max = *comp;
×
716
        m_slider->setClickAndGoType((ClickAndGoWidget::ClickAndGo)type);
×
717
    }
718
}
×
719

720
void VCSliderProperties::storeLevelChannels()
×
721
{
722
    int red = 0, green = 0, blue = 0;
×
723
    int cyan = 0, magenta = 0, yellow = 0, amber = 0, white = 0, uv = 0, lime = 0, indigo = 0;
×
724
    int majorColor = 0;
×
725
    /* Clear all channels from the slider first */
726
    m_slider->clearLevelChannels();
×
727

728
    /* Go thru all fixtures and their channels, add checked channels */
729
    for (int i = 0; i < m_levelList->topLevelItemCount(); i++)
×
730
    {
731
        QTreeWidgetItem* fxi_item = m_levelList->topLevelItem(i);
×
732
        Q_ASSERT(fxi_item != NULL);
×
733

734
        quint32 fxi_id = fxi_item->text(KColumnID).toUInt();
×
735
        Fixture *fxi = m_doc->fixture(fxi_id);
×
736

737
        for (int j = 0; j < fxi_item->childCount(); j++)
×
738
        {
739
            QTreeWidgetItem* ch_item = fxi_item->child(j);
×
740
            Q_ASSERT(ch_item != NULL);
×
741

742
            if (ch_item->checkState(KColumnName) == Qt::Checked)
×
743
            {
744
                quint32 ch_num = ch_item->text(KColumnID).toUInt();
×
745
                if (fxi != NULL)
×
746
                {
747
                    const QLCChannel *ch = fxi->channel(ch_num);
×
748
                    if (ch->group() == QLCChannel::Intensity &&
×
749
                        m_cngColorCheck->isChecked())
×
750
                    {
751
                        if (ch->colour() == QLCChannel::Red)
×
752
                        {
753
                            red++;
×
754
                            checkMajorColor(&red, &majorColor, ClickAndGoWidget::Red);
×
755
                        }
756
                        else if (ch->colour() == QLCChannel::Green)
×
757
                        {
758
                            green++;
×
759
                            checkMajorColor(&green, &majorColor, ClickAndGoWidget::Green);
×
760
                        }
761
                        else if (ch->colour() == QLCChannel::Blue)
×
762
                        {
763
                            blue++;
×
764
                            checkMajorColor(&blue, &majorColor, ClickAndGoWidget::Blue);
×
765
                        }
766
                        else if (ch->colour() == QLCChannel::Cyan)
×
767
                        {
768
                            cyan++;
×
769
                            checkMajorColor(&cyan, &majorColor, ClickAndGoWidget::Cyan);
×
770
                        }
771
                        else if (ch->colour() == QLCChannel::Magenta)
×
772
                        {
773
                            magenta++;
×
774
                            checkMajorColor(&magenta, &majorColor, ClickAndGoWidget::Magenta);
×
775
                        }
776
                        else if (ch->colour() == QLCChannel::Yellow)
×
777
                        {
778
                            yellow++;
×
779
                            checkMajorColor(&yellow, &majorColor, ClickAndGoWidget::Yellow);
×
780
                        }
781
                        else if (ch->colour() == QLCChannel::Amber)
×
782
                        {
783
                            amber++;
×
784
                            checkMajorColor(&amber, &majorColor, ClickAndGoWidget::Amber);
×
785
                        }
786
                        else if (ch->colour() == QLCChannel::White)
×
787
                        {
788
                            white++;
×
789
                            checkMajorColor(&white, &majorColor, ClickAndGoWidget::White);
×
790
                        }
791
                        else if (ch->colour() == QLCChannel::UV)
×
792
                        {
793
                            uv++;
×
794
                            checkMajorColor(&uv, &majorColor, ClickAndGoWidget::UV);
×
795
                        }
796
                        else if (ch->colour() == QLCChannel::Lime)
×
797
                        {
798
                            lime++;
×
799
                            checkMajorColor(&lime, &majorColor, ClickAndGoWidget::Lime);
×
800
                        }
801
                        else if (ch->colour() == QLCChannel::Indigo)
×
802
                        {
803
                            indigo++;
×
804
                            checkMajorColor(&indigo, &majorColor, ClickAndGoWidget::Indigo);
×
805
                        }
806
                    }
807
                }
808
                m_slider->addLevelChannel(fxi_id, ch_num);
×
809
            }
810
        }
811
    }
812
}
×
813

814
void VCSliderProperties::accept()
×
815
{
816
    /* Widget appearance */
817
    if (m_widgetKnobRadio->isChecked())
×
818
        m_slider->setWidgetStyle(VCSlider::WKnob);
×
819
    else
820
        m_slider->setWidgetStyle(VCSlider::WSlider);
×
821

822
    /* Values catching */
823
    if (m_catchValueCheck->isChecked())
×
824
        m_slider->setCatchValues(true);
×
825
    else
826
        m_slider->setCatchValues(false);
×
827

828
    /* Level page */
829
    bool limitDiff =
830
        (m_slider->levelLowLimit() != m_levelLowLimitSpin->value()) ||
×
831
        (m_slider->levelHighLimit() != m_levelLowLimitSpin->value());
×
832
    m_slider->setLevelLowLimit(m_levelLowLimitSpin->value());
×
833
    m_slider->setLevelHighLimit(m_levelHighLimitSpin->value());
×
834
    storeLevelChannels();
×
835

836
    /* Click & Go group */
837
    /* Color doesn't have a case cause it is calculated
838
     * in storeLevelChannels */
839
    if (m_cngNoneCheck->isChecked())
×
840
        m_slider->setClickAndGoType(ClickAndGoWidget::None);
×
841
    else if (m_cngRGBCheck->isChecked())
×
842
        m_slider->setClickAndGoType(ClickAndGoWidget::RGB);
×
843
    else if (m_cngCMYCheck->isChecked())
×
844
        m_slider->setClickAndGoType(ClickAndGoWidget::CMY);
×
845
    else if (m_cngPresetCheck->isChecked())
×
846
        m_slider->setClickAndGoType(ClickAndGoWidget::Preset);
×
847

848
    /* Playback page */
849
    m_slider->setPlaybackFunction(m_playbackFunctionId);
×
850

851
    /* Slider mode */
852
    if (m_slider->sliderMode() != m_sliderMode)
×
853
    {
854
        m_slider->setSliderMode(VCSlider::SliderMode(m_sliderMode));
×
855
        if (m_slider->sliderMode() == VCSlider::Submaster)
×
856
        {
857
            m_slider->setLevelValue(UCHAR_MAX);
×
858
            m_slider->setSliderValue(UCHAR_MAX);
×
859
        }
860
    }
861
    else if (limitDiff && m_slider->sliderMode() == VCSlider::Level)
×
862
    {
863
        // Force the refresh of the slider range
864
        m_slider->setSliderMode(VCSlider::Level);
×
865
    }
866

867
    if (m_slider->sliderMode() == VCSlider::Level)
×
868
    {
869
        m_slider->setChannelsMonitorEnabled(m_monitorValuesCheck->isChecked());
×
870
        m_slider->setOverrideResetKeySequence(m_ovrResetSelWidget->keySequence());
×
871
        m_slider->setInputSource(m_ovrResetSelWidget->inputSource(), VCSlider::overrideResetInputSourceId);
×
872
    }
873

874
    m_slider->setCaption(m_nameEdit->text());
×
875

876
    /* Value style */
877
    if (m_valueExactRadio->isChecked() == true)
×
878
        m_slider->setValueDisplayStyle(VCSlider::ExactValue);
×
879
    else
880
        m_slider->setValueDisplayStyle(VCSlider::PercentageValue);
×
881

882
    /* Slider movement */
883
    if (m_sliderMovementNormalRadio->isChecked() == true)
×
884
        m_slider->setInvertedAppearance(false);
×
885
    else
886
        m_slider->setInvertedAppearance(true);
×
887

888
    /* External input */
889
    m_slider->setInputSource(m_inputSelWidget->inputSource(), VCSlider::sliderInputSourceId);
×
890

891
    /* Close dialog */
892
    QDialog::accept();
×
UNCOV
893
}
×
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

© 2026 Coveralls, Inc