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

mcallegari / qlcplus / 15620016630

12 Jun 2025 08:19PM UTC coverage: 31.812% (-0.06%) from 31.872%
15620016630

Pull #1649

github

web-flow
Merge 22b91406d into 7fd06c76d
Pull Request #1649: Function Wizard: create Effects

11 of 135 new or added lines in 2 files covered. (8.15%)

2 existing lines in 1 file now uncovered.

16446 of 51698 relevant lines covered (31.81%)

19075.62 hits per line

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

0.0
/ui/src/functionwizard.cpp
1
/*
2
  Q Light Controller
3
  functionwizard.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 <QMessageBox>
21
#include <QString>
22
#include <QDebug>
23
#include <QHash>
24
#include <QAction>
25
#include <QSettings>
26

27
#include "palettegenerator.h"
28
#include "fixtureselection.h"
29
#include "functionwizard.h"
30
#include "virtualconsole.h"
31
#include "vcsoloframe.h"
32
#include "vccuelist.h"
33
#include "rgbmatrix.h"
34
#include "efx.h"
35
#include "vcwidget.h"
36
#include "vcbutton.h"
37
#include "vcslider.h"
38
#include "vcxypad.h"
39
#include "vcframe.h"
40
#include "fixture.h"
41
#include "chaser.h"
42
#include "scene.h"
43
#include "doc.h"
44

45
#include "qlcfixturedef.h"
46
#include "qlcfixturehead.h"
47
#include "qlccapability.h"
48
#include "qlcchannel.h"
49
#include "vcframepageshortcut.h"
50

51
#define KFixtureColumnName          0
52
#define KFixtureColumnCaps          1
53
#define KFixtureColumnManufacturer  2
54
#define KFixtureColumnModel         3
55

56
#define KFunctionName               0
57
#define KFunctionOddEven            1
58
#define KFunctionParallel           2
59
#define KFunctionSerial             3
60
#define KFunctionAsymetric          4
61

62
#define KWidgetName                 0
63

64
#define SETTINGS_GEOMETRY "functionwizard/geometry"
65

66
FunctionWizard::FunctionWizard(QWidget* parent, Doc* doc)
×
67
    : QDialog(parent)
68
    , m_doc(doc)
×
69
{
70
    Q_ASSERT(doc != NULL);
×
71
    setupUi(this);
×
72

73
    QString trbgSS = "background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(0, 0, 0, 0), stop:1 rgba(255, 255, 255, 0));";
×
74
    m_wizardLogo->setStyleSheet(trbgSS);
×
75
    m_introText->setStyleSheet(trbgSS);
×
76

77
    QAction* action = new QAction(this);
×
78
    action->setShortcut(QKeySequence(QKeySequence::Close));
×
79
    connect(action, SIGNAL(triggered(bool)), this, SLOT(reject()));
×
80
    addAction(action);
×
81

82
    m_fixtureTree->sortItems(KFixtureColumnName, Qt::AscendingOrder);
×
83

84
    QSettings settings;
×
85
    QVariant geometrySettings = settings.value(SETTINGS_GEOMETRY);
×
86
    if (geometrySettings.isValid() == true)
×
87
        restoreGeometry(geometrySettings.toByteArray());
×
88

89
    connect(m_nextButton, SIGNAL(clicked()),
×
90
            this, SLOT(slotNextPageClicked()));
91

92
    connect(m_tabWidget, SIGNAL(currentChanged(int)),
×
93
            this, SLOT(slotTabClicked()));
94

95
    connect(m_checkBoxAll, SIGNAL(clicked()),
×
96
            this, SLOT(slotPageCheckboxChanged()));
97

98
    connect(m_checkBoxHeads, SIGNAL(clicked()),
×
99
            this, SLOT(slotPageCheckboxChanged()));
100

101
    connect(m_checkBoxFixtures, SIGNAL(clicked()),
×
102
            this, SLOT(slotPageCheckboxChanged()));
103

104
    checkTabsAndButtons();
×
105
}
×
106

107
FunctionWizard::~FunctionWizard()
×
108
{
109
    QSettings settings;
×
110
    settings.setValue(SETTINGS_GEOMETRY, saveGeometry());
×
111

112
    m_paletteList.clear();
×
113
}
×
114

115
void FunctionWizard::slotNextPageClicked()
×
116
{
117
    int newIdx = m_tabWidget->currentIndex() + 1;
×
118
    if (newIdx == 4)
×
119
        return;
×
120

121
    m_tabWidget->setCurrentIndex(newIdx);
×
122
    checkTabsAndButtons();
×
123
}
124

125
void FunctionWizard::slotTabClicked()
×
126
{
127
    checkTabsAndButtons();
×
128
}
×
129

130
void FunctionWizard::accept()
×
131
{
132

133
    foreach (PaletteGenerator *palette, m_paletteList)
×
134
        palette->addToDoc();
×
135

136
    addWidgetsToVirtualConsole();
×
137

138
    m_doc->setModified();
×
139

140
    QDialog::accept();
×
141
}
×
142

143
void FunctionWizard::checkTabsAndButtons()
×
144
{
145
    switch(m_tabWidget->currentIndex())
×
146
    {
147
        case 0:
×
148
        {
149
            m_nextButton->setEnabled(true);
×
150
            m_tabWidget->setTabEnabled(2, false);
×
151
            m_tabWidget->setTabEnabled(3, false);
×
152
        }
153
        break;
×
154
        case 1:
×
155
        {
156
            if (m_allFuncsTree->topLevelItemCount() == 0)
×
157
            {
158
                m_nextButton->setEnabled(false);
×
159
                m_tabWidget->setTabEnabled(2, false);
×
160
            }
161
            else
162
            {
163
                m_nextButton->setEnabled(true);
×
164
                m_tabWidget->setTabEnabled(2, true);
×
165
            }
166
        }
167
        break;
×
168
        case 2:
×
169
        {
170
            m_nextButton->setEnabled(m_widgetsTree->topLevelItemCount() > 0);            
×
171
        }
172
        break;
×
173
        case 3:
×
174
            m_nextButton->setEnabled(false);
×
175
        break;
×
176
    }
177

178
    // enable VC Widget Page if tree not empty
179
    m_tabWidget->setTabEnabled(3, m_widgetsTree->topLevelItemCount() > 0);
×
180
}
×
181

182
/****************************************************************************
183
 * Fixtures
184
 ****************************************************************************/
185

186
QTreeWidgetItem *FunctionWizard::getFixtureGroupItem(QString manufacturer, QString model)
×
187
{
188
    for (int i = 0; i < m_fixtureTree->topLevelItemCount(); i++)
×
189
    {
190
        QTreeWidgetItem *item = m_fixtureTree->topLevelItem(i);
×
191
        if (item->text(KFixtureColumnManufacturer) == manufacturer &&
×
192
            item->text(KFixtureColumnModel) == model)
×
193
                return item;
×
194
    }
195
    // if we're here then the group doesn't exist. Create it
196
    QTreeWidgetItem* newGrp = new QTreeWidgetItem(m_fixtureTree);
×
197
    newGrp->setText(KFixtureColumnName, tr("%1 group").arg(model));
×
198
    newGrp->setIcon(KFixtureColumnName, QIcon(":/group.png"));
×
199
    newGrp->setText(KFixtureColumnManufacturer, manufacturer);
×
200
    newGrp->setText(KFixtureColumnModel, model);
×
201
    newGrp->setExpanded(true);
×
202
    return newGrp;
×
203
}
204

205
void FunctionWizard::addFixture(quint32 fxi_id)
×
206
{
207
    Fixture* fxi = m_doc->fixture(fxi_id);
×
208
    Q_ASSERT(fxi != NULL);
×
209

210
    QStringList caps = PaletteGenerator::getCapabilities(fxi);
×
211

212
    if (caps.join(", ").isEmpty())
×
213
    {
214
        QMessageBox::warning(this, tr("Error"), tr("%1 has no capability supported by this wizard.").arg(fxi->name()));
×
215
        return;
×
216
    }
217
    else
218
    {
219
        QTreeWidgetItem *groupItem = getFixtureGroupItem(fxi->fixtureDef()->manufacturer(), fxi->fixtureDef()->model());
×
220
        Q_ASSERT(groupItem != NULL);
×
221

222
        QTreeWidgetItem* item = new QTreeWidgetItem(groupItem);
×
223
        item->setText(KFixtureColumnName, fxi->name());
×
224
        item->setIcon(KFixtureColumnName, fxi->getIconFromType());
×
225
        item->setData(KFixtureColumnName, Qt::UserRole, fxi_id);
×
226
        item->setText(KFixtureColumnCaps, caps.join(", "));
×
227
    }
228
    m_fixtureTree->resizeColumnToContents(KFixtureColumnName);
×
229
}
×
230

231
void FunctionWizard::slotAddClicked()
×
232
{
233
    FixtureSelection fs(this, m_doc);
×
234
    fs.setMultiSelection(true);
×
235
    fs.setDisabledFixtures(fixtureIds());
×
236
    if (fs.exec() == QDialog::Accepted)
×
237
    {
238
        QListIterator <quint32> it(fs.selection());
×
239
        while (it.hasNext() == true)
×
240
            addFixture(it.next());
×
241

242
        if (m_fixtureTree->topLevelItemCount() > 0)
×
243
        {
244
            updateAvailableFunctionsTree();
×
245
            updateWidgetsTree();
×
246
        }
247
    }
×
248
    checkTabsAndButtons();
×
249
}
×
250

251
void FunctionWizard::slotRemoveClicked()
×
252
{
253
    QListIterator <QTreeWidgetItem*> it(m_fixtureTree->selectedItems());
×
254
    while (it.hasNext() == true)
×
255
        delete it.next();
×
256
    
257
    updateWidgetsTree();
×
258
    checkTabsAndButtons();
×
259
}
×
260

261
void FunctionWizard::slotPageCheckboxChanged()
×
262
{
263
    updateWidgetsTree();
×
264
}
×
265

266
QList <quint32> FunctionWizard::fixtureIds() const
×
267
{
268
    QList <quint32> list;
×
269
    for (int i = 0; i < m_fixtureTree->topLevelItemCount(); i++)
×
270
    {
271
        QTreeWidgetItem* item(m_fixtureTree->topLevelItem(i));
×
272
        Q_ASSERT(item != NULL);
×
273

274
        for (int j = 0; j < item->childCount(); j++)
×
275
        {
276
            QTreeWidgetItem *child = item->child(j);
×
277
            Q_ASSERT(child != NULL);
×
278

279
            list << child->data(KFixtureColumnName, Qt::UserRole).toInt();
×
280
        }
281
    }
282

283
    return list;
×
284
}
×
285

286
/********************************************************************
287
 * Functions
288
 ********************************************************************/
289

290
QTreeWidgetItem *efxItem = NULL;
291

UNCOV
292
void FunctionWizard::addFunctionsGroup(QTreeWidgetItem *fxGrpItem, QTreeWidgetItem *grpItem,
×
293
                                       QString name, PaletteGenerator::PaletteType type)
294
{
295
    if (grpItem == NULL)
×
296
        return;
×
297

NEW
298
    if ((type == PaletteGenerator::EfxDimmer ||
×
NEW
299
        type == PaletteGenerator::EfxRGB ||
×
300
        type == PaletteGenerator::EfxPosition))
301
    {
NEW
302
        if (efxItem == NULL)
×
303
        {
NEW
304
            QTreeWidgetItem *item = new QTreeWidgetItem(grpItem);
×
NEW
305
            item->setText(KFunctionName, "EFXs");
×
NEW
306
            item->setCheckState(KFunctionName, Qt::Unchecked);
×
NEW
307
            item->setFlags(item->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsAutoTristate);
×
NEW
308
            item->setExpanded(true);
×
NEW
309
            efxItem = item;
×
310
        }
NEW
311
        grpItem = efxItem;
×
312
    }
313

314
    QTreeWidgetItem *item = new QTreeWidgetItem(grpItem);
×
315
    item->setText(KFunctionName, name);
×
316
    item->setCheckState(KFunctionName, Qt::Unchecked);
×
317
    item->setData(KFunctionName, Qt::UserRole, type);
×
318

319
    if (fxGrpItem != NULL && fxGrpItem->childCount() > 1)
×
320
    {
321
        item->setCheckState(KFunctionOddEven, Qt::Unchecked);
×
322

NEW
323
        if ((type == PaletteGenerator::EfxDimmer ||
×
NEW
324
            type == PaletteGenerator::EfxRGB ||
×
325
            type == PaletteGenerator::EfxPosition))
326
        {
NEW
327
            item->setFlags(item->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsAutoTristate);
×
NEW
328
            item->setCheckState(KFunctionParallel, Qt::Checked);
×
NEW
329
            item->setCheckState(KFunctionSerial, Qt::Unchecked);
×
NEW
330
            item->setCheckState(KFunctionAsymetric, Qt::Unchecked);
×
331

332
            // add Algorythm sub items
NEW
333
            for (auto &&algo : EFX::algorithmList())
×
334
            {
NEW
335
                QTreeWidgetItem *algoItem = new QTreeWidgetItem(item);
×
NEW
336
                algoItem->setText(KFunctionName, algo);
×
NEW
337
                algoItem->setCheckState(KFunctionName, Qt::Unchecked);
×
NEW
338
                algoItem->setData(KFunctionName, Qt::UserRole, type);
×
NEW
339
                algoItem->setData(KFunctionName, Qt::UserRole + 1, algo);
×
340

NEW
341
                algoItem->setCheckState(KFunctionParallel, Qt::Checked);
×
NEW
342
                algoItem->setCheckState(KFunctionSerial, Qt::Unchecked);
×
NEW
343
                algoItem->setCheckState(KFunctionAsymetric, Qt::Unchecked);
×
NEW
344
            }
×
345
        }
346
    }
347
}
348

349
void FunctionWizard::updateAvailableFunctionsTree()
×
350
{
351
    disconnect(m_allFuncsTree, SIGNAL(itemChanged(QTreeWidgetItem*, int)),
×
352
            this, SLOT(slotFunctionItemChanged(QTreeWidgetItem*,int)));
353

354
    m_allFuncsTree->clear();
×
355
    m_resFuncsTree->clear();
×
356

357
    for (int i = 0; i < m_fixtureTree->topLevelItemCount(); i++)
×
358
    {
359
        QTreeWidgetItem *fxGrpItem = m_fixtureTree->topLevelItem(i);
×
360
        Q_ASSERT(fxGrpItem != NULL);
×
361

362
        if (fxGrpItem->childCount() == 0)
×
363
            continue;
×
364

365
        QTreeWidgetItem *grpItem = new QTreeWidgetItem(m_allFuncsTree);
×
366
        grpItem->setText(KFunctionName, fxGrpItem->text(KFixtureColumnName));
×
367
        grpItem->setIcon(KFunctionName, fxGrpItem->icon(KFixtureColumnName));
×
368
        grpItem->setExpanded(true);
×
369

370
        // since groups contain fixture of the same type, get the first
371
        // child and create categories on its capabilities
372
        QTreeWidgetItem *fxItem = fxGrpItem->child(0);
×
373
        quint32 fxID = fxItem->data(KFixtureColumnName, Qt::UserRole).toUInt();
×
374
        Fixture* fxi = m_doc->fixture(fxID);
×
375
        Q_ASSERT(fxi != NULL);
×
376

377
        QStringList caps = PaletteGenerator::getCapabilities(fxi);
×
378

379
        foreach (QString cap, caps)
×
380
        {
381
            if (cap == KQLCChannelRGB || cap == KQLCChannelCMY)
×
382
            {
383
                addFunctionsGroup(fxGrpItem, grpItem,
×
384
                                  PaletteGenerator::typetoString(PaletteGenerator::PrimaryColors),
×
385
                                  PaletteGenerator::PrimaryColors);
386
                addFunctionsGroup(fxGrpItem, grpItem,
×
387
                                  PaletteGenerator::typetoString(PaletteGenerator::SixteenColors),
×
388
                                  PaletteGenerator::SixteenColors);
389
                addFunctionsGroup(fxGrpItem, grpItem,
×
390
                                  PaletteGenerator::typetoString(PaletteGenerator::Animation),
×
391
                                  PaletteGenerator::Animation);
NEW
392
                addFunctionsGroup(fxGrpItem, grpItem,
×
NEW
393
                                  PaletteGenerator::typetoString(PaletteGenerator::EfxRGB),
×
394
                                  PaletteGenerator::EfxRGB);
395
            }
396
            else if (cap == QLCChannel::groupToString(QLCChannel::Gobo))
×
397
                addFunctionsGroup(fxGrpItem, grpItem,
×
398
                                  PaletteGenerator::typetoString(PaletteGenerator::Gobos),
×
399
                                  PaletteGenerator::Gobos);
400
            else if (cap == QLCChannel::groupToString(QLCChannel::Shutter))
×
401
                addFunctionsGroup(fxGrpItem, grpItem,
×
402
                                  PaletteGenerator::typetoString(PaletteGenerator::Shutter),
×
403
                                  PaletteGenerator::Shutter);
404
            else if (cap == QLCChannel::groupToString(QLCChannel::Colour))
×
405
                addFunctionsGroup(fxGrpItem, grpItem,
×
406
                                  PaletteGenerator::typetoString(PaletteGenerator::ColourMacro),
×
407
                                  PaletteGenerator::ColourMacro);
NEW
408
            else if (cap == KQLCChannelDimmer)
×
NEW
409
                addFunctionsGroup(fxGrpItem, grpItem,
×
NEW
410
                                  PaletteGenerator::typetoString(PaletteGenerator::EfxDimmer),
×
411
                                  PaletteGenerator::EfxDimmer);
NEW
412
            else if (cap == KQLCChannelMovement)
×
NEW
413
                addFunctionsGroup(fxGrpItem, grpItem,
×
NEW
414
                                  PaletteGenerator::typetoString(PaletteGenerator::EfxPosition),
×
415
                                  PaletteGenerator::EfxPosition);
416
        }
×
NEW
417
        efxItem = NULL;
×
UNCOV
418
    }
×
419

420
    m_allFuncsTree->resizeColumnToContents(KFunctionName);
×
421

422
    connect(m_allFuncsTree, SIGNAL(itemChanged(QTreeWidgetItem*, int)),
×
423
            this, SLOT(slotFunctionItemChanged(QTreeWidgetItem*,int)));
424
}
×
425

426
QTreeWidgetItem *FunctionWizard::getFunctionGroupItem(const Function *func)
×
427
{
428
    for (int i = 0; i < m_resFuncsTree->topLevelItemCount(); i++)
×
429
    {
430
        QTreeWidgetItem *item = m_resFuncsTree->topLevelItem(i);
×
431
        int grpType = item->data(KFunctionName, Qt::UserRole).toInt();
×
432
        if (grpType == func->type())
×
433
            return item;
×
434
    }
435
    // if we're here then the group doesn't exist. Create it
436
    QTreeWidgetItem* newGrp = new QTreeWidgetItem(m_resFuncsTree);
×
437
    newGrp->setText(KFixtureColumnName, Function::typeToString(func->type()));
×
438
    newGrp->setIcon(KFixtureColumnName, func->getIcon());
×
439
    newGrp->setData(KFunctionName, Qt::UserRole, func->type());
×
440
    newGrp->setExpanded(true);
×
441
    return newGrp;
×
442
}
443

444
void FunctionWizard::updateResultFunctionsTree()
×
445
{
446
    m_resFuncsTree->clear();
×
447
    m_paletteList.clear();
×
448

449
    for (int i = 0; i < m_allFuncsTree->topLevelItemCount(); i++)
×
450
    {
451
        QTreeWidgetItem *funcGrpItem = m_allFuncsTree->topLevelItem(i);
×
452
        Q_ASSERT(funcGrpItem != NULL);
×
453

454
        if (funcGrpItem->childCount() == 0)
×
455
            continue;
×
456

457
        // retrieve the list of fixtures involved in this group
458
        QList <Fixture *> fxList;
×
459
        QTreeWidgetItem *fxiGrpItem = m_fixtureTree->topLevelItem(i);
×
460

461
        for (int f = 0; f < fxiGrpItem->childCount(); f++)
×
462
        {
463
            QTreeWidgetItem *fItem = fxiGrpItem->child(f);
×
464
            quint32 fxID = fItem->data(KFixtureColumnName, Qt::UserRole).toUInt();
×
465
            Fixture *fixture = m_doc->fixture(fxID);
×
466
            if (fixture != NULL)
×
467
                fxList.append(fixture);
×
468
        }
469

470
        // iterate through the function group children to see which are checked
471
        for (int c = 0; c < funcGrpItem->childCount(); c++)
×
472
        {
473
            QTreeWidgetItem *funcItem = funcGrpItem->child(c);
×
NEW
474
            if (funcItem->checkState(KFunctionName) == Qt::Checked && funcItem->childCount() == 0)
×
475
            {
476
                int type = funcItem->data(KFunctionName, Qt::UserRole).toInt();
×
477
                int subType = PaletteGenerator::All;
×
478
                if (funcItem->checkState(KFunctionOddEven) == Qt::Checked)
×
479
                    subType = PaletteGenerator::OddEven;
×
480
                PaletteGenerator *palette = new PaletteGenerator(m_doc, fxList,
481
                                                                 (PaletteGenerator::PaletteType)type,
482
                                                                 (PaletteGenerator::PaletteSubType)subType);
×
483
                m_paletteList.append(palette);
×
484

485
                foreach (Scene *scene, palette->scenes())
×
486
                {
487
                    QTreeWidgetItem *item = new QTreeWidgetItem(getFunctionGroupItem(scene));
×
488
                    item->setText(KFunctionName, scene->name());
×
489
                    item->setIcon(KFunctionName, scene->getIcon());
×
490
                }
×
491
                foreach (Chaser *chaser, palette->chasers())
×
492
                {
493
                    QTreeWidgetItem *item = new QTreeWidgetItem(getFunctionGroupItem(chaser));
×
494
                    item->setText(KFunctionName, chaser->name());
×
495
                    item->setIcon(KFunctionName, chaser->getIcon());
×
496
                }
×
497
                foreach (RGBMatrix *matrix, palette->matrices())
×
498
                {
499
                    QTreeWidgetItem *item = new QTreeWidgetItem(getFunctionGroupItem(matrix));
×
500
                    item->setText(KFunctionName, matrix->name());
×
501
                    item->setIcon(KFunctionName, matrix->getIcon());
×
502
                }
×
503
            }
504

505
            //child items of EFXs
NEW
506
            for (int c = 0; c < funcItem->childCount(); c++)
×
507
            {
NEW
508
                for (int ca = 0; ca < funcItem->child(c)->childCount(); ca++)
×
509
                {
NEW
510
                    QTreeWidgetItem *subFuncItem = funcItem->child(c)->child(ca);
×
NEW
511
                    if (subFuncItem->checkState(KFunctionName) != Qt::Checked)
×
NEW
512
                        continue;
×
513

NEW
514
                    int type = subFuncItem->data(KFunctionName, Qt::UserRole).toInt();
×
NEW
515
                    EFX::Algorithm algo = EFX::stringToAlgorithm(
×
NEW
516
                        subFuncItem->data(KFunctionName, Qt::UserRole + 1).toString());
×
517

NEW
518
                    int subType = PaletteGenerator::All;
×
NEW
519
                    if (subFuncItem->checkState(KFunctionOddEven) == Qt::Checked)
×
NEW
520
                        subType += PaletteGenerator::OddEven;
×
521

NEW
522
                    if (subFuncItem->checkState(KFunctionParallel) == Qt::Checked)
×
NEW
523
                        subType += PaletteGenerator::Parallel;
×
NEW
524
                    if (subFuncItem->checkState(KFunctionSerial) == Qt::Checked)
×
NEW
525
                        subType += PaletteGenerator::Serial;
×
NEW
526
                    if (subFuncItem->checkState(KFunctionAsymetric) == Qt::Checked)
×
NEW
527
                        subType += PaletteGenerator::Asymetric;
×
528

529
                    PaletteGenerator *palette =
530
                        new PaletteGenerator(m_doc, fxList, (PaletteGenerator::PaletteType)type,
NEW
531
                                             (PaletteGenerator::PaletteSubType)subType, algo);
×
NEW
532
                    m_paletteList.append(palette);
×
533

NEW
534
                    foreach (EFX *efx, palette->efxs())
×
535
                    {
NEW
536
                        QTreeWidgetItem *item = new QTreeWidgetItem(getFunctionGroupItem(efx));
×
NEW
537
                        item->setText(KFunctionName, efx->name());
×
NEW
538
                        item->setIcon(KFunctionName, efx->getIcon());
×
NEW
539
                    }
×
540
                }
541
            }
542
        }
543
    }
×
544
}
×
545

546
void FunctionWizard::slotFunctionItemChanged(QTreeWidgetItem *item, int col)
×
547
{
548
    Q_UNUSED(col)
549
    Q_UNUSED(item)
550

551
    updateResultFunctionsTree();
×
552
    updateWidgetsTree();
×
553

554
    checkTabsAndButtons();
×
555
}
×
556

557
/********************************************************************
558
 * Widgets
559
 ********************************************************************/
560

561
void FunctionWizard::addWidgetItem(QTreeWidgetItem *grpItem, QString name, int type,
×
562
                             QTreeWidgetItem *fxGrpItem, quint32 *channels)
563
{
564
    if (grpItem == NULL)
×
565
        return;
×
566

567
    QTreeWidgetItem *item = new QTreeWidgetItem(grpItem);
×
568
    item->setText(KWidgetName, name );
×
569
    item->setCheckState(KWidgetName, Qt::Unchecked);
×
570
    item->setData(KWidgetName, Qt::UserRole, type);
×
571
    item->setData(KWidgetName, Qt::UserRole + 1, QVariant::fromValue((void*)fxGrpItem));
×
572
    item->setData(KWidgetName, Qt::UserRole + 2, QVariant::fromValue(channels[0]));
×
573
    item->setIcon(KWidgetName, VCWidget::typeToIcon(type));
×
574
    if(name.toLower().contains("speed")) item->setIcon(KWidgetName, QIcon(":/knob.png"));
×
575
    
576
}
577

578
void FunctionWizard::checkPanTilt(QTreeWidgetItem *grpItem,
×
579
                            QTreeWidgetItem *fxGrpItem, qint32* channels)
580
{
581
    //Check if all required Channels are set
582
    if (channels[0] < 0) return;
×
583
    if (channels[2] < 0) return;
×
584
    if (channels[1] > 0 && channels[3] < 0) return;
×
585
    
586
    quint32 panTiltChannels[4] = {};
×
587
    for (size_t i = 0; i < 4; i++)
×
588
        panTiltChannels[i] = channels[i];
×
589

590
    addWidgetItem(grpItem, "XY PAD", VCWidget::XYPadWidget, fxGrpItem, panTiltChannels);
×
591

592
    channels[0] = -1;
×
593
    channels[1] = -1;
×
594
    channels[2] = -1;
×
595
    channels[3] = -1;
×
596
}
597

598
void FunctionWizard::checkRGB(QTreeWidgetItem *grpItem, 
×
599
                            QTreeWidgetItem *fxGrpItem, qint32* channels)
600
{
601
    // Check if all required Channels are set
602
    for (size_t i = 0; i < 3; i++) if(channels[i] < 0) return;
×
603

604
    quint32 RGB[3] = {};
×
605
    for (size_t i = 0; i < 3; i++)
×
606
        RGB[i] = channels[i];
×
607

608
    addWidgetItem(grpItem, "RGB - Click & Go", VCWidget::SliderWidget, fxGrpItem, RGB);
×
609

610
    RGB[0] = -1;
×
611
    RGB[1] = -1;
×
612
    RGB[2] = -1;
×
613
}
614

615
void FunctionWizard::addChannelsToTree(QTreeWidgetItem *frame, QTreeWidgetItem *fxGrpItem, QList<quint32> channels)
×
616
{
617
    QTreeWidgetItem *fxItem = fxGrpItem->child(0);
×
618
    quint32 fxID = fxItem->data(KFixtureColumnName, Qt::UserRole).toUInt();
×
619
    Fixture *fxi = m_doc->fixture(fxID);
×
620
    Q_ASSERT(fxi != NULL);
×
621

622
    qint32 lastPanTilt[] = {-1, -1, -1, -1};
×
623
    qint32 lastRGB[] = {-1, -1, -1};
×
624

625
    
626
    for (auto &&ch : channels)
×
627
    //for (quint32 ch = 0; ch < fxi->channels(); ch++)
628
    {
629
        const QLCChannel *channel(fxi->channel(ch));
×
630
        Q_ASSERT(channel != NULL);
×
631

632
        switch (channel->group())
×
633
        {
634
        case QLCChannel::Pan: {
×
635
            if (channel->preset() == QLCChannel::PositionPan)
×
636
                lastPanTilt[0] = ch;
×
637
            if (channel->preset() == QLCChannel::PositionPanFine)
×
638
                lastPanTilt[1] = ch;
×
639

640
            checkPanTilt(frame, fxGrpItem, lastPanTilt);
×
641
        }
642
        break;
×
643
        case QLCChannel::Tilt: {
×
644
            if (channel->preset() == QLCChannel::PositionTilt)
×
645
                lastPanTilt[2] = ch;
×
646
            if (channel->preset() == QLCChannel::PositionTiltFine)
×
647
                lastPanTilt[3] = ch;
×
648

649
            checkPanTilt(frame, fxGrpItem, lastPanTilt);
×
650
        }
651
        break;
×
652

653
        // Glick & Go's
654
        case QLCChannel::Gobo:
×
655
        case QLCChannel::Shutter:
656
        case QLCChannel::Prism:
657
        case QLCChannel::Beam:
658
        case QLCChannel::Effect:
659
        case QLCChannel::Colour:
660
            addWidgetItem(frame, QLCChannel::groupToString(channel->group()) + " - Click & Go",
×
661
                          VCWidget::SliderWidget, fxGrpItem, &ch);
662
            break;
×
663

664
        case QLCChannel::Intensity: {
×
665
            QLCChannel::PrimaryColour col = channel->colour();
×
666
            switch (col)
×
667
            {
668
            case QLCChannel::Red: {
×
669
                lastRGB[0] = ch;
×
670
                checkRGB(frame, fxGrpItem, lastRGB);
×
671
            }
672
            break;
×
673
            case QLCChannel::Green: {
×
674
                lastRGB[1] = ch;
×
675
                checkRGB(frame, fxGrpItem, lastRGB);
×
676
            }
677
            break;
×
678
            case QLCChannel::Blue: {
×
679
                lastRGB[2] = ch;
×
680
                checkRGB(frame, fxGrpItem, lastRGB);
×
681
            }
682
            break;
×
683
            default: {
×
684
                addWidgetItem(frame, channel->name() + " - Intensity", VCWidget::SliderWidget,
×
685
                              fxGrpItem, &ch);
686
            }
687
            break;
×
688
            }
689
        }
690
        break;
×
691
        case QLCChannel::Speed:
×
692
            addWidgetItem(frame,
×
693
                          channel->name() + " - " + QLCChannel::groupToString(channel->group()),
×
694
                          VCWidget::SliderWidget, fxGrpItem, &ch);
695
            break;
×
696
            break;
697
        default:
×
698
            addWidgetItem(frame,
×
699
                          channel->name() + " - " + QLCChannel::groupToString(channel->group()),
×
700
                          VCWidget::SliderWidget, fxGrpItem, &ch);
701
            break;
×
702
            break;
703
        }
704
    }
705
}
×
706

707
void FunctionWizard::updateWidgetsTree()
×
708
{
709
    m_widgetsTree->clear();
×
710

711
    // Populate palette Widgets
712
    foreach (PaletteGenerator *palette, m_paletteList)
×
713
    {
NEW
714
        QTreeWidgetItem *frame = NULL;
×
715

716
        // Reuse existing frame for EFX
NEW
717
        if (m_widgetsTree->topLevelItemCount() > 0)
×
718
        {
NEW
719
            frame = (QTreeWidgetItem *)m_widgetsTree->topLevelItem(
×
NEW
720
                m_widgetsTree->topLevelItemCount() - 1);
×
NEW
721
            if (frame->text(KWidgetName) != palette->fullName())
×
NEW
722
                frame = NULL;
×
723
        }
724

NEW
725
        if (frame == NULL)
×
726
        {
NEW
727
            frame = new QTreeWidgetItem(m_widgetsTree);
×
NEW
728
            frame->setText(KWidgetName, palette->fullName());
×
729
        }
730

NEW
731
        if (palette->type() == PaletteGenerator::Animation ||
×
NEW
732
            palette->type() == PaletteGenerator::EfxDimmer ||
×
NEW
733
            palette->type() == PaletteGenerator::EfxPosition ||
×
NEW
734
            palette->type() == PaletteGenerator::EfxRGB)
×
735
        {
736
            frame->setIcon(KWidgetName, VCWidget::typeToIcon(VCWidget::SoloFrameWidget));
×
737
            frame->setData(KWidgetName, Qt::UserRole, VCWidget::SoloFrameWidget);
×
738
        }
739
        else
740
        {
741
            frame->setIcon(KWidgetName, VCWidget::typeToIcon(VCWidget::FrameWidget));
×
742
            frame->setData(KWidgetName, Qt::UserRole, VCWidget::FrameWidget);
×
743
        }
744
        frame->setData(KWidgetName, Qt::UserRole + 1, QVariant::fromValue((void *)palette));
×
745
        frame->setFlags(frame->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsAutoTristate);
×
746
        frame->setCheckState(KWidgetName, Qt::Unchecked);
×
747

748
        QTreeWidgetItem *soloFrameItem = NULL;
×
749
        if (palette->scenes().count() > 0)
×
750
        {
751
            soloFrameItem = new QTreeWidgetItem(frame);
×
752
            soloFrameItem->setText(KWidgetName, tr("Presets solo frame"));
×
753
            soloFrameItem->setIcon(KWidgetName, VCWidget::typeToIcon(VCWidget::SoloFrameWidget));
×
754
            soloFrameItem->setFlags(soloFrameItem->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsAutoTristate);
×
755
            soloFrameItem->setCheckState(KWidgetName, Qt::Unchecked);
×
756
            soloFrameItem->setData(KWidgetName, Qt::UserRole, VCWidget::SoloFrameWidget);
×
757
        }
758
        foreach (Scene *scene, palette->scenes())
×
759
        {
760
            QTreeWidgetItem *item = NULL;
×
761
            if (soloFrameItem != NULL)
×
762
                item = new QTreeWidgetItem(soloFrameItem);
×
763
            else
764
                item = new QTreeWidgetItem(frame);
×
765
            QString toRemove = " - " + palette->model();
×
766
            item->setText(KWidgetName, scene->name().remove(toRemove));
×
767
            item->setIcon(KWidgetName, VCWidget::typeToIcon(VCWidget::ButtonWidget));
×
768
            item->setCheckState(KWidgetName, Qt::Unchecked);
×
769
            item->setData(KWidgetName, Qt::UserRole, VCWidget::ButtonWidget);
×
770
            item->setData(KWidgetName, Qt::UserRole + 1, QVariant::fromValue((void *)scene));
×
771

772
        }
×
773
        foreach (Chaser *chaser, palette->chasers())
×
774
        {
775
            QTreeWidgetItem *item = new QTreeWidgetItem(frame);
×
776
            QString toRemove = " - " + palette->model();
×
777
            item->setText(KWidgetName, chaser->name().remove(toRemove));
×
778
            item->setIcon(KWidgetName, VCWidget::typeToIcon(VCWidget::CueListWidget));
×
779
            item->setCheckState(KWidgetName, Qt::Unchecked);
×
780
            item->setData(KWidgetName, Qt::UserRole, VCWidget::CueListWidget);
×
781
            item->setData(KWidgetName, Qt::UserRole + 1, QVariant::fromValue((void *)chaser));
×
782
        }
×
783

784
        foreach (RGBMatrix *matrix, palette->matrices())
×
785
        {
786
            QTreeWidgetItem *item = NULL;
×
787
            if (soloFrameItem != NULL)
×
788
                item = new QTreeWidgetItem(soloFrameItem);
×
789
            else
790
                item = new QTreeWidgetItem(frame);
×
791
            QString toRemove = " - " + palette->model();
×
792
            item->setText(KWidgetName, matrix->name().remove(toRemove));
×
793
            item->setIcon(KWidgetName, VCWidget::typeToIcon(VCWidget::ButtonWidget));
×
794
            item->setCheckState(KWidgetName, Qt::Unchecked);
×
795
            item->setData(KWidgetName, Qt::UserRole, VCWidget::ButtonWidget);
×
796
            item->setData(KWidgetName, Qt::UserRole + 1, QVariant::fromValue((void *)matrix));
×
797
        }
×
NEW
798
        foreach (EFX *efx, palette->efxs())
×
799
        {
NEW
800
            QTreeWidgetItem *item = new QTreeWidgetItem(frame);
×
NEW
801
            QString toRemove = " - " + palette->model();
×
NEW
802
            item->setText(KWidgetName, efx->name().remove(toRemove));
×
NEW
803
            item->setIcon(KWidgetName, VCWidget::typeToIcon(VCWidget::ButtonWidget));
×
NEW
804
            item->setCheckState(KWidgetName, Qt::Unchecked);
×
NEW
805
            item->setData(KWidgetName, Qt::UserRole, VCWidget::ButtonWidget);
×
NEW
806
            item->setData(KWidgetName, Qt::UserRole + 1, QVariant::fromValue((void *)efx));
×
NEW
807
        }
×
808

809
        if (palette->scenes().count() > 0)
×
810
        {
811
            int pType = palette->type();
×
812
            QTreeWidgetItem *item = new QTreeWidgetItem(frame);
×
813
            if (pType == PaletteGenerator::PrimaryColors ||
×
814
                pType == PaletteGenerator::SixteenColors)
815
                    item->setText(KWidgetName, tr("Click & Go RGB"));
×
816
            else if (pType == PaletteGenerator::Gobos ||
×
817
                     pType == PaletteGenerator::Shutter ||
×
818
                     pType == PaletteGenerator::ColourMacro)
819
                        item->setText(KWidgetName, tr("Click & Go Macro"));
×
820

821
            item->setIcon(KWidgetName, VCWidget::typeToIcon(VCWidget::SliderWidget));
×
822
            item->setCheckState(KWidgetName, Qt::Unchecked);
×
823
            item->setData(KWidgetName, Qt::UserRole, VCWidget::SliderWidget);
×
824
            Scene *firstScene = palette->scenes().at(0);
×
825
            item->setData(KWidgetName, Qt::UserRole + 1, QVariant::fromValue((void *)firstScene));
×
826
        }
827
    }
×
828

829
    // Populate Fixture channel Widgets
830
    if (m_checkBoxAll->checkState() == 0 && m_checkBoxHeads->checkState() == 0 &&
×
831
        m_checkBoxFixtures->checkState() == 0)
×
832
        return;
×
833

834
    for (int i = 0; i < m_fixtureTree->topLevelItemCount(); i++)
×
835
    {
836
        QTreeWidgetItem *fxGrpItem = m_fixtureTree->topLevelItem(i);
×
837
        Q_ASSERT(fxGrpItem != NULL);
×
838

839
        if (fxGrpItem->childCount() == 0)
×
840
            continue;
×
841

842
        QTreeWidgetItem *frame = new QTreeWidgetItem(m_widgetsTree);
×
843
        frame->setText(KWidgetName, "Channels - " + fxGrpItem->text(KFixtureColumnName));
×
844
        frame->setIcon(KWidgetName, VCWidget::typeToIcon(VCWidget::FrameWidget));
×
845
        frame->setData(KWidgetName, Qt::UserRole, VCWidget::FrameWidget);
×
846
        frame->setData(KWidgetName, Qt::UserRole + 1, QVariant::fromValue((void *)NULL));
×
847
        frame->setFlags(frame->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsAutoTristate);
×
848
        frame->setCheckState(KWidgetName, Qt::Unchecked);
×
849
        frame->setExpanded(true);
×
850

851
        // since groups contain fixture of the same type, get the first
852
        // child and create categories on its capabilities
853
        QTreeWidgetItem *fxItem = fxGrpItem->child(0);
×
854
        quint32 fxID = fxItem->data(KFixtureColumnName, Qt::UserRole).toUInt();
×
855
        Fixture* fxi = m_doc->fixture(fxID);
×
856
        Q_ASSERT(fxi != NULL);
×
857

858
        frame->setData(KWidgetName, Qt::UserRole + 1, QVariant::fromValue((void *)fxi));
×
859

860
        quint8 fixtureCount = fxGrpItem->childCount();
×
861
        quint8 headCount = fxi->heads();
×
862

863
        QList<quint32> headChannels = fxi->head(0).channels();
×
864
        QList<quint32> noHeadChannels;
×
865
        for (size_t i = 0; i < fxi->channels(); i++)
×
866
        {
867
            noHeadChannels.append(i);
×
868
        }
869
        for (int h = 0; h < fxi->heads(); h++)
×
870
        {
871
            for (auto &&ch : fxi->head(h).channels())
×
872
            {
873
                noHeadChannels.removeAll(ch);
×
874
            }
×
875
        }
876

877
        QList<quint32> allChannels = headChannels;
×
878
        allChannels.append(noHeadChannels);
×
879

880
        quint16 pageCount = 0;
×
881
        QString pageName = "%1 Pages - ";
×
882

883
        if (m_checkBoxFixtures->checkState())
×
884
        {
885
            pageName.append("[F]");
×
886
            pageCount = fixtureCount;
×
887
        }
888
        else
889
            fixtureCount = 0;
×
890
        if (headCount > 1 && m_checkBoxHeads->checkState() == 2)
×
891
        {
892
            if (pageCount > 0)
×
893
            {
894
                pageCount *= headCount;
×
895
                pageName.append("/");
×
896
            }
897
            else
898
                pageCount = headCount;
×
899
            pageName.append("[H]");
×
900
        }
901
        else
902
            headCount = 0;
×
903

904
        if (pageCount < 2)
×
905
        {
906
            // No Pages
907
            addChannelsToTree(frame, fxGrpItem, allChannels);
×
908
            continue;
×
909
        }
910

911
        if (m_checkBoxAll->checkState() == 2)
×
912
        {
913
            QTreeWidgetItem *page = new QTreeWidgetItem(frame);
×
914
            page->setText(KWidgetName, "Page - All");
×
915
            page->setIcon(KWidgetName, VCWidget::typeToIcon(VCWidget::FrameWidget));
×
916
            page->setFlags(frame->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsAutoTristate);
×
917
            page->setCheckState(KWidgetName, Qt::Unchecked);
×
918
            page->setExpanded(true);
×
919

920
            addChannelsToTree(page, fxGrpItem, allChannels);
×
921
        }
922

923
        pageName = pageName.arg(pageCount);
×
924

925
        QTreeWidgetItem *page = new QTreeWidgetItem(frame);
×
926
        page->setText(KWidgetName, pageName);
×
927
        page->setIcon(KWidgetName, VCWidget::typeToIcon(VCWidget::FrameWidget));
×
928
        page->setData(KWidgetName, Qt::UserRole + 1, fixtureCount); // FixturePageCount
×
929
        page->setData(KWidgetName, Qt::UserRole + 2, headCount);    // HeadPageCount
×
930
        page->setFlags(frame->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsAutoTristate);
×
931
        page->setCheckState(KWidgetName, Qt::Unchecked);
×
932
        page->setExpanded(true);
×
933

934
        addChannelsToTree(page, fxGrpItem,
×
935
                          (headCount > 1 && m_checkBoxHeads->checkState() == 2) ? headChannels
×
936
                                                                                : allChannels);
937
    }
×
938
}
939

940
VCWidget *FunctionWizard::createWidget(int type, VCWidget *parent, int xpos, int ypos,
×
941
                                       Function *func, int pType, QTreeWidgetItem *fxGrpItem,
942
                                       quint32 chan, qint32 fixtureNr, qint32 headId)
943
{
944
    VirtualConsole *vc = VirtualConsole::instance();
×
945
    VCWidget *widget = NULL;
×
946

947
    if (parent == NULL)
×
948
        return NULL;
×
949

950
    switch(type)
×
951
    {
952
        case VCWidget::FrameWidget:
×
953
        {
954
            VCFrame* frame = new VCFrame(parent, m_doc, true);
×
955
            vc->setupWidget(frame, parent);
×
956
            frame->move(QPoint(xpos, ypos));
×
957
            widget = frame;
×
958
        }
959
        break;
×
960
        case VCWidget::SoloFrameWidget:
×
961
        {
962
            VCSoloFrame* frame = new VCSoloFrame(parent, m_doc, true);
×
963
            vc->setupWidget(frame, parent);
×
964
            frame->move(QPoint(xpos, ypos));
×
965
            widget = frame;
×
966
        }
967
        break;
×
968
        case VCWidget::ButtonWidget:
×
969
        {
970
            VCButton* button = new VCButton(parent, m_doc);
×
971
            vc->setupWidget(button, parent);
×
972
            button->move(QPoint(xpos, ypos));
×
973
            if (func != NULL)
×
974
                button->setFunction(func->id());
×
975

976
            widget = button;
×
977
        }
978
        break;
×
979
        case VCWidget::CueListWidget:
×
980
        {
981
            VCCueList* cuelist = new VCCueList(parent, m_doc);
×
982
            vc->setupWidget(cuelist, parent);
×
983
            cuelist->move(QPoint(xpos, ypos));
×
984
            if (func != NULL)
×
985
                cuelist->setChaser(func->id());
×
986
            cuelist->resize(QSize(300, m_sliderHeightSpin->value()));
×
987

988
            widget = cuelist;
×
989
        }
990
        break;
×
991
        case VCWidget::SliderWidget:
×
992
        {
993
            VCSlider* slider = new VCSlider(parent, m_doc);
×
994
            vc->setupWidget(slider, parent);
×
995
            slider->move(QPoint(xpos, ypos));
×
996
            // Click & Go Slider in Pallette Frames
997
            if (func != NULL)
×
998
            {
999
                Scene *scene = qobject_cast<Scene*> (func);
×
1000
                foreach (SceneValue scv, scene->values())
×
1001
                    slider->addLevelChannel(scv.fxi, scv.channel);
×
1002

1003
                if (pType == PaletteGenerator::PrimaryColors ||
×
1004
                    pType == PaletteGenerator::SixteenColors)
1005
                        slider->setClickAndGoType(ClickAndGoWidget::RGB);
×
1006
                else
1007
                    slider->setClickAndGoType(ClickAndGoWidget::Preset);
×
1008
                slider->setSliderMode(VCSlider::Level);
×
1009
            }
1010
            else
1011
            {
1012
                // get channel of first Fixture
1013
                int fxID = fxGrpItem->child(0)->data(KFixtureColumnName, Qt::UserRole).toInt();
×
1014
                Fixture *fixture = m_doc->fixture(fxID);
×
1015
                const QLCChannel *channel = fixture->channel(chan);
×
1016

1017
                bool isRGB = channel->colour()==QLCChannel::Red;
×
1018

1019
                for (int c = 0; c < fxGrpItem->childCount(); c++)
×
1020
                {
1021
                    if (fixtureNr >= 0 && c != fixtureNr)
×
1022
                        continue;
×
1023

1024
                    QTreeWidgetItem *fxItem = fxGrpItem->child(c);
×
1025
                    int fxi = fxItem->data(KFixtureColumnName, Qt::UserRole).toInt();
×
1026
                    Fixture *fixture = m_doc->fixture(fxID);
×
1027
                    qint16 chanIndex = fixture->head(0).channels().indexOf(chan);
×
1028
                    for (qint32 h = 0; h < fixture->heads(); h++)
×
1029
                    {
1030
                        if (headId >= 0 && h != headId)
×
1031
                            continue;
×
1032

1033
                        quint32 headChannel = chan;
×
1034
                        if (chanIndex >= 0) // check if channel is in head
×
1035
                            headChannel = fixture->head(h).channels().at(chanIndex);
×
1036

1037
                        slider->addLevelChannel(fxi, headChannel);
×
1038
                        if (isRGB)
×
1039
                        {
1040
                            slider->addLevelChannel(fxi, headChannel + 1);
×
1041
                            slider->addLevelChannel(fxi, headChannel + 2);
×
1042
                        }
1043
                    }
1044
                }
1045
                
1046
                if (isRGB)
×
1047
                {
1048
                    slider->setClickAndGoType(ClickAndGoWidget::RGB);
×
1049
                }
1050
                else if (channel->group() == QLCChannel::Intensity)
×
1051
                {
1052
                    slider->setClickAndGoType(ClickAndGoWidget::None);
×
1053
                }
1054
                else
1055
                {
1056
                    slider->setClickAndGoType(ClickAndGoWidget::Preset);
×
1057
                }
1058
                
1059
                if (channel->group() == QLCChannel::Speed)
×
1060
                    slider->setWidgetStyle(VCSlider::WKnob);
×
1061

1062
                if ((fixtureNr >= 0 || headId >= 0) && m_checkBoxAll->checkState() == Qt::Checked)
×
1063
                    slider->setChannelsMonitorEnabled(true);
×
1064

1065
                slider->setSliderMode(VCSlider::Level); 
×
1066
            }
1067

1068
            slider->resize(QSize(m_sliderWidthSpin->value(), m_sliderHeightSpin->value()));
×
1069

1070
            widget = slider;
×
1071
        }
1072
        break;
×
1073
        case VCWidget::XYPadWidget:
×
1074
        {
1075
            VCXYPad* XYPad = new VCXYPad(parent, m_doc);
×
1076
            vc->setupWidget(XYPad, parent);
×
1077
            XYPad->move(QPoint(xpos, ypos));
×
1078

1079
            for (int c = 0; c < fxGrpItem->childCount(); c++)
×
1080
            {
1081
                if (fixtureNr >= 0 && c != fixtureNr)
×
1082
                    continue;
×
1083

1084
                QTreeWidgetItem *fxItem = fxGrpItem->child(c);
×
1085
                int fxID = fxItem->data(KFixtureColumnName, Qt::UserRole).toInt();
×
1086
                Fixture *fixture = m_doc->fixture(fxID);
×
1087
                for (qint32 h = 0; h < fixture->heads(); h++)
×
1088
                {
1089
                    if (headId >= 0 && h != headId)
×
1090
                        continue;
×
1091

1092
                    VCXYPadFixture fxi = VCXYPadFixture(m_doc);
×
1093
                    fxi.setHead(GroupHead(fxID, h));
×
1094
                    XYPad->appendFixture(fxi);
×
1095
                }
×
1096
            }
1097
            XYPad->resize(QSize(m_sliderHeightSpin->value(), m_sliderHeightSpin->value()));
×
1098
                      
1099
            widget = XYPad;
×
1100
        }
1101
        break;
×
1102
        default:
×
1103
        break;
×
1104
    }
1105

1106
    // Set Function
1107
    if (widget != NULL && func != NULL)
×
1108
    {
1109
        if (func->type() == Function::SceneType && type == VCWidget::ButtonWidget)
×
1110
        {
1111
            Scene *scene = qobject_cast<Scene*> (func);
×
1112

1113
            if (pType == PaletteGenerator::PrimaryColors ||
×
1114
                pType == PaletteGenerator::SixteenColors ||
×
1115
                pType == PaletteGenerator::ColourMacro)
1116
            {
1117
                QColor col = scene->colorValue();
×
1118
                if (col.isValid())
×
1119
                    widget->setBackgroundColor(col);
×
1120
            }
×
1121
            else if (pType == PaletteGenerator::Gobos)
×
1122
            {
1123
                foreach (SceneValue scv, scene->values())
×
1124
                {
1125
                    Fixture *fixture = m_doc->fixture(scv.fxi);
×
1126
                    if (fixture == NULL)
×
1127
                        continue;
×
1128

1129
                    const QLCChannel* channel(fixture->channel(scv.channel));
×
1130
                    if (channel->group() == QLCChannel::Gobo)
×
1131
                    {
1132
                        QLCCapability *cap = channel->searchCapability(scv.value);
×
1133
                        if (cap->resource(0).isValid())
×
1134
                        {
1135
                            widget->setBackgroundImage(cap->resource(0).toString());
×
1136
                            break;
×
1137
                        }
1138
                    }
1139
                }
×
1140
            }
1141
        }
1142
    }
1143

1144
    return widget;
×
1145
}
1146

1147
QSize FunctionWizard::recursiveCreateWidget(QTreeWidgetItem *item, VCWidget *parent, int type)
×
1148
{
1149
    QSize groupSize(100, 50);
×
1150
    int subX = 10, subY = 40;
×
1151

1152
    for (int c = 0; c < item->childCount(); c++)
×
1153
    {
1154
        QTreeWidgetItem *childItem = item->child(c);
×
1155

1156
        if (childItem->checkState(KWidgetName) == Qt::Checked ||
×
1157
            childItem->checkState(KWidgetName) == Qt::PartiallyChecked)
×
1158
        {
1159
            int cType = childItem->data(KWidgetName, Qt::UserRole).toInt();
×
1160
            Function *func = NULL;
×
1161
            QTreeWidgetItem *fxGrpItem  = NULL;
×
1162
            quint32 channel = 0;
×
1163

1164
            if (type)
×
1165
            {
1166
                func = (Function *) childItem->data(KWidgetName, Qt::UserRole + 1).value<void *>();
×
1167
            }
1168
            else
1169
            {
1170
                fxGrpItem = (QTreeWidgetItem *) childItem->data(KWidgetName, Qt::UserRole + 1).value<void *>();
×
1171
                channel = childItem->data(KWidgetName, Qt::UserRole + 2).toUInt();
×
1172
            }
1173

1174
            if (childItem->text(KWidgetName).contains("Page"))
×
1175
            {
1176
                VCFrame *frame = (VCFrame *)parent;
×
1177
                frame->setMultipageMode(true);
×
1178

1179
                if (childItem->childCount() > 0)
×
1180
                {
1181
                    if (childItem->text(KWidgetName).contains("All"))
×
1182
                    {
1183
                        // v page v
1184
                        childItem->setData(KWidgetName, Qt::UserRole + 1, -1); // all fixtures
×
1185
                        childItem->setData(KWidgetName, Qt::UserRole + 2, -1); // all heads
×
1186
                        
1187
                        groupSize = recursiveCreateWidget(childItem, parent, type);                         
×
1188
                        // v frame v
1189
                        childItem->parent()->setData(KWidgetName, Qt::UserRole + 3, groupSize);
×
1190
                        frame->shortcuts().at(frame->currentPage())->setName("All");
×
1191
                        frame->setTotalPagesNumber(frame->totalPagesNumber() + 1);
×
1192
                        frame->slotNextPage();
×
1193
                        continue;
×
1194
                    }
1195
                    else
1196
                    {
1197
                        qint32 fxPages = childItem->data(KWidgetName, Qt::UserRole + 1).toInt();
×
1198
                        qint32 headPages = childItem->data(KWidgetName, Qt::UserRole + 2).toInt();
×
1199
                        qint32 f = fxPages ? 0 : -1;
×
1200

1201
                        for (; f < fxPages; f++)
×
1202
                        {
1203
                            qint32 h = headPages ? 0 : -1;
×
1204
                            for (; h < headPages; h++)
×
1205
                            {
1206
                                // page
1207
                                childItem->setData(KWidgetName, Qt::UserRole + 1, f); // fixture
×
1208
                                childItem->setData(KWidgetName, Qt::UserRole + 2, h); // head
×
1209

1210
                                QSize size = recursiveCreateWidget(childItem, parent, type);
×
1211
                                groupSize = childItem->parent()
×
1212
                                                ->data(KWidgetName, Qt::UserRole + 3)
×
1213
                                                .toSize();
×
1214

1215
                                if (size.width() > groupSize.width())
×
1216
                                    groupSize.setWidth(size.width());
×
1217
                                if (size.height() > groupSize.height())
×
1218
                                    groupSize.setHeight(size.height());
×
1219

1220
                                QString pageName = "";
×
1221
                                if (f >= 0)
×
1222
                                    pageName.append(QString("F%1").arg(f));
×
1223

1224
                                if (h >= 0)
×
1225
                                    pageName.append(QString("%1H%2").arg((f >= 0) ? "/" : "").arg(h));
×
1226

1227
                                frame->shortcuts().at(frame->currentPage())->setName(pageName);
×
1228
                                frame->setTotalPagesNumber(frame->totalPagesNumber() + 1);
×
1229
                                frame->slotNextPage();
×
1230
                            }
×
1231
                        }
1232
                        frame->setTotalPagesNumber(frame->totalPagesNumber() - 1);
×
1233
                        frame->slotSetPage(0);
×
1234
                        frame->updatePageCombo();
×
1235
                    }
1236
                }
1237
                continue;
×
1238
            }
×
1239

1240
            qint32 fxNr = -1;
×
1241
            qint32 headId = -1;
×
1242
            if (childItem->parent()->text(KWidgetName).contains("Page"))
×
1243
            {
1244
                fxNr = childItem->parent()->data(KWidgetName, Qt::UserRole + 1).toInt();
×
1245
                headId = childItem->parent()->data(KWidgetName, Qt::UserRole + 2).toInt();
×
1246
            }
1247

1248
            VCWidget *childWidget = createWidget(cType, parent, subX, subY, func, type, fxGrpItem,
×
1249
                                                 channel, fxNr, headId);
1250
            if (childWidget != NULL)
×
1251
            {
1252
                if (childWidget->type() == VCWidget::SliderWidget)
×
1253
                    childWidget->setCaption(childItem->text(KWidgetName).split(" - ")[0]);
×
1254
                else
1255
                    childWidget->setCaption(childItem->text(KWidgetName));
×
1256

1257
                //qDebug() << childItem->text(KWidgetName);
1258
                //qDebug << "p:"<<parent->type() << " spin:" << m_lineCntSpin->value() << " per:" <<wPerLine << Qt::endl;
1259

1260
                if (childItem->childCount() > 0)
×
1261
                {
1262
                    childWidget->resize(QSize(2000, 1000));
×
1263
                    QSize size = recursiveCreateWidget(childItem, childWidget, type);
×
1264
                    childWidget->resize(size);
×
1265
                }
1266

1267
                if (subX + childWidget->width() > groupSize.width())
×
1268
                    groupSize.setWidth(subX + childWidget->width() + 10);
×
1269
                if (subY + childWidget->height() > groupSize.height())
×
1270
                    groupSize.setHeight(subY + childWidget->height() + 10);
×
1271

1272
                int wPerLine = parent->type() == VCWidget::SoloFrameWidget ? 4 : m_lineCntSpin->value();
×
1273
                if (c > 0 && (c + 1)%wPerLine == 0)
×
1274
                {
1275
                    subX = 10;
×
1276
                    subY += childWidget->height() + 10;
×
1277
                }
1278
                else
1279
                    subX += childWidget->width() + 10;
×
1280
            }
1281
        }
1282
    }
1283

1284
    return groupSize;
×
1285
}
1286

1287
void FunctionWizard::addWidgetsToVirtualConsole()
×
1288
{
1289
    int xPos = 10;
×
1290
    int yPos = 10;
×
1291

1292
    VirtualConsole *vc = VirtualConsole::instance();
×
1293
    VCFrame *mainFrame = vc->contents();
×
1294
    Q_ASSERT(mainFrame != NULL);
×
1295

1296
    for (int i = 0; i < m_widgetsTree->topLevelItemCount(); i++)
×
1297
    {
1298
        QTreeWidgetItem *wItem = m_widgetsTree->topLevelItem(i);
×
1299

1300
        if (wItem->checkState(KWidgetName) == Qt::Checked ||
×
1301
            wItem->checkState(KWidgetName) == Qt::PartiallyChecked)
×
1302
        {
1303
            int wType = wItem->data(KWidgetName, Qt::UserRole).toInt();
×
1304
            VCWidget *widget = createWidget(wType, mainFrame, xPos, yPos);
×
1305
            if (widget == NULL)
×
1306
                continue;
×
1307

1308
            widget->resize(QSize(2000, 1000));
×
1309

1310
            int pType = 0;
×
1311
            if (!wItem->text(KWidgetName).contains("Channels"))
×
1312
            {
1313
                PaletteGenerator *pal = (PaletteGenerator *) wItem->data(KWidgetName, Qt::UserRole + 1).value<void *>();
×
1314
                pType = pal->type();
×
1315
            }
1316

1317
            widget->setCaption(wItem->text(KWidgetName));
×
1318

1319
            QSize size = recursiveCreateWidget(wItem, widget, pType);
×
1320

1321
            widget->resize(size);
×
1322
            xPos += widget->width() + 10;
×
1323
        }
1324
    }
1325
}
×
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