Tab based websocket comms looking like trad RM
This commit is contained in:
84
SettingsTree.cpp
Normal file
84
SettingsTree.cpp
Normal file
@@ -0,0 +1,84 @@
|
||||
#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('/');
|
||||
}
|
||||
Reference in New Issue
Block a user