summaryrefslogtreecommitdiff
path: root/utils/regtools
diff options
context:
space:
mode:
Diffstat (limited to 'utils/regtools')
-rw-r--r--utils/regtools/qeditor/regdisplaypanel.cpp96
-rw-r--r--utils/regtools/qeditor/regdisplaypanel.h6
-rw-r--r--utils/regtools/qeditor/utils.cpp48
-rw-r--r--utils/regtools/qeditor/utils.h28
4 files changed, 111 insertions, 67 deletions
diff --git a/utils/regtools/qeditor/regdisplaypanel.cpp b/utils/regtools/qeditor/regdisplaypanel.cpp
index bbfb4f5840..d450b4e203 100644
--- a/utils/regtools/qeditor/regdisplaypanel.cpp
+++ b/utils/regtools/qeditor/regdisplaypanel.cpp
@@ -176,17 +176,46 @@ RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const S
176 raw_val_layout->addWidget(m_raw_val_edit); 176 raw_val_layout->addWidget(m_raw_val_edit);
177 raw_val_layout->addStretch(); 177 raw_val_layout->addStretch();
178 178
179 m_value_table = new GrowingTableView; 179 m_value_table = new GrowingTableWidget;
180 m_value_model = new RegFieldTableModel(m_value_table); // view takes ownership 180 m_value_table->setRowCount(reg.field.size());
181 m_value_model->SetRegister(m_reg.GetReg()); 181 m_value_table->setColumnCount(5);
182 m_value_model->SetReadOnly(read_only); 182 for(size_t row = 0; row < reg.field.size(); row++)
183 m_value_table->setModel(m_value_model); 183 {
184 const soc_reg_field_t& field = reg.field[row];
185 QString bits_str;
186 if(field.first_bit == field.last_bit)
187 bits_str.sprintf("%d", field.first_bit);
188 else
189 bits_str.sprintf("%d:%d", field.last_bit, field.first_bit);
190 QTableWidgetItem *item = new QTableWidgetItem(bits_str);
191 item->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
192 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
193 m_value_table->setItem(row, FieldBitsColumn, item);
194 item = new QTableWidgetItem(QString(field.name.c_str()));
195 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
196 m_value_table->setItem(row, FieldNameColumn, item);
197 item = new QTableWidgetItem();
198 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
199 item->setData(Qt::DisplayRole, QVariant::fromValue(SocFieldCachedValue()));
200 item->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
201 m_value_table->setItem(row, FieldValueColumn, item);
202 item = new QTableWidgetItem("");
203 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
204 item->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
205 m_value_table->setItem(row, FieldMeaningColumn, item);
206 item = new QTableWidgetItem(QString(field.desc.c_str()));
207 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
208 m_value_table->setItem(row, FieldDescColumn, item);
209 }
210 m_value_table->setHorizontalHeaderItem(FieldBitsColumn, new QTableWidgetItem("Bits"));
211 m_value_table->setHorizontalHeaderItem(FieldNameColumn, new QTableWidgetItem("Name"));
212 m_value_table->setHorizontalHeaderItem(FieldValueColumn, new QTableWidgetItem("Value"));
213 m_value_table->setHorizontalHeaderItem(FieldMeaningColumn, new QTableWidgetItem("Meaning"));
214 m_value_table->setHorizontalHeaderItem(FieldDescColumn, new QTableWidgetItem("Description"));
184 m_value_table->verticalHeader()->setVisible(false); 215 m_value_table->verticalHeader()->setVisible(false);
185 m_value_table->resizeColumnsToContents(); 216 m_value_table->resizeColumnsToContents();
186 m_value_table->horizontalHeader()->setStretchLastSection(true); 217 m_value_table->horizontalHeader()->setStretchLastSection(true);
187 m_value_table->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 218 m_value_table->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
188 // FIXME we cannot use setAlternatingRowColors() because we override the
189 // background color, should it be part of the model ?
190 219
191 SocFieldCachedItemDelegate *m_table_delegate = new SocFieldCachedItemDelegate(this); 220 SocFieldCachedItemDelegate *m_table_delegate = new SocFieldCachedItemDelegate(this);
192 m_table_edit_factory = new QItemEditorFactory(); 221 m_table_edit_factory = new QItemEditorFactory();
@@ -224,13 +253,12 @@ RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const S
224 setLayout(layout); 253 setLayout(layout);
225 AllowWrite(false); 254 AllowWrite(false);
226 255
256 m_ignore_cell_change = false;
227 // load data 257 // load data
228 Reload(); 258 Reload();
229 259
230 connect(m_raw_val_edit->GetLineEdit(), SIGNAL(returnPressed()), this, 260 connect(m_raw_val_edit->GetLineEdit(), SIGNAL(returnPressed()), this, SLOT(OnRawRegValueReturnPressed()));
231 SLOT(OnRawRegValueReturnPressed())); 261 connect(m_value_table, SIGNAL(cellChanged(int, int)), this, SLOT(OnRegFieldValueChanged(int, int)));
232 connect(m_value_table->model(), SIGNAL(OnValueModified(int)), this,
233 SLOT(OnRegValueChanged(int)));
234} 262}
235 263
236RegDisplayPanel::~RegDisplayPanel() 264RegDisplayPanel::~RegDisplayPanel()
@@ -252,15 +280,38 @@ void RegDisplayPanel::Reload()
252 m_raw_val_name->show(); 280 m_raw_val_name->show();
253 m_raw_val_edit->show(); 281 m_raw_val_edit->show();
254 m_raw_val_edit->GetLineEdit()->setText(QString().sprintf("0x%08x", value)); 282 m_raw_val_edit->GetLineEdit()->setText(QString().sprintf("0x%08x", value));
255 m_value_model->SetValues(QVector< QVariant >(1, QVariant(value)));
256 } 283 }
257 else 284 else
258 { 285 {
259 m_raw_val_name->hide(); 286 m_raw_val_name->hide();
260 m_raw_val_edit->hide(); 287 m_raw_val_edit->hide();
261 m_value_model->SetValues(QVector< QVariant >());
262 } 288 }
263 289
290 m_ignore_cell_change = true;
291 for(size_t row = 0; row < reg.field.size(); row++)
292 {
293 const soc_reg_field_t& field = reg.field[row];
294 QTableWidgetItem *item = m_value_table->item(row, FieldValueColumn);
295 QTableWidgetItem *desc_item = m_value_table->item(row, FieldMeaningColumn);
296 if(has_value)
297 {
298 soc_word_t v = (value & field.bitmask()) >> field.first_bit;
299 QString value_name;
300 foreach(const soc_reg_field_value_t& rval, field.value)
301 if(v == rval.value)
302 value_name = rval.name.c_str();
303 item->setData(Qt::DisplayRole, QVariant::fromValue(SocFieldCachedValue(field, v)));
304 if(value_name.size() != 0)
305 desc_item->setText(value_name);
306 }
307 else
308 item->setData(Qt::DisplayRole, QVariant::fromValue(SocFieldCachedValue()));
309 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
310 if(m_allow_write)
311 item->setFlags(item->flags() | Qt::ItemIsEditable);
312 }
313 m_ignore_cell_change = false;
314
264 m_value_table->resizeColumnsToContents(); 315 m_value_table->resizeColumnsToContents();
265 m_value_table->horizontalHeader()->setStretchLastSection(true); 316 m_value_table->horizontalHeader()->setStretchLastSection(true);
266} 317}
@@ -269,10 +320,7 @@ void RegDisplayPanel::AllowWrite(bool en)
269{ 320{
270 m_allow_write = en; 321 m_allow_write = en;
271 if(m_raw_val_edit) 322 if(m_raw_val_edit)
272 {
273 m_raw_val_edit->SetReadOnly(m_io_backend->IsReadOnly() || !m_allow_write); 323 m_raw_val_edit->SetReadOnly(m_io_backend->IsReadOnly() || !m_allow_write);
274 m_value_model->SetReadOnly(m_io_backend->IsReadOnly() || !m_allow_write);
275 }
276 Reload(); 324 Reload();
277} 325}
278 326
@@ -300,19 +348,23 @@ void RegDisplayPanel::OnRawRegValueReturnPressed()
300 BackendHelper helper(m_io_backend, m_reg); 348 BackendHelper helper(m_io_backend, m_reg);
301 helper.WriteRegister(m_reg.GetDevAddr().name.c_str(), m_reg.GetRegAddr().name.c_str(), 349 helper.WriteRegister(m_reg.GetDevAddr().name.c_str(), m_reg.GetRegAddr().name.c_str(),
302 val, mode); 350 val, mode);
303 // register write can change all fields
304 Reload(); 351 Reload();
305} 352}
306 353
307void RegDisplayPanel::OnRegValueChanged(int index) 354void RegDisplayPanel::OnRegFieldValueChanged(int row, int col)
308{ 355{
309 QVariant var = m_value_model->GetValue(index); 356 if(m_ignore_cell_change || col != FieldValueColumn)
310 if(!var.isValid())
311 return; 357 return;
358 QTableWidgetItem *item = m_value_table->item(row, col);
359 SocFieldCachedValue val = item->data(Qt::DisplayRole).value< SocFieldCachedValue >();
312 BackendHelper helper(m_io_backend, m_reg); 360 BackendHelper helper(m_io_backend, m_reg);
361 soc_word_t regval;
362 if(!helper.ReadRegister(m_reg.GetDevAddr().name.c_str(), m_reg.GetRegAddr().name.c_str(), regval))
363 return;
364 regval = (regval & ~val.field().bitmask()) |
365 ((val.value() << val.field().first_bit) & val.field().bitmask());
313 helper.WriteRegister(m_reg.GetDevAddr().name.c_str(), m_reg.GetRegAddr().name.c_str(), 366 helper.WriteRegister(m_reg.GetDevAddr().name.c_str(), m_reg.GetRegAddr().name.c_str(),
314 var.value< soc_word_t >(), IoBackend::Write); 367 regval, IoBackend::Write);
315 // register write can change all fields
316 Reload(); 368 Reload();
317} 369}
318 370
diff --git a/utils/regtools/qeditor/regdisplaypanel.h b/utils/regtools/qeditor/regdisplaypanel.h
index 09943b59a2..ce6f108350 100644
--- a/utils/regtools/qeditor/regdisplaypanel.h
+++ b/utils/regtools/qeditor/regdisplaypanel.h
@@ -86,8 +86,7 @@ protected:
86 bool m_allow_write; 86 bool m_allow_write;
87 RegLineEdit *m_raw_val_edit; 87 RegLineEdit *m_raw_val_edit;
88 RegSexyDisplay *m_sexy_display; 88 RegSexyDisplay *m_sexy_display;
89 GrowingTableView *m_value_table; 89 GrowingTableWidget *m_value_table;
90 RegFieldTableModel *m_value_model;
91 QStyledItemDelegate *m_table_delegate; 90 QStyledItemDelegate *m_table_delegate;
92 QItemEditorFactory *m_table_edit_factory; 91 QItemEditorFactory *m_table_edit_factory;
93 RegItemEditorCreator *m_regedit_creator; 92 RegItemEditorCreator *m_regedit_creator;
@@ -96,10 +95,11 @@ protected:
96 QLabel *m_desc; 95 QLabel *m_desc;
97 QWidget *m_viewport; 96 QWidget *m_viewport;
98 QScrollArea *m_scroll; 97 QScrollArea *m_scroll;
98 bool m_ignore_cell_change;
99 99
100private slots: 100private slots:
101 void OnRawRegValueReturnPressed(); 101 void OnRawRegValueReturnPressed();
102 void OnRegValueChanged(int index); 102 void OnRegFieldValueChanged(int row, int col);
103}; 103};
104 104
105#endif /* REGDISPLAYPANEL_H */ 105#endif /* REGDISPLAYPANEL_H */
diff --git a/utils/regtools/qeditor/utils.cpp b/utils/regtools/qeditor/utils.cpp
index 448ed92c3e..036f1595a3 100644
--- a/utils/regtools/qeditor/utils.cpp
+++ b/utils/regtools/qeditor/utils.cpp
@@ -331,22 +331,7 @@ QString SocFieldCachedItemDelegate::displayText(const QVariant& value, const QLo
331 { 331 {
332 const SocFieldCachedValue& v = value.value< SocFieldCachedValue >(); 332 const SocFieldCachedValue& v = value.value< SocFieldCachedValue >();
333 int bitcount = v.field().last_bit - v.field().first_bit; 333 int bitcount = v.field().last_bit - v.field().first_bit;
334 QString name = v.value_name(); 334 return QString("0x%1").arg(v.value(), (bitcount + 3) / 4, 16, QChar('0'));
335 QString strval = QString("0x%1").arg(v.value(), (bitcount + 3) / 4, 16, QChar('0'));
336 switch(m_mode)
337 {
338 case DisplayName:
339 if(name.size() > 0)
340 return name;
341 /* fallthrough */
342 case DisplayValueAndName:
343 if(name.size() > 0)
344 return QString("%1 (%2)").arg(strval).arg(name);
345 /* fallthrough */
346 case DisplayValue:
347 default:
348 return strval;
349 }
350 } 335 }
351 else 336 else
352 return QStyledItemDelegate::displayText(value, locale); 337 return QStyledItemDelegate::displayText(value, locale);
@@ -543,25 +528,34 @@ void RegSexyDisplay::paintEvent(QPaintEvent *event)
543} 528}
544 529
545/** 530/**
546 * GrowingTableView 531 * GrowingTextEdit
547 */ 532 */
548GrowingTableView::GrowingTableView(QWidget *parent) 533GrowingTextEdit::GrowingTextEdit(QWidget *parent)
549 :QTableView(parent) 534 :QTextEdit(parent)
550{ 535{
536 connect(this, SIGNAL(textChanged()), this, SLOT(TextChanged()));
537 setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
538 setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
551} 539}
552 540
553void GrowingTableView::setModel(QAbstractItemModel *m) 541void GrowingTextEdit::TextChanged()
542{
543 int content_size = document()->documentLayout()->documentSize().height();
544 content_size = qMax(content_size, fontMetrics().height());
545 setFixedHeight(content_size + contentsMargins().top() + contentsMargins().bottom());
546}
547
548/**
549 * GrowingTableWidget
550 */
551GrowingTableWidget::GrowingTableWidget(QWidget *parent)
552 :QTableWidget(parent)
554{ 553{
555 if(model())
556 disconnect(model(), SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)),
557 this, SLOT(DataChanged(const QModelIndex&, const QModelIndex&)));
558 QTableView::setModel(m);
559 connect(model(), SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)), 554 connect(model(), SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)),
560 this, SLOT(DataChanged(const QModelIndex&, const QModelIndex&))); 555 this, SLOT(DataChanged(const QModelIndex&, const QModelIndex&)));
561 DataChanged(QModelIndex(), QModelIndex());
562} 556}
563 557
564void GrowingTableView::DataChanged(const QModelIndex& tl, const QModelIndex& br) 558void GrowingTableWidget::DataChanged(const QModelIndex& tl, const QModelIndex& br)
565{ 559{
566 Q_UNUSED(tl); 560 Q_UNUSED(tl);
567 Q_UNUSED(br); 561 Q_UNUSED(br);
@@ -569,7 +563,7 @@ void GrowingTableView::DataChanged(const QModelIndex& tl, const QModelIndex& br)
569 resizeColumnsToContents(); 563 resizeColumnsToContents();
570 int h = contentsMargins().top() + contentsMargins().bottom(); 564 int h = contentsMargins().top() + contentsMargins().bottom();
571 h += horizontalHeader()->height(); 565 h += horizontalHeader()->height();
572 for(int i = 0; i < model()->rowCount(); i++) 566 for(int i = 0; i < rowCount(); i++)
573 h += rowHeight(i); 567 h += rowHeight(i);
574 setMinimumHeight(h); 568 setMinimumHeight(h);
575} 569}
diff --git a/utils/regtools/qeditor/utils.h b/utils/regtools/qeditor/utils.h
index 6612ce20a4..970010233a 100644
--- a/utils/regtools/qeditor/utils.h
+++ b/utils/regtools/qeditor/utils.h
@@ -149,20 +149,9 @@ Q_DECLARE_METATYPE(SocFieldCachedValue)
149class SocFieldCachedItemDelegate : public QStyledItemDelegate 149class SocFieldCachedItemDelegate : public QStyledItemDelegate
150{ 150{
151public: 151public:
152 enum DisplayMode
153 {
154 DisplayValueAndName, /* "value (name)" or "value" if no name */
155 DisplayName, /* "name" or "value" if no name */
156 DisplayValue, /* "value" */
157 };
158
159 SocFieldCachedItemDelegate(QObject *parent = 0):QStyledItemDelegate(parent) {} 152 SocFieldCachedItemDelegate(QObject *parent = 0):QStyledItemDelegate(parent) {}
160 virtual QString displayText(const QVariant& value, const QLocale& locale) const;
161 void SetMode(DisplayMode mode) { m_mode = mode; }
162 DisplayMode GetMode() const { return m_mode; }
163 153
164protected: 154 virtual QString displayText(const QVariant& value, const QLocale& locale) const;
165 DisplayMode m_mode;
166}; 155};
167 156
168class SocFieldCachedEditor : public SocFieldEditor 157class SocFieldCachedEditor : public SocFieldEditor
@@ -214,12 +203,21 @@ private:
214 mutable QSize m_size; 203 mutable QSize m_size;
215}; 204};
216 205
217class GrowingTableView : public QTableView 206class GrowingTextEdit : public QTextEdit
207{
208 Q_OBJECT
209public:
210 GrowingTextEdit(QWidget *parent = 0);
211
212protected slots:
213 void TextChanged();
214};
215
216class GrowingTableWidget : public QTableWidget
218{ 217{
219 Q_OBJECT 218 Q_OBJECT
220public: 219public:
221 GrowingTableView(QWidget *parent = 0); 220 GrowingTableWidget(QWidget *parent = 0);
222 virtual void setModel(QAbstractItemModel *model);
223 221
224protected slots: 222protected slots:
225 void DataChanged(const QModelIndex& tl, const QModelIndex& br); 223 void DataChanged(const QModelIndex& tl, const QModelIndex& br);