From 0937fc21e7df309782194cee22cf8ea7b173a227 Mon Sep 17 00:00:00 2001 From: Michael Mandl Date: Tue, 22 May 2018 10:57:25 +0200 Subject: [PATCH] added genus model items --- source/Genus/GenusModel.cpp | 169 +++++++++++++++++++++++++++--------- source/Genus/GenusModel.h | 44 +++++++++- 2 files changed, 168 insertions(+), 45 deletions(-) diff --git a/source/Genus/GenusModel.cpp b/source/Genus/GenusModel.cpp index 57acc87..fa42e5c 100644 --- a/source/Genus/GenusModel.cpp +++ b/source/Genus/GenusModel.cpp @@ -1,5 +1,7 @@ #include "GenusModel.h" +#include + GenusModel::GenusModel(QObject *parent) : QAbstractTableModel(parent) { @@ -17,51 +19,64 @@ int GenusModel::columnCount(const QModelIndex &parent) const QVariant GenusModel::data(const QModelIndex &index, int role) const { - if (role == Qt::DisplayRole) - { - if (index.row() == 0 && m_tiere.find(index.column()) != m_tiere.end()) + if (!isValidIndex(index)) + { + return {}; + } + + try + { + auto &item = getItem(index); + + if (role == Qt::DisplayRole) { - return m_tiere.find(index.column())->second.getText().c_str(); + return item.getText().c_str(); } - return "Hello"; - } - - if (role == Qt::CheckStateRole) - { - if (index.row() == 0 && m_tiere.find(index.column()) != m_tiere.end()) + if (role == Qt::CheckStateRole) { - return m_tiere.find(index.column())->second.isChecked() ? Qt::Checked : Qt::Unchecked; + return item.isChecked() ? Qt::Checked : Qt::Unchecked; } + } + catch (std::runtime_error &e) + { + qDebug() << "GenusModel::data" << index << e.what(); + } - return Qt::Unchecked; - } - - return QVariant(); + return {}; } Qt::ItemFlags GenusModel::flags(const QModelIndex &index) const { - return QAbstractTableModel::flags(index) | Qt::ItemIsEnabled - | Qt::ItemIsUserCheckable; + if (isValidIndex(index)) + { + return Qt::ItemIsEnabled | Qt::ItemIsUserCheckable; + } + + return Qt::NoItemFlags; } bool GenusModel::setData( const QModelIndex &index, const QVariant &value, int role) { - if (role != Qt::CheckStateRole) - { - return QAbstractTableModel::setData(index, value, role); - } - else + if (!isValidIndex(index)) { - if (index.row() == 0 && m_tiere.find(index.column()) != m_tiere.end()) - { - m_tiere.find(index.column())->second.setState(value.toBool()); + return false; + } + try + { + if (role == Qt::CheckStateRole) + { + auto &item = getItem(index); + item.setState(value.toBool()); return true; } } + catch (std::runtime_error &e) + { + qDebug() << "GenusModel::setData" << index << e.what(); + } return false; } @@ -69,23 +84,20 @@ bool GenusModel::setData( QVariant GenusModel::headerData( int section, Qt::Orientation orientation, int role) const { - if (role == Qt::DisplayRole) - { - if (orientation == Qt::Vertical) - { - switch (section) - { - case 0: - return "Tiere"; - case 1: - return "Futter"; - case 2: - return "Zirkus"; - default: - return {}; - } - } - } + if (role == Qt::DisplayRole && orientation == Qt::Vertical) + { + switch (section) + { + case 0: + return "Tiere"; + case 1: + return "Futter"; + case 2: + return "Zirkus"; + default: + return {}; + } + } return {}; } @@ -97,3 +109,76 @@ void GenusModel::write(QJsonObject &json) const void GenusModel::read(const QJsonObject &json) { } + +bool GenusModel::isValidIndex(const QModelIndex &index) const +{ + switch (index.row()) + { + case 0: + return m_tiere.find(index.column()) != m_tiere.end(); + case 1: + return m_futter.find(index.column()) != m_futter.end(); + case 2: + return m_zirkus.find(index.column()) != m_zirkus.end(); + default: + return false; + } +} + +GenusModel::CheckableItems &GenusModel::getItems(const QModelIndex &index) +{ + switch (index.row()) + { + case 0: + return m_tiere; + case 1: + return m_futter; + case 2: + return m_zirkus; + default: + break; + } + + throw std::runtime_error("invalid index"); +} + +const GenusModel::CheckableItems &GenusModel::getItems(const QModelIndex &index) const +{ + switch (index.row()) + { + case 0: + return m_tiere; + case 1: + return m_futter; + case 2: + return m_zirkus; + default: + break; + } + + throw std::runtime_error("invalid index"); +} + +CheckableItem &GenusModel::getItem(const QModelIndex &index) +{ + auto &items = getItems(index); + auto entry = items.find(index.column()); + if (entry != items.end()) + { + return entry->second; + } + + throw std::runtime_error("invalid index"); +} + +const CheckableItem &GenusModel::getItem(const QModelIndex &index) const +{ + auto &items = getItems(index); + auto entry = items.find(index.column()); + if (entry != items.end()) + { + return entry->second; + } + + throw std::runtime_error("invalid index"); +} diff --git a/source/Genus/GenusModel.h b/source/Genus/GenusModel.h index cccf937..930034f 100644 --- a/source/Genus/GenusModel.h +++ b/source/Genus/GenusModel.h @@ -38,10 +38,38 @@ class GenusModel : public QAbstractTableModel Q_OBJECT private: - std::map m_tiere = + using CheckableItems = std::map; + + CheckableItems m_tiere = { - {0, {"null"}}, - {1, {"eins"}} + {0, {"Tiger"}}, + {1, {"Bär"}}, + {2, {"Katze"}}, + {3, {"Pferd"}}, + {4, {"Gans"}}, + {5, {"Elefant"}}, + {6, {"Katze"}}, + {7, {"Hund"}} + }; + + CheckableItems m_futter = + { + {0, {"Salat"}}, + {1, {"Fleisch"}}, + {2, {"Knocken"}}, + {3, {"Banane"}}, + {4, {"Apfel"}}, + {5, {"Möhre"}}, + {6, {"Honig"}}, + {7, {"Zucker"}} + }; + + CheckableItems m_zirkus = + { + {0, {"Kiste"}}, + {1, {"Holz"}}, + {2, {"Vorhang"}}, + {3, {"Baum"}} }; public: @@ -59,4 +87,14 @@ public: 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; }; +