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

mcallegari / qlcplus / 14674450945

25 Apr 2025 10:21PM UTC coverage: 31.804% (-0.06%) from 31.866%
14674450945

Pull #1649

github

web-flow
Merge 4e751d81e into 2303fd4cc
Pull Request #1649: Function Wizard: create Effects

8 of 115 new or added lines in 2 files covered. (6.96%)

2 existing lines in 1 file now uncovered.

14691 of 46192 relevant lines covered (31.8%)

26428.53 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 ||
×
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 + 1, Qt::UserRole, algo);
×
339

NEW
340
                algoItem->setCheckState(KFunctionParallel, Qt::Checked);
×
NEW
341
                algoItem->setCheckState(KFunctionSerial, Qt::Unchecked);
×
NEW
342
                algoItem->setCheckState(KFunctionAsymetric, Qt::Unchecked);
×
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);
UNCOV
415
        }
×
NEW
416
        efxItem = NULL;
×
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 + 1, Qt::UserRole).toString());
×
516

517
                    int subType = PaletteGenerator::All;
NEW
518
                    if (subFuncItem->checkState(KFunctionOddEven) == Qt::Checked)
×
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());
×
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
    {
713
        QTreeWidgetItem *frame = new QTreeWidgetItem(m_widgetsTree);
×
714
        frame->setText(KWidgetName, palette->fullName());
×
NEW
715
        if (palette->type() == PaletteGenerator::Animation ||
×
NEW
716
            palette->type() == PaletteGenerator::EfxDimmer ||
×
NEW
717
            palette->type() == PaletteGenerator::EfxPosition ||
×
NEW
718
            palette->type() == PaletteGenerator::EfxRGB)
×
719
        {
720
            frame->setIcon(KWidgetName, VCWidget::typeToIcon(VCWidget::SoloFrameWidget));
×
721
            frame->setData(KWidgetName, Qt::UserRole, VCWidget::SoloFrameWidget);
×
722
        }
723
        else
724
        {
725
            frame->setIcon(KWidgetName, VCWidget::typeToIcon(VCWidget::FrameWidget));
×
726
            frame->setData(KWidgetName, Qt::UserRole, VCWidget::FrameWidget);
×
727
        }
728
        frame->setData(KWidgetName, Qt::UserRole + 1, QVariant::fromValue((void *)palette));
×
729
        frame->setFlags(frame->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsAutoTristate);
×
730
        frame->setCheckState(KWidgetName, Qt::Unchecked);
×
731

732
        QTreeWidgetItem *soloFrameItem = NULL;
733
        if (palette->scenes().count() > 0)
×
734
        {
735
            soloFrameItem = new QTreeWidgetItem(frame);
×
736
            soloFrameItem->setText(KWidgetName, tr("Presets solo frame"));
×
737
            soloFrameItem->setIcon(KWidgetName, VCWidget::typeToIcon(VCWidget::SoloFrameWidget));
×
738
            soloFrameItem->setFlags(soloFrameItem->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsAutoTristate);
×
739
            soloFrameItem->setCheckState(KWidgetName, Qt::Unchecked);
×
740
            soloFrameItem->setData(KWidgetName, Qt::UserRole, VCWidget::SoloFrameWidget);
×
741
        }
742
        foreach (Scene *scene, palette->scenes())
×
743
        {
744
            QTreeWidgetItem *item = NULL;
745
            if (soloFrameItem != NULL)
×
746
                item = new QTreeWidgetItem(soloFrameItem);
×
747
            else
748
                item = new QTreeWidgetItem(frame);
×
749
            QString toRemove = " - " + palette->model();
×
750
            item->setText(KWidgetName, scene->name().remove(toRemove));
×
751
            item->setIcon(KWidgetName, VCWidget::typeToIcon(VCWidget::ButtonWidget));
×
752
            item->setCheckState(KWidgetName, Qt::Unchecked);
×
753
            item->setData(KWidgetName, Qt::UserRole, VCWidget::ButtonWidget);
×
754
            item->setData(KWidgetName, Qt::UserRole + 1, QVariant::fromValue((void *)scene));
×
755

756
        }
×
757
        foreach (Chaser *chaser, palette->chasers())
×
758
        {
759
            QTreeWidgetItem *item = new QTreeWidgetItem(frame);
×
760
            QString toRemove = " - " + palette->model();
×
761
            item->setText(KWidgetName, chaser->name().remove(toRemove));
×
762
            item->setIcon(KWidgetName, VCWidget::typeToIcon(VCWidget::CueListWidget));
×
763
            item->setCheckState(KWidgetName, Qt::Unchecked);
×
764
            item->setData(KWidgetName, Qt::UserRole, VCWidget::CueListWidget);
×
765
            item->setData(KWidgetName, Qt::UserRole + 1, QVariant::fromValue((void *)chaser));
×
766
        }
×
767

768
        foreach (RGBMatrix *matrix, palette->matrices())
×
769
        {
770
            QTreeWidgetItem *item = NULL;
771
            if (soloFrameItem != NULL)
×
772
                item = new QTreeWidgetItem(soloFrameItem);
×
773
            else
774
                item = new QTreeWidgetItem(frame);
×
775
            QString toRemove = " - " + palette->model();
×
776
            item->setText(KWidgetName, matrix->name().remove(toRemove));
×
777
            item->setIcon(KWidgetName, VCWidget::typeToIcon(VCWidget::ButtonWidget));
×
778
            item->setCheckState(KWidgetName, Qt::Unchecked);
×
779
            item->setData(KWidgetName, Qt::UserRole, VCWidget::ButtonWidget);
×
780
            item->setData(KWidgetName, Qt::UserRole + 1, QVariant::fromValue((void *)matrix));
×
781
        }
×
NEW
782
        foreach (EFX *efx, palette->efxs())
×
783
        {
NEW
784
            QTreeWidgetItem *item = new QTreeWidgetItem(frame);
×
NEW
785
            QString toRemove = " - " + palette->model();
×
NEW
786
            item->setText(KWidgetName, efx->name().remove(toRemove));
×
NEW
787
            item->setIcon(KWidgetName, VCWidget::typeToIcon(VCWidget::ButtonWidget));
×
NEW
788
            item->setCheckState(KWidgetName, Qt::Unchecked);
×
NEW
789
            item->setData(KWidgetName, Qt::UserRole, VCWidget::ButtonWidget);
×
NEW
790
            item->setData(KWidgetName, Qt::UserRole + 1, QVariant::fromValue((void *)efx));
×
NEW
791
        }
×
792

793
        if (palette->scenes().count() > 0)
×
794
        {
795
            int pType = palette->type();
×
796
            QTreeWidgetItem *item = new QTreeWidgetItem(frame);
×
797
            if (pType == PaletteGenerator::PrimaryColors ||
×
798
                pType == PaletteGenerator::SixteenColors)
799
                    item->setText(KWidgetName, tr("Click & Go RGB"));
×
800
            else if (pType == PaletteGenerator::Gobos ||
×
801
                     pType == PaletteGenerator::Shutter ||
×
802
                     pType == PaletteGenerator::ColourMacro)
803
                        item->setText(KWidgetName, tr("Click & Go Macro"));
×
804

805
            item->setIcon(KWidgetName, VCWidget::typeToIcon(VCWidget::SliderWidget));
×
806
            item->setCheckState(KWidgetName, Qt::Unchecked);
×
807
            item->setData(KWidgetName, Qt::UserRole, VCWidget::SliderWidget);
×
808
            Scene *firstScene = palette->scenes().at(0);
×
809
            item->setData(KWidgetName, Qt::UserRole + 1, QVariant::fromValue((void *)firstScene));
×
810
        }
811
    }
812

813
    // Populate Fixture channel Widgets
814
    if (m_checkBoxAll->checkState() == 0 && m_checkBoxHeads->checkState() == 0 &&
×
815
        m_checkBoxFixtures->checkState() == 0)
×
816
        return;
817

818
    for (int i = 0; i < m_fixtureTree->topLevelItemCount(); i++)
×
819
    {
820
        QTreeWidgetItem *fxGrpItem = m_fixtureTree->topLevelItem(i);
×
821
        Q_ASSERT(fxGrpItem != NULL);
822

823
        if (fxGrpItem->childCount() == 0)
×
824
            continue;
×
825

826
        QTreeWidgetItem *frame = new QTreeWidgetItem(m_widgetsTree);
×
827
        frame->setText(KWidgetName, "Channels - " + fxGrpItem->text(KFixtureColumnName));
×
828
        frame->setIcon(KWidgetName, VCWidget::typeToIcon(VCWidget::FrameWidget));
×
829
        frame->setData(KWidgetName, Qt::UserRole, VCWidget::FrameWidget);
×
830
        frame->setData(KWidgetName, Qt::UserRole + 1, QVariant::fromValue((void *)NULL));
×
831
        frame->setFlags(frame->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsAutoTristate);
×
832
        frame->setCheckState(KWidgetName, Qt::Unchecked);
×
833
        frame->setExpanded(true);
×
834

835
        // since groups contain fixture of the same type, get the first
836
        // child and create categories on its capabilities
837
        QTreeWidgetItem *fxItem = fxGrpItem->child(0);
×
838
        quint32 fxID = fxItem->data(KFixtureColumnName, Qt::UserRole).toUInt();
×
839
        Fixture* fxi = m_doc->fixture(fxID);
×
840
        Q_ASSERT(fxi != NULL);
841

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

844
        quint8 fixtureCount = fxGrpItem->childCount();
×
845
        quint8 headCount = fxi->heads();
×
846

847
        QList<quint32> headChannels = fxi->head(0).channels();
×
848
        QList<quint32> noHeadChannels;
849
        for (size_t i = 0; i < fxi->channels(); i++)
×
850
        {
851
            noHeadChannels.append(i);
×
852
        }
853
        for (int h = 0; h < fxi->heads(); h++)
×
854
        {
855
            for (auto &&ch : fxi->head(h).channels())
×
856
            {
857
                noHeadChannels.removeAll(ch);
×
858
            }
×
859
        }
860

861
        QList<quint32> allChannels = headChannels;
×
862
        allChannels.append(noHeadChannels);
863

864
        quint16 pageCount = 0;
865
        QString pageName = "%1 Pages - ";
×
866

867
        if (m_checkBoxFixtures->checkState())
×
868
        {
869
            pageName.append("[F]");
×
870
            pageCount = fixtureCount;
×
871
        }
872
        else
873
            fixtureCount = 0;
874
        if (headCount > 1 && m_checkBoxHeads->checkState() == 2)
×
875
        {
876
            if (pageCount > 0)
×
877
            {
878
                pageCount *= headCount;
×
879
                pageName.append("/");
×
880
            }
881
            else
882
                pageCount = headCount;
×
883
            pageName.append("[H]");
×
884
        }
885
        else
886
            headCount = 0;
887

888
        if (pageCount < 2)
×
889
        {
890
            // No Pages
891
            addChannelsToTree(frame, fxGrpItem, allChannels);
×
892
            continue;
893
        }
894

895
        if (m_checkBoxAll->checkState() == 2)
×
896
        {
897
            QTreeWidgetItem *page = new QTreeWidgetItem(frame);
×
898
            page->setText(KWidgetName, "Page - All");
×
899
            page->setIcon(KWidgetName, VCWidget::typeToIcon(VCWidget::FrameWidget));
×
900
            page->setFlags(frame->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsAutoTristate);
×
901
            page->setCheckState(KWidgetName, Qt::Unchecked);
×
902
            page->setExpanded(true);
×
903

904
            addChannelsToTree(page, fxGrpItem, allChannels);
×
905
        }
906

907
        pageName = pageName.arg(pageCount);
×
908

909
        QTreeWidgetItem *page = new QTreeWidgetItem(frame);
×
910
        page->setText(KWidgetName, pageName);
×
911
        page->setIcon(KWidgetName, VCWidget::typeToIcon(VCWidget::FrameWidget));
×
912
        page->setData(KWidgetName, Qt::UserRole + 1, fixtureCount); // FixturePageCount
×
913
        page->setData(KWidgetName, Qt::UserRole + 2, headCount);    // HeadPageCount
×
914
        page->setFlags(frame->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsAutoTristate);
×
915
        page->setCheckState(KWidgetName, Qt::Unchecked);
×
916
        page->setExpanded(true);
×
917

918
        addChannelsToTree(page, fxGrpItem,
×
919
                          (headCount > 1 && m_checkBoxHeads->checkState() == 2) ? headChannels
×
920
                                                                                : allChannels);
921
    }
×
922
}
923

924
VCWidget *FunctionWizard::createWidget(int type, VCWidget *parent, int xpos, int ypos,
×
925
                                       Function *func, int pType, QTreeWidgetItem *fxGrpItem,
926
                                       quint32 chan, qint32 fixtureNr, qint32 headId)
927
{
928
    VirtualConsole *vc = VirtualConsole::instance();
×
929
    VCWidget *widget = NULL;
930

931
    if (parent == NULL)
×
932
        return NULL;
933

934
    switch(type)
×
935
    {
936
        case VCWidget::FrameWidget:
×
937
        {
938
            VCFrame* frame = new VCFrame(parent, m_doc, true);
×
939
            vc->setupWidget(frame, parent);
×
940
            frame->move(QPoint(xpos, ypos));
×
941
            widget = frame;
942
        }
943
        break;
×
944
        case VCWidget::SoloFrameWidget:
×
945
        {
946
            VCSoloFrame* frame = new VCSoloFrame(parent, m_doc, true);
×
947
            vc->setupWidget(frame, parent);
×
948
            frame->move(QPoint(xpos, ypos));
×
949
            widget = frame;
950
        }
951
        break;
×
952
        case VCWidget::ButtonWidget:
×
953
        {
954
            VCButton* button = new VCButton(parent, m_doc);
×
955
            vc->setupWidget(button, parent);
×
956
            button->move(QPoint(xpos, ypos));
×
957
            if (func != NULL)
×
958
                button->setFunction(func->id());
×
959

960
            widget = button;
961
        }
962
        break;
963
        case VCWidget::CueListWidget:
×
964
        {
965
            VCCueList* cuelist = new VCCueList(parent, m_doc);
×
966
            vc->setupWidget(cuelist, parent);
×
967
            cuelist->move(QPoint(xpos, ypos));
×
968
            if (func != NULL)
×
969
                cuelist->setChaser(func->id());
×
970
            cuelist->resize(QSize(300, m_sliderHeightSpin->value()));
×
971

972
            widget = cuelist;
973
        }
974
        break;
×
975
        case VCWidget::SliderWidget:
×
976
        {
977
            VCSlider* slider = new VCSlider(parent, m_doc);
×
978
            vc->setupWidget(slider, parent);
×
979
            slider->move(QPoint(xpos, ypos));
×
980
            // Click & Go Slider in Pallette Frames
981
            if (func != NULL)
×
982
            {
983
                Scene *scene = qobject_cast<Scene*> (func);
984
                foreach (SceneValue scv, scene->values())
×
985
                    slider->addLevelChannel(scv.fxi, scv.channel);
×
986

987
                if (pType == PaletteGenerator::PrimaryColors ||
×
988
                    pType == PaletteGenerator::SixteenColors)
989
                        slider->setClickAndGoType(ClickAndGoWidget::RGB);
×
990
                else
991
                    slider->setClickAndGoType(ClickAndGoWidget::Preset);
×
992
                slider->setSliderMode(VCSlider::Level);
×
993
            }
994
            else
995
            {
996
                // get channel of first Fixture
997
                int fxID = fxGrpItem->child(0)->data(KFixtureColumnName, Qt::UserRole).toInt();
×
998
                Fixture *fixture = m_doc->fixture(fxID);
×
999
                const QLCChannel *channel = fixture->channel(chan);
×
1000

1001
                bool isRGB = channel->colour()==QLCChannel::Red;
×
1002

1003
                for (int c = 0; c < fxGrpItem->childCount(); c++)
×
1004
                {
1005
                    if (fixtureNr >= 0 && c != fixtureNr)
×
1006
                        continue;
×
1007

1008
                    QTreeWidgetItem *fxItem = fxGrpItem->child(c);
×
1009
                    int fxi = fxItem->data(KFixtureColumnName, Qt::UserRole).toInt();
×
1010
                    Fixture *fixture = m_doc->fixture(fxID);
×
1011
                    qint16 chanIndex = fixture->head(0).channels().indexOf(chan);
×
1012
                    for (qint32 h = 0; h < fixture->heads(); h++)
×
1013
                    {
1014
                        if (headId >= 0 && h != headId)
×
1015
                            continue;
×
1016

1017
                        quint32 headChannel = chan;
1018
                        if (chanIndex >= 0) // check if channel is in head
×
1019
                            headChannel = fixture->head(h).channels().at(chanIndex);
×
1020

1021
                        slider->addLevelChannel(fxi, headChannel);
×
1022
                        if (isRGB)
×
1023
                        {
1024
                            slider->addLevelChannel(fxi, headChannel + 1);
×
1025
                            slider->addLevelChannel(fxi, headChannel + 2);
×
1026
                        }
1027
                    }
1028
                }
1029
                
1030
                if (isRGB)
×
1031
                {
1032
                    slider->setClickAndGoType(ClickAndGoWidget::RGB);
×
1033
                }
1034
                else if (channel->group() == QLCChannel::Intensity)
×
1035
                {
1036
                    slider->setClickAndGoType(ClickAndGoWidget::None);
×
1037
                }
1038
                else
1039
                {
1040
                    slider->setClickAndGoType(ClickAndGoWidget::Preset);
×
1041
                }
1042
                
1043
                if (channel->group() == QLCChannel::Speed)
×
1044
                    slider->setWidgetStyle(VCSlider::WKnob);
×
1045

1046
                if ((fixtureNr >= 0 || headId >= 0) && m_checkBoxAll->checkState() == Qt::Checked)
×
1047
                    slider->setChannelsMonitorEnabled(true);
×
1048

1049
                slider->setSliderMode(VCSlider::Level); 
×
1050
            }
1051

1052
            slider->resize(QSize(m_sliderWidthSpin->value(), m_sliderHeightSpin->value()));
×
1053

1054
            widget = slider;
1055
        }
1056
        break;
×
1057
        case VCWidget::XYPadWidget:
×
1058
        {
1059
            VCXYPad* XYPad = new VCXYPad(parent, m_doc);
×
1060
            vc->setupWidget(XYPad, parent);
×
1061
            XYPad->move(QPoint(xpos, ypos));
×
1062

1063
            for (int c = 0; c < fxGrpItem->childCount(); c++)
×
1064
            {
1065
                if (fixtureNr >= 0 && c != fixtureNr)
×
1066
                    continue;
×
1067

1068
                QTreeWidgetItem *fxItem = fxGrpItem->child(c);
×
1069
                int fxID = fxItem->data(KFixtureColumnName, Qt::UserRole).toInt();
×
1070
                Fixture *fixture = m_doc->fixture(fxID);
×
1071
                for (qint32 h = 0; h < fixture->heads(); h++)
×
1072
                {
1073
                    if (headId >= 0 && h != headId)
×
1074
                        continue;
×
1075

1076
                    VCXYPadFixture fxi = VCXYPadFixture(m_doc);
×
1077
                    fxi.setHead(GroupHead(fxID, h));
×
1078
                    XYPad->appendFixture(fxi);
×
1079
                }
×
1080
            }
1081
            XYPad->resize(QSize(m_sliderHeightSpin->value(), m_sliderHeightSpin->value()));
×
1082
                      
1083
            widget = XYPad;
1084
        }
1085
        break;
×
1086
        default:
1087
        break;
1088
    }
1089

1090
    // Set Function
1091
    if (widget != NULL && func != NULL)
×
1092
    {
1093
        if (func->type() == Function::SceneType && type == VCWidget::ButtonWidget)
×
1094
        {
1095
            Scene *scene = qobject_cast<Scene*> (func);
1096

1097
            if (pType == PaletteGenerator::PrimaryColors ||
×
1098
                pType == PaletteGenerator::SixteenColors ||
×
1099
                pType == PaletteGenerator::ColourMacro)
×
1100
            {
1101
                QColor col = scene->colorValue();
×
1102
                if (col.isValid())
×
1103
                    widget->setBackgroundColor(col);
×
1104
            }
1105
            else if (pType == PaletteGenerator::Gobos)
×
1106
            {
1107
                foreach (SceneValue scv, scene->values())
×
1108
                {
1109
                    Fixture *fixture = m_doc->fixture(scv.fxi);
×
1110
                    if (fixture == NULL)
×
1111
                        continue;
1112

1113
                    const QLCChannel* channel(fixture->channel(scv.channel));
×
1114
                    if (channel->group() == QLCChannel::Gobo)
×
1115
                    {
1116
                        QLCCapability *cap = channel->searchCapability(scv.value);
×
1117
                        if (cap->resource(0).isValid())
×
1118
                        {
1119
                            widget->setBackgroundImage(cap->resource(0).toString());
×
1120
                            break;
1121
                        }
1122
                    }
1123
                }
×
1124
            }
1125
        }
1126
    }
1127

1128
    return widget;
1129
}
1130

1131
QSize FunctionWizard::recursiveCreateWidget(QTreeWidgetItem *item, VCWidget *parent, int type)
×
1132
{
1133
    QSize groupSize(100, 50);
×
1134
    int subX = 10, subY = 40;
1135

1136
    for (int c = 0; c < item->childCount(); c++)
×
1137
    {
1138
        QTreeWidgetItem *childItem = item->child(c);
×
1139

1140
        if (childItem->checkState(KWidgetName) == Qt::Checked ||
×
1141
            childItem->checkState(KWidgetName) == Qt::PartiallyChecked)
×
1142
        {
1143
            int cType = childItem->data(KWidgetName, Qt::UserRole).toInt();
×
1144
            Function *func = NULL;
1145
            QTreeWidgetItem *fxGrpItem  = NULL;
1146
            quint32 channel = 0;
1147

1148
            if (type)
×
1149
            {
1150
                func = (Function *) childItem->data(KWidgetName, Qt::UserRole + 1).value<void *>();
×
1151
            }
1152
            else
1153
            {
1154
                fxGrpItem = (QTreeWidgetItem *) childItem->data(KWidgetName, Qt::UserRole + 1).value<void *>();
×
1155
                channel = childItem->data(KWidgetName, Qt::UserRole + 2).toUInt();
×
1156
            }
1157

1158
            if (childItem->text(KWidgetName).contains("Page"))
×
1159
            {
1160
                VCFrame *frame = (VCFrame *)parent;
1161
                frame->setMultipageMode(true);
×
1162

1163
                if (childItem->childCount() > 0)
×
1164
                {
1165
                    if (childItem->text(KWidgetName).contains("All"))
×
1166
                    {
1167
                        // v page v
1168
                        childItem->setData(KWidgetName, Qt::UserRole + 1, -1); // all fixtures
×
1169
                        childItem->setData(KWidgetName, Qt::UserRole + 2, -1); // all heads
×
1170
                        
1171
                        groupSize = recursiveCreateWidget(childItem, parent, type);                         
×
1172
                        // v frame v
1173
                        childItem->parent()->setData(KWidgetName, Qt::UserRole + 3, groupSize);
×
1174
                        frame->shortcuts().at(frame->currentPage())->setName("All");
×
1175
                        frame->setTotalPagesNumber(frame->totalPagesNumber() + 1);
×
1176
                        frame->slotNextPage();
×
1177
                        continue;
×
1178
                    }
1179
                    else
1180
                    {
1181
                        qint32 fxPages = childItem->data(KWidgetName, Qt::UserRole + 1).toInt();
×
1182
                        qint32 headPages = childItem->data(KWidgetName, Qt::UserRole + 2).toInt();
×
1183
                        qint32 f = fxPages ? 0 : -1;
×
1184

1185
                        for (; f < fxPages; f++)
×
1186
                        {
1187
                            qint32 h = headPages ? 0 : -1;
×
1188
                            for (; h < headPages; h++)
×
1189
                            {
1190
                                // page
1191
                                childItem->setData(KWidgetName, Qt::UserRole + 1, f); // fixture
×
1192
                                childItem->setData(KWidgetName, Qt::UserRole + 2, h); // head
×
1193

1194
                                QSize size = recursiveCreateWidget(childItem, parent, type);
×
1195
                                groupSize = childItem->parent()
1196
                                                ->data(KWidgetName, Qt::UserRole + 3)
×
1197
                                                .toSize();
×
1198

1199
                                if (size.width() > groupSize.width())
×
1200
                                    groupSize.setWidth(size.width());
1201
                                if (size.height() > groupSize.height())
×
1202
                                    groupSize.setHeight(size.height());
1203

1204
                                QString pageName = "";
×
1205
                                if (f >= 0)
×
1206
                                    pageName.append(QString("F%1").arg(f));
×
1207

1208
                                if (h >= 0)
×
1209
                                    pageName.append(QString("%1H%2").arg((f >= 0) ? "/" : "").arg(h));
×
1210

1211
                                frame->shortcuts().at(frame->currentPage())->setName(pageName);
×
1212
                                frame->setTotalPagesNumber(frame->totalPagesNumber() + 1);
×
1213
                                frame->slotNextPage();
×
1214
                            }
×
1215
                        }
1216
                        frame->setTotalPagesNumber(frame->totalPagesNumber() - 1);
×
1217
                        frame->slotSetPage(0);
×
1218
                        frame->updatePageCombo();
×
1219
                    }
1220
                }
1221
                continue;
×
1222
            }
×
1223

1224
            qint32 fxNr = -1;
1225
            qint32 headId = -1;
1226
            if (childItem->parent()->text(KWidgetName).contains("Page"))
×
1227
            {
1228
                fxNr = childItem->parent()->data(KWidgetName, Qt::UserRole + 1).toInt();
×
1229
                headId = childItem->parent()->data(KWidgetName, Qt::UserRole + 2).toInt();
×
1230
            }
1231

1232
            VCWidget *childWidget = createWidget(cType, parent, subX, subY, func, type, fxGrpItem,
×
1233
                                                 channel, fxNr, headId);
1234
            if (childWidget != NULL)
×
1235
            {
1236
                if (childWidget->type() == VCWidget::SliderWidget)
×
1237
                    childWidget->setCaption(childItem->text(KWidgetName).split(" - ")[0]);
×
1238
                else
1239
                    childWidget->setCaption(childItem->text(KWidgetName));
×
1240

1241
                //qDebug() << childItem->text(KWidgetName);
1242
                //qDebug << "p:"<<parent->type() << " spin:" << m_lineCntSpin->value() << " per:" <<wPerLine << Qt::endl;
1243

1244
                if (childItem->childCount() > 0)
×
1245
                {
1246
                    childWidget->resize(QSize(2000, 1000));
×
1247
                    QSize size = recursiveCreateWidget(childItem, childWidget, type);
×
1248
                    childWidget->resize(size);
×
1249
                }
1250

1251
                if (subX + childWidget->width() > groupSize.width())
×
1252
                    groupSize.setWidth(subX + childWidget->width() + 10);
×
1253
                if (subY + childWidget->height() > groupSize.height())
×
1254
                    groupSize.setHeight(subY + childWidget->height() + 10);
×
1255

1256
                int wPerLine = parent->type() == VCWidget::SoloFrameWidget ? 4 : m_lineCntSpin->value();
×
1257
                if (c > 0 && (c + 1)%wPerLine == 0)
×
1258
                {
1259
                    subX = 10;
1260
                    subY += childWidget->height() + 10;
×
1261
                }
1262
                else
1263
                    subX += childWidget->width() + 10;
×
1264
            }
1265
        }
1266
    }
1267

1268
    return groupSize;
×
1269
}
1270

1271
void FunctionWizard::addWidgetsToVirtualConsole()
×
1272
{
1273
    int xPos = 10;
1274
    int yPos = 10;
1275

1276
    VirtualConsole *vc = VirtualConsole::instance();
×
1277
    VCFrame *mainFrame = vc->contents();
×
1278
    Q_ASSERT(mainFrame != NULL);
1279

1280
    for (int i = 0; i < m_widgetsTree->topLevelItemCount(); i++)
×
1281
    {
1282
        QTreeWidgetItem *wItem = m_widgetsTree->topLevelItem(i);
×
1283

1284
        if (wItem->checkState(KWidgetName) == Qt::Checked ||
×
1285
            wItem->checkState(KWidgetName) == Qt::PartiallyChecked)
×
1286
        {
1287
            int wType = wItem->data(KWidgetName, Qt::UserRole).toInt();
×
1288
            VCWidget *widget = createWidget(wType, mainFrame, xPos, yPos);
×
1289
            if (widget == NULL)
×
1290
                continue;
×
1291

1292
            widget->resize(QSize(2000, 1000));
×
1293

1294
            int pType = 0;
1295
            if (!wItem->text(KWidgetName).contains("Channels"))
×
1296
            {
1297
                PaletteGenerator *pal = (PaletteGenerator *) wItem->data(KWidgetName, Qt::UserRole + 1).value<void *>();
×
1298
                pType = pal->type();
×
1299
            }
1300

1301
            widget->setCaption(wItem->text(KWidgetName));
×
1302

1303
            QSize size = recursiveCreateWidget(wItem, widget, pType);
×
1304

1305
            widget->resize(size);
×
1306
            xPos += widget->width() + 10;
×
1307
        }
1308
    }
1309
}
×
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