bool VCFrame::loader(QDomDocument* doc, QDomElement* root, QWidget* parent) { VCFrame* frame = NULL; Q_ASSERT(doc != NULL); Q_ASSERT(root != NULL); Q_ASSERT(parent != NULL); if (root->tagName() != KXMLQLCVCFrame) { qWarning("Frame node not found!"); return false; } /* Create a new frame into its parent */ frame = new VCFrame(parent); frame->show(); /* If the current parent widget is anything else than VCFrame, the currently loaded VCFrame is the parent of all VC widgets */ if (parent->className() != "VCFrame") _app->virtualConsole()->setDrawArea(frame); /* Continue loading */ return frame->loadXML(doc, root); }
void VirtualConsole::createWidget(QPtrList <QString> &list) { QString t; for (QString* s = list.next(); s != NULL; s = list.next()) { if (*s == QString("Entry")) { s = list.prev(); break; } else if (*s == QString("Frame")) { if (m_drawArea == NULL) { m_drawArea = new VCFrame(this); m_drawArea->init(); m_drawArea->setBottomFrame(true); m_drawArea->setFrameStyle(QFrame::Panel | QFrame::Sunken); m_layout->addWidget(m_drawArea, 1); m_drawArea->createContents(list); m_drawArea->show(); } else { VCFrame* w = new VCFrame(m_drawArea); w->init(); w->createContents(list); } } else if (*s == QString("Label")) { VCLabel* w = new VCLabel(m_drawArea); w->init(); w->createContents(list); } else if (*s == QString("Button")) { VCButton* w = new VCButton(m_drawArea); w->init(); w->createContents(list); } else if (*s == QString("Slider")) { VCDockSlider* s = new VCDockSlider(m_drawArea); s->init(); s->createContents(list); } else { // Unknown keyword, skip list.next(); } } }
void VCFrame_Test::customMenu() { VCFrame* frame = VirtualConsole::instance()->contents(); QVERIFY(frame != NULL); QMenu menu; QMenu* customMenu = frame->customMenu(&menu); QVERIFY(customMenu != NULL); QCOMPARE(customMenu->title(), tr("Add")); delete customMenu; }
void VCFrame::slotAddFrame(QPoint p) { VCFrame* f = new VCFrame(this); assert(f); f->init(); f->show(); f->move(p); _app->doc()->setModified(true); }
VCWidget* VCFrame::createCopy(VCWidget* parent) { Q_ASSERT(parent != NULL); VCFrame* frame = new VCFrame(parent); if (frame->copyFrom(this) == false) { delete frame; frame = NULL; } return frame; }
VCWidget* VCFrame::createCopy(VCWidget* parent) { Q_ASSERT(parent != NULL); VCFrame* frame = new VCFrame(parent, m_doc, m_outputMap, m_inputMap, m_masterTimer); if (frame->copyFrom(this) == false) { delete frame; frame = NULL; } return frame; }
void VirtualConsole::slotAddFrame() { VCWidget* parent(closestParent()); if (parent == NULL) return; VCFrame* frame = new VCFrame(parent, m_doc); Q_ASSERT(frame != NULL); frame->show(); frame->move(parent->lastClickPoint()); clearWidgetSelection(); setWidgetSelected(frame, true); m_doc->setModified(); }
void VCFrame::addFrame(QPoint at) { VCFrame* frame = new VCFrame(this); Q_ASSERT(frame != NULL); frame->show(); if (at.isNull() == false) frame->move(at); else frame->move(m_mousePressPoint); _app->virtualConsole()->setSelectedWidget(frame); _app->doc()->setModified(); }
void VCFrameProperties_Test::initial() { VCFrame* frame = new VCFrame(VirtualConsole::instance()->contents(), m_doc); frame->setAllowChildren(false); frame->setAllowResize(true); QWidget w; VCFrameProperties prop(&w, frame, m_doc); QCOMPARE(prop.m_allowChildrenCheck->isChecked(), false); QCOMPARE(prop.m_allowResizeCheck->isChecked(), true); prop.m_allowChildrenCheck->setChecked(true); prop.m_allowResizeCheck->setChecked(false); prop.accept(); QCOMPARE(prop.allowChildren(), true); QCOMPARE(prop.allowResize(), false); }
bool VCFrame::loader(const QDomElement* root, QWidget* parent) { VCFrame* frame = NULL; Q_ASSERT(root != NULL); Q_ASSERT(parent != NULL); if (root->tagName() != KXMLQLCVCFrame) { qDebug() << "Frame node not found!"; return false; } /* Create a new frame into its parent */ frame = new VCFrame(parent); frame->show(); /* Continue loading */ return frame->loadXML(root); }
void VirtualConsole::slotAddFrame() { QWidget* parent = NULL; if (m_selectedWidget && QString(m_selectedWidget->className()) == QString("VCFrame")) { parent = m_selectedWidget; } else { parent = m_drawArea; } VCFrame* f = new VCFrame(parent); assert(f); f->init(); f->show(); _app->doc()->setModified(true); }
VirtualConsole::VirtualConsole(QQuickView *view, Doc *doc, QObject *parent) : PreviewContext(view, doc, parent) , m_latestWidgetId(0) , m_resizeMode(false) , m_selectedWidget(NULL) { Q_ASSERT(doc != NULL); for (int i = 0; i < VC_PAGES_NUMBER; i++) { VCFrame *page = new VCFrame(m_doc, this, this); QQmlEngine::setObjectOwnership(page, QQmlEngine::CppOwnership); page->setAllowResize(false); page->setShowHeader(false); page->setGeometry(QRect(0, 0, 1920, 1080)); page->setFont(QFont("RobotoCondensed", 16)); m_pages.append(page); } qmlRegisterType<VCWidget>("com.qlcplus.classes", 1, 0, "VCWidget"); qmlRegisterType<VCFrame>("com.qlcplus.classes", 1, 0, "VCFrame"); qmlRegisterType<VCButton>("com.qlcplus.classes", 1, 0, "VCButton"); }
void VirtualConsole::slotAddButtonMatrix() { VCWidget* parent(closestParent()); if (parent == NULL) return; AddVCButtonMatrix abm(this, m_doc); if (abm.exec() == QDialog::Rejected) return; int h = abm.horizontalCount(); int v = abm.verticalCount(); int sz = abm.buttonSize(); VCFrame* frame = NULL; if (abm.frameStyle() == AddVCButtonMatrix::NormalFrame) frame = new VCFrame(parent, m_doc); else frame = new VCSoloFrame(parent, m_doc); Q_ASSERT(frame != NULL); // Resize the parent frame to fit the buttons nicely and toggle resizing off frame->resize(QSize((h * sz) + 20, (v * sz) + 20)); frame->setAllowResize(false); for (int y = 0; y < v; y++) { for (int x = 0; x < h; x++) { VCButton* button = new VCButton(frame, m_doc); Q_ASSERT(button != NULL); button->move(QPoint(10 + (x * sz), 10 + (y * sz))); button->resize(QSize(sz, sz)); button->show(); int index = (y * h) + x; if (index < abm.functions().size()) { quint32 fid = abm.functions().at(index); Function* function = m_doc->function(fid); if (function != NULL) { button->setFunction(fid); button->setCaption(function->name()); } } } } // Show the frame after adding buttons to prevent flickering frame->show(); frame->move(parent->lastClickPoint()); frame->setAllowChildren(false); // Don't allow more children clearWidgetSelection(); setWidgetSelected(frame, true); m_doc->setModified(); }
void VCFrame_Test::handleWidgetSelection() { VCFrame* frame = VirtualConsole::instance()->contents(); QVERIFY(frame->isBottomFrame() == true); QMouseEvent ev(QEvent::MouseButtonPress, QPoint(0, 0), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); frame->handleWidgetSelection(&ev); // Select bottom frame (->no selection) frame->handleWidgetSelection(&ev); QCOMPARE(VirtualConsole::instance()->selectedWidgets().size(), 0); // Select a child frame VCFrame* child = new VCFrame(frame, m_doc); QVERIFY(child->isBottomFrame() == false); child->handleWidgetSelection(&ev); QCOMPARE(VirtualConsole::instance()->selectedWidgets().size(), 1); // Again select bottom frame frame->handleWidgetSelection(&ev); QCOMPARE(VirtualConsole::instance()->selectedWidgets().size(), 0); }
void VirtualConsole::slotAddSliderMatrix() { VCWidget* parent(closestParent()); if (parent == NULL) return; AddVCSliderMatrix avsm(this); if (avsm.exec() == QDialog::Rejected) return; int width = VCSlider::defaultSize.width(); int height = avsm.height(); int count = avsm.amount(); VCFrame* frame = new VCFrame(parent, m_doc); Q_ASSERT(frame != NULL); // Resize the parent frame to fit the sliders nicely frame->resize(QSize((count * width) + 20, height + 20)); frame->setAllowResize(false); for (int i = 0; i < count; i++) { VCSlider* slider = new VCSlider(frame, m_doc); Q_ASSERT(slider != NULL); slider->move(QPoint(10 + (width * i), 10)); slider->resize(QSize(width, height)); slider->show(); } // Show the frame after adding buttons to prevent flickering frame->show(); frame->move(parent->lastClickPoint()); frame->setAllowChildren(false); // Don't allow more children clearWidgetSelection(); setWidgetSelected(frame, true); m_doc->setModified(); }
void VCFrame::saveFramesToFile(QFile& file, t_vc_id parentID) { QString s; QString t; // Comment s = QString("# Virtual Console Frame Entry\n"); file.writeBlock((const char*) s, s.length()); // Entry type s = QString("Entry = Frame") + QString("\n"); file.writeBlock((const char*) s, s.length()); // Name s = QString("Name = ") + caption() + QString("\n"); file.writeBlock((const char*) s, s.length()); // Parent ID if (parentID != 0) { t.setNum(parentID); s = QString("Parent = ") + t + QString("\n"); file.writeBlock((const char*) s, s.length()); } // Geometry if (m_bottomFrame == false) { // X t.setNum(x()); s = QString("X = ") + t + QString("\n"); file.writeBlock((const char*) s, s.length()); // Y t.setNum(y()); s = QString("Y = ") + t + QString("\n"); file.writeBlock((const char*) s, s.length()); // W t.setNum(width()); s = QString("Width = ") + t + QString("\n"); file.writeBlock((const char*) s, s.length()); // H t.setNum(height()); s = QString("Height = ") + t + QString("\n"); file.writeBlock((const char*) s, s.length()); } // Palette if (ownPalette()) { // Text color t.setNum(qRgb(paletteForegroundColor().red(), paletteForegroundColor().green(), paletteForegroundColor().blue())); s = QString("Textcolor = ") + t + QString("\n"); file.writeBlock((const char*) s, s.length()); // Background color t.setNum(qRgb(paletteBackgroundColor().red(), paletteBackgroundColor().green(), paletteBackgroundColor().blue())); s = QString("Backgroundcolor = ") + t + QString("\n"); file.writeBlock((const char*) s, s.length()); } // Background pixmap if (paletteBackgroundPixmap()) { s = QString("Pixmap = " + iconText() + QString("\n")); file.writeBlock((const char*) s, s.length()); } // Font s = QString("Font = ") + font().toString() + QString("\n"); file.writeBlock((const char*) s, s.length()); // Frame if (frameStyle() & KFrameStyle) { s = QString("Frame = ") + Settings::trueValue() + QString("\n"); } else { s = QString("Frame = ") + Settings::falseValue() + QString("\n"); } file.writeBlock((const char*) s, s.length()); // Button Behaviour t.setNum(m_buttonBehaviour); s = QString("ButtonBehaviour = ") + t + QString("\n"); file.writeBlock((const char*) s, s.length()); // ID t.setNum(id()); s = QString("ID = ") + t + QString("\n"); file.writeBlock((const char*) s, s.length()); if (children() != NULL) { QObjectList* ol = (QObjectList*) children(); QObjectListIt it(*ol); // Child frames for (; it.current() != NULL; ++it) { if (QString(it.current()->className()) == QString("VCFrame")) { VCFrame* w = (VCFrame*) it.current(); w->saveFramesToFile(file, id()); } } } }
void VCButton::createContents(QPtrList <QString> &list) { QRect rect(30, 30, 30, 30); for (QString* s = list.next(); s != NULL; s = list.next()) { if (*s == QString("Entry")) { s = list.prev(); break; } else if (*s == QString("Name")) { setCaption(*(list.next())); } else if (*s == QString("Parent")) { VCFrame* parent = _app->virtualConsole()->getFrame(list.next()->toInt()); if (parent != NULL) { reparent((QWidget*)parent, 0, QPoint(0, 0), true); } // each Button should set if (parent->buttonBehaviour() == VCFrame::Exclusive) { setExclusive(true); } else { setExclusive(false); } } else if (*s == QString("X")) { rect.setX(list.next()->toInt()); } else if (*s == QString("Y")) { rect.setY(list.next()->toInt()); } else if (*s == QString("Width")) { rect.setWidth(list.next()->toInt()); } else if (*s == QString("Height")) { rect.setHeight(list.next()->toInt()); } else if (*s == QString("Textcolor")) { QColor qc; qc.setRgb(list.next()->toUInt()); setPaletteForegroundColor(qc); } else if (*s == QString("Backgroundcolor")) { QColor qc; qc.setRgb(list.next()->toUInt()); setPaletteBackgroundColor(qc); } else if (*s == QString("Color")) { // Backwards compatibility for button background color QString t = *(list.next()); int i = t.find(QString(",")); int r = t.left(i).toInt(); int j = t.find(QString(","), i + 1); int g = t.mid(i+1, j-i-1).toInt(); int b = t.mid(j+1).toInt(); QColor qc(r, g, b); setPaletteBackgroundColor(qc); } else if (*s == QString("Pixmap")) { QString t; t = *(list.next()); QPixmap pm(t); if (pm.isNull() == false) { setIconText(t); setPaletteBackgroundPixmap(pm); } } else if (*s == QString("Font")) { QFont f = font(); QString q = *(list.next()); f.fromString(q); setFont(f); } else if (*s == QString("Function")) { attachFunction(list.next()->toInt()); } else if (*s == QString("BindKey")) { assert(m_keyBind); QString t = *(list.next()); m_keyBind->setKey(t.toInt()); } else if (*s == QString("BindMod")) { assert(m_keyBind); QString t = *(list.next()); m_keyBind->setMod(t.toInt()); } else if (*s == QString("BindPress")) { assert(m_keyBind); QString t = *(list.next()); m_keyBind->setPressAction((KeyBind::PressAction) t.toInt()); } else if (*s == QString("BindRelease")) { assert(m_keyBind); QString t = *(list.next()); m_keyBind->setReleaseAction((KeyBind::ReleaseAction) t.toInt()); } else { // Unknown keyword, ignore *list.next(); } } setGeometry(rect); }
bool VCFrame::loadXML(const QDomElement* root) { bool visible = false; int x = 0; int y = 0; int w = 0; int h = 0; QDomNode node; QDomElement tag; QString str; Q_ASSERT(root != NULL); if (root->tagName() != xmlTagName()) { qWarning() << Q_FUNC_INFO << "Frame node not found"; return false; } /* Caption */ setCaption(root->attribute(KXMLQLCVCCaption)); /* Children */ node = root->firstChild(); while (node.isNull() == false) { tag = node.toElement(); if (tag.tagName() == KXMLQLCWindowState) { loadXMLWindowState(&tag, &x, &y, &w, &h, &visible); setGeometry(x, y, w, h); } else if (tag.tagName() == KXMLQLCVCAppearance) { loadXMLAppearance(&tag); } else if (tag.tagName() == KXMLQLCVCFrame) { /* Create a new frame into its parent */ VCFrame* frame = new VCFrame(this, m_doc, m_outputMap, m_inputMap, m_masterTimer); if (frame->loadXML(&tag) == false) delete frame; else frame->show(); } else if (tag.tagName() == KXMLQLCVCLabel) { /* Create a new label into its parent */ VCLabel* label = new VCLabel(this, m_doc, m_outputMap, m_inputMap, m_masterTimer); if (label->loadXML(&tag) == false) delete label; else label->show(); } else if (tag.tagName() == KXMLQLCVCButton) { /* Create a new button into its parent */ VCButton* button = new VCButton(this, m_doc, m_outputMap, m_inputMap, m_masterTimer); if (button->loadXML(&tag) == false) delete button; else button->show(); } else if (tag.tagName() == KXMLQLCVCXYPad) { /* Create a new xy pad into its parent */ VCXYPad* xypad = new VCXYPad(this, m_doc, m_outputMap, m_inputMap, m_masterTimer); if (xypad->loadXML(&tag) == false) delete xypad; else xypad->show(); } else if (tag.tagName() == KXMLQLCVCSlider) { /* Create a new slider into its parent */ VCSlider* slider = new VCSlider(this, m_doc, m_outputMap, m_inputMap, m_masterTimer); if (slider->loadXML(&tag) == false) delete slider; else slider->show(); } else if (tag.tagName() == KXMLQLCVCSoloFrame) { /* Create a new frame into its parent */ VCSoloFrame* soloframe = new VCSoloFrame(this, m_doc, m_outputMap, m_inputMap, m_masterTimer); if (soloframe->loadXML(&tag) == false) delete soloframe; else soloframe->show(); } else if (tag.tagName() == KXMLQLCVCCueList) { /* Create a new cuelist into its parent */ VCCueList* cuelist = new VCCueList(this, m_doc, m_outputMap, m_inputMap, m_masterTimer); if (cuelist->loadXML(&tag) == false) delete cuelist; else cuelist->show(); } else { qWarning() << Q_FUNC_INFO << "Unknown frame tag:" << tag.tagName(); } node = node.nextSibling(); } return true; }
mg_result WebAccess::websocketDataHandler(mg_connection *conn) { if (conn == NULL) return MG_TRUE; m_conn = conn; // store this to send VC loaded async event if (conn->content_len == 0) return MG_TRUE; QString qData = QString(conn->content); qData.truncate(conn->content_len); qDebug() << "[websocketDataHandler]" << qData; QStringList cmdList = qData.split("|"); if (cmdList.isEmpty()) return MG_TRUE; if(cmdList[0] == "QLC+CMD") { if (cmdList.count() < 2) return MG_FALSE; if(cmdList[1] == "opMode") emit toggleDocMode(); return MG_TRUE; } else if (cmdList[0] == "QLC+IO") { if (cmdList.count() < 3) return MG_FALSE; int universe = cmdList[2].toInt(); if (cmdList[1] == "INPUT") { m_doc->inputOutputMap()->setInputPatch(universe, cmdList[3], cmdList[4].toUInt()); m_doc->inputOutputMap()->saveDefaults(); } else if (cmdList[1] == "OUTPUT") { m_doc->inputOutputMap()->setOutputPatch(universe, cmdList[3], cmdList[4].toUInt(), false); m_doc->inputOutputMap()->saveDefaults(); } else if (cmdList[1] == "FB") { m_doc->inputOutputMap()->setOutputPatch(universe, cmdList[3], cmdList[4].toUInt(), true); m_doc->inputOutputMap()->saveDefaults(); } else if (cmdList[1] == "PROFILE") { InputPatch *inPatch = m_doc->inputOutputMap()->inputPatch(universe); if (inPatch != NULL) { m_doc->inputOutputMap()->setInputPatch(universe, inPatch->pluginName(), inPatch->input(), cmdList[3]); m_doc->inputOutputMap()->saveDefaults(); } } else if (cmdList[1] == "PASSTHROUGH") { quint32 uniIdx = cmdList[2].toUInt(); if (cmdList[3] == "true") m_doc->inputOutputMap()->setUniversePassthrough(uniIdx, true); else m_doc->inputOutputMap()->setUniversePassthrough(uniIdx, false); m_doc->inputOutputMap()->saveDefaults(); } else if (cmdList[1] == "AUDIOIN") { QSettings settings; if (cmdList[2] == "__qlcplusdefault__") settings.remove(SETTINGS_AUDIO_INPUT_DEVICE); else { settings.setValue(SETTINGS_AUDIO_INPUT_DEVICE, cmdList[2]); m_doc->destroyAudioCapture(); } } else if (cmdList[1] == "AUDIOOUT") { QSettings settings; if (cmdList[2] == "__qlcplusdefault__") settings.remove(SETTINGS_AUDIO_OUTPUT_DEVICE); else settings.setValue(SETTINGS_AUDIO_OUTPUT_DEVICE, cmdList[2]); } else qDebug() << "[webaccess] Command" << cmdList[1] << "not supported !"; return MG_TRUE; } #if defined(Q_WS_X11) || defined(Q_OS_LINUX) else if(cmdList[0] == "QLC+SYS") { if (cmdList.at(1) == "NETWORK") { if (m_netConfig->updateNetworkFile(cmdList) == true) { QString wsMessage = QString("ALERT|" + tr("Network configuration changed. Reboot to apply the changes.")); mg_websocket_write(m_conn, WEBSOCKET_OPCODE_TEXT, wsMessage.toUtf8().data(), wsMessage.length()); return MG_TRUE; } else qDebug() << "[webaccess] Error writing network configuration file !"; return MG_TRUE; } else if (cmdList.at(1) == "AUTOSTART") { if (cmdList.count() < 3) return MG_FALSE; QString asName = QString("%1/%2/%3").arg(getenv("HOME")).arg(USERQLCPLUSDIR).arg(AUTOSTART_PROJECT_NAME); if (cmdList.at(2) == "none") QFile::remove(asName); else emit storeAutostartProject(asName); QString wsMessage = QString("ALERT|" + tr("Autostart configuration changed")); mg_websocket_write(m_conn, WEBSOCKET_OPCODE_TEXT, wsMessage.toUtf8().data(), wsMessage.length()); return MG_TRUE; } else if (cmdList.at(1) == "REBOOT") { QProcess *rebootProcess = new QProcess(); rebootProcess->start("reboot", QStringList()); } else if (cmdList.at(1) == "HALT") { QProcess *haltProcess = new QProcess(); haltProcess->start("halt", QStringList()); } } #endif else if (cmdList[0] == "QLC+API") { if (cmdList.count() < 2) return MG_FALSE; QString apiCmd = cmdList[1]; // compose the basic API reply messages QString wsAPIMessage = QString("QLC+API|%1|").arg(apiCmd); if (apiCmd == "isProjectLoaded") { if (m_pendingProjectLoaded) { wsAPIMessage.append("true"); m_pendingProjectLoaded = false; } else wsAPIMessage.append("false"); } else if (apiCmd == "getFunctionsNumber") { wsAPIMessage.append(QString::number(m_doc->functions().count())); } else if (apiCmd == "getFunctionsList") { foreach(Function *f, m_doc->functions()) wsAPIMessage.append(QString("%1|%2|").arg(f->id()).arg(f->name())); // remove trailing separator wsAPIMessage.truncate(wsAPIMessage.length() - 1); } else if (apiCmd == "getFunctionType") { if (cmdList.count() < 3) return MG_FALSE; quint32 fID = cmdList[2].toUInt(); Function *f = m_doc->function(fID); if (f != NULL) wsAPIMessage.append(m_doc->function(fID)->typeString()); else wsAPIMessage.append(Function::typeToString(Function::Undefined)); } else if (apiCmd == "getFunctionStatus") { if (cmdList.count() < 3) return MG_FALSE; quint32 fID = cmdList[2].toUInt(); Function *f = m_doc->function(fID); if (f != NULL) { if (f->isRunning()) wsAPIMessage.append("Running"); else wsAPIMessage.append("Stopped"); } else wsAPIMessage.append(Function::typeToString(Function::Undefined)); } else if (apiCmd == "getWidgetsNumber") { VCFrame *mainFrame = m_vc->contents(); QList<VCWidget *> chList = mainFrame->findChildren<VCWidget*>(); wsAPIMessage.append(QString::number(chList.count())); } else if (apiCmd == "getWidgetsList") { VCFrame *mainFrame = m_vc->contents(); foreach(VCWidget *widget, mainFrame->findChildren<VCWidget*>()) wsAPIMessage.append(QString("%1|%2|").arg(widget->id()).arg(widget->caption())); // remove trailing separator wsAPIMessage.truncate(wsAPIMessage.length() - 1); } else if (apiCmd == "getWidgetType") { if (cmdList.count() < 3) return MG_FALSE; quint32 wID = cmdList[2].toUInt(); VCWidget *widget = m_vc->widget(wID); if (widget != NULL) wsAPIMessage.append(widget->typeToString(widget->type())); else wsAPIMessage.append(widget->typeToString(VCWidget::UnknownWidget)); } else if (apiCmd == "getWidgetStatus") { if (cmdList.count() < 3) return MG_FALSE; quint32 wID = cmdList[2].toUInt(); VCWidget *widget = m_vc->widget(wID); if (widget != NULL) { switch(widget->type()) { case VCWidget::ButtonWidget: { VCButton *button = qobject_cast<VCButton*>(widget); if (button->isOn()) wsAPIMessage.append("255"); else wsAPIMessage.append("0"); } break; case VCWidget::SliderWidget: { VCSlider *slider = qobject_cast<VCSlider*>(widget); wsAPIMessage.append(QString::number(slider->sliderValue())); } break; case VCWidget::CueListWidget: { VCCueList *cue = qobject_cast<VCCueList*>(widget); quint32 chaserID = cue->chaserID(); Function *f = m_doc->function(chaserID); if (f != NULL && f->isRunning()) wsAPIMessage.append(QString("PLAY|%2|").arg(cue->getCurrentIndex())); else wsAPIMessage.append("STOP"); } break; } } } else if (apiCmd == "getChannelsValues") { if (cmdList.count() < 4) return MG_FALSE; quint32 universe = cmdList[2].toUInt() - 1; int startAddr = cmdList[3].toInt() - 1; int count = 1; if (cmdList.count() == 5) count = cmdList[4].toInt(); wsAPIMessage.append(WebAccessSimpleDesk::getChannelsMessage(m_doc, m_sd, universe, startAddr, count)); } else if (apiCmd == "sdResetUniverse") { m_sd->resetUniverse(); wsAPIMessage = "QLC+API|getChannelsValues|"; wsAPIMessage.append(WebAccessSimpleDesk::getChannelsMessage( m_doc, m_sd, m_sd->getCurrentUniverseIndex(), 0, m_sd->getSlidersNumber())); } //qDebug() << "Simple desk channels:" << wsAPIMessage; mg_websocket_write(conn, WEBSOCKET_OPCODE_TEXT, wsAPIMessage.toUtf8().data(), wsAPIMessage.length()); return MG_TRUE; } else if(cmdList[0] == "CH") { if (cmdList.count() < 3) return MG_FALSE; uint absAddress = cmdList[1].toInt() - 1; int value = cmdList[2].toInt(); m_sd->setAbsoluteChannelValue(absAddress, uchar(value)); return MG_TRUE; } else if(cmdList[0] == "POLL") return MG_TRUE; if (qData.contains("|") == false) return MG_FALSE; quint32 widgetID = cmdList[0].toUInt(); VCWidget *widget = m_vc->widget(widgetID); uchar value = 0; if (cmdList.count() > 1) value = (uchar)cmdList[1].toInt(); if (widget != NULL) { switch(widget->type()) { case VCWidget::ButtonWidget: { VCButton *button = qobject_cast<VCButton*>(widget); if ((value == 0 && button->isOn()) || (value != 0 && button->isOn() == false)) button->pressFunction(); } break; case VCWidget::SliderWidget: { VCSlider *slider = qobject_cast<VCSlider*>(widget); slider->setSliderValue(value); } break; case VCWidget::AudioTriggersWidget: { VCAudioTriggers *triggers = qobject_cast<VCAudioTriggers*>(widget); triggers->slotEnableButtonToggled(value ? true : false); } break; case VCWidget::CueListWidget: { if (cmdList.count() < 2) return MG_FALSE; VCCueList *cue = qobject_cast<VCCueList*>(widget); if (cmdList[1] == "PLAY") cue->slotPlayback(); else if (cmdList[1] == "PREV") cue->slotPreviousCue(); else if (cmdList[1] == "NEXT") cue->slotNextCue(); else if (cmdList[1] == "STEP") cue->playCueAtIndex(cmdList[2].toInt()); } break; case VCWidget::FrameWidget: case VCWidget::SoloFrameWidget: { VCFrame *frame = qobject_cast<VCFrame*>(widget); frame->blockSignals(true); if (cmdList[1] == "NEXT_PG") frame->slotNextPage(); else if (cmdList[1] == "PREV_PG") frame->slotPreviousPage(); frame->blockSignals(false); } break; default: break; } } return MG_TRUE; }