void MonitorFixture::setFixture(quint32 fxi_id) { Fixture* fxi; /* Get rid of old stuff first, if such exists */ if (m_fixtureLabel != NULL) delete m_fixtureLabel; while (m_channelLabels.isEmpty() == false) delete m_channelLabels.takeFirst(); while (m_valueLabels.isEmpty() == false) delete m_valueLabels.takeFirst(); m_fixture = fxi_id; fxi = m_doc->fixture(m_fixture); if (fxi != NULL) { /* The grid layout uses columns and rows. The first row is for the fixture name, second row for channel numbers and the third row for channel values. Each channel is in its own column. */ QGridLayout* lay = qobject_cast<QGridLayout*> (layout()); /* Create a new fixture label and set the fixture name there */ m_fixtureLabel = new QLabel(this); m_fixtureLabel->setText(QString("<B>%1</B>").arg(fxi->name())); /* Set the fixture name to span all channels horizontally */ lay->addWidget(m_fixtureLabel, 0, 0, 1, fxi->channels(), Qt::AlignLeft); /* Create channel numbers and value labels */ for (quint32 i = 0; i < fxi->channels(); i++) { QLabel* label; QString str; /* Create a label for channel number */ label = new QLabel(this); lay->addWidget(label, 1, i, Qt::AlignHCenter); m_channelLabels.append(label); /* Create a label for value */ label = new QLabel(this); lay->addWidget(label, 2, i, Qt::AlignHCenter); m_valueLabels.append(label); } } }
bool Doc::moveFixture(quint32 id, quint32 newAddress) { if (m_fixtures.contains(id) == true) { Fixture* fixture = m_fixtures[id]; // remove it QMutableHashIterator <uint,uint> it(m_addresses); while (it.hasNext() == true) { it.next(); if (it.value() == id) it.remove(); } // add it to new address for (uint i = newAddress; i < newAddress + fixture->channels(); i++) { m_addresses[i] = id; } setModified(); return true; } else { qWarning() << Q_FUNC_INFO << "No fixture with id" << id; return false; } }
bool Scene::setFixture(t_fixture_id id) { Fixture* fxi = NULL; fxi = _app->doc()->fixture(id); if (fxi == NULL) { return false; } t_channel newChannels = fxi->channels(); if (m_channels == 0) { m_channels = newChannels; m_values = new SceneValue[m_channels]; for (t_channel i = 0; i < m_channels; i++) { m_values[i].value = 0; m_values[i].type = Fade; } } else { Q_ASSERT(m_channels == newChannels); } m_fixture = id; _app->doc()->emitFunctionChanged(m_id); return true; }
// // Paint all visible fixture labels // void Monitor::paintFixtureLabelAll(QRegion region, int x_offset, int y_offset, int unitW, int unitH, int unitsX) { int x = 0; int y = 0; int w = 0; int wcur = 0; int h = 0; t_fixture_id id = KNoID; Fixture* fxi = NULL; // Draw fixture names and their channel spaces for (id = 0; id < KFixtureArraySize; id++) { fxi = _app->doc()->fixture(id); if (fxi == NULL) continue; if (fxi->universe() != m_universe) continue; // Calculate x and y positions for this fixture label x = ((fxi->address() % unitsX) * unitW); x += x_offset; y = static_cast<int> (floor((fxi->address() / unitsX)) * (unitH * 3)); y += y_offset; // Get width and height for this fixture label w = (fxi->channels() * unitW) - X_OFFSET; h = unitH; // Check if this label needs to be painted at all if (region.contains(QRect(x, y, w, h)) == false) continue; if ((x + w + X_OFFSET) <= width()) { // The label fits to one line, just draw it paintFixtureLabel(x, y, w, h, fxi->name()); } else { // The label needs to be drawn on at least two lines while (w > 0) { wcur = MIN(w, (unitsX * unitW) - (x)); // Draw the label paintFixtureLabel(x, y, wcur, h, fxi->name()); // Calculate remaining width w = w - wcur - X_OFFSET; // Next line y += (unitH * 3); x = x_offset; } } } }
void RGBMatrix_Test::initTestCase() { m_doc = new Doc(this); QDir fxiDir(INTERNAL_FIXTUREDIR); fxiDir.setFilter(QDir::Files); fxiDir.setNameFilters(QStringList() << QString("*%1").arg(KExtFixture)); QVERIFY(m_doc->fixtureDefCache()->loadMap(fxiDir) == true); QLCFixtureDef* def = m_doc->fixtureDefCache()->fixtureDef("Stairville", "LED PAR56"); QVERIFY(def != NULL); QLCFixtureMode* mode = def->modes().first(); QVERIFY(mode != NULL); FixtureGroup* grp = new FixtureGroup(m_doc); grp->setName("Test Group"); grp->setSize(QSize(5, 5)); m_doc->addFixtureGroup(grp); for (int i = 0; i < 25; i++) { Fixture* fxi = new Fixture(m_doc); fxi->setFixtureDefinition(def, mode); fxi->setAddress(i * fxi->channels()); m_doc->addFixture(fxi); grp->assignFixture(fxi->id()); } QVERIFY(m_doc->rgbScriptsCache()->load(QDir(INTERNAL_SCRIPTDIR))); QVERIFY(m_doc->rgbScriptsCache()->names().size() != 0); }
void FixtureConsole::setFixture(t_fixture_id id) { ConsoleChannel* cc = NULL; Fixture* fxi = NULL; /* Get rid of any previous channels */ while (m_channels.isEmpty() == false) delete m_channels.takeFirst(); m_fixture = id; fxi = _app->doc()->fixture(m_fixture); Q_ASSERT(fxi != NULL); /* Create channel units */ for (unsigned int i = 0; i < fxi->channels(); i++) { const QLCChannel* ch = fxi->channel(i); Q_ASSERT(ch != NULL); if (ch->group() == QLCChannel::NoGroup) continue; cc = new ConsoleChannel(this, m_fixture, i); cc->setCheckable(m_channelsCheckable); layout()->addWidget(cc); connect(cc, SIGNAL(valueChanged(quint32,uchar,bool)), this, SLOT(slotValueChanged(quint32,uchar,bool))); m_channels.append(cc); } /* Make a spacer item eat excess space to justify channels left */ layout()->addItem(new QSpacerItem(20, 20, QSizePolicy::Expanding)); }
void FixtureManager::slotAutoFunction() { #if 0 QTreeWidgetItem* item; t_fixture_id fxi_id; Fixture* fxi; item = m_tree->currentItem(); if (item == NULL) return; fxi_id = item->text(KColumnID).toInt(); fxi = _app->doc()->fixture(fxi_id); Q_ASSERT(fxi != NULL); // Loop over all channels for (int i = 0; i < fxi->channels(); i++) { QLCChannel* channel = fxi->channel(i); Q_ASSERT(channel != NULL); QListIterator <QLCCapability*> cap_it(*channel->capabilities()); // Loop over all capabilities while (cap_it.hasNext() == true) { QLCCapability* cap = cap_it.next(); Q_ASSERT(cap != NULL); Scene* sc = static_cast<Scene*> (_app->doc()->newFunction(Function::Scene, fxi_id)); sc->setName(channel->name() + " - " + cap->name()); // Set the unused channels to NoSet and zero. for (int j = 0; j < fxi->channels(); j++) sc->set(j, 0, Scene::NoSet); // Set only the capability sc->set(i, (t_value) ((cap->min() + cap->max()) / 2), Scene::Set); } } #endif }
void FixtureList::init() { QTreeWidgetItem* item; m_listView->clear(); connect(m_listView, SIGNAL(itemSelectionChanged()), this, SLOT(slotSelectionChanged())); connect(m_listView, SIGNAL(itemDoubleClicked(QTreeWidgetItem*)), this, SLOT(slotItemDoubleClicked())); for (t_fixture_id fxi_id = 0; fxi_id < KFixtureArraySize; fxi_id++) { Fixture* fxi = _app->doc()->fixture(fxi_id); if (fxi == NULL) continue; for (unsigned int n = 0; n < fxi->channels(); n++) { QLCChannel* channel; QString s; // Create a new item for a channel item = new QTreeWidgetItem(m_listView); // Fixture name item->setText(KColumnFixtureName, fxi->name()); // Channel name channel = fxi->channel(n); if (channel != NULL) { s.sprintf("%.3d: ", n + 1); s += channel->name(); item->setText(KColumnChannelName, s); } else { delete item; break; } // Relative channel number (not shown) s.sprintf("%.3d", n); item->setText(KColumnChannelNum, s); // Fixture ID (not shown) item->setText(KColumnFixtureID, QString("%1").arg(fxi_id)); } } /* Select the first item */ item = m_listView->topLevelItem(0); if (item != NULL) item->setSelected(true); }
bool Doc::replaceFixtures(QList<Fixture*> newFixturesList) { // Delete all fixture instances QListIterator <quint32> fxit(m_fixtures.keys()); while (fxit.hasNext() == true) { Fixture* fxi = m_fixtures.take(fxit.next()); delete fxi; m_fixturesListCacheUpToDate = false; } m_latestFixtureId = 0; m_addresses.clear(); foreach(Fixture *fixture, newFixturesList) { quint32 id = fixture->id(); // create a copy of the original cause remapping will // destroy it later Fixture *newFixture = new Fixture(this); newFixture->setID(id); newFixture->setName(fixture->name()); newFixture->setAddress(fixture->address()); newFixture->setUniverse(fixture->universe()); if (fixture->fixtureDef() == NULL || (fixture->fixtureDef()->manufacturer() == KXMLFixtureGeneric && fixture->fixtureDef()->model() == KXMLFixtureGeneric)) { newFixture->setChannels(fixture->channels()); } else { QLCFixtureDef *def = fixtureDefCache()->fixtureDef(fixture->fixtureDef()->manufacturer(), fixture->fixtureDef()->model()); QLCFixtureMode *mode = NULL; if (def != NULL) mode = def->mode(fixture->fixtureMode()->name()); newFixture->setFixtureDefinition(def, mode); } newFixture->setExcludeFadeChannels(fixture->excludeFadeChannels()); m_fixtures.insert(id, newFixture); m_fixturesListCacheUpToDate = false; /* Patch fixture change signals thru Doc */ connect(newFixture, SIGNAL(changed(quint32)), this, SLOT(slotFixtureChanged(quint32))); /* Keep track of fixture addresses */ for (uint i = newFixture->universeAddress(); i < newFixture->universeAddress() + newFixture->channels(); i++) { m_addresses[i] = id; } m_latestFixtureId = id; }
void ChaserRunner_Test::init() { QLCFixtureDef* def = m_doc->fixtureDefCache()->fixtureDef("Futurelight", "DJScan250"); QVERIFY(def != NULL); QLCFixtureMode* mode = def->mode("Mode 1"); QVERIFY(mode != NULL); Fixture* fxi = new Fixture(m_doc); QVERIFY(fxi != NULL); fxi->setFixtureDefinition(def, mode); fxi->setName("Test Fixture"); fxi->setAddress(0); fxi->setUniverse(0); m_doc->addFixture(fxi); m_scene1 = new Scene(m_doc); m_scene1->setName("S1"); QVERIFY(m_scene1 != NULL); for (quint32 i = 0; i < fxi->channels(); i++) m_scene1->setValue(fxi->id(), i, 255 - i); m_doc->addFunction(m_scene1); m_scene2 = new Scene(m_doc); m_scene2->setName("S2"); QVERIFY(m_scene2 != NULL); for (quint32 i = 0; i < fxi->channels(); i++) m_scene2->setValue(fxi->id(), i, 127 - i); m_doc->addFunction(m_scene2); m_scene3 = new Scene(m_doc); m_scene3->setName("S3"); QVERIFY(m_scene3 != NULL); for (quint32 i = 0; i < fxi->channels(); i++) m_scene3->setValue(fxi->id(), i, 0 + i); m_doc->addFunction(m_scene3); m_chaser = new Chaser(m_doc); m_chaser->addStep(ChaserStep(m_scene1->id())); m_chaser->addStep(ChaserStep(m_scene2->id())); m_chaser->addStep(ChaserStep(m_scene3->id())); }
void Doc::slotFixtureChanged(quint32 id) { /* Keep track of fixture addresses */ Fixture* fxi = fixture(id); for (uint i = fxi->universeAddress(); i < fxi->universeAddress() + fxi->channels(); i++) { m_addresses[i] = id; } setModified(); emit fixtureChanged(id); }
void FixtureList::init() { QListViewItem* item = NULL; QLCChannel* channel = NULL; Fixture* fxi = NULL; unsigned int n = 0; QString fxi_id; QString s; m_listView->clear(); for (t_fixture_id i = 0; i < KFixtureArraySize; i++) { fxi = _app->doc()->fixture(i); if (fxi == NULL) continue; fxi_id.setNum(fxi->id()); for (n = 0; n < fxi->channels(); n++) { // Create a new item for a channel item = new QListViewItem(m_listView); // Fixture name item->setText(KColumnFixtureName, fxi->name()); // Channel name channel = fxi->channel(n); if (channel != NULL) { s.sprintf("%.3d: ", n + 1); s += channel->name(); item->setText(KColumnChannelName, s); } else { delete item; break; } // Relative channel number (not shown) s.sprintf("%.3d", n); item->setText(KColumnChannelNum, s); // Fixture ID (not shown) item->setText(KColumnFixtureID, fxi_id); } } m_listView->setSelected(m_listView->firstChild(), true); }
// Save this function to an XML document bool Scene::saveXML(QDomDocument* doc, QDomElement* wksp_root) { Fixture* fxi = NULL; QDomElement root; QDomElement tag; QDomText text; QString str; Q_ASSERT(doc != NULL); Q_ASSERT(wksp_root != NULL); fxi = _app->doc()->fixture(m_fixture); Q_ASSERT(fxi != NULL); /* Function tag */ root = doc->createElement(KXMLQLCFunction); wksp_root->appendChild(root); root.setAttribute(KXMLQLCFunctionID, id()); root.setAttribute(KXMLQLCFunctionType, Function::typeToString(m_type)); root.setAttribute(KXMLQLCFunctionName, name()); root.setAttribute(KXMLQLCFunctionFixture, fixture()); /* Speed bus */ tag = doc->createElement(KXMLQLCBus); root.appendChild(tag); tag.setAttribute(KXMLQLCBusRole, KXMLQLCBusFade); str.setNum(busID()); text = doc->createTextNode(str); tag.appendChild(text); /* Scene contents */ for (t_channel i = 0; i < fxi->channels(); i++) { /* Value tag */ tag = doc->createElement(KXMLQLCFunctionValue); /* Value type & channel */ tag.setAttribute(KXMLQLCFunctionChannel, i); tag.setAttribute(KXMLQLCFunctionValueType, valueTypeString(i)); root.appendChild(tag); /* Value contents */ str.setNum(m_values[i].value); text = doc->createTextNode(str); tag.appendChild(text); } }
void MainView2D::createFixtureItems(quint32 fxID, QVector3D pos, bool mmCoords) { Fixture *fixture = m_doc->fixture(fxID); if (fixture == NULL) return; if (fixture->type() == QLCFixtureDef::Dimmer) { for (quint32 i = 0; i < fixture->channels(); i++) createFixtureItem(fixture->id(), i, 0, pos, mmCoords); } else { createFixtureItem(fixture->id(), 0, 0, pos, mmCoords); } }
void Fixture_Test::loader() { QBuffer buffer; buffer.open(QIODevice::WriteOnly | QIODevice::Text); QXmlStreamWriter xmlWriter(&buffer); xmlWriter.writeStartElement("Fixture"); xmlWriter.writeTextElement("Channels", "18"); xmlWriter.writeTextElement("Name", "Foobar"); xmlWriter.writeTextElement("Universe", "3"); xmlWriter.writeTextElement("Model", "Foobar"); xmlWriter.writeTextElement("Mode", "Foobar"); xmlWriter.writeTextElement("Manufacturer", "Foobar"); xmlWriter.writeTextElement("ID", "42"); xmlWriter.writeTextElement("Address", "21"); xmlWriter.writeEndDocument(); xmlWriter.setDevice(NULL); buffer.close(); buffer.open(QIODevice::ReadOnly | QIODevice::Text); QXmlStreamReader xmlReader(&buffer); xmlReader.readNextStartElement(); QVERIFY(m_doc != NULL); QVERIFY(m_doc->fixtures().size() == 0); QVERIFY(Fixture::loader(xmlReader, m_doc) == true); QVERIFY(m_doc->fixtures().size() == 1); QVERIFY(m_doc->fixture(0) == NULL); // No ID auto-assignment Fixture* fxi = m_doc->fixture(42); QVERIFY(fxi != NULL); QVERIFY(fxi->name() == "Foobar"); QVERIFY(fxi->channels() == 18); QVERIFY(fxi->address() == 21); QVERIFY(fxi->universe() == 3); QVERIFY(fxi->fixtureDef() != NULL); QVERIFY(fxi->fixtureMode() != NULL); }
void SceneEditor::slotRemoveFixtureClicked() { int r = QMessageBox::question( this, tr("Remove fixtures"), tr("Do you want to remove the selected fixture(s)?"), QMessageBox::Yes, QMessageBox::No); if (r == QMessageBox::Yes) { QListIterator <Fixture*> it(selectedFixtures()); while (it.hasNext() == true) { Fixture* fixture = it.next(); Q_ASSERT(fixture != NULL); removeFixtureTab(fixture); removeFixtureItem(fixture); /* Remove all values associated to the fixture */ for (quint32 i = 0; i < fixture->channels(); i++) m_scene->unsetValue(fixture->id(), i); } } }
QMultiHash<int, SceneValue> FixtureManager::setFixtureCapabilities(quint32 fxID, bool enable) { int capDelta = 1; bool hasDimmer = false, hasColor = false, hasPosition = false; QMultiHash<int, SceneValue> channelsMap; Fixture *fixture = m_doc->fixture(fxID); if (fixture == NULL) return channelsMap; if (enable == false) capDelta = -1; for (quint32 ch = 0; ch < fixture->channels(); ch++) { const QLCChannel* channel(fixture->channel(ch)); if(channel == NULL) continue; int chType = channel->group(); switch (channel->group()) { case QLCChannel::Intensity: { QLCChannel::PrimaryColour col = channel->colour(); switch (col) { case QLCChannel::NoColour: hasDimmer = true; break; case QLCChannel::Red: case QLCChannel::Green: case QLCChannel::Blue: case QLCChannel::Cyan: case QLCChannel::Magenta: case QLCChannel::Yellow: case QLCChannel::White: hasColor = true; break; default: break; } chType = col; } break; case QLCChannel::Pan: case QLCChannel::Tilt: hasPosition = true; break; default: break; } if (hasDimmer) { QQuickItem *dimmerCapItem = qobject_cast<QQuickItem*>(m_view->rootObject()->findChild<QObject *>("capIntensity")); dimmerCapItem->setProperty("counter", dimmerCapItem->property("counter").toInt() + capDelta); } if (hasColor) { QQuickItem *colorCapItem = qobject_cast<QQuickItem*>(m_view->rootObject()->findChild<QObject *>("capColor")); colorCapItem->setProperty("counter", colorCapItem->property("counter").toInt() + capDelta); } if (hasPosition) { QQuickItem *positionCapItem = qobject_cast<QQuickItem*>(m_view->rootObject()->findChild<QObject *>("capPosition")); positionCapItem->setProperty("counter", positionCapItem->property("counter").toInt() + capDelta); } channelsMap.insert(chType, SceneValue(fxID, ch)); } return channelsMap; }
void FixtureConsole::setFixture(t_fixture_id id) { unsigned int i = 0; Fixture* fxi = NULL; ConsoleChannel* unit = NULL; m_fixture = id; fxi = _app->doc()->fixture(m_fixture); assert(fxi); // Set an icon setIcon(QPixmap(PIXMAPS + QString("/console.png"))); // Set the main horizontal layout m_layout = new QHBoxLayout(this); m_layout->setAutoAdd(true); // Create scene editor widget if (m_sceneEditor) delete m_sceneEditor; m_sceneEditor = new SceneEditor(this); m_sceneEditor->setFixture(m_fixture); m_sceneEditor->show(); // Catch function add signals connect(_app->doc(), SIGNAL(functionAdded(t_function_id)), m_sceneEditor, SLOT(slotFunctionAdded(t_function_id))); // Catch function remove signals connect(_app->doc(), SIGNAL(functionRemoved(t_function_id)), m_sceneEditor, SLOT(slotFunctionRemoved(t_function_id))); // Catch function change signals connect(_app->doc(), SIGNAL(functionChanged(t_function_id)), m_sceneEditor, SLOT(slotFunctionChanged(t_function_id))); // Create channel units for (i = 0; i < fxi->channels(); i++) { unit = new ConsoleChannel(this, m_fixture, i); unit->init(); unit->update(); // Channel updates to scene editor connect(unit, SIGNAL(changed(t_channel, t_value, Scene::ValueType)), m_sceneEditor, SLOT(slotChannelChanged(t_channel, t_value, Scene::ValueType))); // Scene editor updates to channels connect(m_sceneEditor, SIGNAL(sceneActivated(SceneValue*, t_channel)), unit, SLOT(slotSceneActivated(SceneValue*, t_channel))); m_unitList.append(unit); } /* Resize the console to some sensible proportions if at least one channel unit was inserted */ if (unit != NULL) resize(m_sceneEditor->width() + (fxi->channels() * unit->width()), 250); // Update scene editor (also causes an update to channelunits) m_sceneEditor->update(); }
void Fixture_Test::loader() { QDomDocument doc; QDomElement root = doc.createElement("Fixture"); doc.appendChild(root); QDomElement chs = doc.createElement("Channels"); QDomText chsText = doc.createTextNode("18"); chs.appendChild(chsText); root.appendChild(chs); QDomElement name = doc.createElement("Name"); QDomText nameText = doc.createTextNode("Foobar"); name.appendChild(nameText); root.appendChild(name); QDomElement uni = doc.createElement("Universe"); QDomText uniText = doc.createTextNode("3"); uni.appendChild(uniText); root.appendChild(uni); QDomElement model = doc.createElement("Model"); QDomText modelText = doc.createTextNode("Foobar"); model.appendChild(modelText); root.appendChild(model); QDomElement mode = doc.createElement("Mode"); QDomText modeText = doc.createTextNode("Foobar"); mode.appendChild(modeText); root.appendChild(mode); QDomElement type = doc.createElement("Manufacturer"); QDomText typeText = doc.createTextNode("Foobar"); type.appendChild(typeText); root.appendChild(type); QDomElement id = doc.createElement("ID"); QDomText idText = doc.createTextNode("42"); id.appendChild(idText); root.appendChild(id); QDomElement addr = doc.createElement("Address"); QDomText addrText = doc.createTextNode("21"); addr.appendChild(addrText); root.appendChild(addr); Doc* qlcdoc = new Doc(this, m_fixtureDefCache); QVERIFY(qlcdoc != NULL); QVERIFY(qlcdoc->fixtures() == 0); QVERIFY(Fixture::loader(&root, qlcdoc) == true); QVERIFY(qlcdoc->fixtures() == 1); QVERIFY(qlcdoc->fixture(0) == NULL); // No ID auto-assignment Fixture* fxi = qlcdoc->fixture(42); QVERIFY(fxi != NULL); QVERIFY(fxi->name() == "Foobar"); QVERIFY(fxi->channels() == 18); QVERIFY(fxi->address() == 21); QVERIFY(fxi->universe() == 3); QVERIFY(fxi->fixtureDef() == NULL); QVERIFY(fxi->fixtureMode() == NULL); delete qlcdoc; }
void AddFixture_Test::initialScanner() { Fixture* fxi = new Fixture(m_doc); fxi->setName("My scanner"); QLCFixtureDef* def = m_doc->fixtureDefCache()->fixtureDef("Martin", "MAC300"); Q_ASSERT(def != NULL); Q_ASSERT(def != NULL); Q_ASSERT(def->channels().size() > 0); QLCFixtureMode* mode = def->modes().first(); Q_ASSERT(def->modes().size() > 1); fxi->setFixtureDefinition(def, mode); fxi->setUniverse(2); fxi->setAddress(484); m_doc->addFixture(fxi); AddFixture af(NULL, m_doc, fxi); QVERIFY(m_doc == af.m_doc); QVERIFY(af.fixtureDef() == def); QVERIFY(af.mode() == mode); QVERIFY(af.name() == QString("My scanner")); QVERIFY(af.address() == 484); QVERIFY(af.universe() == 2); QVERIFY(af.amount() == 1); QVERIFY(af.gap() == 0); QVERIFY(af.channels() == fxi->channels()); // Check that all makes & models are put to the tree QStringList makers(m_doc->fixtureDefCache()->manufacturers()); QVERIFY(makers.isEmpty() == false); for (int i = 0; i < af.m_tree->topLevelItemCount(); i++) { QTreeWidgetItem* top = af.m_tree->topLevelItem(i); if (top->text(0) != KXMLFixtureGeneric) { QStringList models(m_doc->fixtureDefCache()->models(top->text(0))); for (int j = 0; j < top->childCount(); j++) { QTreeWidgetItem* child = top->child(j); QCOMPARE(child->childCount(), 0); QCOMPARE(models.removeAll(child->text(0)), 1); } QCOMPARE(makers.removeAll(top->text(0)), 1); } else { QCOMPARE(i, af.m_tree->topLevelItemCount() - 1); // Generic should be last QCOMPARE(top->childCount(), 3); QCOMPARE(top->child(0)->text(0), QString(KXMLFixtureGeneric)); QStringList models(m_doc->fixtureDefCache()->models(top->text(0))); for (int j = 0; j < top->childCount(); j++) { QTreeWidgetItem* child = top->child(j); QCOMPARE(child->childCount(), 0); QCOMPARE(models.removeAll(child->text(0)), child->text(0) == KXMLFixtureGeneric ? 0 : 1); } QCOMPARE(makers.removeAll(top->text(0)), 1); } } QVERIFY(makers.isEmpty() == true); // Generic / Generic should be selected for dimmers QVERIFY(af.m_tree->currentItem() != NULL); QCOMPARE(af.m_tree->currentItem()->text(0), def->model()); QVERIFY(af.m_tree->currentItem()->parent() != NULL); QCOMPARE(af.m_tree->currentItem()->parent()->text(0), def->manufacturer()); QVERIFY(af.m_modeCombo->isEnabled() == true); QCOMPARE(af.m_modeCombo->count(), def->modes().size()); QCOMPARE(af.m_modeCombo->itemText(0), mode->name()); QVERIFY(af.m_universeCombo->isEnabled() == true); QCOMPARE(af.m_universeCombo->currentIndex(), 2); QCOMPARE(af.m_universeCombo->count(), 4); QVERIFY(af.m_addressSpin->isEnabled() == true); QCOMPARE(af.m_addressSpin->value(), 485); QVERIFY(af.m_channelsSpin->isEnabled() == false); QCOMPARE(af.m_channelsSpin->value(), (int) fxi->channels()); QVERIFY(af.m_nameEdit->isEnabled() == true); QCOMPARE(af.m_nameEdit->text(), QString("My scanner")); QVERIFY(af.m_nameEdit->isModified() == true); QVERIFY(af.m_multipleGroup->isEnabled() == false); QVERIFY(af.m_gapSpin->isEnabled() == false); QCOMPARE(af.m_gapSpin->value(), 0); QVERIFY(af.m_amountSpin->isEnabled() == false); QCOMPARE(af.m_amountSpin->value(), 1); }
QString Script::handleSetFixture(const QList<QStringList>& tokens, QList<Universe *> universes) { qDebug() << Q_FUNC_INFO; if (tokens.size() > 4) return QString("Too many arguments"); bool ok = false; quint32 id = 0; quint32 ch = 0; uchar value = 0; double time = 0; id = tokens[0][1].toUInt(&ok); if (ok == false) return QString("Invalid fixture (ID: %1)").arg(tokens[0][1]); for (int i = 1; i < tokens.size(); i++) { QStringList list = tokens[i]; list[0] = list[0].toLower().trimmed(); if (list.size() == 2) { ok = false; if (list[0] == "val" || list[0] == "value") value = uchar(list[1].toUInt(&ok)); else if (list[0] == "ch" || list[0] == "channel") ch = list[1].toUInt(&ok); else if (list[0] == "time") time = list[1].toDouble(&ok); else return QString("Unrecognized keyword: %1").arg(list[0]); if (ok == false) return QString("Invalid value (%1) for keyword: %2").arg(list[1]).arg(list[0]); } } Doc* doc = qobject_cast<Doc*> (parent()); Q_ASSERT(doc != NULL); Fixture* fxi = doc->fixture(id); if (fxi != NULL) { if (ch < fxi->channels()) { int address = fxi->address() + ch; if (address < 512) { GenericFader* gf = fader(); Q_ASSERT(gf != NULL); FadeChannel fc; fc.setFixture(doc, fxi->id()); fc.setChannel(ch); fc.setTarget(value); fc.setFadeTime(time); // If the script has used the channel previously, it might still be in // the bowels of GenericFader so get the starting value from there. // Otherwise get it from universes (HTP channels are always 0 then). quint32 uni = fc.universe(); if (gf->channels().contains(fc) == true) fc.setStart(gf->channels()[fc].current()); else fc.setStart(universes[uni]->preGMValue(address)); fc.setCurrent(fc.start()); gf->add(fc); return QString(); } else { return QString("Invalid address: %1").arg(address); } } else { return QString("Fixture (%1) has no channel number %2").arg(fxi->name()).arg(ch); } } else { return QString("No such fixture (ID: %1)").arg(id); } }