From acb8be56023e2008a4bbe92e1f770e63b633d8ff Mon Sep 17 00:00:00 2001 From: Bent Witthold Date: Mon, 29 Dec 2025 13:03:09 +0100 Subject: [PATCH] Refactored JsonParser to not use roles (or their names) directly. --- formats/jsonparser.cpp | 39 +++++++++++++++++++++++++-------------- formats/jsonparser.h | 4 ++++ model/metadata.h | 8 ++++---- model/tablemodel.cpp | 8 +++++--- 4 files changed, 38 insertions(+), 21 deletions(-) diff --git a/formats/jsonparser.cpp b/formats/jsonparser.cpp index 9de0ea1..1121949 100644 --- a/formats/jsonparser.cpp +++ b/formats/jsonparser.cpp @@ -23,20 +23,6 @@ QList> JsonParser::toItemValuesList(const QByteArray& jsonD return result; } -QHash JsonParser::jsonObjectToItemValues(const QJsonObject& itemJsonObject) { - QHash values; - - // TODO iterate over "public & editable" roles (the ones that should occur in JSON file) - // & use a (static) function to retrieve it (i. e. getRoleValue(int role)) - values[NameRole] = itemJsonObject[ROLE_NAMES.value(NameRole)].toString(); - values[DescriptionRole] = itemJsonObject[ROLE_NAMES.value(DescriptionRole)].toString(); - values[InfoRole] = itemJsonObject[ROLE_NAMES.value(InfoRole)].toString(); - values[AmountRole] = itemJsonObject[ROLE_NAMES.value(AmountRole)].toInt(); - values[FactorRole] = itemJsonObject[ROLE_NAMES.value(FactorRole)].toDouble(); - - return values; -} - JsonParser::JsonParser() {} QJsonArray JsonParser::extractItemArray(const QByteArray& jsonData, const QString& objectName) { @@ -52,3 +38,28 @@ QJsonArray JsonParser::extractItemArray(const QByteArray& jsonData, const QStrin return itemArray; } + +QHash JsonParser::jsonObjectToItemValues(const QJsonObject& itemJsonObject) { + QHash values; + + for (auto iter = ROLE_NAMES.cbegin(), end = ROLE_NAMES.cend(); iter != end; ++iter) { + std::pair keyValuePair = getKeyValuePair(itemJsonObject, iter.key()); + values.insert(keyValuePair.first, keyValuePair.second); + } + return values; +} + +pair JsonParser::getKeyValuePair(const QJsonObject& itemJsonObject, const int role) { + QVariant result; + const QJsonValue jsonValue = itemJsonObject[ROLE_NAMES.value(role)]; + if (STRING_ROLES.contains(role)) { + result = jsonValue.toString(); + } else if (INT_ROLES.contains(role)) { + result = jsonValue.toInt(); + } else if (DOUBLE_ROLES.contains(role)) { + result = jsonValue.toDouble(); + } else { + qCritical() << QString("Cant find data type of role %1!!!").arg(role); + } + return pair(role, result.toString()); +} diff --git a/formats/jsonparser.h b/formats/jsonparser.h index 36f557b..8feb08d 100644 --- a/formats/jsonparser.h +++ b/formats/jsonparser.h @@ -8,6 +8,8 @@ class QString; class QByteArray; class QJsonArray; +using namespace std; + class JsonParser { public: static QList> toItemValuesList(const QByteArray& jsonData, @@ -18,6 +20,8 @@ class JsonParser { static QJsonArray extractItemArray(const QByteArray& jsonData, const QString& objectName); static QHash jsonObjectToItemValues(const QJsonObject& itemJsonObject); + + static pair getKeyValuePair(const QJsonObject& itemJsonObject, const int role); }; #endif // JSONPARSER_H diff --git a/model/metadata.h b/model/metadata.h index 1c1342a..aac7c71 100644 --- a/model/metadata.h +++ b/model/metadata.h @@ -13,10 +13,9 @@ static QHash ROLE_NAMES = {{NameRole, "Name"}, {InfoRole, "Info"}, {AmountRole, "Amount"}, {FactorRole, "Factor"}}; -// TODO ? use a data structure containing the type information of each column -// ([QString, QString, QString, int, double], {{NameRole, QString},...}) -// instead of INT_COLUMNS,... -static QList INT_COLUMNS = {"Amount", "Factor"}; +static QList STRING_ROLES = {NameRole, DescriptionRole, InfoRole}; +static QList INT_ROLES = {AmountRole}; +static QList DOUBLE_ROLES = {FactorRole}; /// JSON keys static const QString ITEM_KEY_STRING = "items"; @@ -24,6 +23,7 @@ static const QString ITEM_KEY_STRING = "items"; /// file naming static const QString ITEM_FILE_NAME = ITEM_KEY_STRING + ".json"; +/// functions static int GET_ROLE_FOR_COLUMN(const int column) { switch (column) { case 0: diff --git a/model/tablemodel.cpp b/model/tablemodel.cpp index 9885a45..0071eb5 100644 --- a/model/tablemodel.cpp +++ b/model/tablemodel.cpp @@ -236,9 +236,11 @@ QMap TableModel::onlyChangedValues(const QModelIndex& index, } bool TableModel::isEmptyValueEqualToZero(const int role) const { - const QString roleName = ROLE_NAMES.value(role); - if (INT_COLUMNS.contains(roleName)) { + if (INT_ROLES.contains(role)) { return true; + } else if (DOUBLE_ROLES.contains(role)) { + return true; + } else { + return false; } - return false; }