1
0
Fork 0
forked from len0rd/rockbox

Revert "regtools/qeditor: use the new model, drop unused code"

This reverts commit 3b3d9bf725.
Gerrit did crap on this one.
This commit is contained in:
Amaury Pouly 2014-12-15 22:44:17 +01:00
parent 3b3d9bf725
commit 94c4834bbb
4 changed files with 111 additions and 67 deletions

View file

@ -176,17 +176,46 @@ RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const S
raw_val_layout->addWidget(m_raw_val_edit); raw_val_layout->addWidget(m_raw_val_edit);
raw_val_layout->addStretch(); raw_val_layout->addStretch();
m_value_table = new GrowingTableView; m_value_table = new GrowingTableWidget;
m_value_model = new RegFieldTableModel(m_value_table); // view takes ownership m_value_table->setRowCount(reg.field.size());
m_value_model->SetRegister(m_reg.GetReg()); m_value_table->setColumnCount(5);
m_value_model->SetReadOnly(read_only); for(size_t row = 0; row < reg.field.size(); row++)
m_value_table->setModel(m_value_model); {
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->verticalHeader()->setVisible(false); m_value_table->verticalHeader()->setVisible(false);
m_value_table->resizeColumnsToContents(); m_value_table->resizeColumnsToContents();
m_value_table->horizontalHeader()->setStretchLastSection(true); m_value_table->horizontalHeader()->setStretchLastSection(true);
m_value_table->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 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); SocFieldCachedItemDelegate *m_table_delegate = new SocFieldCachedItemDelegate(this);
m_table_edit_factory = new QItemEditorFactory(); m_table_edit_factory = new QItemEditorFactory();
@ -224,13 +253,12 @@ RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const S
setLayout(layout); setLayout(layout);
AllowWrite(false); AllowWrite(false);
m_ignore_cell_change = false;
// load data // load data
Reload(); Reload();
connect(m_raw_val_edit->GetLineEdit(), SIGNAL(returnPressed()), this, connect(m_raw_val_edit->GetLineEdit(), SIGNAL(returnPressed()), this, SLOT(OnRawRegValueReturnPressed()));
SLOT(OnRawRegValueReturnPressed())); connect(m_value_table, SIGNAL(cellChanged(int, int)), this, SLOT(OnRegFieldValueChanged(int, int)));
connect(m_value_table->model(), SIGNAL(OnValueModified(int)), this,
SLOT(OnRegValueChanged(int)));
} }
RegDisplayPanel::~RegDisplayPanel() RegDisplayPanel::~RegDisplayPanel()
@ -252,15 +280,38 @@ void RegDisplayPanel::Reload()
m_raw_val_name->show(); m_raw_val_name->show();
m_raw_val_edit->show(); m_raw_val_edit->show();
m_raw_val_edit->GetLineEdit()->setText(QString().sprintf("0x%08x", value)); m_raw_val_edit->GetLineEdit()->setText(QString().sprintf("0x%08x", value));
m_value_model->SetValues(QVector< QVariant >(1, QVariant(value)));
} }
else else
{ {
m_raw_val_name->hide(); m_raw_val_name->hide();
m_raw_val_edit->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->resizeColumnsToContents();
m_value_table->horizontalHeader()->setStretchLastSection(true); m_value_table->horizontalHeader()->setStretchLastSection(true);
} }
@ -269,10 +320,7 @@ void RegDisplayPanel::AllowWrite(bool en)
{ {
m_allow_write = en; m_allow_write = en;
if(m_raw_val_edit) if(m_raw_val_edit)
{
m_raw_val_edit->SetReadOnly(m_io_backend->IsReadOnly() || !m_allow_write); m_raw_val_edit->SetReadOnly(m_io_backend->IsReadOnly() || !m_allow_write);
m_value_model->SetReadOnly(m_io_backend->IsReadOnly() || !m_allow_write);
}
Reload(); Reload();
} }
@ -300,19 +348,23 @@ void RegDisplayPanel::OnRawRegValueReturnPressed()
BackendHelper helper(m_io_backend, m_reg); BackendHelper helper(m_io_backend, m_reg);
helper.WriteRegister(m_reg.GetDevAddr().name.c_str(), m_reg.GetRegAddr().name.c_str(), helper.WriteRegister(m_reg.GetDevAddr().name.c_str(), m_reg.GetRegAddr().name.c_str(),
val, mode); val, mode);
// register write can change all fields
Reload(); Reload();
} }
void RegDisplayPanel::OnRegValueChanged(int index) void RegDisplayPanel::OnRegFieldValueChanged(int row, int col)
{ {
QVariant var = m_value_model->GetValue(index); if(m_ignore_cell_change || col != FieldValueColumn)
if(!var.isValid())
return; return;
QTableWidgetItem *item = m_value_table->item(row, col);
SocFieldCachedValue val = item->data(Qt::DisplayRole).value< SocFieldCachedValue >();
BackendHelper helper(m_io_backend, m_reg); 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(), helper.WriteRegister(m_reg.GetDevAddr().name.c_str(), m_reg.GetRegAddr().name.c_str(),
var.value< soc_word_t >(), IoBackend::Write); regval, IoBackend::Write);
// register write can change all fields
Reload(); Reload();
} }

View file

@ -86,8 +86,7 @@ protected:
bool m_allow_write; bool m_allow_write;
RegLineEdit *m_raw_val_edit; RegLineEdit *m_raw_val_edit;
RegSexyDisplay *m_sexy_display; RegSexyDisplay *m_sexy_display;
GrowingTableView *m_value_table; GrowingTableWidget *m_value_table;
RegFieldTableModel *m_value_model;
QStyledItemDelegate *m_table_delegate; QStyledItemDelegate *m_table_delegate;
QItemEditorFactory *m_table_edit_factory; QItemEditorFactory *m_table_edit_factory;
RegItemEditorCreator *m_regedit_creator; RegItemEditorCreator *m_regedit_creator;
@ -96,10 +95,11 @@ protected:
QLabel *m_desc; QLabel *m_desc;
QWidget *m_viewport; QWidget *m_viewport;
QScrollArea *m_scroll; QScrollArea *m_scroll;
bool m_ignore_cell_change;
private slots: private slots:
void OnRawRegValueReturnPressed(); void OnRawRegValueReturnPressed();
void OnRegValueChanged(int index); void OnRegFieldValueChanged(int row, int col);
}; };
#endif /* REGDISPLAYPANEL_H */ #endif /* REGDISPLAYPANEL_H */

View file

@ -331,22 +331,7 @@ QString SocFieldCachedItemDelegate::displayText(const QVariant& value, const QLo
{ {
const SocFieldCachedValue& v = value.value< SocFieldCachedValue >(); const SocFieldCachedValue& v = value.value< SocFieldCachedValue >();
int bitcount = v.field().last_bit - v.field().first_bit; int bitcount = v.field().last_bit - v.field().first_bit;
QString name = v.value_name(); return QString("0x%1").arg(v.value(), (bitcount + 3) / 4, 16, QChar('0'));
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 else
return QStyledItemDelegate::displayText(value, locale); return QStyledItemDelegate::displayText(value, locale);
@ -543,25 +528,34 @@ void RegSexyDisplay::paintEvent(QPaintEvent *event)
} }
/** /**
* GrowingTableView * GrowingTextEdit
*/ */
GrowingTableView::GrowingTableView(QWidget *parent) GrowingTextEdit::GrowingTextEdit(QWidget *parent)
:QTableView(parent) :QTextEdit(parent)
{ {
connect(this, SIGNAL(textChanged()), this, SLOT(TextChanged()));
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
} }
void GrowingTableView::setModel(QAbstractItemModel *m) void GrowingTextEdit::TextChanged()
{
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)
{ {
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&)), connect(model(), SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)),
this, SLOT(DataChanged(const QModelIndex&, const QModelIndex&))); this, SLOT(DataChanged(const QModelIndex&, const QModelIndex&)));
DataChanged(QModelIndex(), QModelIndex());
} }
void GrowingTableView::DataChanged(const QModelIndex& tl, const QModelIndex& br) void GrowingTableWidget::DataChanged(const QModelIndex& tl, const QModelIndex& br)
{ {
Q_UNUSED(tl); Q_UNUSED(tl);
Q_UNUSED(br); Q_UNUSED(br);
@ -569,7 +563,7 @@ void GrowingTableView::DataChanged(const QModelIndex& tl, const QModelIndex& br)
resizeColumnsToContents(); resizeColumnsToContents();
int h = contentsMargins().top() + contentsMargins().bottom(); int h = contentsMargins().top() + contentsMargins().bottom();
h += horizontalHeader()->height(); h += horizontalHeader()->height();
for(int i = 0; i < model()->rowCount(); i++) for(int i = 0; i < rowCount(); i++)
h += rowHeight(i); h += rowHeight(i);
setMinimumHeight(h); setMinimumHeight(h);
} }

View file

@ -149,20 +149,9 @@ Q_DECLARE_METATYPE(SocFieldCachedValue)
class SocFieldCachedItemDelegate : public QStyledItemDelegate class SocFieldCachedItemDelegate : public QStyledItemDelegate
{ {
public: public:
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) {} 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: virtual QString displayText(const QVariant& value, const QLocale& locale) const;
DisplayMode m_mode;
}; };
class SocFieldCachedEditor : public SocFieldEditor class SocFieldCachedEditor : public SocFieldEditor
@ -214,12 +203,21 @@ private:
mutable QSize m_size; mutable QSize m_size;
}; };
class GrowingTableView : public QTableView class GrowingTextEdit : public QTextEdit
{ {
Q_OBJECT Q_OBJECT
public: public:
GrowingTableView(QWidget *parent = 0); GrowingTextEdit(QWidget *parent = 0);
virtual void setModel(QAbstractItemModel *model);
protected slots:
void TextChanged();
};
class GrowingTableWidget : public QTableWidget
{
Q_OBJECT
public:
GrowingTableWidget(QWidget *parent = 0);
protected slots: protected slots:
void DataChanged(const QModelIndex& tl, const QModelIndex& br); void DataChanged(const QModelIndex& tl, const QModelIndex& br);