From 03f765c04059c9754b4204dccec9de178ec51157 Mon Sep 17 00:00:00 2001 From: Jussi Kuokkanen Date: Sun, 30 Jul 2023 11:39:25 +0300 Subject: [PATCH] get text for AssignableItem in a separate function --- src/tuxclocker-qt/data/DeviceModel.cpp | 70 +++++++++++++------------- src/tuxclocker-qt/data/DeviceModel.hpp | 1 + 2 files changed, 36 insertions(+), 35 deletions(-) diff --git a/src/tuxclocker-qt/data/DeviceModel.cpp b/src/tuxclocker-qt/data/DeviceModel.cpp index f781113..b0836d3 100644 --- a/src/tuxclocker-qt/data/DeviceModel.cpp +++ b/src/tuxclocker-qt/data/DeviceModel.cpp @@ -146,41 +146,7 @@ QStandardItem *DeviceModel::createAssignable( ifaceItem->setData(v, AssignableRole); // Set initial text to current value (one-time at startup) - QString text("No value set"); - auto unit = itemData.unit(); - auto currentValue = proxy->currentValue(); - - if (currentValue.has_value()) { - p::match(itemData.assignableInfo())( - pattern(as(arg)) = - [&](auto e_vec) { - /* Find index from EnumVec (O(n) doesn't matter since we only search - once here) This should never be anything other than an uint but - in theory it could be whatever at this point */ - try { - auto index = std::get(currentValue.value()); - for (auto &e : e_vec) { - if (index == e.key) { - text = QString::fromStdString(e.name); - break; - } - } - } catch (std::bad_variant_access &e) { - } - - // text = - // QString::fromStdString(e_vec[std::get(currentValue.value())].name); - }, - pattern(as(_)) = - [&]() { - auto base = fromAssignmentArgument(currentValue.value()); - if (unit.has_value()) - text = QString("%1 %2").arg(base, unit.value()); - else - text = base; - }); - } - ifaceItem->setText(text); + ifaceItem->setText(displayText(proxy, itemData)); connect(ifaceItem, &AssignableItem::assignableDataChanged, [=](QVariant v) { // Only show checkbox when value has been changed @@ -232,6 +198,40 @@ QStandardItem *DeviceModel::createAssignable( return ifaceItem; } +QString DeviceModel::displayText(AssignableProxy *proxy, AssignableItemData data) { + auto currentValue = proxy->currentValue(); + auto defVal = "No value set"; + if (!currentValue.has_value()) + return defVal; + + auto a_info = data.assignableInfo(); + // Try to get text representation of current enum + if (std::holds_alternative(a_info) && + std::holds_alternative(currentValue.value())) { + auto enumVec = std::get(a_info); + auto index = std::get(currentValue.value()); + // Find the key + for (auto &e : enumVec) { + if (index == e.key) { + return QString::fromStdString(e.name); + } + } + // TODO: not that helpful message without any name or DBus path + qWarning("Tried to get name for invalid Enumeration index %u", index); + return defVal; + } + + auto unit = data.unit(); + if (std::holds_alternative(a_info)) { + auto valueText = fromAssignmentArgument(currentValue.value()); + if (unit.has_value()) + return QString("%1 %2").arg(valueText, unit.value()); + else + return valueText; + } + return defVal; +} + QVariant DeviceModel::data(const QModelIndex &index, int role) const { if (index.row() != DeviceModel::NameColumn && role == DeviceModel::NodeNameRole) { // Get name from adjacent column diff --git a/src/tuxclocker-qt/data/DeviceModel.hpp b/src/tuxclocker-qt/data/DeviceModel.hpp index 52e071f..66c22a4 100644 --- a/src/tuxclocker-qt/data/DeviceModel.hpp +++ b/src/tuxclocker-qt/data/DeviceModel.hpp @@ -74,6 +74,7 @@ private: TC::TreeNode node, QDBusConnection conn); std::optional setupStaticReadable( TC::TreeNode node, QDBusConnection conn); + QString displayText(AssignableProxy *proxy, AssignableItemData data); constexpr int fadeOutTime() { return 5000; } // milliseconds constexpr int transparency() { return 120; } // 0-255 // Colors for items