#include "SettingsTree.h" #include #include SettingsTree::SettingsTree(QWidget *parent) : QTreeWidget(parent) { setColumnCount(2); setHeaderLabels({"Key", "Value"}); header()->setSectionResizeMode(0, QHeaderView::Interactive); header()->setSectionResizeMode(1, QHeaderView::Stretch); header()->setStretchLastSection(true); setAlternatingRowColors(true); setUniformRowHeights(true); setAnimated(true); setIndentation(16); setColumnWidth(0, 240); connect(this, &QTreeWidget::itemChanged, this, &SettingsTree::onItemChanged); } void SettingsTree::loadKeys(const QStringList &keys) { m_loading = true; clear(); m_itemMap.clear(); for (const QString &key : keys) { const QStringList parts = key.split('/'); QTreeWidgetItem *parent = invisibleRootItem(); QString accumulated; for (int i = 0; i < parts.size(); ++i) { if (!accumulated.isEmpty()) accumulated += '/'; accumulated += parts[i]; if (!m_itemMap.contains(accumulated)) { auto *item = new QTreeWidgetItem(parent); item->setText(0, parts[i]); item->setExpanded(false); const bool isLeaf = (i == parts.size() - 1); if (isLeaf) { item->setFlags(item->flags() | Qt::ItemIsEditable); item->setToolTip(1, "Double-click to edit and send"); } else { item->setFlags(item->flags() & ~Qt::ItemIsEditable); } m_itemMap[accumulated] = item; } parent = m_itemMap[accumulated]; } } resizeColumnToContents(0); m_loading = false; } void SettingsTree::setValue(const QString &key, const QString &value) { if (!m_itemMap.contains(key)) return; m_loading = true; m_itemMap[key]->setText(1, value); m_loading = false; } void SettingsTree::onItemChanged(QTreeWidgetItem *item, int column) { if (m_loading || column != 1) return; const QString key = fullPath(item); if (key.isEmpty()) return; emit valueEdited(key, item->text(1)); } QString SettingsTree::fullPath(QTreeWidgetItem *item) const { QStringList parts; QTreeWidgetItem *cur = item; while (cur && cur != invisibleRootItem()) { parts.prepend(cur->text(0)); cur = cur->parent(); } return parts.join('/'); }