diff options
Diffstat (limited to 'utils/regtools/qeditor/regdisplaypanel.cpp')
-rw-r--r-- | utils/regtools/qeditor/regdisplaypanel.cpp | 89 |
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 | ||
216 | RegDisplayPanel::~RegDisplayPanel() | 230 | RegDisplayPanel::~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 | ||
275 | void RegDisplayPanel::AllowWrite(bool en) | 285 | void 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 | ||
282 | IoBackend::WriteMode RegDisplayPanel::EditModeToWriteMode(RegLineEdit::EditMode mode) | 293 | IoBackend::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 | |||
320 | void 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 | ||