00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "ui/configurationwidget.h"
00022 #include <QVBoxLayout>
00023 #include <QHeaderView>
00024
00025 namespace farsa {
00026
00027 ConfigurationWidget::ConfigurationWidget(QWidget *parent) :
00028 QSplitter(Qt::Horizontal, parent),
00029 m_configurationParameters(NULL),
00030 m_tmpParameters(),
00031 m_readOnly(true),
00032 m_valuesChanged(false),
00033 m_treeWidget(NULL),
00034 m_tableWidget(NULL)
00035 {
00036
00037 m_treeWidget = new QTreeWidget(this);
00038 addWidget(m_treeWidget);
00039
00040 m_treeWidget->setColumnCount(1);
00041 m_treeWidget->setSelectionMode(QAbstractItemView::SingleSelection);
00042 m_treeWidget->setHeaderLabel("Groups");
00043 m_treeWidget->header()->setClickable(false);
00044 setStretchFactor(0, 1);
00045
00046
00047 m_tableWidget = new QTableWidget(this);
00048 addWidget(m_tableWidget);
00049
00050 m_tableWidget->setColumnCount(2);
00051 m_tableWidget->setHorizontalHeaderLabels(QStringList() << "Parameters" << "Value");
00052 m_tableWidget->horizontalHeader()->setClickable(false);
00053 m_tableWidget->verticalHeader()->setClickable(false);
00054 setStretchFactor(1, 2);
00055
00056
00057 connect(m_treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(changeTableContent(QTreeWidgetItem *, int)));
00058 connect(m_tableWidget, SIGNAL(itemChanged(QTableWidgetItem *)), this, SLOT(storeChangedItem(QTableWidgetItem *)));
00059 }
00060
00061 ConfigurationWidget::~ConfigurationWidget()
00062 {
00063
00064 }
00065
00066 void ConfigurationWidget::setConfigurationParameters(ConfigurationParameters *conf)
00067 {
00068 m_configurationParameters = conf;
00069
00070 updateParameters();
00071 }
00072
00073 void ConfigurationWidget::fillWidgetTree( QString groupName, QString groupFullPath, QTreeWidgetItem* root) {
00074
00075 QTreeWidgetItem *widgetRoot = new QTreeWidgetItem(root, QStringList() << groupName);
00076
00077 widgetRoot->setData( 0, Qt::UserRole, groupFullPath );
00078 QStringList groupList = m_tmpParameters.getGroupsList( groupFullPath );
00079 foreach( QString group, groupList ) {
00080 fillWidgetTree( group, groupFullPath + ConfigurationParameters::GroupSeparator() + group, widgetRoot );
00081 }
00082 }
00083
00084 void ConfigurationWidget::updateParameters()
00085 {
00086 if (m_configurationParameters == NULL) {
00087 return;
00088 }
00089
00090
00091 m_valuesChanged = false;
00092
00093
00094 m_tmpParameters = *m_configurationParameters;
00095
00096
00097 m_treeWidget->clear();
00098
00099
00100 QTreeWidgetItem *widgetRoot = new QTreeWidgetItem(QStringList() << "root");
00101 widgetRoot->setData(0, Qt::UserRole, "");
00102 m_treeWidget->insertTopLevelItem(0, widgetRoot);
00103
00104 QStringList groupList = m_tmpParameters.getGroupsList( "" );
00105 foreach( QString group, groupList ) {
00106 fillWidgetTree( group, group, widgetRoot );
00107 }
00108
00109 m_treeWidget->setCurrentItem(m_treeWidget->topLevelItem(0));
00110
00111 m_treeWidget->update();
00112
00113 changeTableContent(m_treeWidget->currentItem(), 0);
00114 }
00115
00116 void ConfigurationWidget::setReadOnly(bool readOnly)
00117 {
00118 m_readOnly = readOnly;
00119
00120
00121 for (int r = 0; r < m_tableWidget->rowCount(); r++) {
00122 QTableWidgetItem *const item = m_tableWidget->item(r, 1);
00123 if (m_readOnly) {
00124 item->setFlags(item->flags() & ~Qt::ItemIsEditable);
00125 } else {
00126 item->setFlags(item->flags() | Qt::ItemIsEditable);
00127 }
00128 }
00129
00130
00131 m_tableWidget->update();
00132 }
00133
00134 void ConfigurationWidget::store()
00135 {
00136 if (m_configurationParameters == NULL) {
00137 return;
00138 }
00139
00140 *m_configurationParameters = m_tmpParameters;
00141
00142
00143 m_valuesChanged = false;
00144 }
00145
00146 void ConfigurationWidget::restore()
00147 {
00148 if (m_configurationParameters == NULL) {
00149 return;
00150 }
00151
00152 m_tmpParameters = *m_configurationParameters;
00153
00154
00155 updateParameters();
00156 }
00157
00158 void ConfigurationWidget::changeTableContent(QTreeWidgetItem *item, int)
00159 {
00160
00161 m_tableWidget->blockSignals(true);
00162
00163
00164 m_tableWidget->clearContents();
00165
00166
00167 QString groupFullPath = item->data(0, Qt::UserRole).toString();
00168
00169
00170 QStringList paramList = m_tmpParameters.getParametersList( groupFullPath );
00171 m_tableWidget->setRowCount( paramList.size() );
00172 for (int i = 0; i < paramList.size(); i++) {
00173
00174 QTableWidgetItem *parameter = new QTableWidgetItem( paramList[i] );
00175 parameter->setFlags(Qt::ItemIsEnabled);
00176 m_tableWidget->setItem(i, 0, parameter);
00177
00178 QString fullName = groupFullPath + ConfigurationParameters::GroupSeparator() + paramList[i];
00179 QTableWidgetItem *value = new QTableWidgetItem( m_tmpParameters.getValue( fullName ) );
00180 value->setData( Qt::UserRole, fullName );
00181 if (m_readOnly) {
00182 value->setFlags(Qt::ItemIsEnabled);
00183 } else {
00184 value->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable);
00185 }
00186 m_tableWidget->setItem(i, 1, value);
00187 }
00188
00189
00190 m_tableWidget->blockSignals(false);
00191
00192
00193 m_tableWidget->update();
00194 }
00195
00196 void ConfigurationWidget::storeChangedItem(QTableWidgetItem *item)
00197 {
00198
00199 if (item->column() != 1) {
00200 return;
00201 }
00202
00203
00204 QString paramFullName = item->data( Qt::UserRole ).toString();
00205
00206
00207 QString parameter = m_tableWidget->item(item->row(), 0)->text();
00208 QString oldValue = m_tmpParameters.getValue( paramFullName );
00209 QString newValue = item->text();
00210
00211
00212 m_tmpParameters.setValue(paramFullName, newValue);
00213
00214
00215 m_valuesChanged = true;
00216
00217
00218 emit valueHasChanged(paramFullName, oldValue, newValue);
00219 }
00220
00221 }