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

mcallegari / qlcplus / 13633248611

03 Mar 2025 02:31PM UTC coverage: 31.871% (+0.4%) from 31.5%
13633248611

push

github

web-flow
actions: add chrpath to profile

14689 of 46089 relevant lines covered (31.87%)

26426.11 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

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

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

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

134
    /********************************************************************
135
     * External input
136
     ********************************************************************/
137

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

145
    /*********************************************************************
146
     * Level page
147
     *********************************************************************/
148

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

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

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

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

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

178
    /*********************************************************************
179
     * Playback page
180
     *********************************************************************/
181

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

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

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

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

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

220
/*****************************************************************************
221
 * General page
222
 *****************************************************************************/
223

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

228
    m_nameEdit->setEnabled(true);
×
229

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

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

264
    }
265
}
×
266

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

271
    m_nameEdit->setEnabled(true);
×
272

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

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

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

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

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

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

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

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

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

346
/*****************************************************************************
347
 * Level page
348
 *****************************************************************************/
349

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

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

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

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

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

381
    levelUpdateChannels(item, fxi);
×
382

383
}
×
384

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

394
    return NULL;
395
}
396

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

403
    Q_ASSERT(parent != NULL);
404
    Q_ASSERT(fxi != NULL);
405

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

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

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

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

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

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

441

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

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

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

457
    return NULL;
458
}
459

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

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

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

477
    Q_ASSERT(parent != NULL);
478
    Q_ASSERT(cap != NULL);
479

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

678
/*****************************************************************************
679
 * Playback page
680
 *****************************************************************************/
681

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

915
    /* Close dialog */
916
    QDialog::accept();
×
917
}
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc