4#include "include/column_data/column_data.h"
5#include "include/tables/game_table.h"
16template<
class T_ChildAbstractIdTableItem,
17 class T_ParentAbstractIdTableItem,
23 const QString &table_name,
26 const qint16 minimum_supported_database_version = TableAttributes::NO_DATABASE_VERSION);
32 QVariant data(
const QModelIndex &index, qint32 role = Qt::DisplayRole)
const override;
35 qint32 rowCount(
const QModelIndex &parent = QModelIndex())
const override;
38 std::shared_ptr<ehm_dal::tables::AbstractTable> parentTable()
const override
42 ehm_dal::tables::AbstractTable::ParentTableRelationshipType parentTableRelationship()
45 return parent_table_relationship_;
48 const std::shared_ptr<ehm_dal::tables::AbstractTable> parent_table,
49 const ehm_dal::tables::AbstractTable::ParentTableRelationshipType relationship)
override
51 parent_table_ = std::move(parent_table);
52 parent_table_relationship_ = std::move(relationship);
56 bool setData(
const QModelIndex &index,
57 const QVariant &value,
58 qint32 role = Qt::EditRole)
override;
61 inline QString modelName()
const override {
return QStringLiteral(
"Game child table"); }
62 inline constexpr AbstractBaseModel::AbstractTableModelType modelType()
const override
64 return AbstractBaseModel::AbstractTableModelType::GameChildTable;
69 std::shared_ptr<ehm_dal::tables::AbstractTable> parent_table_;
70 ehm_dal::tables::AbstractTable::ParentTableRelationshipType parent_table_relationship_{
71 ehm_dal::tables::AbstractTable::ParentTableRelationshipType::ParentTableHasChildIdField};
74 bool transferChildDataToParent();
76 enum ENUM_FLAGS { NO_PARENT = 0, CHILD_INDEX_PARENT_ROW_MODIFIER = 1 };
79 virtual bool emitModifiedColumns(
const qint32 row,
80 const std::vector<qint32> &modified_columns,
81 const QModelIndex &parent,
82 const QList<qint32> &modified_roles = QList<qint32>())
84 for (
const auto &itr : modified_columns) {
85 const auto parent_index{this->index(parent.row(), 0, QModelIndex())};
86 const auto modified_index{this->index(row, itr, parent_index)};
88 emit this->dataChanged(modified_index, modified_index, modified_roles);
91 return !modified_columns.empty();
99template<
class T_ChildAbstractIdTableItem,
class T_ParentAbstractIdTableItem,
class T_ColumnData>
100GameChildTable<T_ChildAbstractIdTableItem, T_ParentAbstractIdTableItem, T_ColumnData>::GameChildTable(
101 const QString &table_name,
104 const qint16 minimum_supported_database_version)
105 : GameTable<T_ChildAbstractIdTableItem, T_ColumnData>(table_name,
108 minimum_supported_database_version)
115template<
class T_ChildAbstractIdTableItem,
class T_ParentAbstractIdTableItem,
class T_ColumnData>
121 const auto transfer_result{transferChildDataToParent()};
123 return read_result && transfer_result;
130template<
class T_ChildAbstractIdTableItem,
class T_ParentAbstractIdTableItem,
class T_ColumnData>
132 const QModelIndex &index, qint32 role)
const
134 if (!index.isValid())
137 return this->parent_table_->childData(index,
139 this->constColumnData(),
140 this->attributes()->
id());
147template<
class T_ChildAbstractIdTableItem,
class T_ParentAbstractIdTableItem,
class T_ColumnData>
148qint32 GameChildTable<T_ChildAbstractIdTableItem, T_ParentAbstractIdTableItem, T_ColumnData>::rowCount(
149 const QModelIndex &parent)
const
151 if (parent.isValid() || !this->parent_table_)
154 return this->parent_table_->rowCount();
162template<
class T_ChildAbstractIdTableItem,
class T_ParentAbstractIdTableItem,
class T_ColumnData>
163bool GameChildTable<T_ChildAbstractIdTableItem, T_ParentAbstractIdTableItem, T_ColumnData>::
164 transferChildDataToParent()
166 if (!parent_table_) {
167 qWarning().noquote() << QStringLiteral(
"No parent table assigned to '%1' child table")
168 .arg(this->table_attributes_.name());
172 const auto parent_size{parent_table_->rowCount()};
173 const auto child_table_index{this->attributes()->id()};
176 if (parent_table_relationship_
177 == ehm_dal::tables::AbstractTable::ParentTableRelationshipType::ParentTableHasChildIdField) {
178 for (
auto parent_id = 0; parent_id < parent_size; ++parent_id) {
179 const auto child_id{parent_table_->childItemId(parent_id, child_table_index)};
180 if (this->isValidRow(child_id))
181 parent_table_->addChildItem(parent_id, this->data_[child_id], child_table_index);
185 else if (parent_table_relationship_
186 == ehm_dal::tables::AbstractTable::ParentTableRelationshipType::
187 ChildTableHasParentIdField) {
188 for (
auto &itr : this->data_) {
189 const auto parent_id{itr->parentItemId()};
190 parent_table_->addChildItem(parent_id, itr, child_table_index);
204template<
class T_ChildAbstractIdTableItem,
class T_ParentAbstractIdTableItem,
class T_ColumnData>
205bool GameChildTable<T_ChildAbstractIdTableItem, T_ParentAbstractIdTableItem, T_ColumnData>::setData(
206 const QModelIndex &index,
const QVariant &value, qint32 role)
208 if (!index.isValid() || role != Qt::EditRole)
211 std::vector<qint32> modified_columns{index.column()};
213 const auto result{parent_table_->setChildData(index,
217 this->constColumnData(),
218 this->attributes()->
id())};
220 if (result && this->emitModifiedColumns(index.row(), modified_columns, index.parent()))
The ColumnData class represents a container of ehm_dal::column_data::Column and attributes relating t...
Definition: column_data.h:19
The GameChildTable class is a model for child data of a parent table. Each parent item has a single c...
Definition: game_child_table.h:20
bool readStream(QDataStream &in) override
Reads the table data from a QDataStream.
Definition: game_child_table.h:116
Definition: game_table.h:23
namespace ehm_dal::tables
Definition: column.h:4
TableType
The TableType enum denotes different types of database table.
Definition: table_type.h:12
TableIndex
The TableIndex enum represents the id number of each table within the database.
Definition: table_index.h:14