OpenLCP/platform/qt/universemodel.cpp

193 lines
3.9 KiB
C++
Raw Normal View History

2021-07-30 13:57:27 -04:00
#include "universemodel.h"
2021-07-31 14:06:58 -04:00
2021-07-30 14:33:51 -04:00
#include <QFont>
2021-07-31 14:06:58 -04:00
#include <QChar>
#include <QMetaEnum>
2021-07-30 13:57:27 -04:00
/**
* @brief UniverseModel::UniverseModel
* @param parent
*/
UniverseModel::UniverseModel(QObject *parent)
: QAbstractTableModel(parent)
{
}
/**
* @brief UniverseModel::headerData
* @param section
* @param orientation
* @param role
* @return
*/
QVariant UniverseModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (role != Qt::DisplayRole)
return QVariant();
if (orientation == Qt::Horizontal)
return section + 1;
if (orientation == Qt::Vertical)
return section * 10;
return QVariant();
}
/**
* @brief UniverseModel::rowCount
* @param parent
* @return
*/
int UniverseModel::rowCount(const QModelIndex &parent) const
{
if (parent.isValid())
return 0;
return 52;
}
/**
* @brief UniverseModel::columnCount
* @param parent
* @return
*/
int UniverseModel::columnCount(const QModelIndex &parent) const
{
if (parent.isValid())
return 0;
return 10;
}
/**
* @brief UniverseModel::data
* @param index
* @param role
* @return
*/
QVariant UniverseModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (!universe_)
return QVariant();
switch (role) {
case Qt::DisplayRole:
{
int slot = (index.row() * 10) + (index.column() + 1);
if (slot == 0)
return QVariant();
if (slot > 512)
return QVariant();
2021-07-31 14:06:58 -04:00
switch (data_mode_) {
case Decimal:
2021-08-06 12:14:29 -04:00
return universe_->slot(slot);
2021-07-31 14:06:58 -04:00
break;
case Hex:
return QString("%1")
2021-08-06 12:14:29 -04:00
.arg(universe_->slot(slot), 2, 16, QChar('0'))
2021-07-31 14:06:58 -04:00
.toUpper();
break;
case Percent:
2021-08-06 12:14:29 -04:00
return QString("%1%").arg((universe_->slot(slot) / 255.0F) * 100,
2021-07-31 14:06:58 -04:00
0, 'f', 0, '0');
break;
}
2021-07-30 13:57:27 -04:00
break;
}
2021-07-30 14:33:51 -04:00
case Qt::FontRole:
return QFont("monospace");
break;
2021-07-30 13:57:27 -04:00
case Qt::TextAlignmentRole:
return int(Qt::AlignCenter | Qt::AlignVCenter);
break;
default:
return QVariant();
}
}
/**
* @brief UniverseModel::setData
* @param index
* @param value
* @param role
* @return
*/
2021-08-06 12:14:29 -04:00
bool UniverseModel::setData(const QModelIndex &index, const QVariant &value,
int role)
2021-07-30 13:57:27 -04:00
{
if (data(index, role) != value) {
// FIXME: Implement me!
emit dataChanged(index, index, QVector<int>() << role);
return true;
}
return false;
}
/**
* @brief UniverseModel::flags
* @param index
* @return
*/
Qt::ItemFlags UniverseModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return Qt::NoItemFlags;
if (!universe_)
return Qt::NoItemFlags;
int slot = (index.row() * 10) + (index.column() + 1);
if (slot == 0)
return Qt::NoItemFlags;
if (slot > 512)
return Qt::NoItemFlags;
return QAbstractItemModel::flags(index);// | Qt::ItemIsEditable;
}
/**
* @brief UniverseModel::universeRefreshed
*/
void UniverseModel::universeRefreshed() {
emit dataChanged(index(0,0), index(rowCount(), columnCount()));
2021-07-31 10:33:26 -04:00
emit recievedUpdate(universe_);
2021-07-30 13:57:27 -04:00
}
2021-07-31 14:06:58 -04:00
/**
* @brief UniverseModel::setDataMode
* @param mode
*/
void UniverseModel::setDataMode(const QString mode)
{
auto&& metaEnum = QMetaEnum::fromType<data_modes>();
2021-08-06 12:14:29 -04:00
data_mode_ = static_cast<data_modes>(metaEnum.keyToValue(mode.toLocal8Bit()));
2021-07-31 14:06:58 -04:00
emit dataChanged(index(0,0), index(rowCount(), columnCount()));
}
2021-07-30 13:57:27 -04:00
/**
* @brief UniverseModel::setUniverse
* @param universe
*/
void UniverseModel::setUniverse(QSacnUniverse *universe)
{
if (universe_)
disconnect(universe_, 0, this, 0);
universe_ = universe;
connect(universe_, &QSacnUniverse::changed,
this, &UniverseModel::universeRefreshed);
}