Files
esa-remote-lite/SettingsTree.cpp
2026-04-01 19:38:05 +01:00

85 lines
2.4 KiB
C++

#include "SettingsTree.h"
#include <QHeaderView>
#include <QTreeWidgetItem>
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('/');
}