ESGRAF48/source/CheckableTestModel/CheckableTestModel.cpp

195 lines
4.0 KiB
C++
Raw Permalink Normal View History

#include "CheckableTestModel.h"
#include <QJsonArray>
2018-08-26 12:24:05 +00:00
#include <QSize>
#include <QDebug>
2019-10-05 14:14:45 +00:00
CheckableTestModel::CheckableTestModel(QObject* parent)
2019-02-02 13:44:01 +00:00
: QAbstractTableModel(parent)
{
}
2019-10-05 14:14:45 +00:00
int CheckableTestModel::rowCount(const QModelIndex&) const
{
2019-10-05 14:14:45 +00:00
return static_cast<int>(m_tests.size());
}
2019-10-05 14:14:45 +00:00
int CheckableTestModel::columnCount(const QModelIndex&) const
{
2019-10-05 14:14:45 +00:00
int columnCount = 0;
2019-10-05 14:14:45 +00:00
for (const auto& test : m_tests)
{
columnCount = std::max(columnCount, static_cast<int>(test.size()));
}
2019-10-05 14:14:45 +00:00
return columnCount;
}
2019-10-05 14:14:45 +00:00
QVariant CheckableTestModel::data(const QModelIndex& index, int role) const
{
2019-10-05 14:14:45 +00:00
if (!isValidIndex(index))
{
return {};
}
try
{
auto& item = getItem(index);
switch (role)
{
case Qt::DisplayRole:
{
return item.getText().c_str();
}
case Qt::CheckStateRole:
{
return item.isChecked() ? Qt::Checked : Qt::Unchecked;
}
}
}
catch (std::runtime_error& e)
{
qDebug() << "CheckableTestModel::data" << index << e.what();
}
return {};
}
2019-10-05 14:14:45 +00:00
Qt::ItemFlags CheckableTestModel::flags(const QModelIndex& index) const
{
2019-10-05 14:14:45 +00:00
if (isValidIndex(index))
{
return Qt::ItemIsEnabled | Qt::ItemIsUserCheckable;
}
2019-10-05 14:14:45 +00:00
return Qt::NoItemFlags;
}
2019-10-05 14:14:45 +00:00
bool CheckableTestModel::setData(const QModelIndex& index, const QVariant& value, int role)
{
2019-10-05 14:14:45 +00:00
if (!isValidIndex(index))
{
return false;
}
try
{
if (role == Qt::CheckStateRole)
{
auto& item = getItem(index);
item.setState(value.toBool());
emit dataChanged(index, index);
return true;
}
}
catch (std::runtime_error& e)
{
qDebug() << "CheckableTestModel::setData" << index << e.what();
}
return false;
}
2019-02-02 13:44:01 +00:00
QVariant CheckableTestModel::headerData(int section, Qt::Orientation orientation, int role) const
{
2019-10-05 14:14:45 +00:00
switch (orientation)
{
case Qt::Vertical:
{
switch (role)
{
case Qt::DisplayRole:
{
if (section < m_tests.size())
{
return m_tests.at(section).name();
}
}
case Qt::SizeHintRole:
{
return QSize(200, 0);
}
}
break;
}
default:
break;
}
return QAbstractTableModel::headerData(section, orientation, role);
}
2019-10-05 14:14:45 +00:00
bool CheckableTestModel::isValidIndex(const QModelIndex& index) const
{
2019-10-05 14:14:45 +00:00
if (index.row() < m_tests.size())
{
return index.column() < m_tests.at(index.row()).size();
}
2019-10-05 14:14:45 +00:00
return false;
}
2019-10-05 14:14:45 +00:00
CheckableItems& CheckableTestModel::getItems(const QModelIndex& index)
{
2019-10-05 14:14:45 +00:00
if (index.row() < m_tests.size())
{
return m_tests.at(index.row()).items();
}
2019-10-05 14:14:45 +00:00
throw std::runtime_error("invalid index");
}
2019-10-05 14:14:45 +00:00
const CheckableItems& CheckableTestModel::getItems(const QModelIndex& index) const
{
2019-10-05 14:14:45 +00:00
if (index.row() < m_tests.size())
{
return m_tests.at(index.row()).items();
}
2019-10-05 14:14:45 +00:00
throw std::runtime_error("invalid index");
}
2019-10-05 14:14:45 +00:00
CheckableItem& CheckableTestModel::getItem(const QModelIndex& index)
{
2019-10-05 14:14:45 +00:00
auto& items = getItems(index);
if (index.column() < items.size())
{
return items.at(index.column());
}
2019-10-05 14:14:45 +00:00
throw std::runtime_error("invalid index");
}
2019-10-05 14:14:45 +00:00
const CheckableItem& CheckableTestModel::getItem(const QModelIndex& index) const
{
2019-10-05 14:14:45 +00:00
auto& items = getItems(index);
if (index.column() < items.size())
{
return items.at(index.column());
}
2019-10-05 14:14:45 +00:00
throw std::runtime_error("invalid index");
}
2018-06-15 15:53:43 +00:00
unsigned int CheckableTestModel::getPoints() const
{
2019-10-05 14:14:45 +00:00
unsigned int points = 0;
2018-06-15 15:53:43 +00:00
2019-10-05 14:14:45 +00:00
for (const auto& test : m_tests)
{
for (const auto& item : test.items())
{
points += item.points();
}
}
2018-06-15 15:53:43 +00:00
2019-10-05 14:14:45 +00:00
return points;
2018-06-15 15:53:43 +00:00
}
2019-02-03 18:53:51 +00:00
QString CheckableTestModel::getTitle() const
{
2019-10-05 14:14:45 +00:00
return m_title;
2019-02-03 18:53:51 +00:00
}