diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index d3eefd8..13a022f 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -36,9 +36,11 @@ target_include_directories(${PROJECT_NAME} target_link_libraries(${PROJECT_NAME} PRIVATE MetaData + VerbEnd Genus Qt5::Widgets ) add_subdirectory(MetaData) +add_subdirectory(VerbEnd) add_subdirectory(Genus) diff --git a/source/Genus/CheckableItem.cpp b/source/CheckableItem.cpp similarity index 100% rename from source/Genus/CheckableItem.cpp rename to source/CheckableItem.cpp diff --git a/source/Genus/CheckableItem.h b/source/CheckableItem.h similarity index 100% rename from source/Genus/CheckableItem.h rename to source/CheckableItem.h diff --git a/source/Genus/CheckableItems.cpp b/source/CheckableItems.cpp similarity index 100% rename from source/Genus/CheckableItems.cpp rename to source/CheckableItems.cpp diff --git a/source/Genus/CheckableItems.h b/source/CheckableItems.h similarity index 100% rename from source/Genus/CheckableItems.h rename to source/CheckableItems.h diff --git a/source/DataModel.cpp b/source/DataModel.cpp index e174c9e..e1362b6 100644 --- a/source/DataModel.cpp +++ b/source/DataModel.cpp @@ -3,6 +3,7 @@ DataModel::DataModel(QObject *parent) : QObject(parent) , m_metaData(this) + , m_verbEnd(this) , m_genus(this) { } @@ -13,6 +14,10 @@ void DataModel::write(QJsonObject &target) const m_metaData.write(metaData); target["MetaData"] = metaData; + QJsonObject verbEnd; + m_verbEnd.write(verbEnd); + target["VerbEnd"] = verbEnd; + QJsonObject genus; m_genus.write(genus); target["Genus"] = genus; @@ -26,6 +31,12 @@ void DataModel::read(const QJsonObject &source) m_metaData.read(metaData.toObject()); } + const auto &verbEnd = source["VerbEnd"]; + if (verbEnd.isObject()) + { + m_verbEnd.read(verbEnd.toObject()); + } + const auto &genus = source["Genus"]; if (genus.isObject()) { diff --git a/source/DataModel.h b/source/DataModel.h index 7e271bf..db7a475 100644 --- a/source/DataModel.h +++ b/source/DataModel.h @@ -2,6 +2,7 @@ #include "MetaData/MetaDataModel.h" #include "Genus/GenusModel.h" +#include "VerbEnd/VerbEndModel.h" #include @@ -11,6 +12,7 @@ class DataModel : public QObject public: MetaDataModel m_metaData; + VerbEndModel m_verbEnd; GenusModel m_genus; public: diff --git a/source/Genus/CMakeLists.txt b/source/Genus/CMakeLists.txt index 435ec16..296fede 100644 --- a/source/Genus/CMakeLists.txt +++ b/source/Genus/CMakeLists.txt @@ -13,9 +13,9 @@ qt5_wrap_ui(UI_HEADERS add_library(${PROJECT_NAME} GenusWidget.cpp GenusModel.cpp - CheckableItem.cpp - CheckableItems.cpp - ${UI_HEADERS} + ../CheckableItem.cpp + ../CheckableItems.cpp + ${UI_HEADERS} ) set_target_properties(${PROJECT_NAME} diff --git a/source/Genus/GenusModel.h b/source/Genus/GenusModel.h index bceab15..895bf7b 100644 --- a/source/Genus/GenusModel.h +++ b/source/Genus/GenusModel.h @@ -1,7 +1,7 @@ #pragma once -#include "CheckableItem.h" -#include "CheckableItems.h" +#include "../CheckableItem.h" +#include "../CheckableItems.h" #include diff --git a/source/VerbEnd/CMakeLists.txt b/source/VerbEnd/CMakeLists.txt new file mode 100644 index 0000000..27629a3 --- /dev/null +++ b/source/VerbEnd/CMakeLists.txt @@ -0,0 +1,33 @@ +cmake_minimum_required(VERSION 3.6) + +project(VerbEnd LANGUAGES CXX) + +find_package(Qt5Widgets REQUIRED) + +set(CMAKE_AUTOMOC ON) + +qt5_wrap_ui(UI_HEADERS + VerbEndWidget.ui +) + +add_library(${PROJECT_NAME} + VerbEndWidget.cpp + VerbEndModel.cpp + ../CheckableItem.cpp + ../CheckableItems.cpp + ${UI_HEADERS} +) + +set_target_properties(${PROJECT_NAME} + PROPERTIES CXX_STANDARD 14 +) + +target_include_directories(${PROJECT_NAME} + PRIVATE + ${CMAKE_CURRENT_BINARY_DIR} +) + +target_link_libraries(${PROJECT_NAME} + PRIVATE + Qt5::Widgets +) diff --git a/source/VerbEnd/VerbEndModel.cpp b/source/VerbEnd/VerbEndModel.cpp new file mode 100644 index 0000000..38175e5 --- /dev/null +++ b/source/VerbEnd/VerbEndModel.cpp @@ -0,0 +1,208 @@ +#include "VerbEndModel.h" + +#include +#include + +VerbEndModel::VerbEndModel(QObject *parent) + : QAbstractTableModel(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"); +} diff --git a/source/VerbEnd/VerbEndModel.h b/source/VerbEnd/VerbEndModel.h new file mode 100644 index 0000000..2b02269 --- /dev/null +++ b/source/VerbEnd/VerbEndModel.h @@ -0,0 +1,44 @@ +#pragma once + +#include "../CheckableItem.h" +#include "../CheckableItems.h" + +#include + +class VerbEndModel : public QAbstractTableModel +{ + 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; +}; diff --git a/source/VerbEnd/VerbEndWidget.cpp b/source/VerbEnd/VerbEndWidget.cpp new file mode 100644 index 0000000..c3ebbc5 --- /dev/null +++ b/source/VerbEnd/VerbEndWidget.cpp @@ -0,0 +1,23 @@ +#include "VerbEndWidget.h" +#include "ui_VerbEndWidget.h" + +#include "VerbEndModel.h" + +VerbEndWidget::VerbEndWidget(QWidget *parent) + : QWidget(parent) + , ui(new Ui::VerbEndWidget) +{ + ui->setupUi(this); + + ui->verbEndTableView->horizontalHeader()->hide(); +} + +VerbEndWidget::~VerbEndWidget() +{ + delete ui; +} + +void VerbEndWidget::setModel(VerbEndModel *model) +{ + ui->verbEndTableView->setModel(model); +} diff --git a/source/VerbEnd/VerbEndWidget.h b/source/VerbEnd/VerbEndWidget.h new file mode 100644 index 0000000..95f7ef5 --- /dev/null +++ b/source/VerbEnd/VerbEndWidget.h @@ -0,0 +1,23 @@ +#pragma once + +#include + +class VerbEndModel; + +namespace Ui { +class VerbEndWidget; +}; + +class VerbEndWidget : public QWidget +{ + Q_OBJECT + +private: + Ui::VerbEndWidget *ui; + +public: + VerbEndWidget(QWidget *parent = nullptr); + ~VerbEndWidget(); + + void setModel(VerbEndModel *model); +}; diff --git a/source/VerbEnd/VerbEndWidget.ui b/source/VerbEnd/VerbEndWidget.ui new file mode 100644 index 0000000..98c9e4e --- /dev/null +++ b/source/VerbEnd/VerbEndWidget.ui @@ -0,0 +1,24 @@ + + + VerbEndWidget + + + + 0 + 0 + 556 + 210 + + + + Form + + + + + + + + + + diff --git a/source/mainwindow.cpp b/source/mainwindow.cpp index 7927602..ec9393f 100644 --- a/source/mainwindow.cpp +++ b/source/mainwindow.cpp @@ -31,6 +31,7 @@ void MainWindow::newFile() { m_dataModel = std::make_unique(this); ui->metaDataWidget->setModel(&m_dataModel->m_metaData); + ui->verbEndWidget->setModel(&m_dataModel->m_verbEnd); ui->genusWidget->setModel(&m_dataModel->m_genus); } diff --git a/source/mainwindow.ui b/source/mainwindow.ui index f524a0b..730c748 100644 --- a/source/mainwindow.ui +++ b/source/mainwindow.ui @@ -18,7 +18,7 @@ - 0 + 1 @@ -30,6 +30,16 @@ + + + Subtest 2: Verbenstellungsregel (VE) + + + + + + + Subtest 3: Genus @@ -140,6 +150,12 @@
Genus/GenusWidget.h
1 + + VerbEndWidget + QWidget +
VerbEnd/VerbEndWidget.h
+ 1 +