diff --git a/src/plugins/axivion/axivionperspective.cpp b/src/plugins/axivion/axivionperspective.cpp index 7eb2ee1e6fa..fe56601bb84 100644 --- a/src/plugins/axivion/axivionperspective.cpp +++ b/src/plugins/axivion/axivionperspective.cpp @@ -661,16 +661,12 @@ void IssuesWidget::addIssues(const Dto::IssueTableDto &dto, int startRow) for (const auto &column : tableColumns) { const auto it = row.find(column.key); if (it != row.end()) { - QString value = anyToSimpleString(it->second); + QString value = anyToSimpleString(it->second, column.type, column.typeOptions); if (column.key == "id") { value.prepend(m_currentPrefix); id = value; } toolTips << value; - if (column.key.toLower().endsWith("path")) { - const FilePath fp = FilePath::fromUserInput(value); - value = QString("%1 [%2]").arg(fp.fileName(), fp.path()); - } data << value; } } diff --git a/src/plugins/axivion/axivionplugin.cpp b/src/plugins/axivion/axivionplugin.cpp index 7d663c6d952..cc2a2116626 100644 --- a/src/plugins/axivion/axivionplugin.cpp +++ b/src/plugins/axivion/axivionplugin.cpp @@ -74,41 +74,82 @@ QIcon iconForIssue(const std::optional &issueKind) return prefixToIcon.insert(*issueKind, icon.icon()).value(); } -QString anyToSimpleString(const Dto::Any &any) +static QString anyToString(const Dto::Any &any) { - if (any.isString()) - return any.getString(); - if (any.isBool()) - return QString("%1").arg(any.getBool()); - if (any.isDouble()) { - const double value = any.getDouble(); - double intPart; - const double fragPart = std::modf(value, &intPart); - if (fragPart != 0) - return QString::number(value); - return QString::number(value, 'f', 0); + if (any.isNull() || !any.isString()) + return {}; + return any.getString(); +} + +static QString anyToPathString(const Dto::Any &any) +{ + const QString pathStr = anyToString(any); + if (pathStr.isEmpty()) + return {}; + const FilePath fp = FilePath::fromUserInput(pathStr); + return fp.contains("/") ? QString("%1 [%2]").arg(fp.fileName(), fp.path()) : fp.fileName(); +} + +// only the first found innerKey is used to add its value to the list +static QString anyListOfMapToString(const Dto::Any &any, const QStringList &innerKeys) +{ + if (any.isNull() || !any.isList()) + return {}; + const std::vector anyList = any.getList(); + QStringList list; + for (const Dto::Any &inner : anyList) { + if (!inner.isMap()) + continue; + const std::map innerMap = inner.getMap(); + for (const QString &innerKey : innerKeys) { + auto value = innerMap.find(innerKey); + if (value == innerMap.end()) + continue; + list << anyToString(value->second); + break; + } } + return list.join(", "); +} + +static QString anyToNumberString(const Dto::Any &any) +{ if (any.isNull()) - return QString(); // or NULL?? - if (any.isList()) { - const std::vector anyList = any.getList(); - QStringList list; - for (const Dto::Any &inner : anyList) - list << anyToSimpleString(inner); - return list.join(','); + return {}; + if (any.isString()) // handle Infinity/NaN/... + return any.getString(); + + const double value = any.getDouble(); + double intPart; + const double frac = std::modf(value, &intPart); + if (frac != 0) + return QString::number(value, 'f'); + return QString::number(value, 'f', 0); +} + +QString anyToSimpleString(const Dto::Any &any, const QString &type, + const std::optional> &options) +{ + if (type == "path") + return anyToPathString(any); + if (type == "string" || type == "state") + return anyToString(any); + if (type == "tags") + return anyListOfMapToString(any, {"tag"}); + if (type == "number") + return anyToNumberString(any); + if (type == "owners") { + return anyListOfMapToString(any, {"displayName", "name"}); } - if (any.isMap()) { // TODO - const std::map anyMap = any.getMap(); - auto value = anyMap.find("displayName"); - if (value != anyMap.end()) - return anyToSimpleString(value->second); - value = anyMap.find("name"); - if (value != anyMap.end()) - return anyToSimpleString(value->second); - value = anyMap.find("tag"); - if (value != anyMap.end()) - return anyToSimpleString(value->second); + if (type == "boolean") { + if (!any.isBool()) + return {}; + if (options && options->size() == 2) + return any.getBool() ? options->at(1).key : options->at(0).key; + return any.getBool() ? QString("true") : QString("false"); } + + QTC_ASSERT(false, qDebug() << "unhandled" << type); return {}; } diff --git a/src/plugins/axivion/axivionplugin.h b/src/plugins/axivion/axivionplugin.h index c364a63a56d..eadc755867c 100644 --- a/src/plugins/axivion/axivionplugin.h +++ b/src/plugins/axivion/axivionplugin.h @@ -119,7 +119,8 @@ std::optional namedFilterInfoForKey(const QString &key, bool handleCertificateIssue(); QIcon iconForIssue(const std::optional &issueKind); -QString anyToSimpleString(const Dto::Any &any); +QString anyToSimpleString(const Dto::Any &any, const QString &type, + const std::optional> &options); void fetchIssueInfo(const QString &id); void switchActiveDashboardId(const Utils::Id &toDashboardId);