bool OutputMap::pluginSupportsFeedback(const QString& pluginName) { QLCIOPlugin* outputPlugin = doc()->ioPluginCache()->plugin(pluginName); if (outputPlugin != NULL) return (outputPlugin->capabilities() & QLCIOPlugin::Feedback) > 0; else return false; }
bool OutputMap::canConfigurePlugin(const QString& pluginName) { QLCIOPlugin* outputPlugin = doc()->ioPluginCache()->plugin(pluginName); if (outputPlugin != NULL) return outputPlugin->canConfigure(); else return false; }
QStringList OutputMap::pluginOutputs(const QString& pluginName) { QLCIOPlugin* op = doc()->ioPluginCache()->plugin(pluginName); if (op == NULL) return QStringList(); else return op->outputs(); }
QStringList InputMap::pluginInputs(const QString& pluginName) { QLCIOPlugin* ip = doc()->ioPluginCache()->plugin(pluginName); if (ip == NULL) return QStringList(); else return ip->inputs(); }
QString InputMap::pluginDescription(const QString& pluginName) { QLCIOPlugin* plugin = NULL; if (pluginName.isEmpty() == false) plugin = doc()->ioPluginCache()->plugin(pluginName); if (plugin != NULL) { return plugin->pluginInfo(); } else return ""; }
QString OutputMap::pluginStatus(const QString& pluginName, quint32 output) { QLCIOPlugin* outputPlugin = doc()->ioPluginCache()->plugin(pluginName); if (outputPlugin != NULL) { return outputPlugin->outputInfo(output); } else { QString info; info += QString("<HTML><HEAD></HEAD><BODY>"); info += QString("<H3>%1</H3>").arg(tr("Nothing selected")); info += QString("</BODY></HTML>"); return info; } }
QString InputMap::pluginStatus(const QString& pluginName, quint32 input) { QLCIOPlugin* inputPlugin = NULL; QString info; if (pluginName.isEmpty() == false) inputPlugin = doc()->ioPluginCache()->plugin(pluginName); if (inputPlugin != NULL) { info = inputPlugin->inputInfo(input); } else { /* Nothing selected */ info += QString("<HTML><HEAD></HEAD><BODY>"); info += QString("<H3>%1</H3>").arg(tr("Nothing selected")); info += QString("</BODY></HTML>"); } return info; }
void IOPluginCache::load(const QDir& dir) { qDebug() << Q_FUNC_INFO << dir.path(); /* Check that we can access the directory */ if (dir.exists() == false || dir.isReadable() == false) return; /* Loop thru all files in the directory */ QStringListIterator it(dir.entryList()); while (it.hasNext() == true) { /* Attempt to load a plugin from the path */ QString fileName(it.next()); QString path = dir.absoluteFilePath(fileName); QPluginLoader loader(path, this); QLCIOPlugin* ptr = qobject_cast<QLCIOPlugin*> (loader.instance()); if (ptr != NULL) { /* Check for duplicates */ if (plugin(ptr->name()) == NULL) { /* New plugin. Append and init. */ qDebug() << "Loaded I/O plugin" << ptr->name() << "from" << fileName; emit pluginLoaded(ptr->name()); ptr->init(); m_plugins << ptr; connect(ptr, SIGNAL(configurationChanged()), this, SLOT(slotConfigurationChanged())); #if !defined(Q_OS_ANDROID) HotPlugMonitor::connectListener(ptr); #endif // QLCi18n::loadTranslation(p->name().replace(" ", "_")); } else { /* Duplicate plugin. Unload it. */ qWarning() << Q_FUNC_INFO << "Discarded duplicate I/O plugin" << ptr->name() << "in" << path; loader.unload(); } } else { qWarning() << Q_FUNC_INFO << fileName << "doesn't contain an I/O plugin:" << loader.errorString(); loader.unload(); } } }
void InputOutputPatchEditor::fillMappingTree() { /* Disable check state change tracking when the tree is filled */ disconnect(m_mapTree, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(slotMapItemChanged(QTreeWidgetItem*, int))); m_mapTree->clear(); qDebug() << "[InputOutputPatchEditor] Fill tree for universe: " << m_universe; // Build a complete list of Input/Output plugins QStringList IOplugins = m_ioMap->inputPluginNames(); foreach (QString out, m_ioMap->outputPluginNames()) if (IOplugins.contains(out) == false) IOplugins.append(out); // cycle through available plugins foreach (QString pluginName, IOplugins) { quint32 inputId = 0; quint32 outputId = 0; QStringList inputs = m_ioMap->pluginInputs(pluginName); QStringList outputs = m_ioMap->pluginOutputs(pluginName); bool hasFeedback = m_ioMap->pluginSupportsFeedback(pluginName); QLCIOPlugin *plugin = m_doc->ioPluginCache()->plugin(pluginName); // 1st case: this plugin has no input or output if (inputs.length() == 0 && outputs.length() == 0) { QTreeWidgetItem* pitem = new QTreeWidgetItem(m_mapTree); pitem->setText(KMapColumnPluginName, pluginName); pitem->setText(KMapColumnDeviceName, KInputNone); pitem->setText(KMapColumnInputLine, QString("%1").arg(QLCIOPlugin::invalidLine())); pitem->setText(KMapColumnOutputLine, QString("%1").arg(QLCIOPlugin::invalidLine())); } else { // 2nd case: plugin with an input and maybe an output for (int l = 0; l < inputs.length(); l++) { quint32 uni = m_ioMap->inputMapping(pluginName, inputId); //qDebug() << "Plugin: " << pluginName << ", input: " << id << ", universe:" << uni; if (uni == InputOutputMap::invalidUniverse() || (uni == m_universe || plugin->capabilities() & QLCIOPlugin::Infinite)) { QTreeWidgetItem* pitem = new QTreeWidgetItem(m_mapTree); pitem->setText(KMapColumnPluginName, pluginName); pitem->setText(KMapColumnDeviceName, inputs.at(l)); pitem->setFlags(pitem->flags() | Qt::ItemIsUserCheckable); if (m_currentInputPluginName == pluginName && m_currentInput == inputId) pitem->setCheckState(KMapColumnHasInput, Qt::Checked); else pitem->setCheckState(KMapColumnHasInput, Qt::Unchecked); pitem->setTextAlignment(KMapColumnHasInput, Qt::AlignHCenter); pitem->setText(KMapColumnInputLine, QString("%1").arg(inputId)); pitem->setText(KMapColumnOutputLine, QString("%1").arg(QLCIOPlugin::invalidLine())); // check if this plugin has also an output if (outputs.contains(inputs.at(l))) { quint32 outUni = m_ioMap->outputMapping(pluginName, outputId); if (outUni == InputOutputMap::invalidUniverse() || (outUni == m_universe || plugin->capabilities() & QLCIOPlugin::Infinite)) { if (m_currentOutputPluginName == pluginName && m_currentOutput == outputId) pitem->setCheckState(KMapColumnHasOutput, Qt::Checked); else pitem->setCheckState(KMapColumnHasOutput, Qt::Unchecked); pitem->setText(KMapColumnOutputLine, QString("%1").arg(outputId)); // add feedback if (hasFeedback) { if (m_currentFeedbackPluginName == pluginName && m_currentFeedback == outputId) pitem->setCheckState(KMapColumnHasFeedback, Qt::Checked); else pitem->setCheckState(KMapColumnHasFeedback, Qt::Unchecked); } } outputId++; } } inputId++; } // 3rd case: output only plugins for (int o = 0; o < outputs.length(); o++) { if (inputs.contains(outputs.at(o)) == false) { quint32 outUni = m_ioMap->outputMapping(pluginName, outputId); if (outUni == InputOutputMap::invalidUniverse() || (outUni == m_universe || plugin->capabilities() & QLCIOPlugin::Infinite)) { //qDebug() << "Plugin: " << pluginName << ", output: " << id << ", universe:" << outUni; QTreeWidgetItem* pitem = new QTreeWidgetItem(m_mapTree); pitem->setText(KMapColumnPluginName, pluginName); pitem->setText(KMapColumnDeviceName, outputs.at(o)); pitem->setFlags(pitem->flags() | Qt::ItemIsUserCheckable); if (m_currentOutputPluginName == pluginName && m_currentOutput == outputId) pitem->setCheckState(KMapColumnHasOutput, Qt::Checked); else pitem->setCheckState(KMapColumnHasOutput, Qt::Unchecked); // add feedback if (hasFeedback) { if (m_currentFeedbackPluginName == pluginName && m_currentFeedback == outputId) pitem->setCheckState(KMapColumnHasFeedback, Qt::Checked); else pitem->setCheckState(KMapColumnHasFeedback, Qt::Unchecked); } pitem->setText(KMapColumnOutputLine, QString("%1").arg(outputId)); pitem->setText(KMapColumnInputLine, QString("%1").arg(QLCIOPlugin::invalidLine())); } outputId++; } } } }
void OutputMap::configurePlugin(const QString& pluginName) { QLCIOPlugin* outputPlugin = doc()->ioPluginCache()->plugin(pluginName); if (outputPlugin != NULL) outputPlugin->configure(); }