Print most of the table structures

This commit is contained in:
Michael Mandl 2019-02-03 19:53:51 +01:00
parent f895ec0c1c
commit ab862aeaf1
31 changed files with 411 additions and 203 deletions

View file

@ -39,9 +39,7 @@ target_include_directories(${PROJECT_NAME}
target_link_libraries(${PROJECT_NAME}
PRIVATE
CheckableItem
CheckableTest
CheckableTestModel
PrintableModel
Qt5::Widgets
${Protobuf_LIBRARIES}
)

View file

@ -1,8 +1,10 @@
#include "GenusModel.h"
GenusModel::GenusModel(QObject *parent)
: CheckableTestModel(parent)
: PrintableModel(parent)
{
m_title = "Subtest 3: Genus";
m_tests = {{"Tiere", {"Tiger", "Bär", "Katze", "Pferd", "Gans", "Elefant", "Affe", "Hund"}},
{"Futter",
{"Salat", "Fleisch", "Knochen", "Banane", "Apfel", "Karotte", "Honig", "Zucker"}},

View file

@ -1,9 +1,9 @@
#pragma once
#include "CheckableTestModel.h"
#include "PrintableModel.h"
#include "GenusModel.pb.h"
class GenusModel : public CheckableTestModel
class GenusModel : public PrintableModel
{
Q_OBJECT

View file

@ -39,9 +39,7 @@ target_include_directories(${PROJECT_NAME}
target_link_libraries(${PROJECT_NAME}
PRIVATE
CheckableItem
CheckableTest
CheckableTestModel
PrintableModel
Qt5::Widgets
${Protobuf_LIBRARIES}
)

View file

@ -3,8 +3,10 @@
#include <QSize>
PluralModel::PluralModel(QObject *parent)
: CheckableTestModel(parent)
: PrintableModel(parent)
{
m_title = "Subtest 5: Plural";
m_tests = {{"Plural",
{"Fisch /-e/", "Banane /-n/", "Bonbon /-s/", "Ei /-er/", "Eimer /-ø/",
"Korn UML+/-er/", "Nuss UML+/-e/", "Bär /-en/", "Apfel UML"}}};

View file

@ -1,9 +1,9 @@
#pragma once
#include "CheckableTestModel.h"
#include "PrintableModel.h"
#include "PluralModel.pb.h"
class PluralModel : public CheckableTestModel
class PluralModel : public PrintableModel
{
Q_OBJECT

View file

@ -19,6 +19,7 @@ protobuf_generate_cpp(V2Svk_PROTO_SRCS V2Svk_PROTO_HDRS ${V2Svk_PROTO_FILES})
add_library(${PROJECT_NAME}
V2SvkWidget.cpp
V2SvkModel.cpp
WFModel.cpp
OTModel.cpp
TPrModel.cpp
@ -42,9 +43,6 @@ target_include_directories(${PROJECT_NAME}
target_link_libraries(${PROJECT_NAME}
PRIVATE
CheckableItem
CheckableTest
CheckableTestModel
PrintableModel
Qt5::Widgets
${Protobuf_LIBRARIES}

View file

@ -1,7 +1,7 @@
#include "OTModel.h"
OTModel::OTModel(QObject *parent)
: CheckableTestModel(parent)
: V2SvkModel(parent)
{
m_tests = {
{"Objekt-Topikalisierung",
@ -13,7 +13,7 @@ OTModel::OTModel(QObject *parent)
};
}
unsigned int OTModel::getV2Points()
unsigned int OTModel::getV2Points() const
{
unsigned int points = 0;
@ -33,7 +33,7 @@ unsigned int OTModel::getV2Points()
return points;
}
unsigned int OTModel::getSvkPoints()
unsigned int OTModel::getSvkPoints() const
{
unsigned int points = 0;
@ -103,3 +103,13 @@ void OTModel::read(const ESGRAF48::V2SvkModel &model)
emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1));
}
std::set<int> OTModel::v2Tests() const
{
return {0};
};
std::set<int> OTModel::svkTests() const
{
return {1};
};

View file

@ -1,18 +1,24 @@
#pragma once
#include "CheckableTestModel.h"
#include "V2SvkModel.h"
#include "V2SvkModel.pb.h"
class OTModel : public CheckableTestModel
class OTModel : public V2SvkModel
{
Q_OBJECT
public:
OTModel(QObject *parent);
unsigned int getV2Points();
unsigned int getSvkPoints();
unsigned int getV2Points() const override;
unsigned int getSvkPoints() const override;
void write(ESGRAF48::V2SvkModel &model) const;
void read(const ESGRAF48::V2SvkModel &model);
void write(ESGRAF48::V2SvkModel &model) const override;
void read(const ESGRAF48::V2SvkModel &model) override;
protected:
void printHeader(QPainter &) const override {};
std::set<int> v2Tests() const override;
std::set<int> svkTests() const override;
};

View file

@ -1,7 +1,7 @@
#include "TPeModel.h"
TPeModel::TPeModel(QObject *parent)
: CheckableTestModel(parent)
: V2SvkModel(parent)
{
m_tests = {
{"Temporaladverb Perfekt", {"Affe", "Affe", "Schwein", "Schwein", "Gans", "Gans"}},
@ -11,7 +11,7 @@ TPeModel::TPeModel(QObject *parent)
};
}
unsigned int TPeModel::getV2Points()
unsigned int TPeModel::getV2Points() const
{
unsigned int points = 0;
@ -31,7 +31,7 @@ unsigned int TPeModel::getV2Points()
return points;
}
unsigned int TPeModel::getSvkPoints()
unsigned int TPeModel::getSvkPoints() const
{
unsigned int points = 0;
@ -93,3 +93,13 @@ void TPeModel::read(const ESGRAF48::V2SvkModel &model)
emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1));
}
std::set<int> TPeModel::v2Tests() const
{
return {0, 1};
};
std::set<int> TPeModel::svkTests() const
{
return {2, 3};
};

View file

@ -1,18 +1,24 @@
#pragma once
#include "CheckableTestModel.h"
#include "V2SvkModel.h"
#include "V2SvkModel.pb.h"
class TPeModel : public CheckableTestModel
class TPeModel : public V2SvkModel
{
Q_OBJECT
public:
TPeModel(QObject *parent);
unsigned int getV2Points();
unsigned int getSvkPoints();
unsigned int getV2Points() const override;
unsigned int getSvkPoints() const override;
void write(ESGRAF48::V2SvkModel &model) const;
void read(const ESGRAF48::V2SvkModel &model);
void write(ESGRAF48::V2SvkModel &model) const override;
void read(const ESGRAF48::V2SvkModel &model) override;
protected:
void printHeader(QPainter &) const override {};
std::set<int> v2Tests() const override;
std::set<int> svkTests() const override;
};

View file

@ -1,7 +1,7 @@
#include "TPrModel.h"
TPrModel::TPrModel(QObject *parent)
: CheckableTestModel(parent)
: V2SvkModel(parent)
{
m_tests = {
{"Temporaladverb Präsens", {"Affe", "Affe", "Schwein", "Schwein", "Gans", "Gans"}},
@ -9,7 +9,7 @@ TPrModel::TPrModel(QObject *parent)
};
}
unsigned int TPrModel::getV2Points()
unsigned int TPrModel::getV2Points() const
{
unsigned int points = 0;
@ -29,7 +29,7 @@ unsigned int TPrModel::getV2Points()
return points;
}
unsigned int TPrModel::getSvkPoints()
unsigned int TPrModel::getSvkPoints() const
{
unsigned int points = 0;
@ -87,3 +87,13 @@ void TPrModel::read(const ESGRAF48::V2SvkModel &model)
emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1));
}
std::set<int> TPrModel::v2Tests() const
{
return {0};
};
std::set<int> TPrModel::svkTests() const
{
return {1};
};

View file

@ -1,18 +1,24 @@
#pragma once
#include "CheckableTestModel.h"
#include "V2SvkModel.h"
#include "V2SvkModel.pb.h"
class TPrModel : public CheckableTestModel
class TPrModel : public V2SvkModel
{
Q_OBJECT
public:
TPrModel(QObject *parent);
unsigned int getV2Points();
unsigned int getSvkPoints();
unsigned int getV2Points() const override;
unsigned int getSvkPoints() const override;
void write(ESGRAF48::V2SvkModel &model) const;
void read(const ESGRAF48::V2SvkModel &model);
void write(ESGRAF48::V2SvkModel &model) const override;
void read(const ESGRAF48::V2SvkModel &model) override;
protected:
void printHeader(QPainter &) const override{};
std::set<int> v2Tests() const override;
std::set<int> svkTests() const override;
};

View file

@ -0,0 +1,126 @@
#include "V2SvkModel.h"
V2SvkModel::V2SvkModel(QObject *parent)
: PrintableModel(parent)
{
}
void V2SvkModel::printTests(QPainter &painter) const
{
painter.setFont(tableFont());
painter.setPen(tablePen());
auto width = painter.device()->width();
auto height = 1.5 * painter.fontMetrics().lineSpacing();
auto v2TestIndices = v2Tests();
auto svkTestIndices = svkTests();
double x = 0;
double y = 0;
auto testIndex = 0;
for (const auto &test : m_tests)
{
double rowHeaderWidth = 0.2 * width;
double resultCellWidth = test.size() > 8 ? 0.04 * width : 0.08 * width;
double rowHeight = height;
if (testIndex == 0)
{
drawTextSquare(painter, {x, y, rowHeaderWidth, 2 * rowHeight}, test.name());
x += rowHeaderWidth;
std::vector<std::pair<std::string, unsigned int>> columnHeaders;
for (const auto &item : test.items())
{
const auto &itemText = item.getText();
if (!columnHeaders.empty() && columnHeaders.back().first == itemText)
{
columnHeaders.back().second++;
}
else
{
columnHeaders.emplace_back(itemText, 1);
}
}
for (const auto &columnHeader : columnHeaders)
{
double cellWidth = columnHeader.second * resultCellWidth;
drawTextSquare(painter, {x, y, cellWidth, rowHeight}, columnHeader.first.c_str());
x += cellWidth;
}
x = rowHeaderWidth;
y += rowHeight;
}
else
{
drawTextSquare(painter, {x, y, rowHeaderWidth, rowHeight}, test.name());
x += rowHeaderWidth;
}
unsigned int emptyItemsStack = 0;
for (const auto &item : test.items())
{
if (item.getText().empty())
{
emptyItemsStack++;
}
else
{
if (emptyItemsStack > 0)
{
drawGreySquare(painter, {x - emptyItemsStack * resultCellWidth, y,
emptyItemsStack * resultCellWidth, rowHeight});
emptyItemsStack = 0;
}
drawCheckSquare(painter, {x, y, resultCellWidth, rowHeight}, item.isChecked());
}
x += resultCellWidth;
}
if (emptyItemsStack > 0)
{
drawGreySquare(painter, {x - emptyItemsStack * resultCellWidth, y,
emptyItemsStack * resultCellWidth, rowHeight});
emptyItemsStack = 0;
}
if (v2TestIndices.find(testIndex) != v2TestIndices.end())
{
drawResultSquare(painter, y, false, test.getPoints());
}
if (svkTestIndices.find(testIndex) != svkTestIndices.end())
{
drawResultSquare(painter, y, true, test.getPoints());
}
x = 0;
y += rowHeight;
testIndex++;
}
x = 0;
y += height;
painter.translate(0, y);
}
void V2SvkModel::printSummary(QPainter &painter, unsigned int v2Points, unsigned int svkPoints)
{
painter.setFont(PrintableModel::tableFont());
painter.setPen(PrintableModel::tablePen());
auto width = painter.device()->width();
auto height = 1.5 * painter.fontMetrics().lineSpacing();
painter.drawText(0, 0, 0.85 * width, height, Qt::AlignRight | Qt::AlignVCenter,
"Rohwertpunkte Total:");
PrintableModel::drawResultSquare(painter, 0, false, v2Points);
PrintableModel::drawResultSquare(painter, 0, true, svkPoints);
painter.translate(0, 3 * height);
}

View file

@ -0,0 +1,27 @@
#pragma once
#include "PrintableModel.h"
#include "V2SvkModel.pb.h"
class V2SvkModel : public PrintableModel
{
Q_OBJECT
public:
V2SvkModel(QObject *parent);
virtual unsigned int getV2Points() const = 0;
virtual unsigned int getSvkPoints() const = 0;
virtual void write(ESGRAF48::V2SvkModel &model) const = 0;
virtual void read(const ESGRAF48::V2SvkModel &model) = 0;
static void printSummary(QPainter &painter, unsigned int v2Points, unsigned int svkPoints);
protected:
void printTests(QPainter &painter) const override;
void printSummary(QPainter &painter) const override {};
virtual std::set<int> v2Tests() const = 0;
virtual std::set<int> svkTests() const = 0;
};

View file

@ -1,8 +1,10 @@
#include "WFModel.h"
WFModel::WFModel(QObject *parent)
: CheckableTestModel(parent)
: V2SvkModel(parent)
{
m_title = "Subtest 1: Verbzweitstellungsregel (V2) und Subjekt-Verb-Kontrollregel (SVK)";
m_tests = {
{"W-Frage",
{"Affe", "Affe", "Affe", "Affe", "Schwein", "Schwein", "Schwein", "Schwein", "Gans",
@ -134,115 +136,12 @@ void WFModel::read(const ESGRAF48::V2SvkModel &model)
emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1));
}
void WFModel::printTo(QPainter &painter) const
std::set<int> WFModel::v2Tests() const
{
painter.setFont(h2Font());
return {0, 1};
};
painter.drawText(
0, 0, "Subtest 1: Verbzweitstellungsregel (V2) und Subjekt-Verb-Kontrollregel (SVK)");
painter.setFont(tableFont());
painter.setPen(tablePen());
auto width = painter.device()->width();
auto height = 1.5 * painter.fontMetrics().lineSpacing();
std::set<unsigned int> blockStarters = {0, 3, 5, 7};
std::set<unsigned int> v2Tests = {0, 1, 3, 5, 7, 8};
std::set<unsigned int> svkTests = {2, 4, 6, 9, 10};
double x = 0;
double y = 0;
auto testIndex = 0;
for (const auto &test : m_tests)
{
double rowHeaderWidth = 0.2 * width;
double resultCellWidth = test.size() > 8 ? 0.05 * width : 0.1 * width;
double rowHeight = height;
if (blockStarters.find(testIndex) != blockStarters.end())
{
y += rowHeight;
drawTextSquare(painter, {x, y, rowHeaderWidth, 2 * rowHeight}, test.name());
x += rowHeaderWidth;
std::vector<std::pair<std::string, unsigned int>> columnHeaders;
for (const auto &item : test.items())
{
const auto &itemText = item.getText();
if (!columnHeaders.empty() && columnHeaders.back().first == itemText)
{
columnHeaders.back().second++;
}
else
{
columnHeaders.emplace_back(itemText, 1);
}
}
for (const auto &columnHeader : columnHeaders)
{
double cellWidth = columnHeader.second * resultCellWidth;
drawTextSquare(painter, {x, y, cellWidth, rowHeight}, columnHeader.first.c_str());
x += cellWidth;
}
x = rowHeaderWidth;
y += rowHeight;
}
else
{
drawTextSquare(painter, {x, y, rowHeaderWidth, rowHeight}, test.name());
x += rowHeaderWidth;
}
unsigned int emptyItemsStack = 0;
for (const auto &item : test.items())
{
if (item.getText().empty())
{
emptyItemsStack++;
}
else
{
if (emptyItemsStack > 0)
{
drawGreySquare(painter, {x - emptyItemsStack * resultCellWidth, y,
emptyItemsStack * resultCellWidth, rowHeight});
emptyItemsStack = 0;
}
drawCheckSquare(painter, {x, y, resultCellWidth, rowHeight}, item.isChecked());
}
x += resultCellWidth;
}
if (emptyItemsStack > 0)
{
drawGreySquare(painter, {x - emptyItemsStack * resultCellWidth, y,
emptyItemsStack * resultCellWidth, rowHeight});
emptyItemsStack = 0;
}
if (v2Tests.find(testIndex) != v2Tests.end())
{
drawResultSquare(painter, y, false, test.getPoints());
}
if (svkTests.find(testIndex) != svkTests.end())
{
drawResultSquare(painter, y, true, test.getPoints());
}
x = 0;
y += rowHeight;
testIndex++;
}
x = 0;
y += height;
painter.drawText(x, y, 0.85 * width, height, Qt::AlignRight | Qt::AlignVCenter,
"Rohwertpunkte Total:");
drawResultSquare(painter, y, false, getV2Points());
drawResultSquare(painter, y, true, getSvkPoints());
}
std::set<int> WFModel::svkTests() const
{
return {2};
};

View file

@ -1,25 +1,24 @@
#pragma once
#include "PrintableModel.h"
#include "CheckableTestModel.h"
#include "V2SvkModel.h"
#include "V2SvkModel.pb.h"
class WFModel : public CheckableTestModel, public PrintableModel
class WFModel : public V2SvkModel
{
Q_OBJECT
public:
WFModel(QObject *parent);
unsigned int getV2Points() const;
unsigned int getSvkPoints() const;
unsigned int getV2Points() const override;
unsigned int getSvkPoints() const override;
void write(ESGRAF48::V2SvkModel &model) const;
void read(const ESGRAF48::V2SvkModel &model);
void printTo(QPainter &painter) const override;
void write(ESGRAF48::V2SvkModel &model) const override;
void read(const ESGRAF48::V2SvkModel &model) override;
protected:
std::set<int> v2Tests() const override;
std::set<int> svkTests() const override;
bool isValidIndex(const QModelIndex &index) const override;
};

View file

@ -42,6 +42,7 @@ target_link_libraries(${PROJECT_NAME}
CheckableItem
CheckableTest
CheckableTestModel
PrintableModel
Qt5::Widgets
${Protobuf_LIBRARIES}
)

View file

@ -1,8 +1,10 @@
#include "VerbEndModel.h"
VerbEndModel::VerbEndModel(QObject *parent)
: CheckableTestModel(parent)
: PrintableModel(parent)
{
m_title = "Subtest 2: Verbendstellungsregel (VE)";
m_tests = { { "Telefonat",
{ "Kausal", "Kausal", "Relativ", "Kausal",
"Final", "Temporal", "Temporal" } },
@ -98,3 +100,4 @@ void VerbEndModel::read(const ESGRAF48::VerbEndModel &model)
emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1));
}

View file

@ -1,9 +1,9 @@
#pragma once
#include "CheckableTestModel.h"
#include "PrintableModel.h"
#include "VerbEndModel.pb.h"
class VerbEndModel : public CheckableTestModel
class VerbEndModel : public PrintableModel
{
Q_OBJECT