#include "QtNodeParameters.h" #include #include #include #include #include #include #include #include "Object.h" namespace FD { std::vector QtNodeParameters::getObjectTypes() { std::map& factoryMap = Object::ObjectFactoryDictionary(); std::vector typeVect; for (std::map::iterator iter = factoryMap.begin(); iter != factoryMap.end(); iter++) { typeVect.push_back(iter->first); } return typeVect; } QtNodeParameters::QtNodeParameters(UINode *node) : m_node(node) { m_params = m_node->getParameters(); m_vLayout = new QVBoxLayout(this); m_tabWidget = new QTabWidget(this); m_tabWidget->addTab(buildParametersTable(), "Parameters"); m_tabWidget->addTab(new QTextEdit(this),"Comments"); m_tabWidget->addTab(new QTextEdit(this),"Inputs/Outputs"); m_vLayout->addWidget(m_tabWidget); m_buttonBox = new QDialogButtonBox(QDialogButtonBox::Apply | QDialogButtonBox::Cancel | QDialogButtonBox::Ok | QDialogButtonBox::RestoreDefaults , Qt::Horizontal, this); m_buttonBox->button(QDialogButtonBox::Apply)->setDisabled(true); m_vLayout->addWidget(m_buttonBox); connect(m_buttonBox, SIGNAL( clicked(QAbstractButton*) ), this, SLOT(buttonClicked( QAbstractButton*)) ); setLayout(m_vLayout); resize(640,480); } /* class ParameterText { public: std::string name; std::string value; std::string type; std::string description; }; */ QWidget* QtNodeParameters::buildParametersTable() { cerr<<"QtNodeParameters::buildParametersTable()"<addWidget(new QLabel("NAME",this),0,0,Qt::AlignLeft | Qt::AlignTop); m_paramsLayout->addWidget(new QLabel("TYPE",this),0,1,Qt::AlignLeft | Qt::AlignTop); m_paramsLayout->addWidget(new QLabel("DESCRIPTION",this),0,2,Qt::AlignLeft | Qt::AlignTop); m_paramsLayout->addWidget(new QLabel("VALUE",this),0,3,Qt::AlignLeft | Qt::AlignTop); if (m_params) { std::vector &textParams = m_params->get_textParams(); //m_typesWidge = new QComboBox[textParams.size()]; for (unsigned int i = 0; i < textParams.size(); i++) { //ADD NAME m_paramsLayout->addWidget(new QLabel(textParams[i]->name.c_str(),this),i+1,0,Qt::AlignLeft | Qt::AlignTop); //ADD TYPE if(m_params->get_defaultTextParams()[i]->type == "any") { //Fill combo for "any" types std::vector typeVect = QtNodeParameters::getObjectTypes(); QComboBox *combo = new QComboBox(this); combo->addItem("int"); combo->addItem("string"); combo->addItem("float"); combo->addItem("bool"); combo->addItem("object"); combo->addItem("subnet_param"); int index = combo->findText( textParams[i]->type.c_str() ); if( index != -1) combo->setCurrentIndex(index); else combo->setCurrentIndex(0); /*for (unsigned int j = 0; j < typeVect.size(); j++) { combo->addItem(typeVect[j].c_str()); //problem minuscule majuscule 1er lettre if(textParams[i]->type.substr(1) == typeVect[j].substr(1)) { combo->setCurrentIndex( j ); } }*/ m_paramsLayout->addWidget(combo,i+1,1,Qt::AlignLeft); connect(combo, SIGNAL( currentIndexChanged(int) ), this, SLOT( typeChanged() ) ); //The name is used to associate the comnbo with the value : combo->setAccessibleName(QString::number(i)); m_typesWidge.append(combo); } else { m_paramsLayout->addWidget(new QLabel(textParams[i]->type.c_str(),this),i+1,1,Qt::AlignLeft | Qt::AlignTop); } //ADD DESCRIPTION m_paramsLayout->addWidget(new QLabel(textParams[i]->description.c_str(),this),i+1,2,Qt::AlignLeft | Qt::AlignTop); //ADD VALUE addValues(i,textParams[i]->type); } } return widget; } //ADD different objects to m_valuesWidge[index] by using the type of m_params->get_textParams()[index]->type //string -> QComboBox (value1;value2...) QLineEdit (value?) //bool -> QComboBox (true or false) //int -> QSpinBox //float -> QDoubleSpinBox //other -> QLineEdit void QtNodeParameters::addValues(int index, string type) { cerr<<"QtNodeParameters::addValues(int index) : "; cerr< &textParams = m_params->get_textParams(); if( index < m_valuesWidge.size() ) { m_paramsLayout->removeWidget( m_valuesWidge[index] ); delete m_valuesWidge.takeAt(index); } unsigned int lastPos=0; if(type == "string") { string defaultString = m_params->get_defaultTextParams()[index]->value; QComboBox* combo = new QComboBox(this); combo->setAccessibleName("QComboBox"); ////Fill combo with string like : "value1;value2;value3" for(unsigned int j = 0;j < defaultString.size(); j++) { if(defaultString[j]==';') { combo->addItem(defaultString.substr(lastPos,j-lastPos).c_str()); lastPos = j+1; } } if(lastPos!=0) { combo->addItem(defaultString.substr(lastPos).c_str()); combo->setCurrentIndex( combo->findText(textParams[index]->value.c_str(), Qt::MatchExactly)); connect(combo, SIGNAL( currentIndexChanged(int) ), this, SLOT( valueChanged() ) ); m_valuesWidge.insert(index, combo); } else { delete combo; QLineEdit* lineEdit = new QLineEdit(textParams[index]->value.c_str(),this); connect(lineEdit, SIGNAL( textChanged(const QString & ) ), this, SLOT( valueChanged() ) ); lineEdit->setAccessibleName("QLineEdit"); m_valuesWidge.insert(index, lineEdit); } } else if(type == "bool") { QComboBox* combo = new QComboBox(this); combo->setAccessibleName("QComboBox"); combo->addItem("true"); combo->addItem("false"); combo->setCurrentIndex( combo->findText( textParams[index]->value.c_str(), Qt::MatchExactly)); connect(combo, SIGNAL( currentIndexChanged(int) ), this, SLOT( valueChanged() ) ); m_valuesWidge.insert(index, combo); } else if(type == "int") { QSpinBox* spinBox = new QSpinBox(this); spinBox->setAccessibleName("QSpinBox"); //Maybe to change... extremum value of int generate a warning spinBox->setRange ( -1000000, 1000000 ); spinBox->setValue( QString(textParams[index]->value.c_str()).toInt() ) ; connect(spinBox, SIGNAL( valueChanged(int) ), this, SLOT( valueChanged() ) ); m_valuesWidge.insert(index, spinBox); } else if(type == "float") { QDoubleSpinBox* doubleSpinBox = new QDoubleSpinBox(this); doubleSpinBox->setAccessibleName("QDoubleSpinBox"); //Maybe to change... doubleSpinBox->setRange( -1000000, 1000000 ); doubleSpinBox->setValue( QString(textParams[index]->value.c_str()).toFloat() ) ; connect(doubleSpinBox, SIGNAL( valueChanged(double) ), this, SLOT( valueChanged() ) ); m_valuesWidge.insert(index, doubleSpinBox); } else { QLineEdit* lineEdit = new QLineEdit(textParams[index]->value.c_str(),this); connect(lineEdit, SIGNAL( textChanged(const QString & ) ), this, SLOT( valueChanged() ) ); lineEdit->setAccessibleName("QLineEdit"); m_valuesWidge.insert(index, lineEdit); } m_paramsLayout->addWidget(m_valuesWidge[index],index+1,3,Qt::AlignLeft | Qt::AlignTop); } void QtNodeParameters::validParameters() { cerr<<"QtNodeParameters::validParameters()"< &textParams = m_params->get_textParams(); //Valid Types for (unsigned int i = 0; i < m_typesWidge.size(); i++) { int paramsIndex = m_typesWidge[i]->accessibleName().toInt(); textParams[paramsIndex]->type = m_typesWidge[i]->currentText().toStdString(); } //Valid Values for (unsigned int i = 0; i < textParams.size(); i++) { if(m_valuesWidge[i]->accessibleName() == "QLineEdit") textParams[i]->value = dynamic_cast(m_valuesWidge[i])->text().toStdString(); else if(m_valuesWidge[i]->accessibleName() == "QComboBox") textParams[i]->value = dynamic_cast(m_valuesWidge[i])->currentText().toStdString(); else if(m_valuesWidge[i]->accessibleName() == "QSpinBox") textParams[i]->value = dynamic_cast(m_valuesWidge[i])->text().toStdString(); else if(m_valuesWidge[i]->accessibleName() == "QDoubleSpinBox") textParams[i]->value = dynamic_cast(m_valuesWidge[i])->text().toStdString(); } } } void QtNodeParameters::buttonClicked (QAbstractButton * button ) { cerr<<"QtNodeParameters::buttonClicked()"<button( QDialogButtonBox::Apply )) { validParameters(); m_buttonBox->button(QDialogButtonBox::Apply)->setDisabled(true); } else if(button == (QAbstractButton*)m_buttonBox->button( QDialogButtonBox::Ok )) { close(); } else if(button == (QAbstractButton*)m_buttonBox->button( QDialogButtonBox::Cancel )) { setView(m_params->get_textParams()); close(); } else if(button == (QAbstractButton*)m_buttonBox->button( QDialogButtonBox::RestoreDefaults )) { setView(m_params->get_defaultTextParams()); } else { cerr<<"QtNodeParameters::buttonClicked() : unknown button"< &textParams) { cerr<<"QtNodeParameters::setView()"<accessibleName().toInt(); int index = m_typesWidge[i]->findText( textParams[paramsIndex]->type.c_str() ); if( index != -1) m_typesWidge[i]->setCurrentIndex(index); else { m_typesWidge[i]->setCurrentIndex(0); } } //set Value for (unsigned int i = 0; i < textParams.size(); i++) { //Update Values View if(m_valuesWidge[i]->accessibleName() == "QLineEdit") dynamic_cast(m_valuesWidge[i])->setText( textParams[i]->value.c_str() ); else if(m_valuesWidge[i]->accessibleName() == "QSpinBox") dynamic_cast(m_valuesWidge[i])->setValue( QString(textParams[i]->value.c_str()).toInt() ) ; else if(m_valuesWidge[i]->accessibleName() == "QDoubleSpinBox") dynamic_cast(m_valuesWidge[i])->setValue( QString(textParams[i]->value.c_str()).toInt() ) ; else if(m_valuesWidge[i]->accessibleName() == "QComboBox") { QComboBox *comboBox = dynamic_cast(m_valuesWidge[i]); int index = comboBox->findText( textParams[i]->value.c_str() ); if( index != -1) comboBox->setCurrentIndex(index); else { comboBox->setCurrentIndex(0); } } } } void QtNodeParameters::valueChanged() { cerr<<"QtNodeParameters::valueChanged()"<button(QDialogButtonBox::Apply)->setEnabled(true); } void QtNodeParameters::typeChanged() { cerr<<"QtNodeParameters::typeChanged()"< &textParams = m_params->get_textParams(); for (unsigned int i = 0; i < m_typesWidge.size(); i++) { int paramsIndex = m_typesWidge[i]->accessibleName().toInt(); addValues(paramsIndex, m_typesWidge[i]->currentText().toStdString()); } m_buttonBox->button(QDialogButtonBox::Apply)->setEnabled(true); } } //namespace FD