/* * Copyright (C) 2011, Mathieu Labbe - IntRoLab - Universite de Sherbrooke */ #include "ParametersToolBox.h" #include "Settings.h" #include #include #include #include #include #include #include #include #include ParametersToolBox::ParametersToolBox(QWidget *parent) : QToolBox(parent) { } ParametersToolBox::~ParametersToolBox() { } QWidget * ParametersToolBox::getParameterWidget(const QString & key) { return this->findChild(key); } void ParametersToolBox::resetPage(int index) { const QObjectList & children = this->widget(index)->children(); for(int j=0; jobjectName(); // ignore only the nextObjID setting, to avoid problem with saved objects if(key.compare(Settings::kGeneral_nextObjID()) != 0) { QVariant value = Settings::getDefaultParameters().value(key, QVariant()); if(value.isValid()) { if(qobject_cast(children.at(j))) { ((QComboBox*)children.at(j))->setCurrentIndex(value.toString().split(':').first().toInt()); } else if(qobject_cast(children.at(j))) { ((QSpinBox*)children.at(j))->setValue(value.toInt()); } else if(qobject_cast(children.at(j))) { ((QDoubleSpinBox*)children.at(j))->setValue(value.toDouble()); } else if(qobject_cast(children.at(j))) { ((QCheckBox*)children.at(j))->setChecked(value.toBool()); } else if(qobject_cast(children.at(j))) { ((QLineEdit*)children.at(j))->setText(value.toString()); } Settings::setParameter(key, value); } } } } void ParametersToolBox::resetCurrentPage() { this->blockSignals(true); this->resetPage(this->currentIndex()); this->blockSignals(false); emit parametersChanged(); } void ParametersToolBox::resetAllPages() { this->blockSignals(true); for(int i=0; i< this->count(); ++i) { this->resetPage(i); } this->blockSignals(false); emit parametersChanged(); } void ParametersToolBox::setupUi() { this->removeItem(0); // remove dummy page used in .ui QWidget * currentItem = 0; const ParametersMap & parameters = Settings::getParameters(); for(ParametersMap::const_iterator iter=parameters.constBegin(); iter!=parameters.constEnd(); ++iter) { QStringList splitted = iter.key().split('/'); QString group = splitted.first(); QString name = splitted.last(); if(currentItem == 0 || currentItem->objectName().compare(group) != 0) { currentItem = new QWidget(this); this->addItem(currentItem, group); currentItem->setObjectName(group); QVBoxLayout * layout = new QVBoxLayout(currentItem); currentItem->setLayout(layout); layout->addSpacerItem(new QSpacerItem(0,0, QSizePolicy::Minimum, QSizePolicy::Expanding)); addParameter(layout, iter.key(), iter.value()); } else { addParameter((QVBoxLayout*)currentItem->layout(), iter.key(), iter.value()); } } } void ParametersToolBox::updateParameter(const QString & key) { QWidget * widget = this->findChild(key); QString type = Settings::getParametersType().value(key); if(type.compare("QString") == 0) { QString value = Settings::getParameter(key).toString(); if(value.contains(';')) { // It's a list, just change the index QStringList splitted = value.split(':'); ((QComboBox*)widget)->setCurrentIndex(splitted.first().toInt()); } else { ((QLineEdit*)widget)->setText(value); } } else if(type.compare("int") == 0) { ((QSpinBox*)widget)->setValue(Settings::getParameter(key).toInt()); } else if(type.compare("uint") == 0) { ((QSpinBox*)widget)->setValue(Settings::getParameter(key).toInt()); } else if(type.compare("double") == 0) { ((QDoubleSpinBox*)widget)->setValue(Settings::getParameter(key).toDouble()); } else if(type.compare("float") == 0) { ((QDoubleSpinBox*)widget)->setValue(Settings::getParameter(key).toDouble()); } else if(type.compare("bool") == 0) { ((QCheckBox*)widget)->setChecked(Settings::getParameter(key).toBool()); } } void ParametersToolBox::addParameter(QVBoxLayout * layout, const QString & key, const QVariant & value) { QString type = Settings::getParametersType().value(key); if(type.compare("QString") == 0) { addParameter(layout, key, value.toString()); } else if(type.compare("int") == 0) { addParameter(layout, key, value.toInt()); } else if(type.compare("uint") == 0) { addParameter(layout, key, value.toInt()); } else if(type.compare("double") == 0) { addParameter(layout, key, value.toDouble()); } else if(type.compare("float") == 0) { addParameter(layout, key, value.toDouble()); } else if(type.compare("bool") == 0) { addParameter(layout, key, value.toBool()); } } void ParametersToolBox::addParameter(QVBoxLayout * layout, const QString & key, const QString & value) { if(value.contains(';')) { QComboBox * widget = new QComboBox(this); widget->setObjectName(key); QStringList splitted = value.split(':'); widget->addItems(splitted.last().split(';')); widget->setCurrentIndex(splitted.first().toInt()); connect(widget, SIGNAL(currentIndexChanged(int)), this, SLOT(changeParameter(int))); addParameter(layout, key.split('/').last(), widget); } else { QLineEdit * widget = new QLineEdit(value, this); widget->setObjectName(key); connect(widget, SIGNAL(editingFinished()), this, SLOT(changeParameter())); addParameter(layout, key.split('/').last(), widget); } } void ParametersToolBox::addParameter(QVBoxLayout * layout, const QString & key, const double & value) { QDoubleSpinBox * widget = new QDoubleSpinBox(this); double def = Settings::getDefaultParameters().value(key).toDouble(); if(def<0.001) { widget->setDecimals(4); } else if(def<0.01) { widget->setDecimals(3); } if(def>=0.0) { widget->setMaximum(def*1000000.0); } else if(def==0.0) { widget->setMaximum(1000000.0); } else if(def<0.0) { widget->setMinimum(def*1000000.0); widget->setMaximum(0.0); } widget->setValue(value); widget->setObjectName(key); connect(widget, SIGNAL(editingFinished()), this, SLOT(changeParameter())); addParameter(layout, key.split('/').last(), widget); } void ParametersToolBox::addParameter(QVBoxLayout * layout, const QString & key, const int & value) { QSpinBox * widget = new QSpinBox(this); int def = Settings::getDefaultParameters().value(key).toInt(); if(def>0) { widget->setMaximum(def*1000000); } else if(def == 0) { widget->setMaximum(1000000); } else if(def<0) { widget->setMinimum(def*1000000); widget->setMaximum(0); } widget->setValue(value); widget->setObjectName(key); connect(widget, SIGNAL(editingFinished()), this, SLOT(changeParameter())); addParameter(layout, key.split('/').last(), widget); } void ParametersToolBox::addParameter(QVBoxLayout * layout, const QString & key, const bool & value) { QCheckBox * widget = new QCheckBox(this); widget->setChecked(value); widget->setObjectName(key); connect(widget, SIGNAL(stateChanged(int)), this, SLOT(changeParameter(int))); addParameter(layout, key.split('/').last(), widget); } void ParametersToolBox::addParameter(QVBoxLayout * layout, const QString & name, QWidget * widget) { QHBoxLayout * hLayout = new QHBoxLayout(); layout->insertLayout(layout->count()-1, hLayout); QString tmp = name; if(tmp.at(0).isDigit()) { tmp.remove(0,1); } hLayout->addWidget(new QLabel(tmp, this)); hLayout->addWidget(widget); } void ParametersToolBox::changeParameter(const QString & value) { if(sender()) { Settings::setParameter(sender()->objectName(), value); emit parametersChanged(); } } void ParametersToolBox::changeParameter() { if(sender()) { QDoubleSpinBox * doubleSpinBox = qobject_cast(sender()); QSpinBox * spinBox = qobject_cast(sender()); QLineEdit * lineEdit = qobject_cast(sender()); if(doubleSpinBox) { Settings::setParameter(sender()->objectName(), doubleSpinBox->value()); } else if(spinBox) { Settings::setParameter(sender()->objectName(), spinBox->value()); } else if(lineEdit) { Settings::setParameter(sender()->objectName(), lineEdit->text()); } emit parametersChanged(); } } void ParametersToolBox::changeParameter(const int & value) { if(sender()) { QComboBox * comboBox = qobject_cast(sender()); QCheckBox * checkBox = qobject_cast(sender()); if(comboBox) { if(comboBox->objectName().compare(Settings::kDetector_Descriptor_2Descriptor()) == 0 || comboBox->objectName().compare(Settings::kNearestNeighbor_1Strategy()) == 0) { //verify binary issue QComboBox * descriptorBox = (QComboBox*)this->getParameterWidget(Settings::kDetector_Descriptor_2Descriptor()); QComboBox * nnBox = (QComboBox*)this->getParameterWidget(Settings::kNearestNeighbor_1Strategy()); bool isBinaryDescriptor = descriptorBox->currentText().compare("ORB") == 0 || descriptorBox->currentText().compare("Brief") == 0; if(isBinaryDescriptor && nnBox->currentText().compare("Lsh") != 0) { QMessageBox::warning(this, tr("Error"), tr("Current selected descriptor type (\"%1\") is binary while nearest neighbor strategy is not (\"%2\").\n" "Falling back to \"Lsh\" nearest neighbor strategy (by default).") .arg(descriptorBox->currentText()) .arg(nnBox->currentText())); QString tmp = Settings::getNearestNeighbor_1Strategy(); *tmp.begin() = '5'; // set index Settings::setNearestNeighbor_1Strategy(tmp); this->updateParameter(Settings::kNearestNeighbor_1Strategy()); if(sender() == nnBox) { return; } } else if(!isBinaryDescriptor && nnBox->currentText().compare("Lsh") == 0) { QMessageBox::warning(this, tr("Error"), tr("Current selected descriptor type (\"%1\") is not binary while nearest neighbor strategy is (\"%2\").\n" "Falling back to \"KDTree\" nearest neighbor strategy (by default).") .arg(descriptorBox->currentText()) .arg(nnBox->currentText())); QString tmp = Settings::getNearestNeighbor_1Strategy(); *tmp.begin() = '1'; // set index Settings::setNearestNeighbor_1Strategy(tmp); this->updateParameter(Settings::kNearestNeighbor_1Strategy()); if(sender() == nnBox) { return; } } } QStringList items; for(int i=0; icount(); ++i) { items.append(comboBox->itemText(i)); } QString merged = QString::number(value) + QString(":") + items.join(";"); Settings::setParameter(sender()->objectName(), merged); } else if(checkBox) { Settings::setParameter(sender()->objectName(), value==Qt::Checked?true:false); } emit parametersChanged(); } }