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

mcallegari / qlcplus / 19144422256

06 Nov 2025 05:33PM UTC coverage: 34.256% (-0.1%) from 34.358%
19144422256

push

github

mcallegari
Back to 5.1.0 debug

17718 of 51723 relevant lines covered (34.26%)

19528.23 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
    m_levelList->sortByColumn(0, Qt::AscendingOrder);
×
59

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

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

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

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

97
    /*********************************************************************
98
     * General page
99
     *********************************************************************/
100

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

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

110
    /* Slider mode */
111
    m_sliderMode = m_slider->sliderMode();
×
112

113
    /* Slider movement (Qt understands inverted appearance vice versa) */
114
    if (m_slider->invertedAppearance() == true)
×
115
        m_sliderMovementInvertedRadio->setChecked(true);
×
116
    else
117
        m_sliderMovementNormalRadio->setChecked(true);
×
118

119
    /* Value display style */
120
    switch (m_slider->valueDisplayStyle())
×
121
    {
122
        default:
×
123
        case VCSlider::ExactValue:
124
            m_valueExactRadio->setChecked(true);
×
125
        break;
×
126
        case VCSlider::PercentageValue:
×
127
            m_valuePercentageRadio->setChecked(true);
×
128
        break;
×
129
    }
130

131
    /* Values catching */
132
    if (m_slider->catchValues())
×
133
        m_catchValueCheck->setChecked(true);
×
134

135
    /********************************************************************
136
     * External input
137
     ********************************************************************/
138

139
    m_inputSelWidget = new InputSelectionWidget(m_doc, this);
×
140
    m_inputSelWidget->setKeyInputVisibility(false);
×
141
    m_inputSelWidget->setInputSource(m_slider->inputSource(VCSlider::sliderInputSourceId));
×
142
    m_inputSelWidget->setWidgetPage(m_slider->page());
×
143
    m_inputSelWidget->show();
×
144
    m_extControlLayout->addWidget(m_inputSelWidget);
×
145

146
    /*********************************************************************
147
     * Level page
148
     *********************************************************************/
149

150
    /* Level limit spins */
151
    m_levelLowLimitSpin->setValue(m_slider->levelLowLimit());
×
152
    m_levelHighLimitSpin->setValue(m_slider->levelHighLimit());
×
153

154
    /* Tree widget contents */
155
    levelUpdateFixtures();
×
156
    levelUpdateChannelSelections();
×
157

158
    connect(m_levelList, SIGNAL(expanded(QModelIndex)),
×
159
            this, SLOT(slotItemExpanded()));
160
    connect(m_levelList, SIGNAL(collapsed(QModelIndex)),
×
161
            this, SLOT(slotItemExpanded()));
162
    connect(m_monitorValuesCheck, SIGNAL(clicked(bool)),
×
163
            this, SLOT(slotMonitorCheckClicked(bool)));
164

165
    m_ovrResetSelWidget = new InputSelectionWidget(m_doc, this);
×
166
    m_ovrResetSelWidget->setTitle(tr("Override reset control"));
×
167
    m_ovrResetSelWidget->setCustomFeedbackVisibility(true);
×
168
    m_ovrResetSelWidget->setKeySequence(m_slider->overrideResetKeySequence());
×
169
    m_ovrResetSelWidget->setInputSource(m_slider->inputSource(VCSlider::overrideResetInputSourceId));
×
170
    m_ovrResetSelWidget->setWidgetPage(m_slider->page());
×
171
    m_monitorResetControl->addWidget(m_ovrResetSelWidget);
×
172

173
    if (m_sliderMode == VCSlider::Level && m_slider->channelsMonitorEnabled())
×
174
        m_ovrResetSelWidget->show();
×
175
    else
176
        m_ovrResetSelWidget->hide();
×
177
    m_monitorValuesCheck->setChecked(m_slider->channelsMonitorEnabled());
×
178

179
    /*********************************************************************
180
     * Playback page
181
     *********************************************************************/
182

183
    /* Function */
184
    m_playbackFunctionId = m_slider->playbackFunction();
×
185
    updatePlaybackFunctionName();
×
186

187
    m_flashInputWidget = new InputSelectionWidget(m_doc, this);
×
188
    m_flashInputWidget->setKeySequence(m_slider->playbackFlashKeySequence());
×
189
    m_flashInputWidget->setInputSource(m_slider->inputSource(VCSlider::flashButtonInputSourceId));
×
190
    m_flashInputWidget->setWidgetPage(m_slider->page());
×
191
    m_flashInputWidget->show();
×
192
    m_flashInputWidget->setEnabled(m_slider->playbackFlashEnable());
×
193
    m_flashButtonLayout->addWidget(m_flashInputWidget);
×
194

195
    connect(m_flashButtonCheck, SIGNAL(clicked(bool)),
×
196
            this, SLOT(slotFlashCheckClicked(bool)));
197
    m_flashButtonCheck->setChecked(m_slider->playbackFlashEnable());
×
198

199
    /* At last, sort out visibility */
200
    switch (m_sliderMode)
×
201
    {
202
        default:
×
203
        case VCSlider::Level:
204
            slotModeLevelClicked();
×
205
        break;
×
206
        case VCSlider::Playback:
×
207
            slotModePlaybackClicked();
×
208
        break;
×
209
        case VCSlider::Submaster:
×
210
            slotModeSubmasterClicked();
×
211
        break;
×
212
    }
213
}
×
214

215
VCSliderProperties::~VCSliderProperties()
×
216
{
217
    delete m_inputSelWidget;
×
218
    delete m_ovrResetSelWidget;
×
219
}
×
220

221
/*****************************************************************************
222
 * General page
223
 *****************************************************************************/
224

225
void VCSliderProperties::slotModeLevelClicked()
×
226
{
227
    m_sliderMode = VCSlider::Level;
×
228

229
    m_nameEdit->setEnabled(true);
×
230

231
    setLevelPageVisibility(true);
×
232
    setPlaybackPageVisibility(false);
×
233
    setSubmasterPageVisibility(false);
×
234

235
    int cngType = m_slider->clickAndGoType();
×
236
    switch(cngType)
×
237
    {
238
        case ClickAndGoWidget::Red:
×
239
        case ClickAndGoWidget::Green:
240
        case ClickAndGoWidget::Blue:
241
        case ClickAndGoWidget::Cyan:
242
        case ClickAndGoWidget::Magenta:
243
        case ClickAndGoWidget::Yellow:
244
        case ClickAndGoWidget::Amber:
245
        case ClickAndGoWidget::White:
246
        case ClickAndGoWidget::UV:
247
        case ClickAndGoWidget::Lime:
248
        case ClickAndGoWidget::Indigo:
249
            m_cngColorCheck->setChecked(true);
×
250
        break;
×
251
        case ClickAndGoWidget::RGB:
×
252
            m_cngRGBCheck->setChecked(true);
×
253
        break;
×
254
        case ClickAndGoWidget::CMY:
×
255
            m_cngCMYCheck->setChecked(true);
×
256
        break;
×
257
        case ClickAndGoWidget::Preset:
×
258
            m_cngPresetCheck->setChecked(true);
×
259
        break;
×
260
        default:
×
261
        case ClickAndGoWidget::None:
262
            m_cngNoneCheck->setChecked(true);
×
263
        break;
×
264

265
    }
266
}
×
267

268
void VCSliderProperties::slotModePlaybackClicked()
×
269
{
270
    m_sliderMode = VCSlider::Playback;
×
271

272
    m_nameEdit->setEnabled(true);
×
273

274
    setLevelPageVisibility(false);
×
275
    setPlaybackPageVisibility(true);
×
276
    setSubmasterPageVisibility(false);
×
277
}
×
278

279
void VCSliderProperties::slotModeSubmasterClicked()
×
280
{
281
    m_sliderMode = VCSlider::Submaster;
×
282

283
    setLevelPageVisibility(false);
×
284
    setPlaybackPageVisibility(false);
×
285
    setSubmasterPageVisibility(true);
×
286
}
×
287

288
void VCSliderProperties::setLevelPageVisibility(bool visible)
×
289
{
290
    m_levelValueRangeGroup->setVisible(visible);
×
291
    m_levelList->setVisible(visible);
×
292
    m_levelAllButton->setVisible(visible);
×
293
    m_levelNoneButton->setVisible(visible);
×
294
    m_levelInvertButton->setVisible(visible);
×
295
    m_levelByGroupButton->setVisible(visible);
×
296
    m_clickngoGroup->setVisible(visible);
×
297
    m_monitorValuesCheck->setVisible(visible);
×
298
    if (m_monitorValuesCheck->isChecked() && m_ovrResetSelWidget != NULL)
×
299
        m_ovrResetSelWidget->setVisible(visible);
×
300

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

313
void VCSliderProperties::setPlaybackPageVisibility(bool visible)
×
314
{
315
    m_playbackFunctionGroup->setVisible(visible);
×
316
    m_flashButtonCheck->setVisible(visible);
×
317
    m_flashInputWidget->setVisible(visible);
×
318

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

331
void VCSliderProperties::setSubmasterPageVisibility(bool visible)
×
332
{
333
    m_submasterInfo->setVisible(visible);
×
334

335
    if (visible == true)
×
336
    {
337
        m_switchToSubmasterModeButton->hide();
×
338
        m_submasterSpacer->changeSize(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding);
×
339
    }
340
    else
341
    {
342
        m_switchToSubmasterModeButton->show();
×
343
        m_submasterSpacer->changeSize(0, 0, QSizePolicy::Fixed, QSizePolicy::Fixed);
×
344
    }
345
}
×
346

347
/*****************************************************************************
348
 * Level page
349
 *****************************************************************************/
350

351
void VCSliderProperties::levelUpdateFixtures()
×
352
{
353
    foreach (Fixture* fixture, m_doc->fixtures())
×
354
    {
355
        Q_ASSERT(fixture != NULL);
×
356
        levelUpdateFixtureNode(fixture->id());
×
357
    }
×
358
    m_levelList->header()->resizeSections(QHeaderView::ResizeToContents);
×
359
}
×
360

361
void VCSliderProperties::levelUpdateFixtureNode(quint32 id)
×
362
{
363
    QTreeWidgetItem* item;
364
    Fixture* fxi;
365
    QString str;
×
366

367
    fxi = m_doc->fixture(id);
×
368
    Q_ASSERT(fxi != NULL);
×
369

370
    item = levelFixtureNode(id);
×
371
    if (item == NULL)
×
372
    {
373
        item = new QTreeWidgetItem(m_levelList);
×
374
        item->setText(KColumnID, str.setNum(id));
×
375
        item->setFlags(item->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsAutoTristate);
×
376
    }
377

378
    item->setText(KColumnName, fxi->name());
×
379
    item->setIcon(KColumnName, fxi->getIconFromType());
×
380
    item->setText(KColumnType, fxi->typeString());
×
381

382
    levelUpdateChannels(item, fxi);
×
383

384
}
×
385

386
QTreeWidgetItem* VCSliderProperties::levelFixtureNode(quint32 id)
×
387
{
388
    for (int i = 0; i < m_levelList->topLevelItemCount(); i++)
×
389
    {
390
        QTreeWidgetItem *item = m_levelList->topLevelItem(i);
×
391
        if (item->text(KColumnID).toUInt() == id)
×
392
            return item;
×
393
    }
394

395
    return NULL;
×
396
}
397

398
void VCSliderProperties::levelUpdateChannels(QTreeWidgetItem* parent,
×
399
                                             Fixture* fxi)
400
{
401
    quint32 channels = 0;
×
402
    quint32 ch = 0;
×
403

404
    Q_ASSERT(parent != NULL);
×
405
    Q_ASSERT(fxi != NULL);
×
406

407
    channels = fxi->channels();
×
408
    for (ch = 0; ch < channels; ch++)
×
409
        levelUpdateChannelNode(parent, fxi, ch);
×
410
}
×
411

412
void VCSliderProperties::levelUpdateChannelNode(QTreeWidgetItem* parent,
×
413
                                                Fixture* fxi, quint32 ch)
414
{
415
    Q_ASSERT(parent != NULL);
×
416

417
    if (fxi == NULL)
×
418
        return;
×
419

420
    const QLCChannel* channel = fxi->channel(ch);
×
421
    if (channel == NULL)
×
422
        return;
×
423

424
    QTreeWidgetItem* item = levelChannelNode(parent, ch);
×
425
    if (item == NULL)
×
426
    {
427
        item = new QTreeWidgetItem(parent);
×
428
        item->setText(KColumnID, QString::number(ch));
×
429
        item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
×
430
        item->setCheckState(KColumnName, Qt::Unchecked);
×
431
    }
432

433
    item->setText(KColumnName, QString("%1:%2").arg(ch + 1)
×
434
                  .arg(channel->name()));
×
435
    item->setIcon(KColumnName, channel->getIcon());
×
436
    if (channel->group() == QLCChannel::Intensity &&
×
437
        channel->colour() != QLCChannel::NoColour)
×
438
        item->setText(KColumnType, QLCChannel::colourToString(channel->colour()));
×
439
    else
440
        item->setText(KColumnType, QLCChannel::groupToString(channel->group()));
×
441

442

443
    levelUpdateCapabilities(item, channel);
×
444
}
445

446
QTreeWidgetItem* VCSliderProperties::levelChannelNode(QTreeWidgetItem* parent,
×
447
                                                      quint32 ch)
448
{
449
    Q_ASSERT(parent != NULL);
×
450

451
    for (int i = 0; i < parent->childCount(); i++)
×
452
    {
453
        QTreeWidgetItem* item = parent->child(i);
×
454
        if (item->text(KColumnID).toUInt() == ch)
×
455
            return item;
×
456
    }
457

458
    return NULL;
×
459
}
460

461
void VCSliderProperties::levelUpdateCapabilities(QTreeWidgetItem* parent,
×
462
                                                 const QLCChannel* channel)
463
{
464
    Q_ASSERT(parent != NULL);
×
465
    Q_ASSERT(channel != NULL);
×
466

467
    QListIterator <QLCCapability*> it(channel->capabilities());
×
468
    while (it.hasNext() == true)
×
469
        levelUpdateCapabilityNode(parent, it.next());
×
470
}
×
471

472
void VCSliderProperties::levelUpdateCapabilityNode(QTreeWidgetItem* parent,
×
473
        QLCCapability* cap)
474
{
475
    QTreeWidgetItem* item;
476
    QString str;
×
477

478
    Q_ASSERT(parent != NULL);
×
479
    Q_ASSERT(cap != NULL);
×
480

481
    item = new QTreeWidgetItem(parent);
×
482
    item->setText(KColumnName, cap->name());
×
483
    item->setText(KColumnRange, str.asprintf("%.3d - %.3d",
×
484
                                             cap->min(), cap->max()));
×
485
    item->setFlags(item->flags() & (~Qt::ItemIsUserCheckable));
×
486
}
×
487

488
void VCSliderProperties::levelUpdateChannelSelections()
×
489
{
490
    /* Check all items that are present in the slider's list of
491
       controlled channels. We don't need to set other items off,
492
       because this function is run only during init when everything
493
       is off. */
494
    QListIterator <VCSlider::LevelChannel> it(m_slider->m_levelChannels);
×
495
    while (it.hasNext() == true)
×
496
    {
497
        VCSlider::LevelChannel lch(it.next());
×
498

499
        QTreeWidgetItem* fxiNode = levelFixtureNode(lch.fixture);
×
500
        if (fxiNode == NULL)
×
501
            continue;
×
502

503
        QTreeWidgetItem* chNode = levelChannelNode(fxiNode, lch.channel);
×
504
        if (chNode == NULL)
×
505
            continue;
×
506

507
        chNode->setCheckState(KColumnName, Qt::Checked);
×
508
    }
509
}
×
510

511
void VCSliderProperties::levelSelectChannelsByGroup(QString group)
×
512
{
513
    QTreeWidgetItem* fxi_item;
514
    QTreeWidgetItem* ch_item;
515
    int i;
516
    int j;
517

518
    /* Go thru only channel items. Fixture items get (partially) selected
519
       according to their children's state */
520
    for (i = 0; i < m_levelList->topLevelItemCount(); i++)
×
521
    {
522
        fxi_item = m_levelList->topLevelItem(i);
×
523
        Q_ASSERT(fxi_item != NULL);
×
524

525
        for (j = 0; j < fxi_item->childCount(); j++)
×
526
        {
527
            ch_item = fxi_item->child(j);
×
528
            Q_ASSERT(ch_item != NULL);
×
529

530
            if (ch_item->text(KColumnType) == group)
×
531
                ch_item->setCheckState(KColumnName, Qt::Checked);
×
532
        }
533
    }
534
}
×
535

536
void VCSliderProperties::slotLevelLowSpinChanged(int value)
×
537
{
538
    if (value >= m_levelHighLimitSpin->value())
×
539
        m_levelHighLimitSpin->setValue(value + 1);
×
540
}
×
541

542
void VCSliderProperties::slotLevelHighSpinChanged(int value)
×
543
{
544
    if (value <= m_levelLowLimitSpin->value())
×
545
        m_levelLowLimitSpin->setValue(value - 1);
×
546
}
×
547

548
void VCSliderProperties::slotLevelCapabilityClicked()
×
549
{
550
    QTreeWidgetItem* item;
551
    QStringList list;
×
552

553
    item = m_levelList->currentItem();
×
554
    if (item == NULL || item->parent() == NULL ||
×
555
            item->parent()->parent() == NULL)
×
556
        return;
×
557

558
    list = item->text(KColumnRange).split("-");
×
559
    Q_ASSERT(list.size() == 2);
×
560

561
    m_levelLowLimitSpin->setValue(list[0].toInt());
×
562
    m_levelHighLimitSpin->setValue(list[1].toInt());
×
563
}
×
564

565
void VCSliderProperties::slotLevelListClicked(QTreeWidgetItem* item)
×
566
{
567
    /* Enable the capability button if a capability has been selected */
568
    if (item != NULL && item->parent() != NULL &&
×
569
            item->parent()->parent() != NULL)
×
570
    {
571
        m_levelCapabilityButton->setEnabled(true);
×
572
    }
573
    else
574
    {
575
        m_levelCapabilityButton->setEnabled(false);
×
576
    }
577
}
×
578

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

588
        fxi_item->setCheckState(KColumnName, Qt::Checked);
×
589
    }
590
}
×
591

592
void VCSliderProperties::slotLevelNoneClicked()
×
593
{
594
    /* Set all fixture items unselected, their children should get unselected
595
       as well because the fixture items are Controller items. */
596
    for (int i = 0; i < m_levelList->topLevelItemCount(); i++)
×
597
    {
598
        QTreeWidgetItem *fxi_item = m_levelList->topLevelItem(i);
×
599
        Q_ASSERT(fxi_item != NULL);
×
600

601
        fxi_item->setCheckState(KColumnName, Qt::Unchecked);
×
602
    }
603
}
×
604

605
void VCSliderProperties::slotLevelInvertClicked()
×
606
{
607
    /* Go through only channel items. Fixture items get (partially) selected
608
       according to their children's state */
609
    for (int i = 0; i < m_levelList->topLevelItemCount(); i++)
×
610
    {
611
        QTreeWidgetItem *fxi_item = m_levelList->topLevelItem(i);
×
612
        Q_ASSERT(fxi_item != NULL);
×
613

614
        for (int j = 0; j < fxi_item->childCount(); j++)
×
615
        {
616
            QTreeWidgetItem *ch_item = fxi_item->child(j);
×
617
            Q_ASSERT(ch_item != NULL);
×
618

619
            if (ch_item->checkState(KColumnName) == Qt::Checked)
×
620
                ch_item->setCheckState(KColumnName,
×
621
                                       Qt::Unchecked);
622
            else
623
                ch_item->setCheckState(KColumnName,
×
624
                                       Qt::Checked);
625
        }
626
    }
627
}
×
628

629
void VCSliderProperties::slotLevelByGroupClicked()
×
630
{
631
    bool ok = false;
×
632
    QString group;
×
633
    QStringList groups;
×
634

635
    foreach (Fixture* fixture, m_doc->fixtures())
×
636
    {
637
        Q_ASSERT(fixture != NULL);
×
638

639
        for (quint32 i = 0; i < fixture->channels(); i++)
×
640
        {
641
            const QLCChannel *channel = fixture->channel(i);
×
642

643
            QString property = QLCChannel::groupToString(channel->group());
×
644

645
            if (channel->group() == QLCChannel::Intensity &&
×
646
                channel->colour() != QLCChannel::NoColour)
×
647
            {
648
                property = QLCChannel::colourToString(channel->colour());
×
649
            }
650

651
            if (groups.contains(property) == false)
×
652
                groups.append(property);
×
653
        }
×
654
    }
×
655

656
    group = QInputDialog::getItem(this,
×
657
                                  tr("Select channels by group"),
×
658
                                  tr("Select a channel group"),
×
659
                                  groups, 0,
660
                                  false, &ok);
×
661

662
    if (ok == true)
×
663
        levelSelectChannelsByGroup(group);
×
664
}
×
665

666
void VCSliderProperties::slotItemExpanded()
×
667
{
668
    m_levelList->header()->resizeSections(QHeaderView::ResizeToContents);
×
669
}
×
670

671
void VCSliderProperties::slotMonitorCheckClicked(bool checked)
×
672
{
673
    if (checked == true)
×
674
        m_ovrResetSelWidget->show();
×
675
    else
676
        m_ovrResetSelWidget->hide();
×
677
}
×
678

679
/*****************************************************************************
680
 * Playback page
681
 *****************************************************************************/
682

683
void VCSliderProperties::slotAttachPlaybackFunctionClicked()
×
684
{
685
    FunctionSelection fs(this, m_doc);
×
686
    fs.setMultiSelection(false);
×
687
    fs.setFilter(Function::SceneType | Function::ChaserType | Function::SequenceType |
×
688
                 Function::EFXType | Function::AudioType | Function::RGBMatrixType |
689
                 Function::CollectionType | Function::VideoType, false);
690
    fs.disableFilters(Function::ScriptType | Function::ShowType);
×
691

692
    if (fs.exec() != QDialog::Accepted)
×
693
        return;
×
694

695
    if (fs.selection().size() == 0)
×
696
        return;
×
697

698
    m_playbackFunctionId = fs.selection().first();
×
699
    updatePlaybackFunctionName();
×
700
}
×
701

702
void VCSliderProperties::slotDetachPlaybackFunctionClicked()
×
703
{
704
    m_playbackFunctionId = Function::invalidId();
×
705
    updatePlaybackFunctionName();
×
706
}
×
707

708
void VCSliderProperties::slotFlashCheckClicked(bool checked)
×
709
{
710
    m_flashInputWidget->setEnabled(checked);
×
711
}
×
712

713
void VCSliderProperties::updatePlaybackFunctionName()
×
714
{
715
    Function* function = m_doc->function(m_playbackFunctionId);
×
716
    if (function != NULL)
×
717
    {
718
        m_playbackFunctionEdit->setText(function->name());
×
719
        if (m_nameEdit->text().simplified().isEmpty() == true)
×
720
            m_nameEdit->setText(function->name());
×
721
    }
722
    else
723
    {
724
        m_playbackFunctionId = Function::invalidId(); // Ensure
×
725
        m_playbackFunctionEdit->setText(tr("No function"));
×
726
    }
727
}
×
728

729
/*****************************************************************************
730
 * OK & Cancel
731
 *****************************************************************************/
732

733
void VCSliderProperties::checkMajorColor(int *comp, int *max, int type)
×
734
{
735
    if (*comp > *max)
×
736
    {
737
        *max = *comp;
×
738
        m_slider->setClickAndGoType((ClickAndGoWidget::ClickAndGo)type);
×
739
    }
740
}
×
741

742
void VCSliderProperties::storeLevelChannels()
×
743
{
744
    int red = 0, green = 0, blue = 0;
×
745
    int cyan = 0, magenta = 0, yellow = 0, amber = 0, white = 0, uv = 0, lime = 0, indigo = 0;
×
746
    int majorColor = 0;
×
747
    /* Clear all channels from the slider first */
748
    m_slider->clearLevelChannels();
×
749

750
    /* Go thru all fixtures and their channels, add checked channels */
751
    for (int i = 0; i < m_levelList->topLevelItemCount(); i++)
×
752
    {
753
        QTreeWidgetItem* fxi_item = m_levelList->topLevelItem(i);
×
754
        Q_ASSERT(fxi_item != NULL);
×
755

756
        quint32 fxi_id = fxi_item->text(KColumnID).toUInt();
×
757
        Fixture *fxi = m_doc->fixture(fxi_id);
×
758

759
        for (int j = 0; j < fxi_item->childCount(); j++)
×
760
        {
761
            QTreeWidgetItem* ch_item = fxi_item->child(j);
×
762
            Q_ASSERT(ch_item != NULL);
×
763

764
            if (ch_item->checkState(KColumnName) == Qt::Checked)
×
765
            {
766
                quint32 ch_num = ch_item->text(KColumnID).toUInt();
×
767
                if (fxi != NULL)
×
768
                {
769
                    const QLCChannel *ch = fxi->channel(ch_num);
×
770
                    if (ch->group() == QLCChannel::Intensity &&
×
771
                        m_cngColorCheck->isChecked())
×
772
                    {
773
                        if (ch->colour() == QLCChannel::Red)
×
774
                        {
775
                            red++;
×
776
                            checkMajorColor(&red, &majorColor, ClickAndGoWidget::Red);
×
777
                        }
778
                        else if (ch->colour() == QLCChannel::Green)
×
779
                        {
780
                            green++;
×
781
                            checkMajorColor(&green, &majorColor, ClickAndGoWidget::Green);
×
782
                        }
783
                        else if (ch->colour() == QLCChannel::Blue)
×
784
                        {
785
                            blue++;
×
786
                            checkMajorColor(&blue, &majorColor, ClickAndGoWidget::Blue);
×
787
                        }
788
                        else if (ch->colour() == QLCChannel::Cyan)
×
789
                        {
790
                            cyan++;
×
791
                            checkMajorColor(&cyan, &majorColor, ClickAndGoWidget::Cyan);
×
792
                        }
793
                        else if (ch->colour() == QLCChannel::Magenta)
×
794
                        {
795
                            magenta++;
×
796
                            checkMajorColor(&magenta, &majorColor, ClickAndGoWidget::Magenta);
×
797
                        }
798
                        else if (ch->colour() == QLCChannel::Yellow)
×
799
                        {
800
                            yellow++;
×
801
                            checkMajorColor(&yellow, &majorColor, ClickAndGoWidget::Yellow);
×
802
                        }
803
                        else if (ch->colour() == QLCChannel::Amber)
×
804
                        {
805
                            amber++;
×
806
                            checkMajorColor(&amber, &majorColor, ClickAndGoWidget::Amber);
×
807
                        }
808
                        else if (ch->colour() == QLCChannel::White)
×
809
                        {
810
                            white++;
×
811
                            checkMajorColor(&white, &majorColor, ClickAndGoWidget::White);
×
812
                        }
813
                        else if (ch->colour() == QLCChannel::UV)
×
814
                        {
815
                            uv++;
×
816
                            checkMajorColor(&uv, &majorColor, ClickAndGoWidget::UV);
×
817
                        }
818
                        else if (ch->colour() == QLCChannel::Lime)
×
819
                        {
820
                            lime++;
×
821
                            checkMajorColor(&lime, &majorColor, ClickAndGoWidget::Lime);
×
822
                        }
823
                        else if (ch->colour() == QLCChannel::Indigo)
×
824
                        {
825
                            indigo++;
×
826
                            checkMajorColor(&indigo, &majorColor, ClickAndGoWidget::Indigo);
×
827
                        }
828
                    }
829
                }
830
                m_slider->addLevelChannel(fxi_id, ch_num);
×
831
            }
832
        }
833
    }
834
}
×
835

836
void VCSliderProperties::accept()
×
837
{
838
    /* Widget appearance */
839
    if (m_widgetKnobRadio->isChecked())
×
840
        m_slider->setWidgetStyle(VCSlider::WKnob);
×
841
    else
842
        m_slider->setWidgetStyle(VCSlider::WSlider);
×
843

844
    /* Values catching */
845
    if (m_catchValueCheck->isChecked())
×
846
        m_slider->setCatchValues(true);
×
847
    else
848
        m_slider->setCatchValues(false);
×
849

850
    /* Level page */
851
    bool limitDiff =
852
        (m_slider->levelLowLimit() != m_levelLowLimitSpin->value()) ||
×
853
        (m_slider->levelHighLimit() != m_levelLowLimitSpin->value());
×
854
    m_slider->setLevelLowLimit(m_levelLowLimitSpin->value());
×
855
    m_slider->setLevelHighLimit(m_levelHighLimitSpin->value());
×
856
    storeLevelChannels();
×
857

858
    /* Click & Go group */
859
    /* Color doesn't have a case cause it is calculated
860
     * in storeLevelChannels */
861
    if (m_cngNoneCheck->isChecked())
×
862
        m_slider->setClickAndGoType(ClickAndGoWidget::None);
×
863
    else if (m_cngRGBCheck->isChecked())
×
864
        m_slider->setClickAndGoType(ClickAndGoWidget::RGB);
×
865
    else if (m_cngCMYCheck->isChecked())
×
866
        m_slider->setClickAndGoType(ClickAndGoWidget::CMY);
×
867
    else if (m_cngPresetCheck->isChecked())
×
868
        m_slider->setClickAndGoType(ClickAndGoWidget::Preset);
×
869

870
    /* Playback page */
871
    m_slider->setPlaybackFunction(m_playbackFunctionId);
×
872
    m_slider->setPlaybackFlashEnable(m_flashButtonCheck->isChecked());
×
873
    m_slider->setPlaybackFlashKeySequence(m_flashInputWidget->keySequence());
×
874
    m_slider->setInputSource(m_flashInputWidget->inputSource(), VCSlider::flashButtonInputSourceId);
×
875

876
    /* Slider mode */
877
    if (m_slider->sliderMode() != m_sliderMode)
×
878
    {
879
        m_slider->setSliderMode(VCSlider::SliderMode(m_sliderMode));
×
880
        if (m_slider->sliderMode() == VCSlider::Submaster)
×
881
        {
882
            m_slider->setLevelValue(UCHAR_MAX);
×
883
            m_slider->setSliderValue(UCHAR_MAX);
×
884
        }
885
    }
886
    else if (limitDiff && m_slider->sliderMode() == VCSlider::Level)
×
887
    {
888
        // Force the refresh of the slider range
889
        m_slider->setSliderMode(VCSlider::Level);
×
890
    }
891

892
    if (m_slider->sliderMode() == VCSlider::Level)
×
893
    {
894
        m_slider->setChannelsMonitorEnabled(m_monitorValuesCheck->isChecked());
×
895
        m_slider->setOverrideResetKeySequence(m_ovrResetSelWidget->keySequence());
×
896
        m_slider->setInputSource(m_ovrResetSelWidget->inputSource(), VCSlider::overrideResetInputSourceId);
×
897
    }
898

899
    m_slider->setCaption(m_nameEdit->text());
×
900

901
    /* Value style */
902
    if (m_valueExactRadio->isChecked() == true)
×
903
        m_slider->setValueDisplayStyle(VCSlider::ExactValue);
×
904
    else
905
        m_slider->setValueDisplayStyle(VCSlider::PercentageValue);
×
906

907
    /* Slider movement */
908
    if (m_sliderMovementNormalRadio->isChecked() == true)
×
909
        m_slider->setInvertedAppearance(false);
×
910
    else
911
        m_slider->setInvertedAppearance(true);
×
912

913
    /* External input */
914
    m_slider->setInputSource(m_inputSelWidget->inputSource(), VCSlider::sliderInputSourceId);
×
915

916
    /* Close dialog */
917
    QDialog::accept();
×
918
}
×
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