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

mcallegari / qlcplus / 20968955957

13 Jan 2026 07:00PM UTC coverage: 34.172% (-0.004%) from 34.176%
20968955957

push

github

mcallegari
vc/slider: toggle input auto-detection on tab change (fix #1791)

0 of 5 new or added lines in 1 file covered. (0.0%)

1 existing line in 1 file now uncovered.

17720 of 51855 relevant lines covered (34.17%)

19818.09 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(KColumnName, 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

NEW
288
void VCSliderProperties::slotTabChanged()
×
289
{
NEW
290
    m_inputSelWidget->stopAutoDetection();
×
NEW
291
    m_ovrResetSelWidget->stopAutoDetection();
×
NEW
292
    m_flashInputWidget->stopAutoDetection();
×
NEW
293
}
×
294

UNCOV
295
void VCSliderProperties::setLevelPageVisibility(bool visible)
×
296
{
297
    m_levelValueRangeGroup->setVisible(visible);
×
298
    m_levelList->setVisible(visible);
×
299
    m_levelAllButton->setVisible(visible);
×
300
    m_levelNoneButton->setVisible(visible);
×
301
    m_levelInvertButton->setVisible(visible);
×
302
    m_levelByGroupButton->setVisible(visible);
×
303
    m_clickngoGroup->setVisible(visible);
×
304
    m_monitorValuesCheck->setVisible(visible);
×
305
    if (m_monitorValuesCheck->isChecked() && m_ovrResetSelWidget != NULL)
×
306
        m_ovrResetSelWidget->setVisible(visible);
×
307

308
    if (visible == true)
×
309
    {
310
        m_switchToLevelModeButton->hide();
×
311
        //m_levelSpacer->changeSize(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding);
312
    }
313
    else
314
    {
315
        m_switchToLevelModeButton->show();
×
316
        //m_levelSpacer->changeSize(0, 0, QSizePolicy::Fixed, QSizePolicy::Fixed);
317
    }
318
}
×
319

320
void VCSliderProperties::setPlaybackPageVisibility(bool visible)
×
321
{
322
    m_playbackFunctionGroup->setVisible(visible);
×
323
    m_flashButtonCheck->setVisible(visible);
×
324
    m_flashInputWidget->setVisible(visible);
×
325

326
    if (visible == true)
×
327
    {
328
        m_switchToPlaybackModeButton->hide();
×
329
        m_playbackSpacer->changeSize(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding);
×
330
    }
331
    else
332
    {
333
        m_switchToPlaybackModeButton->show();
×
334
        m_playbackSpacer->changeSize(0, 0, QSizePolicy::Fixed, QSizePolicy::Fixed);
×
335
    }
336
}
×
337

338
void VCSliderProperties::setSubmasterPageVisibility(bool visible)
×
339
{
340
    m_submasterInfo->setVisible(visible);
×
341

342
    if (visible == true)
×
343
    {
344
        m_switchToSubmasterModeButton->hide();
×
345
        m_submasterSpacer->changeSize(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding);
×
346
    }
347
    else
348
    {
349
        m_switchToSubmasterModeButton->show();
×
350
        m_submasterSpacer->changeSize(0, 0, QSizePolicy::Fixed, QSizePolicy::Fixed);
×
351
    }
352
}
×
353

354
/*****************************************************************************
355
 * Level page
356
 *****************************************************************************/
357

358
void VCSliderProperties::levelUpdateFixtures()
×
359
{
360
    foreach (Fixture* fixture, m_doc->fixtures())
×
361
    {
362
        Q_ASSERT(fixture != NULL);
×
363
        levelUpdateFixtureNode(fixture->id());
×
364
    }
×
365
    m_levelList->header()->resizeSections(QHeaderView::ResizeToContents);
×
366
}
×
367

368
void VCSliderProperties::levelUpdateFixtureNode(quint32 id)
×
369
{
370
    QTreeWidgetItem* item;
371
    Fixture* fxi;
372
    QString str;
×
373

374
    fxi = m_doc->fixture(id);
×
375
    Q_ASSERT(fxi != NULL);
×
376

377
    item = levelFixtureNode(id);
×
378
    if (item == NULL)
×
379
    {
380
        item = new QTreeWidgetItem(m_levelList);
×
381
        item->setText(KColumnID, str.setNum(id));
×
382
        item->setFlags(item->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsAutoTristate);
×
383
    }
384

385
    item->setText(KColumnName, fxi->name());
×
386
    item->setIcon(KColumnName, fxi->getIconFromType());
×
387
    item->setText(KColumnType, fxi->typeString());
×
388

389
    levelUpdateChannels(item, fxi);
×
390

391
}
×
392

393
QTreeWidgetItem* VCSliderProperties::levelFixtureNode(quint32 id)
×
394
{
395
    for (int i = 0; i < m_levelList->topLevelItemCount(); i++)
×
396
    {
397
        QTreeWidgetItem *item = m_levelList->topLevelItem(i);
×
398
        if (item->text(KColumnID).toUInt() == id)
×
399
            return item;
×
400
    }
401

402
    return NULL;
×
403
}
404

405
void VCSliderProperties::levelUpdateChannels(QTreeWidgetItem* parent,
×
406
                                             Fixture* fxi)
407
{
408
    quint32 channels = 0;
×
409
    quint32 ch = 0;
×
410

411
    Q_ASSERT(parent != NULL);
×
412
    Q_ASSERT(fxi != NULL);
×
413

414
    channels = fxi->channels();
×
415
    for (ch = 0; ch < channels; ch++)
×
416
        levelUpdateChannelNode(parent, fxi, ch);
×
417
}
×
418

419
void VCSliderProperties::levelUpdateChannelNode(QTreeWidgetItem* parent,
×
420
                                                Fixture* fxi, quint32 ch)
421
{
422
    Q_ASSERT(parent != NULL);
×
423

424
    if (fxi == NULL)
×
425
        return;
×
426

427
    const QLCChannel* channel = fxi->channel(ch);
×
428
    if (channel == NULL)
×
429
        return;
×
430

431
    QTreeWidgetItem* item = levelChannelNode(parent, ch);
×
432
    if (item == NULL)
×
433
    {
434
        item = new QTreeWidgetItem(parent);
×
435
        item->setText(KColumnID, QString::number(ch));
×
436
        item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
×
437
        item->setCheckState(KColumnName, Qt::Unchecked);
×
438
    }
439

440
    item->setText(KColumnName, QString("%1:%2").arg(ch + 1, 3, 10, QChar('0'))
×
441
                  .arg(channel->name()));
×
442
    item->setIcon(KColumnName, channel->getIcon());
×
443
    if (channel->group() == QLCChannel::Intensity &&
×
444
        channel->colour() != QLCChannel::NoColour)
×
445
        item->setText(KColumnType, QLCChannel::colourToString(channel->colour()));
×
446
    else
447
        item->setText(KColumnType, QLCChannel::groupToString(channel->group()));
×
448

449

450
    levelUpdateCapabilities(item, channel);
×
451
}
452

453
QTreeWidgetItem* VCSliderProperties::levelChannelNode(QTreeWidgetItem* parent,
×
454
                                                      quint32 ch)
455
{
456
    Q_ASSERT(parent != NULL);
×
457

458
    for (int i = 0; i < parent->childCount(); i++)
×
459
    {
460
        QTreeWidgetItem* item = parent->child(i);
×
461
        if (item->text(KColumnID).toUInt() == ch)
×
462
            return item;
×
463
    }
464

465
    return NULL;
×
466
}
467

468
void VCSliderProperties::levelUpdateCapabilities(QTreeWidgetItem* parent,
×
469
                                                 const QLCChannel* channel)
470
{
471
    Q_ASSERT(parent != NULL);
×
472
    Q_ASSERT(channel != NULL);
×
473

474
    QListIterator <QLCCapability*> it(channel->capabilities());
×
475
    while (it.hasNext() == true)
×
476
        levelUpdateCapabilityNode(parent, it.next());
×
477
}
×
478

479
void VCSliderProperties::levelUpdateCapabilityNode(QTreeWidgetItem* parent,
×
480
        QLCCapability* cap)
481
{
482
    QTreeWidgetItem* item;
483
    QString str;
×
484

485
    Q_ASSERT(parent != NULL);
×
486
    Q_ASSERT(cap != NULL);
×
487

488
    item = new QTreeWidgetItem(parent);
×
489
    item->setText(KColumnName, cap->name());
×
490
    item->setText(KColumnRange, str.asprintf("%.3d - %.3d",
×
491
                                             cap->min(), cap->max()));
×
492
    item->setFlags(item->flags() & (~Qt::ItemIsUserCheckable));
×
493
}
×
494

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

506
        QTreeWidgetItem* fxiNode = levelFixtureNode(lch.fixture);
×
507
        if (fxiNode == NULL)
×
508
            continue;
×
509

510
        QTreeWidgetItem* chNode = levelChannelNode(fxiNode, lch.channel);
×
511
        if (chNode == NULL)
×
512
            continue;
×
513

514
        chNode->setCheckState(KColumnName, Qt::Checked);
×
515
    }
516
}
×
517

518
void VCSliderProperties::levelSelectChannelsByGroup(QString group)
×
519
{
520
    QTreeWidgetItem* fxi_item;
521
    QTreeWidgetItem* ch_item;
522
    int i;
523
    int j;
524

525
    /* Go thru only channel items. Fixture items get (partially) selected
526
       according to their children's state */
527
    for (i = 0; i < m_levelList->topLevelItemCount(); i++)
×
528
    {
529
        fxi_item = m_levelList->topLevelItem(i);
×
530
        Q_ASSERT(fxi_item != NULL);
×
531

532
        for (j = 0; j < fxi_item->childCount(); j++)
×
533
        {
534
            ch_item = fxi_item->child(j);
×
535
            Q_ASSERT(ch_item != NULL);
×
536

537
            if (ch_item->text(KColumnType) == group)
×
538
                ch_item->setCheckState(KColumnName, Qt::Checked);
×
539
        }
540
    }
541
}
×
542

543
void VCSliderProperties::slotLevelLowSpinChanged(int value)
×
544
{
545
    if (value >= m_levelHighLimitSpin->value())
×
546
        m_levelHighLimitSpin->setValue(value + 1);
×
547
}
×
548

549
void VCSliderProperties::slotLevelHighSpinChanged(int value)
×
550
{
551
    if (value <= m_levelLowLimitSpin->value())
×
552
        m_levelLowLimitSpin->setValue(value - 1);
×
553
}
×
554

555
void VCSliderProperties::slotLevelCapabilityClicked()
×
556
{
557
    QTreeWidgetItem* item;
558
    QStringList list;
×
559

560
    item = m_levelList->currentItem();
×
561
    if (item == NULL || item->parent() == NULL ||
×
562
            item->parent()->parent() == NULL)
×
563
        return;
×
564

565
    list = item->text(KColumnRange).split("-");
×
566
    Q_ASSERT(list.size() == 2);
×
567

568
    m_levelLowLimitSpin->setValue(list[0].toInt());
×
569
    m_levelHighLimitSpin->setValue(list[1].toInt());
×
570
}
×
571

572
void VCSliderProperties::slotLevelListClicked(QTreeWidgetItem* item)
×
573
{
574
    /* Enable the capability button if a capability has been selected */
575
    if (item != NULL && item->parent() != NULL &&
×
576
            item->parent()->parent() != NULL)
×
577
    {
578
        m_levelCapabilityButton->setEnabled(true);
×
579
    }
580
    else
581
    {
582
        m_levelCapabilityButton->setEnabled(false);
×
583
    }
584
}
×
585

586
void VCSliderProperties::slotLevelAllClicked()
×
587
{
588
    /* Set all fixture items selected, their children should get selected
589
       as well because the fixture items are Controller items. */
590
    for (int i = 0; i < m_levelList->topLevelItemCount(); i++)
×
591
    {
592
        QTreeWidgetItem *fxi_item = m_levelList->topLevelItem(i);
×
593
        Q_ASSERT(fxi_item != NULL);
×
594

595
        fxi_item->setCheckState(KColumnName, Qt::Checked);
×
596
    }
597
}
×
598

599
void VCSliderProperties::slotLevelNoneClicked()
×
600
{
601
    /* Set all fixture items unselected, their children should get unselected
602
       as well because the fixture items are Controller items. */
603
    for (int i = 0; i < m_levelList->topLevelItemCount(); i++)
×
604
    {
605
        QTreeWidgetItem *fxi_item = m_levelList->topLevelItem(i);
×
606
        Q_ASSERT(fxi_item != NULL);
×
607

608
        fxi_item->setCheckState(KColumnName, Qt::Unchecked);
×
609
    }
610
}
×
611

612
void VCSliderProperties::slotLevelInvertClicked()
×
613
{
614
    /* Go through only channel items. Fixture items get (partially) selected
615
       according to their children's state */
616
    for (int i = 0; i < m_levelList->topLevelItemCount(); i++)
×
617
    {
618
        QTreeWidgetItem *fxi_item = m_levelList->topLevelItem(i);
×
619
        Q_ASSERT(fxi_item != NULL);
×
620

621
        for (int j = 0; j < fxi_item->childCount(); j++)
×
622
        {
623
            QTreeWidgetItem *ch_item = fxi_item->child(j);
×
624
            Q_ASSERT(ch_item != NULL);
×
625

626
            if (ch_item->checkState(KColumnName) == Qt::Checked)
×
627
                ch_item->setCheckState(KColumnName,
×
628
                                       Qt::Unchecked);
629
            else
630
                ch_item->setCheckState(KColumnName,
×
631
                                       Qt::Checked);
632
        }
633
    }
634
}
×
635

636
void VCSliderProperties::slotLevelByGroupClicked()
×
637
{
638
    bool ok = false;
×
639
    QString group;
×
640
    QStringList groups;
×
641

642
    foreach (Fixture* fixture, m_doc->fixtures())
×
643
    {
644
        Q_ASSERT(fixture != NULL);
×
645

646
        for (quint32 i = 0; i < fixture->channels(); i++)
×
647
        {
648
            const QLCChannel *channel = fixture->channel(i);
×
649

650
            QString property = QLCChannel::groupToString(channel->group());
×
651

652
            if (channel->group() == QLCChannel::Intensity &&
×
653
                channel->colour() != QLCChannel::NoColour)
×
654
            {
655
                property = QLCChannel::colourToString(channel->colour());
×
656
            }
657

658
            if (groups.contains(property) == false)
×
659
                groups.append(property);
×
660
        }
×
661
    }
×
662

663
    group = QInputDialog::getItem(this,
×
664
                                  tr("Select channels by group"),
×
665
                                  tr("Select a channel group"),
×
666
                                  groups, 0,
667
                                  false, &ok);
×
668

669
    if (ok == true)
×
670
        levelSelectChannelsByGroup(group);
×
671
}
×
672

673
void VCSliderProperties::slotItemExpanded()
×
674
{
675
    m_levelList->header()->resizeSections(QHeaderView::ResizeToContents);
×
676
}
×
677

678
void VCSliderProperties::slotMonitorCheckClicked(bool checked)
×
679
{
680
    if (checked == true)
×
681
        m_ovrResetSelWidget->show();
×
682
    else
683
        m_ovrResetSelWidget->hide();
×
684
}
×
685

686
/*****************************************************************************
687
 * Playback page
688
 *****************************************************************************/
689

690
void VCSliderProperties::slotAttachPlaybackFunctionClicked()
×
691
{
692
    FunctionSelection fs(this, m_doc);
×
693
    fs.setMultiSelection(false);
×
694
    fs.setFilter(Function::SceneType | Function::ChaserType | Function::SequenceType |
×
695
                 Function::EFXType | Function::AudioType | Function::RGBMatrixType |
696
                 Function::CollectionType | Function::VideoType, false);
697
    fs.disableFilters(Function::ScriptType | Function::ShowType);
×
698

699
    if (fs.exec() != QDialog::Accepted)
×
700
        return;
×
701

702
    if (fs.selection().size() == 0)
×
703
        return;
×
704

705
    m_playbackFunctionId = fs.selection().first();
×
706
    updatePlaybackFunctionName();
×
707
}
×
708

709
void VCSliderProperties::slotDetachPlaybackFunctionClicked()
×
710
{
711
    m_playbackFunctionId = Function::invalidId();
×
712
    updatePlaybackFunctionName();
×
713
}
×
714

715
void VCSliderProperties::slotFlashCheckClicked(bool checked)
×
716
{
717
    m_flashInputWidget->setEnabled(checked);
×
718
}
×
719

720
void VCSliderProperties::updatePlaybackFunctionName()
×
721
{
722
    Function* function = m_doc->function(m_playbackFunctionId);
×
723
    if (function != NULL)
×
724
    {
725
        m_playbackFunctionEdit->setText(function->name());
×
726
        if (m_nameEdit->text().simplified().isEmpty() == true)
×
727
            m_nameEdit->setText(function->name());
×
728
    }
729
    else
730
    {
731
        m_playbackFunctionId = Function::invalidId(); // Ensure
×
732
        m_playbackFunctionEdit->setText(tr("No function"));
×
733
    }
734
}
×
735

736
/*****************************************************************************
737
 * OK & Cancel
738
 *****************************************************************************/
739

740
void VCSliderProperties::checkMajorColor(int *comp, int *max, int type)
×
741
{
742
    if (*comp > *max)
×
743
    {
744
        *max = *comp;
×
745
        m_slider->setClickAndGoType((ClickAndGoWidget::ClickAndGo)type);
×
746
    }
747
}
×
748

749
void VCSliderProperties::storeLevelChannels()
×
750
{
751
    int red = 0, green = 0, blue = 0;
×
752
    int cyan = 0, magenta = 0, yellow = 0, amber = 0, white = 0, uv = 0, lime = 0, indigo = 0;
×
753
    int majorColor = 0;
×
754
    /* Clear all channels from the slider first */
755
    m_slider->clearLevelChannels();
×
756

757
    /* Go thru all fixtures and their channels, add checked channels */
758
    for (int i = 0; i < m_levelList->topLevelItemCount(); i++)
×
759
    {
760
        QTreeWidgetItem* fxi_item = m_levelList->topLevelItem(i);
×
761
        Q_ASSERT(fxi_item != NULL);
×
762

763
        quint32 fxi_id = fxi_item->text(KColumnID).toUInt();
×
764
        Fixture *fxi = m_doc->fixture(fxi_id);
×
765

766
        for (int j = 0; j < fxi_item->childCount(); j++)
×
767
        {
768
            QTreeWidgetItem* ch_item = fxi_item->child(j);
×
769
            Q_ASSERT(ch_item != NULL);
×
770

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

843
void VCSliderProperties::accept()
×
844
{
845
    /* Widget appearance */
846
    if (m_widgetKnobRadio->isChecked())
×
847
        m_slider->setWidgetStyle(VCSlider::WKnob);
×
848
    else
849
        m_slider->setWidgetStyle(VCSlider::WSlider);
×
850

851
    /* Values catching */
852
    if (m_catchValueCheck->isChecked())
×
853
        m_slider->setCatchValues(true);
×
854
    else
855
        m_slider->setCatchValues(false);
×
856

857
    /* Level page */
858
    bool limitDiff =
859
        (m_slider->levelLowLimit() != m_levelLowLimitSpin->value()) ||
×
860
        (m_slider->levelHighLimit() != m_levelLowLimitSpin->value());
×
861
    m_slider->setLevelLowLimit(m_levelLowLimitSpin->value());
×
862
    m_slider->setLevelHighLimit(m_levelHighLimitSpin->value());
×
863
    storeLevelChannels();
×
864

865
    /* Click & Go group */
866
    /* Color doesn't have a case cause it is calculated
867
     * in storeLevelChannels */
868
    if (m_cngNoneCheck->isChecked())
×
869
        m_slider->setClickAndGoType(ClickAndGoWidget::None);
×
870
    else if (m_cngRGBCheck->isChecked())
×
871
        m_slider->setClickAndGoType(ClickAndGoWidget::RGB);
×
872
    else if (m_cngCMYCheck->isChecked())
×
873
        m_slider->setClickAndGoType(ClickAndGoWidget::CMY);
×
874
    else if (m_cngPresetCheck->isChecked())
×
875
        m_slider->setClickAndGoType(ClickAndGoWidget::Preset);
×
876

877
    /* Playback page */
878
    m_slider->setPlaybackFunction(m_playbackFunctionId);
×
879
    m_slider->setPlaybackFlashEnable(m_flashButtonCheck->isChecked());
×
880
    m_slider->setPlaybackFlashKeySequence(m_flashInputWidget->keySequence());
×
881
    m_slider->setInputSource(m_flashInputWidget->inputSource(), VCSlider::flashButtonInputSourceId);
×
882

883
    /* Slider mode */
884
    if (m_slider->sliderMode() != m_sliderMode)
×
885
    {
886
        m_slider->setSliderMode(VCSlider::SliderMode(m_sliderMode));
×
887
        if (m_slider->sliderMode() == VCSlider::Submaster)
×
888
        {
889
            m_slider->setLevelValue(UCHAR_MAX);
×
890
            m_slider->setSliderValue(UCHAR_MAX);
×
891
        }
892
    }
893
    else if (limitDiff && m_slider->sliderMode() == VCSlider::Level)
×
894
    {
895
        // Force the refresh of the slider range
896
        m_slider->setSliderMode(VCSlider::Level);
×
897
    }
898

899
    if (m_slider->sliderMode() == VCSlider::Level)
×
900
    {
901
        m_slider->setChannelsMonitorEnabled(m_monitorValuesCheck->isChecked());
×
902
        m_slider->setOverrideResetKeySequence(m_ovrResetSelWidget->keySequence());
×
903
        m_slider->setInputSource(m_ovrResetSelWidget->inputSource(), VCSlider::overrideResetInputSourceId);
×
904
    }
905

906
    m_slider->setCaption(m_nameEdit->text());
×
907

908
    /* Value style */
909
    if (m_valueExactRadio->isChecked() == true)
×
910
        m_slider->setValueDisplayStyle(VCSlider::ExactValue);
×
911
    else
912
        m_slider->setValueDisplayStyle(VCSlider::PercentageValue);
×
913

914
    /* Slider movement */
915
    if (m_sliderMovementNormalRadio->isChecked() == true)
×
916
        m_slider->setInvertedAppearance(false);
×
917
    else
918
        m_slider->setInvertedAppearance(true);
×
919

920
    /* External input */
921
    m_slider->setInputSource(m_inputSelWidget->inputSource(), VCSlider::sliderInputSourceId);
×
922

923
    /* Close dialog */
924
    QDialog::accept();
×
925
}
×
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