summaryrefslogtreecommitdiff
path: root/utils/regtools/qeditor/regdisplaypanel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'utils/regtools/qeditor/regdisplaypanel.cpp')
-rw-r--r--utils/regtools/qeditor/regdisplaypanel.cpp89
1 files changed, 58 insertions, 31 deletions
diff --git a/utils/regtools/qeditor/regdisplaypanel.cpp b/utils/regtools/qeditor/regdisplaypanel.cpp
index cef5f9807b..8d7bf582f1 100644
--- a/utils/regtools/qeditor/regdisplaypanel.cpp
+++ b/utils/regtools/qeditor/regdisplaypanel.cpp
@@ -136,7 +136,6 @@ RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const S
136 m_raw_val_edit->GetLineEdit()->setValidator(new SocFieldValidator(m_raw_val_edit)); 136 m_raw_val_edit->GetLineEdit()->setValidator(new SocFieldValidator(m_raw_val_edit));
137 m_raw_val_edit->EnableSCT(!!(reg.flags & REG_HAS_SCT)); 137 m_raw_val_edit->EnableSCT(!!(reg.flags & REG_HAS_SCT));
138 m_raw_val_edit->GetLineEdit()->setFont(m_reg_font); 138 m_raw_val_edit->GetLineEdit()->setFont(m_reg_font);
139 connect(m_raw_val_edit->GetLineEdit(), SIGNAL(returnPressed()), this, SLOT(OnRawRegValueReturnPressed()));
140 QHBoxLayout *raw_val_layout = new QHBoxLayout; 139 QHBoxLayout *raw_val_layout = new QHBoxLayout;
141 raw_val_layout->addStretch(); 140 raw_val_layout->addStretch();
142 raw_val_layout->addWidget(m_raw_val_name); 141 raw_val_layout->addWidget(m_raw_val_name);
@@ -157,28 +156,39 @@ RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const S
157 QTableWidgetItem *item = new QTableWidgetItem(bits_str); 156 QTableWidgetItem *item = new QTableWidgetItem(bits_str);
158 item->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter); 157 item->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
159 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); 158 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
160 m_value_table->setItem(row, 0, item); 159 m_value_table->setItem(row, FieldBitsColumn, item);
161 item = new QTableWidgetItem(QString(field.name.c_str())); 160 item = new QTableWidgetItem(QString(field.name.c_str()));
162 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); 161 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
163 m_value_table->setItem(row, 1, item); 162 m_value_table->setItem(row, FieldNameColumn, item);
163 item = new QTableWidgetItem();
164 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
165 item->setData(Qt::DisplayRole, QVariant::fromValue(SocFieldCachedValue()));
166 item->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
167 m_value_table->setItem(row, FieldValueColumn, item);
168 item = new QTableWidgetItem("");
169 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
170 item->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
171 m_value_table->setItem(row, FieldMeaningColumn, item);
164 item = new QTableWidgetItem(QString(field.desc.c_str())); 172 item = new QTableWidgetItem(QString(field.desc.c_str()));
165 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); 173 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
166 m_value_table->setItem(row, 4, item); 174 m_value_table->setItem(row, FieldDescColumn, item);
167 } 175 }
168 m_value_table->setHorizontalHeaderItem(0, new QTableWidgetItem("Bits")); 176 m_value_table->setHorizontalHeaderItem(FieldBitsColumn, new QTableWidgetItem("Bits"));
169 m_value_table->setHorizontalHeaderItem(1, new QTableWidgetItem("Name")); 177 m_value_table->setHorizontalHeaderItem(FieldNameColumn, new QTableWidgetItem("Name"));
170 m_value_table->setHorizontalHeaderItem(2, new QTableWidgetItem("Value")); 178 m_value_table->setHorizontalHeaderItem(FieldValueColumn, new QTableWidgetItem("Value"));
171 m_value_table->setHorizontalHeaderItem(3, new QTableWidgetItem("Meaning")); 179 m_value_table->setHorizontalHeaderItem(FieldMeaningColumn, new QTableWidgetItem("Meaning"));
172 m_value_table->setHorizontalHeaderItem(4, new QTableWidgetItem("Description")); 180 m_value_table->setHorizontalHeaderItem(FieldDescColumn, new QTableWidgetItem("Description"));
173 m_value_table->verticalHeader()->setVisible(false); 181 m_value_table->verticalHeader()->setVisible(false);
174 m_value_table->resizeColumnsToContents(); 182 m_value_table->resizeColumnsToContents();
175 m_value_table->horizontalHeader()->setStretchLastSection(true); 183 m_value_table->horizontalHeader()->setStretchLastSection(true);
176 m_value_table->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 184 m_value_table->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
177 185
178 m_table_delegate = new QStyledItemDelegate(this); 186 SocFieldCachedItemDelegate *m_table_delegate = new SocFieldCachedItemDelegate(this);
179 m_table_edit_factory = new QItemEditorFactory(); 187 m_table_edit_factory = new QItemEditorFactory();
180 m_regedit_creator = new RegItemEditorCreator(); 188 SocFieldCachedEditorCreator *m_table_edit_creator = new SocFieldCachedEditorCreator();
181 m_table_edit_factory->registerEditor(QVariant::String, m_regedit_creator); 189 // FIXME see QTBUG-30392
190 m_table_edit_factory->registerEditor((QVariant::Type)qMetaTypeId< SocFieldCachedValue >(),
191 m_table_edit_creator);
182 m_table_delegate->setItemEditorFactory(m_table_edit_factory); 192 m_table_delegate->setItemEditorFactory(m_table_edit_factory);
183 m_value_table->setItemDelegate(m_table_delegate); 193 m_value_table->setItemDelegate(m_table_delegate);
184 194
@@ -209,8 +219,12 @@ RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const S
209 setLayout(layout); 219 setLayout(layout);
210 AllowWrite(false); 220 AllowWrite(false);
211 221
222 m_ignore_cell_change = false;
212 // load data 223 // load data
213 Reload(); 224 Reload();
225
226 connect(m_raw_val_edit->GetLineEdit(), SIGNAL(returnPressed()), this, SLOT(OnRawRegValueReturnPressed()));
227 connect(m_value_table, SIGNAL(cellChanged(int, int)), this, SLOT(OnRegFieldValueChanged(int, int)));
214} 228}
215 229
216RegDisplayPanel::~RegDisplayPanel() 230RegDisplayPanel::~RegDisplayPanel()
@@ -239,11 +253,12 @@ void RegDisplayPanel::Reload()
239 m_raw_val_edit->hide(); 253 m_raw_val_edit->hide();
240 } 254 }
241 255
242 int row = 0; 256 m_ignore_cell_change = true;
243 foreach(const soc_reg_field_t& field, reg.field) 257 for(size_t row = 0; row < reg.field.size(); row++)
244 { 258 {
245 QTableWidgetItem *item = new QTableWidgetItem(); 259 const soc_reg_field_t& field = reg.field[row];
246 QTableWidgetItem *desc_item = new QTableWidgetItem(); 260 QTableWidgetItem *item = m_value_table->item(row, FieldValueColumn);
261 QTableWidgetItem *desc_item = m_value_table->item(row, FieldMeaningColumn);
247 if(has_value) 262 if(has_value)
248 { 263 {
249 soc_word_t v = (value & field.bitmask()) >> field.first_bit; 264 soc_word_t v = (value & field.bitmask()) >> field.first_bit;
@@ -251,25 +266,20 @@ void RegDisplayPanel::Reload()
251 foreach(const soc_reg_field_value_t& rval, field.value) 266 foreach(const soc_reg_field_value_t& rval, field.value)
252 if(v == rval.value) 267 if(v == rval.value)
253 value_name = rval.name.c_str(); 268 value_name = rval.name.c_str();
254 const char *fmt = "%lu"; 269 item->setData(Qt::DisplayRole, QVariant::fromValue(SocFieldCachedValue(field, v)));
255 // heuristic
256 if((field.last_bit - field.first_bit + 1) > 16)
257 fmt = "0x%lx";
258 item->setText(QString().sprintf(fmt, (unsigned long)v));
259 item->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
260
261 if(value_name.size() != 0) 270 if(value_name.size() != 0)
262 {
263 desc_item->setText(value_name); 271 desc_item->setText(value_name);
264 desc_item->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
265 }
266 } 272 }
273 else
274 item->setData(Qt::DisplayRole, QVariant::fromValue(SocFieldCachedValue()));
267 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); 275 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
268 desc_item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); 276 if(m_allow_write)
269 m_value_table->setItem(row, 2, item); 277 item->setFlags(item->flags() | Qt::ItemIsEditable);
270 m_value_table->setItem(row, 3, desc_item);
271 row++;
272 } 278 }
279 m_ignore_cell_change = false;
280
281 m_value_table->resizeColumnsToContents();
282 m_value_table->horizontalHeader()->setStretchLastSection(true);
273} 283}
274 284
275void RegDisplayPanel::AllowWrite(bool en) 285void RegDisplayPanel::AllowWrite(bool en)
@@ -277,6 +287,7 @@ void RegDisplayPanel::AllowWrite(bool en)
277 m_allow_write = en; 287 m_allow_write = en;
278 if(m_raw_val_edit) 288 if(m_raw_val_edit)
279 m_raw_val_edit->SetReadOnly(m_io_backend->IsReadOnly() || !m_allow_write); 289 m_raw_val_edit->SetReadOnly(m_io_backend->IsReadOnly() || !m_allow_write);
290 Reload();
280} 291}
281 292
282IoBackend::WriteMode RegDisplayPanel::EditModeToWriteMode(RegLineEdit::EditMode mode) 293IoBackend::WriteMode RegDisplayPanel::EditModeToWriteMode(RegLineEdit::EditMode mode)
@@ -303,7 +314,23 @@ void RegDisplayPanel::OnRawRegValueReturnPressed()
303 BackendHelper helper(m_io_backend, m_reg); 314 BackendHelper helper(m_io_backend, m_reg);
304 helper.WriteRegister(m_reg.GetDevAddr().name.c_str(), m_reg.GetRegAddr().name.c_str(), 315 helper.WriteRegister(m_reg.GetDevAddr().name.c_str(), m_reg.GetRegAddr().name.c_str(),
305 val, mode); 316 val, mode);
306 // FIXME: we should notify the UI to read value back because it has changed 317 Reload();
318}
319
320void RegDisplayPanel::OnRegFieldValueChanged(int row, int col)
321{
322 if(m_ignore_cell_change || col != FieldValueColumn)
323 return;
324 QTableWidgetItem *item = m_value_table->item(row, col);
325 SocFieldCachedValue val = item->data(Qt::DisplayRole).value< SocFieldCachedValue >();
326 BackendHelper helper(m_io_backend, m_reg);
327 soc_word_t regval;
328 if(!helper.ReadRegister(m_reg.GetDevAddr().name.c_str(), m_reg.GetRegAddr().name.c_str(), regval))
329 return;
330 regval = (regval & ~val.field().bitmask()) |
331 ((val.value() << val.field().first_bit) & val.field().bitmask());
332 helper.WriteRegister(m_reg.GetDevAddr().name.c_str(), m_reg.GetRegAddr().name.c_str(),
333 regval, IoBackend::Write);
307 Reload(); 334 Reload();
308} 335}
309 336