From becde8c794e75a5fe56d55e4c6abf69f69c27a49 Mon Sep 17 00:00:00 2001 From: Bent Witthold Date: Sun, 1 Mar 2026 10:59:34 +0100 Subject: [PATCH] Added type role and column & refactored the JsonParser in the process. --- formats/csvparser.cpp | 4 ++++ formats/jsonparser.cpp | 53 ++++++++++++++++++++++++++++-------------- formats/jsonparser.h | 1 + model/metadata.h | 26 +++++++++++++++------ model/modelitem.cpp | 30 ++++-------------------- 5 files changed, 63 insertions(+), 51 deletions(-) diff --git a/formats/csvparser.cpp b/formats/csvparser.cpp index 85e5bac..cf2715a 100644 --- a/formats/csvparser.cpp +++ b/formats/csvparser.cpp @@ -127,6 +127,10 @@ QVariant CsvParser::parseItemValue(const int role, const std::string& valueStrin if (STRING_ROLES.contains(role)) { /// string values result = QString::fromStdString(valueString); + } else if (TYPE_ROLES.contains(role)) { + /// type values + // TODO validate string is allowed + result = QString::fromStdString(valueString); } else if (INT_ROLES.contains(role)) { /// int values diff --git a/formats/jsonparser.cpp b/formats/jsonparser.cpp index 8ef90de..6b7e80d 100644 --- a/formats/jsonparser.cpp +++ b/formats/jsonparser.cpp @@ -43,24 +43,7 @@ QByteArray JsonParser::itemValuesListToJson(const QList& itemVa QJsonObject rootObject; QJsonArray itemArray; for (const ModelItemValues& itemValues : itemValuesList) { - QJsonObject itemObject; - - QListIterator i(USER_FACING_ROLES); - while (i.hasNext()) { - const UserRoles role = i.next(); - const QString roleName = ROLE_NAMES.value(role); - const QVariant value = itemValues.value(role); - if (STRING_ROLES.contains(role)) { - itemObject.insert(roleName, value.toString()); - } else if (INT_ROLES.contains(role)) { - itemObject.insert(roleName, value.toInt()); - } else if (DOUBLE_ROLES.contains(role)) { - itemObject.insert(roleName, value.toDouble()); - } else { - qCritical() << QString("Can't find data type for role %1!!!").arg(role); - } - } - + QJsonObject itemObject = itemValuesToJsonObject(itemValues); itemArray.append(itemObject); } @@ -70,6 +53,38 @@ QByteArray JsonParser::itemValuesListToJson(const QList& itemVa return jsonDoc.toJson(QJsonDocument::Compact); } +QJsonObject JsonParser::itemValuesToJsonObject(const ModelItemValues& itemValues) { + QJsonObject result; + + // TODO add dates (entry, modification, end) + const UserRoles idRole = IdRole; + const QString roleName = ROLE_NAMES.value(idRole); + const QVariant idValue = itemValues.value(idRole); + if (!idValue.isNull()) { + const QString idRoleName = ROLE_NAMES.value(idRole); + result.insert(idRoleName, idValue.toString()); + } + + QListIterator i(USER_FACING_ROLES); + while (i.hasNext()) { + const UserRoles role = i.next(); + const QString roleName = ROLE_NAMES.value(role); + const QVariant value = itemValues.value(role); + if (STRING_ROLES.contains(role)) { + result.insert(roleName, value.toString()); + } else if (INT_ROLES.contains(role)) { + result.insert(roleName, value.toInt()); + } else if (DOUBLE_ROLES.contains(role)) { + result.insert(roleName, value.toDouble()); + } else if (TYPE_ROLES.contains(role)) { + result.insert(roleName, value.toString()); + } else { + qCritical() << QString("Can't find data type for role %1!!!").arg(role); + } + } + return result; +} + JsonParser::JsonParser() {} QJsonArray JsonParser::extractItemArray(const QJsonDocument& doc, const QString& objectName) { @@ -112,6 +127,8 @@ pair JsonParser::getKeyValuePair(const QJsonObject& itemJsonObjec result = jsonValue.toInt(); } else if (DOUBLE_ROLES.contains(role)) { result = jsonValue.toDouble(); + } else if (TYPE_ROLES.contains(role)) { + result = jsonValue.toString(); } else { qCritical() << QString("Cant find data type of role %1!!!").arg(role); } diff --git a/formats/jsonparser.h b/formats/jsonparser.h index bb920fd..428673c 100644 --- a/formats/jsonparser.h +++ b/formats/jsonparser.h @@ -18,6 +18,7 @@ class JsonParser { const QString& rootValueName = ""); static QByteArray itemValuesListToJson(const QList& itemValuesList, const QString& objectName = ""); + static QJsonObject itemValuesToJsonObject(const ModelItemValues& itemValues); private: explicit JsonParser(); diff --git a/model/metadata.h b/model/metadata.h index eadb1d0..04bd561 100644 --- a/model/metadata.h +++ b/model/metadata.h @@ -13,6 +13,7 @@ enum UserRoles { NameRole = Qt::UserRole + 1, DescriptionRole, InfoRole, + TypeRole, AmountRole, FactorRole, /// Non user facing @@ -24,16 +25,21 @@ enum UserRoles { static UserRoles DEFAULT_ROLE = NameRole; // TODO ?rename USER_FACING_ROLES -> MAIN_ROLES ? -static QList USER_FACING_ROLES = {NameRole, DescriptionRole, InfoRole, AmountRole, - FactorRole}; +static QList USER_FACING_ROLES = {NameRole, DescriptionRole, InfoRole, + TypeRole, AmountRole, FactorRole}; static QHash ROLE_NAMES = { - {NameRole, "name"}, {DescriptionRole, "description"}, {InfoRole, "info"}, - {AmountRole, "amount"}, {FactorRole, "factor"}, {ToStringRole, "ToString"}, - {IdRole, "id"}}; + {NameRole, "name"}, {DescriptionRole, "description"}, + {InfoRole, "info"}, {TypeRole, "type"}, + {AmountRole, "amount"}, {FactorRole, "factor"}, + {ToStringRole, "ToString"}, {IdRole, "id"}}; + static QList STRING_ROLES = {NameRole, DescriptionRole, InfoRole, IdRole}; static QList INT_ROLES = {AmountRole}; static QList DOUBLE_ROLES = {FactorRole}; +static const QList TYPE_ROLES = {TypeRole}; +static const QList TYPES = {"A", "B", "C", ""}; + /// JSON keys static const QString ITEMS_KEY_STRING = "items"; static const QString ITEM_KEY_STRING = "item"; @@ -42,7 +48,7 @@ static const QString ITEM_KEY_STRING = "item"; static const QString ITEMS_FILE_NAME = ITEMS_KEY_STRING + ".json"; /// functions -static int GET_ROLE_FOR_COLUMN(const int column) { +static UserRoles GET_ROLE_FOR_COLUMN(const int column) { switch (column) { case 0: return NameRole; @@ -54,9 +60,12 @@ static int GET_ROLE_FOR_COLUMN(const int column) { return InfoRole; break; case 3: - return AmountRole; + return TypeRole; break; case 4: + return AmountRole; + break; + case 5: return FactorRole; break; default: @@ -65,6 +74,9 @@ static int GET_ROLE_FOR_COLUMN(const int column) { break; } } + +static int GET_COLUMN_FOR_ROLE(const UserRoles role) { return USER_FACING_ROLES.indexOf(role); } + static QList GET_HEADER_NAMES() { QList result; for (const UserRoles& role : USER_FACING_ROLES) { diff --git a/model/modelitem.cpp b/model/modelitem.cpp index 88ac31b..85673fd 100644 --- a/model/modelitem.cpp +++ b/model/modelitem.cpp @@ -1,10 +1,11 @@ #include "modelitem.h" -#include "metadata.h" - #include #include +#include "../formats/jsonparser.h" +#include "metadata.h" + ModelItem::ModelItem(const ModelItemValues values) : m_values(values) {} @@ -66,29 +67,6 @@ QString ModelItem::toString() const { } QJsonObject ModelItem::toJsonObject() const { - QJsonObject itemObject; - // TODO add UUID and dates (entry, modification, end) - const UserRoles idRole = IdRole; - QVariant idValue = data(idRole); - if (!idValue.isNull()) { - const QString idRoleName = ROLE_NAMES.value(idRole); - itemObject.insert(idRoleName, idValue.toString()); - } - - QListIterator i(USER_FACING_ROLES); - while (i.hasNext()) { - const UserRoles role = i.next(); - const QString roleName = ROLE_NAMES.value(role); - const QVariant value = data(role); - if (STRING_ROLES.contains(role)) { - itemObject.insert(roleName, value.toString()); - } else if (INT_ROLES.contains(role)) { - itemObject.insert(roleName, value.toInt()); - } else if (DOUBLE_ROLES.contains(role)) { - itemObject.insert(roleName, value.toDouble()); - } else { - qCritical() << QString("Cant find data type of role %1!!!").arg(role); - } - } + QJsonObject itemObject = JsonParser::itemValuesToJsonObject(m_values); return itemObject; }