From 3b3d9bf725a5b04e4cd9bc4254fbd2594b518e89 Mon Sep 17 00:00:00 2001 From: Amaury Pouly Date: Wed, 22 Oct 2014 18:00:59 +0200 Subject: regtools/qeditor: use the new model, drop unused code Change-Id: Ic4e2e201f6d055c85d52b7fe15d25980386df5b8 Reviewed-on: http://gerrit.rockbox.org/1023 Reviewed-by: Amaury Pouly --- utils/regtools/qeditor/regdisplaypanel.cpp | 96 +++++++----------------------- utils/regtools/qeditor/regdisplaypanel.h | 6 +- utils/regtools/qeditor/utils.cpp | 48 ++++++++------- utils/regtools/qeditor/utils.h | 28 +++++---- 4 files changed, 67 insertions(+), 111 deletions(-) (limited to 'utils') diff --git a/utils/regtools/qeditor/regdisplaypanel.cpp b/utils/regtools/qeditor/regdisplaypanel.cpp index d450b4e203..bbfb4f5840 100644 --- a/utils/regtools/qeditor/regdisplaypanel.cpp +++ b/utils/regtools/qeditor/regdisplaypanel.cpp @@ -176,46 +176,17 @@ RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const S raw_val_layout->addWidget(m_raw_val_edit); raw_val_layout->addStretch(); - m_value_table = new GrowingTableWidget; - m_value_table->setRowCount(reg.field.size()); - m_value_table->setColumnCount(5); - for(size_t row = 0; row < reg.field.size(); row++) - { - const soc_reg_field_t& field = reg.field[row]; - QString bits_str; - if(field.first_bit == field.last_bit) - bits_str.sprintf("%d", field.first_bit); - else - bits_str.sprintf("%d:%d", field.last_bit, field.first_bit); - QTableWidgetItem *item = new QTableWidgetItem(bits_str); - item->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter); - item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); - m_value_table->setItem(row, FieldBitsColumn, item); - item = new QTableWidgetItem(QString(field.name.c_str())); - item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); - m_value_table->setItem(row, FieldNameColumn, item); - item = new QTableWidgetItem(); - item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); - item->setData(Qt::DisplayRole, QVariant::fromValue(SocFieldCachedValue())); - item->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter); - m_value_table->setItem(row, FieldValueColumn, item); - item = new QTableWidgetItem(""); - item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); - item->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter); - m_value_table->setItem(row, FieldMeaningColumn, item); - item = new QTableWidgetItem(QString(field.desc.c_str())); - item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); - m_value_table->setItem(row, FieldDescColumn, item); - } - m_value_table->setHorizontalHeaderItem(FieldBitsColumn, new QTableWidgetItem("Bits")); - m_value_table->setHorizontalHeaderItem(FieldNameColumn, new QTableWidgetItem("Name")); - m_value_table->setHorizontalHeaderItem(FieldValueColumn, new QTableWidgetItem("Value")); - m_value_table->setHorizontalHeaderItem(FieldMeaningColumn, new QTableWidgetItem("Meaning")); - m_value_table->setHorizontalHeaderItem(FieldDescColumn, new QTableWidgetItem("Description")); + m_value_table = new GrowingTableView; + m_value_model = new RegFieldTableModel(m_value_table); // view takes ownership + m_value_model->SetRegister(m_reg.GetReg()); + m_value_model->SetReadOnly(read_only); + m_value_table->setModel(m_value_model); m_value_table->verticalHeader()->setVisible(false); m_value_table->resizeColumnsToContents(); m_value_table->horizontalHeader()->setStretchLastSection(true); m_value_table->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + // FIXME we cannot use setAlternatingRowColors() because we override the + // background color, should it be part of the model ? SocFieldCachedItemDelegate *m_table_delegate = new SocFieldCachedItemDelegate(this); m_table_edit_factory = new QItemEditorFactory(); @@ -253,12 +224,13 @@ RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const S setLayout(layout); AllowWrite(false); - m_ignore_cell_change = false; // load data Reload(); - connect(m_raw_val_edit->GetLineEdit(), SIGNAL(returnPressed()), this, SLOT(OnRawRegValueReturnPressed())); - connect(m_value_table, SIGNAL(cellChanged(int, int)), this, SLOT(OnRegFieldValueChanged(int, int))); + connect(m_raw_val_edit->GetLineEdit(), SIGNAL(returnPressed()), this, + SLOT(OnRawRegValueReturnPressed())); + connect(m_value_table->model(), SIGNAL(OnValueModified(int)), this, + SLOT(OnRegValueChanged(int))); } RegDisplayPanel::~RegDisplayPanel() @@ -280,38 +252,15 @@ void RegDisplayPanel::Reload() m_raw_val_name->show(); m_raw_val_edit->show(); m_raw_val_edit->GetLineEdit()->setText(QString().sprintf("0x%08x", value)); + m_value_model->SetValues(QVector< QVariant >(1, QVariant(value))); } else { m_raw_val_name->hide(); m_raw_val_edit->hide(); + m_value_model->SetValues(QVector< QVariant >()); } - m_ignore_cell_change = true; - for(size_t row = 0; row < reg.field.size(); row++) - { - const soc_reg_field_t& field = reg.field[row]; - QTableWidgetItem *item = m_value_table->item(row, FieldValueColumn); - QTableWidgetItem *desc_item = m_value_table->item(row, FieldMeaningColumn); - if(has_value) - { - soc_word_t v = (value & field.bitmask()) >> field.first_bit; - QString value_name; - foreach(const soc_reg_field_value_t& rval, field.value) - if(v == rval.value) - value_name = rval.name.c_str(); - item->setData(Qt::DisplayRole, QVariant::fromValue(SocFieldCachedValue(field, v))); - if(value_name.size() != 0) - desc_item->setText(value_name); - } - else - item->setData(Qt::DisplayRole, QVariant::fromValue(SocFieldCachedValue())); - item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); - if(m_allow_write) - item->setFlags(item->flags() | Qt::ItemIsEditable); - } - m_ignore_cell_change = false; - m_value_table->resizeColumnsToContents(); m_value_table->horizontalHeader()->setStretchLastSection(true); } @@ -320,7 +269,10 @@ void RegDisplayPanel::AllowWrite(bool en) { m_allow_write = en; if(m_raw_val_edit) + { m_raw_val_edit->SetReadOnly(m_io_backend->IsReadOnly() || !m_allow_write); + m_value_model->SetReadOnly(m_io_backend->IsReadOnly() || !m_allow_write); + } Reload(); } @@ -348,23 +300,19 @@ void RegDisplayPanel::OnRawRegValueReturnPressed() BackendHelper helper(m_io_backend, m_reg); helper.WriteRegister(m_reg.GetDevAddr().name.c_str(), m_reg.GetRegAddr().name.c_str(), val, mode); + // register write can change all fields Reload(); } -void RegDisplayPanel::OnRegFieldValueChanged(int row, int col) +void RegDisplayPanel::OnRegValueChanged(int index) { - if(m_ignore_cell_change || col != FieldValueColumn) + QVariant var = m_value_model->GetValue(index); + if(!var.isValid()) return; - QTableWidgetItem *item = m_value_table->item(row, col); - SocFieldCachedValue val = item->data(Qt::DisplayRole).value< SocFieldCachedValue >(); BackendHelper helper(m_io_backend, m_reg); - soc_word_t regval; - if(!helper.ReadRegister(m_reg.GetDevAddr().name.c_str(), m_reg.GetRegAddr().name.c_str(), regval)) - return; - regval = (regval & ~val.field().bitmask()) | - ((val.value() << val.field().first_bit) & val.field().bitmask()); helper.WriteRegister(m_reg.GetDevAddr().name.c_str(), m_reg.GetRegAddr().name.c_str(), - regval, IoBackend::Write); + var.value< soc_word_t >(), IoBackend::Write); + // register write can change all fields Reload(); } diff --git a/utils/regtools/qeditor/regdisplaypanel.h b/utils/regtools/qeditor/regdisplaypanel.h index ce6f108350..09943b59a2 100644 --- a/utils/regtools/qeditor/regdisplaypanel.h +++ b/utils/regtools/qeditor/regdisplaypanel.h @@ -86,7 +86,8 @@ protected: bool m_allow_write; RegLineEdit *m_raw_val_edit; RegSexyDisplay *m_sexy_display; - GrowingTableWidget *m_value_table; + GrowingTableView *m_value_table; + RegFieldTableModel *m_value_model; QStyledItemDelegate *m_table_delegate; QItemEditorFactory *m_table_edit_factory; RegItemEditorCreator *m_regedit_creator; @@ -95,11 +96,10 @@ protected: QLabel *m_desc; QWidget *m_viewport; QScrollArea *m_scroll; - bool m_ignore_cell_change; private slots: void OnRawRegValueReturnPressed(); - void OnRegFieldValueChanged(int row, int col); + void OnRegValueChanged(int index); }; #endif /* REGDISPLAYPANEL_H */ diff --git a/utils/regtools/qeditor/utils.cpp b/utils/regtools/qeditor/utils.cpp index 036f1595a3..448ed92c3e 100644 --- a/utils/regtools/qeditor/utils.cpp +++ b/utils/regtools/qeditor/utils.cpp @@ -331,7 +331,22 @@ QString SocFieldCachedItemDelegate::displayText(const QVariant& value, const QLo { const SocFieldCachedValue& v = value.value< SocFieldCachedValue >(); int bitcount = v.field().last_bit - v.field().first_bit; - return QString("0x%1").arg(v.value(), (bitcount + 3) / 4, 16, QChar('0')); + QString name = v.value_name(); + QString strval = QString("0x%1").arg(v.value(), (bitcount + 3) / 4, 16, QChar('0')); + switch(m_mode) + { + case DisplayName: + if(name.size() > 0) + return name; + /* fallthrough */ + case DisplayValueAndName: + if(name.size() > 0) + return QString("%1 (%2)").arg(strval).arg(name); + /* fallthrough */ + case DisplayValue: + default: + return strval; + } } else return QStyledItemDelegate::displayText(value, locale); @@ -528,34 +543,25 @@ void RegSexyDisplay::paintEvent(QPaintEvent *event) } /** - * GrowingTextEdit + * GrowingTableView */ -GrowingTextEdit::GrowingTextEdit(QWidget *parent) - :QTextEdit(parent) -{ - connect(this, SIGNAL(textChanged()), this, SLOT(TextChanged())); - setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); -} - -void GrowingTextEdit::TextChanged() +GrowingTableView::GrowingTableView(QWidget *parent) + :QTableView(parent) { - int content_size = document()->documentLayout()->documentSize().height(); - content_size = qMax(content_size, fontMetrics().height()); - setFixedHeight(content_size + contentsMargins().top() + contentsMargins().bottom()); } -/** - * GrowingTableWidget - */ -GrowingTableWidget::GrowingTableWidget(QWidget *parent) - :QTableWidget(parent) +void GrowingTableView::setModel(QAbstractItemModel *m) { + if(model()) + disconnect(model(), SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)), + this, SLOT(DataChanged(const QModelIndex&, const QModelIndex&))); + QTableView::setModel(m); connect(model(), SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(DataChanged(const QModelIndex&, const QModelIndex&))); + DataChanged(QModelIndex(), QModelIndex()); } -void GrowingTableWidget::DataChanged(const QModelIndex& tl, const QModelIndex& br) +void GrowingTableView::DataChanged(const QModelIndex& tl, const QModelIndex& br) { Q_UNUSED(tl); Q_UNUSED(br); @@ -563,7 +569,7 @@ void GrowingTableWidget::DataChanged(const QModelIndex& tl, const QModelIndex& b resizeColumnsToContents(); int h = contentsMargins().top() + contentsMargins().bottom(); h += horizontalHeader()->height(); - for(int i = 0; i < rowCount(); i++) + for(int i = 0; i < model()->rowCount(); i++) h += rowHeight(i); setMinimumHeight(h); } diff --git a/utils/regtools/qeditor/utils.h b/utils/regtools/qeditor/utils.h index 970010233a..6612ce20a4 100644 --- a/utils/regtools/qeditor/utils.h +++ b/utils/regtools/qeditor/utils.h @@ -149,9 +149,20 @@ Q_DECLARE_METATYPE(SocFieldCachedValue) class SocFieldCachedItemDelegate : public QStyledItemDelegate { public: - SocFieldCachedItemDelegate(QObject *parent = 0):QStyledItemDelegate(parent) {} + enum DisplayMode + { + DisplayValueAndName, /* "value (name)" or "value" if no name */ + DisplayName, /* "name" or "value" if no name */ + DisplayValue, /* "value" */ + }; + SocFieldCachedItemDelegate(QObject *parent = 0):QStyledItemDelegate(parent) {} virtual QString displayText(const QVariant& value, const QLocale& locale) const; + void SetMode(DisplayMode mode) { m_mode = mode; } + DisplayMode GetMode() const { return m_mode; } + +protected: + DisplayMode m_mode; }; class SocFieldCachedEditor : public SocFieldEditor @@ -203,21 +214,12 @@ private: mutable QSize m_size; }; -class GrowingTextEdit : public QTextEdit -{ - Q_OBJECT -public: - GrowingTextEdit(QWidget *parent = 0); - -protected slots: - void TextChanged(); -}; - -class GrowingTableWidget : public QTableWidget +class GrowingTableView : public QTableView { Q_OBJECT public: - GrowingTableWidget(QWidget *parent = 0); + GrowingTableView(QWidget *parent = 0); + virtual void setModel(QAbstractItemModel *model); protected slots: void DataChanged(const QModelIndex& tl, const QModelIndex& br); -- cgit v1.2.3