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

mcallegari / qlcplus / 15615318666

12 Jun 2025 03:53PM UTC coverage: 31.812% (-0.06%) from 31.872%
15615318666

Pull #1649

github

web-flow
Merge 196d0a46a 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){
×
NEW
303
            QTreeWidgetItem *item = new QTreeWidgetItem(grpItem);
×
NEW
304
            item->setText(KFunctionName, "EFXs");
×
NEW
305
            item->setCheckState(KFunctionName, Qt::Unchecked);
×
NEW
306
            item->setFlags(item->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsAutoTristate);
×
NEW
307
            item->setExpanded(true);
×
NEW
308
            efxItem = item;
×
309
        }
NEW
310
        grpItem = efxItem;
×
311
    }
312

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

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

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

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

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

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

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

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

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

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

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

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

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

419
    m_allFuncsTree->resizeColumnToContents(KFunctionName);
×
420

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

553
    checkTabsAndButtons();
×
554
}
×
555

556
/********************************************************************
557
 * Widgets
558
 ********************************************************************/
559

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1143
    return widget;
×
1144
}
1145

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1283
    return groupSize;
×
1284
}
1285

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

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

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

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

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

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

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

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

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