refactored common test-model functions to base class

This commit is contained in:
Michael Mandl 2018-05-24 20:35:16 +02:00
parent 3ad5d3bd57
commit 8f170eb83b
14 changed files with 353 additions and 480 deletions

View file

@ -27,6 +27,8 @@ target_include_directories(${PROJECT_NAME}
target_link_libraries(${PROJECT_NAME}
PRIVATE
CheckableItem
CheckableItem
CheckableTest
CheckableTestModel
Qt5::Widgets
)

View file

@ -1,208 +1,13 @@
#include "VerbEndModel.h"
#include <QJsonArray>
#include <QDebug>
VerbEndModel::VerbEndModel(QObject *parent)
: QAbstractTableModel(parent)
: CheckableTestModel(parent)
{
}
int VerbEndModel::rowCount(const QModelIndex &parent) const
{
return 3;
}
int VerbEndModel::columnCount(const QModelIndex &parent) const
{
return 7;
}
QVariant VerbEndModel::data(const QModelIndex &index, int role) const
{
if (!isValidIndex(index))
{
return {};
}
try
{
auto &item = getItem(index);
if (role == Qt::DisplayRole)
{
return item.getText().c_str();
}
if (role == Qt::CheckStateRole)
{
return item.isChecked() ? Qt::Checked : Qt::Unchecked;
}
}
catch (std::runtime_error &e)
{
qDebug() << "VerbEndModel::data" << index << e.what();
}
return {};
}
Qt::ItemFlags VerbEndModel::flags(const QModelIndex &index) const
{
if (isValidIndex(index))
{
return Qt::ItemIsEnabled | Qt::ItemIsUserCheckable;
}
return Qt::NoItemFlags;
}
bool VerbEndModel::setData(
const QModelIndex &index, const QVariant &value, int role)
{
if (!isValidIndex(index))
{
return false;
}
try
{
if (role == Qt::CheckStateRole)
{
auto &item = getItem(index);
item.setState(value.toBool());
return true;
}
}
catch (std::runtime_error &e)
{
qDebug() << "VerbEndModel::setData" << index << e.what();
}
return false;
}
QVariant VerbEndModel::headerData(
int section, Qt::Orientation orientation, int role) const
{
if (role == Qt::DisplayRole && orientation == Qt::Vertical)
{
switch (section)
{
case 0:
return "Telefonat";
case 1:
return "Zaubertrick";
case 2:
return "Zauberregel";
default:
return {};
}
}
return {};
}
void VerbEndModel::write(QJsonObject &json) const
{
QJsonArray telefonat;
m_telefonat.write(telefonat);
json["Telefonat"] = telefonat;
QJsonArray zaubertrick;
m_zaubertrick.write(zaubertrick);
json["Zaubertrick"] = zaubertrick;
QJsonArray zauberregel;
m_zauberregel.write(zauberregel);
json["Zauberregel"] = zauberregel;
}
void VerbEndModel::read(const QJsonObject &json)
{
if (json["Telefonat"].isArray())
{
m_telefonat.read(json["Telefonat"].toArray());
}
if (json["Zaubertrick"].isArray())
{
m_zaubertrick.read(json["Zaubertrick"].toArray());
}
if (json["Zauberregel"].isArray())
{
m_zauberregel.read(json["Zauberregel"].toArray());
}
}
bool VerbEndModel::isValidIndex(const QModelIndex &index) const
{
switch (index.row())
{
case 0:
return index.column() < m_telefonat.size();
case 1:
return index.column() < m_zaubertrick.size();
case 2:
return index.column() < m_zauberregel.size();
default:
return false;
}
}
CheckableItems &VerbEndModel::getItems(const QModelIndex &index)
{
switch (index.row())
{
case 0:
return m_telefonat;
case 1:
return m_zaubertrick;
case 2:
return m_zauberregel;
default:
break;
}
throw std::runtime_error("invalid index");
}
const CheckableItems &VerbEndModel::getItems(const QModelIndex &index) const
{
switch (index.row())
{
case 0:
return m_telefonat;
case 1:
return m_zaubertrick;
case 2:
return m_zauberregel;
default:
break;
}
throw std::runtime_error("invalid index");
}
CheckableItem &VerbEndModel::getItem(const QModelIndex &index)
{
auto &items = getItems(index);
if (index.column() < items.size())
{
return items.at(index.column());
}
throw std::runtime_error("invalid index");
}
const CheckableItem &VerbEndModel::getItem(const QModelIndex &index) const
{
auto &items = getItems(index);
if (index.column() < items.size())
{
return items.at(index.column());
}
throw std::runtime_error("invalid index");
m_tests = { { "Telefonat",
{ "Kausal (1)", "Kausal (2)", "Relativ", "Kausal (3)",
"Final", "Temporal (1)", "Temporal (2)" } },
{ "Zaubertrick", { "Relativ", "Final (1)", "Kausal (1)", "Final (2)",
"Temporal (1)", "Kausal (2)", "Temporal (2)" } },
{ "Zauberregel", { "Temporal (1)", "Kausal", "Final", "Relativ (1)",
"Temporal (2)", "Relativ (2)" } } };
}

View file

@ -1,44 +1,11 @@
#pragma once
#include "CheckableItem.h"
#include "CheckableItems.h"
#include "CheckableTestModel.h"
#include <QAbstractTableModel>
class VerbEndModel : public QAbstractTableModel
class VerbEndModel : public CheckableTestModel
{
Q_OBJECT
private:
CheckableItems m_telefonat = { "Kausal (1)", "Kausal (2)", "Relativ",
"Kausal (3)", "Final", "Temporal (1)", "Temporal (2)" };
CheckableItems m_zaubertrick = { "Relativ", "Final (1)", "Kausal (1)",
"Final (2)", "Temporal (1)", "Kausal (2)", "Temporal (2)" };
CheckableItems m_zauberregel = { "Temporal (1)", "Kausal", "Final",
"Relativ (1)", "Temporal (2)", "Relativ (2)" };
public:
VerbEndModel(QObject *parent);
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(
const QModelIndex &index, int role = Qt::DisplayRole) const override;
Qt::ItemFlags flags(const QModelIndex &index) const override;
bool setData(const QModelIndex &index, const QVariant &value,
int role = Qt::EditRole) override;
QVariant headerData(int section, Qt::Orientation orientation,
int role = Qt::DisplayRole) const override;
void write(QJsonObject &json) const;
void read(const QJsonObject &json);
private:
bool isValidIndex(const QModelIndex &index) const;
CheckableItems &getItems(const QModelIndex &index);
const CheckableItems &getItems(const QModelIndex &index) const;
CheckableItem &getItem(const QModelIndex &index);
const CheckableItem &getItem(const QModelIndex &index) const;
};