g2o
properties_widget.cpp
Go to the documentation of this file.
1 // g2o - General Graph Optimization
2 // Copyright (C) 2011 R. Kuemmerle, G. Grisetti, W. Burgard
3 //
4 // This file is part of g2o.
5 //
6 // g2o is free software: you can redistribute it and/or modify
7 // it under the terms of the GNU General Public License as published by
8 // the Free Software Foundation, either version 3 of the License, or
9 // (at your option) any later version.
10 //
11 // g2o is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
15 //
16 // You should have received a copy of the GNU General Public License
17 // along with g2o. If not, see <http://www.gnu.org/licenses/>.
18 
19 #include "properties_widget.h"
20 
21 #include <QLineEdit>
22 
23 #include <iostream>
24 #include <cassert>
25 
26 #include "g2o/stuff/property.h"
27 
28 using namespace std;
29 
30 using namespace g2o;
31 
32 PropertiesWidget::PropertiesWidget(QWidget * parent, Qt::WindowFlags f) :
33  QDialog(parent, f),
34  _properties(0)
35 {
36  setupUi(this);
37 }
38 
40 {
41 }
42 
44 {
45  tableWidget->clear();
46  _propNames.clear();
47 
48  tableWidget->setColumnCount(2);
49 
50  QStringList horizontalHeaders;
51  horizontalHeaders.append("Name");
52  horizontalHeaders.append("Value");
53  tableWidget->setHorizontalHeaderLabels(horizontalHeaders);
54 
55  tableWidget->verticalHeader()->hide();
56 
57  PropertyMap* properties = _properties;
58  if (! properties)
59  return;
60  tableWidget->setRowCount(properties->size());
61 
62  int r = 0;
63  for (PropertyMap::PropertyMapIterator it = properties->begin(); it != properties->end(); ++it, ++r) {
64 
65  QTableWidgetItem* textItem = new QTableWidgetItem;
66  textItem->setText(QString::fromStdString(humanReadablePropName(it->first)));
67  textItem->setFlags(textItem->flags() & ~Qt::ItemIsEditable);
68  tableWidget->setItem(r, 0, textItem);
69  _propNames.push_back(it->first);
70 
71  if (dynamic_cast<Property<bool>*>(it->second)) {
72  Property<bool>* prop = static_cast<Property<bool>*>(it->second);
73  QTableWidgetItem* checkItem = new QTableWidgetItem;
74  checkItem->setText("enabled");
75  checkItem->setFlags(checkItem->flags() | Qt::ItemIsUserCheckable);
76  if (prop->value())
77  checkItem->setCheckState(Qt::Checked);
78  else
79  checkItem->setCheckState(Qt::Unchecked);
80  tableWidget->setItem(r, 1, checkItem);
81  } else {
82  QLineEdit* editor = new QLineEdit(tableWidget);
83  editor->setText(QString::fromStdString(it->second->toString()));
84  if (dynamic_cast<Property<int>*>(it->second)) {
85  editor->setValidator(new QIntValidator(editor));
86  }
87  else if (dynamic_cast<Property<float>*>(it->second)) {
88  editor->setValidator(new QDoubleValidator(editor));
89  }
90  else if (dynamic_cast<Property<double>*>(it->second)) {
91  editor->setValidator(new QDoubleValidator(editor));
92  }
93  tableWidget->setCellWidget(r, 1, editor);
94  }
95 
96  }
97  tableWidget->resizeColumnToContents(0);
98 }
99 
101 {
102  assert(tableWidget->rowCount() == (int) _propNames.size());
103  PropertyMap* properties = _properties;
104  for (int r = 0; r < tableWidget->rowCount(); ++r) {
105  const std::string& propName = _propNames[r];
106  BaseProperty* baseProp = properties->getProperty<BaseProperty>(propName);
107  if (! baseProp)
108  continue;
109 
110  if (dynamic_cast<Property<bool>*>(baseProp)) {
111  Property<bool>* prop = static_cast<Property<bool>*>(baseProp);
112  QTableWidgetItem* checkItem = tableWidget->item(r, 1);
113  prop->setValue(checkItem->checkState() == Qt::Checked);
114  } else {
115  QLineEdit* editor = dynamic_cast<QLineEdit*>(tableWidget->cellWidget(r, 1));
116  bool status = baseProp->fromString(editor->text().toStdString());
117  if (! status) {
118  cerr << "Warning: unable to set property " << baseProp->name() << endl;
119  }
120  }
121  }
122 }
123 
125 {
126  applyProperties();
127 }
128 
130 {
131  applyProperties();
132  close();
133 }
134 
135 std::string PropertiesWidget::humanReadablePropName(const std::string& propertyName) const
136 {
137  return propertyName;
138 }
139 
141 {
142  _properties = properties;
144 }
BaseClass::iterator PropertyMapIterator
Definition: property.h:80
virtual void updateDisplayedProperties()
g2o::PropertyMap * _properties
virtual std::string humanReadablePropName(const std::string &propertyName) const
virtual bool fromString(const std::string &s)=0
std::vector< std::string > _propNames
void setValue(const T &v)
Definition: property.h:56
PropertiesWidget(QWidget *parent=0, Qt::WindowFlags f=0)
void setProperties(g2o::PropertyMap *properties)
const T & value() const
Definition: property.h:57
virtual void applyProperties()
a collection of properties mapping from name to the property itself
Definition: property.h:76
const std::string & name()
Definition: property.h:43