Imported existing sources
This commit is contained in:
@@ -0,0 +1,128 @@
|
||||
#include "modbustablemodel.h"
|
||||
|
||||
namespace {
|
||||
enum {
|
||||
ColumnDecimal,
|
||||
ColumnHex,
|
||||
ColumnBinary,
|
||||
ColumnAscii,
|
||||
ColumnCount
|
||||
};
|
||||
}
|
||||
|
||||
void ModbusTableModel::setResult(const QModbusDataUnit &result)
|
||||
{
|
||||
beginResetModel();
|
||||
m_result = result;
|
||||
endResetModel();
|
||||
}
|
||||
|
||||
QModelIndex ModbusTableModel::index(int row, int column, const QModelIndex &parent) const
|
||||
{
|
||||
Q_ASSERT(!parent.isValid());
|
||||
return createIndex(row, column);
|
||||
}
|
||||
|
||||
QModelIndex ModbusTableModel::parent(const QModelIndex &child) const
|
||||
{
|
||||
return {};
|
||||
}
|
||||
|
||||
int ModbusTableModel::rowCount(const QModelIndex &parent) const
|
||||
{
|
||||
Q_ASSERT(!parent.isValid());
|
||||
return m_result.isValid() ? m_result.valueCount() : 0;
|
||||
}
|
||||
|
||||
int ModbusTableModel::columnCount(const QModelIndex &parent) const
|
||||
{
|
||||
Q_ASSERT(!parent.isValid());
|
||||
return ColumnCount;
|
||||
}
|
||||
|
||||
QVariant ModbusTableModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
Q_ASSERT(index.isValid());
|
||||
Q_ASSERT(m_result.isValid());
|
||||
Q_ASSERT(index.row() >= 0);
|
||||
Q_ASSERT(index.row() < m_result.valueCount());
|
||||
Q_ASSERT(index.column() >= 0);
|
||||
Q_ASSERT(index.column() < ColumnCount);
|
||||
|
||||
const auto &values = m_result.values();
|
||||
Q_ASSERT(index.row() < values.size());
|
||||
|
||||
const auto &value = values[index.row()];
|
||||
|
||||
switch (role)
|
||||
{
|
||||
case Qt::DisplayRole:
|
||||
switch (index.column())
|
||||
{
|
||||
case ColumnDecimal: return QString::number(value);
|
||||
case ColumnHex: return QString::number(value, 16).rightJustified(4, '0').insert(2, ' ');
|
||||
case ColumnBinary: return QString::number(value, 2) .rightJustified(16, '0').insert(8, ' ');
|
||||
case ColumnAscii: return QString{QChar{(value&0xFF00)>>8}} + QChar{value&0x00FF};
|
||||
}
|
||||
__builtin_unreachable();
|
||||
break;
|
||||
case Qt::EditRole:
|
||||
switch (index.column())
|
||||
{
|
||||
case ColumnDecimal:
|
||||
case ColumnHex:
|
||||
case ColumnBinary:
|
||||
case ColumnAscii:
|
||||
return value;
|
||||
}
|
||||
__builtin_unreachable();
|
||||
break;
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
QVariant ModbusTableModel::headerData(int section, Qt::Orientation orientation, int role) const
|
||||
{
|
||||
switch (orientation)
|
||||
{
|
||||
case Qt::Horizontal:
|
||||
Q_ASSERT(section >= 0);
|
||||
Q_ASSERT(section < ColumnCount);
|
||||
|
||||
switch (role)
|
||||
{
|
||||
case Qt::DisplayRole:
|
||||
case Qt::EditRole:
|
||||
switch (section)
|
||||
{
|
||||
case ColumnDecimal: return tr("Decimal");
|
||||
case ColumnHex: return tr("Hex");
|
||||
case ColumnBinary: return tr("Binary");
|
||||
case ColumnAscii: return tr("Ascii");
|
||||
}
|
||||
__builtin_unreachable();
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case Qt::Vertical:
|
||||
Q_ASSERT(m_result.isValid());
|
||||
Q_ASSERT(section >= 0);
|
||||
Q_ASSERT(section < m_result.valueCount());
|
||||
|
||||
switch (role)
|
||||
{
|
||||
case Qt::DisplayRole: return QString::number(m_result.startAddress() + section);
|
||||
case Qt::EditRole: return m_result.startAddress() + section;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
__builtin_unreachable();
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
Reference in New Issue
Block a user