centralize most item text handling to AssignableItem

This commit is contained in:
Jussi Kuokkanen 2023-09-05 15:58:57 +03:00
parent a7d7db474c
commit b149159d27
10 changed files with 51 additions and 49 deletions

View File

@ -1,5 +1,7 @@
#include "AssignableItem.hpp"
#include <DynamicReadableConnection.hpp>
Q_DECLARE_METATYPE(AssignableItemData)
void AssignableItem::setData(const QVariant &v, int role) {
@ -7,6 +9,8 @@ void AssignableItem::setData(const QVariant &v, int role) {
auto data = v.value<AssignableItemData>().value();
// Value is not empty
if (data.isValid()) {
updateText(v.value<AssignableItemData>());
QVariant vr;
vr.setValue(data);
emit assignableDataChanged(vr);
@ -18,3 +22,31 @@ void AssignableItem::setData(const QVariant &v, int role) {
}
QStandardItem::setData(v, role);
}
void AssignableItem::updateText(AssignableItemData data) {
if (data.value().canConvert<DynamicReadableConnectionData>()) {
setText("(Parametrized)");
return;
}
if (std::holds_alternative<RangeInfo>(data.assignableInfo())) {
if (m_unit.has_value())
setText(QString{"%1 %2"}.arg(data.value().toString(), m_unit.value()));
else
setText(data.value().toString());
return;
}
if (std::holds_alternative<EnumerationVec>(data.assignableInfo())) {
auto index = data.value().toUInt();
auto enumVec = std::get<EnumerationVec>(data.assignableInfo());
if (enumVec.size() - 1 >= index) {
setText(QString::fromStdString(enumVec[index].name));
} else {
// This could arise from the settings being edited manually
qWarning("Trying to set Enumeration with invalid index %u!", index);
setText(QString::number(index));
}
}
}

View File

@ -2,6 +2,9 @@
#include "DeviceModel.hpp"
#include <AssignableItemData.hpp>
#include <Device.hpp>
#include <optional>
#include <QObject>
#include <QStandardItem>
@ -10,7 +13,10 @@
// Forgive me for the sin of multiple inheritance
class AssignableItem : public QObject, public QStandardItem {
public:
AssignableItem(QObject *parent = nullptr) : QObject(parent), QStandardItem() {}
AssignableItem(std::optional<QString> unit, QObject *parent = nullptr)
: QObject(parent), QStandardItem() {
m_unit = unit;
}
bool committal() { return m_committed; }
// Whether or not the set value shall be applied. Doesn't reset or change it.
void setCommittal(bool on) { m_committed = on; }
@ -21,5 +27,8 @@ signals:
private:
Q_OBJECT
void updateText(AssignableItemData);
std::optional<QString> m_unit;
bool m_committed = false;
};

View File

@ -122,7 +122,7 @@ QString fromAssignmentArgument(AssignmentArgument a_arg) {
QStandardItem *DeviceModel::createAssignable(
TC::TreeNode<TCDBus::DeviceNode> node, QDBusConnection conn, AssignableItemData itemData) {
auto ifaceItem = new AssignableItem(this);
auto ifaceItem = new AssignableItem(itemData.unit(), this);
auto proxy = new AssignableProxy(node.value().path, conn, this);
connect(proxy, &AssignableProxy::connectionValueChanged, [=](auto result, auto text) {

View File

@ -78,11 +78,7 @@ void DeviceModelDelegate::setModelData(
auto a_editor = static_cast<AbstractAssignableEditor *>(editor);
auto data = index.data(DeviceModel::AssignableRole).value<AssignableItemData>();
auto text = (data.unit().has_value())
? QString("%1 %2").arg(a_editor->displayData(), data.unit().value())
: a_editor->displayData();
setAssignableData(model, index, text, a_editor->assignableData());
setAssignableData(model, index, a_editor->assignableData());
}
}
@ -149,7 +145,7 @@ bool DeviceModelDelegate::editorEvent(QEvent *event, QAbstractItemModel *model,
// TODO: not handled in AssignableProxy
connect(m_functionEditor, &FunctionEditor::connectionDataChanged,
[=](auto data) {
setAssignableData(model, index, "(Parametrized)", data);
setAssignableData(model, index, data);
Globals::g_mainStack->setCurrentWidget(
Globals::g_deviceBrowser);
});
@ -163,7 +159,7 @@ bool DeviceModelDelegate::editorEvent(QEvent *event, QAbstractItemModel *model,
template <typename T>
void DeviceModelDelegate::setAssignableData(
QAbstractItemModel *model, const QModelIndex &index, QString text, T data) {
QAbstractItemModel *model, const QModelIndex &index, T data) {
auto assData = index.data(DeviceModel::AssignableRole).value<AssignableItemData>();
QVariant assV;
assV.setValue(data);
@ -172,7 +168,6 @@ void DeviceModelDelegate::setAssignableData(
QVariant v;
v.setValue(assData);
model->setData(index, text, Qt::DisplayRole);
model->setData(index, v, DeviceModel::AssignableRole);
}
@ -181,44 +176,18 @@ void DeviceModelDelegate::setAssignableDefaults(
for (auto &def : defaults) {
auto data = def.index.data(DeviceModel::AssignableRole).value<AssignableItemData>();
QString text;
// TODO: maybe move all this handling to AssignableItem once this works
if (std::holds_alternative<EnumerationVec>(data.assignableInfo())) {
auto index = def.defaultValue.toUInt();
auto enumVec = std::get<EnumerationVec>(data.assignableInfo());
if (enumVec.size() - 1 >= index) {
text = QString::fromStdString(enumVec[index].name);
} else {
// This could arise from the settings being edited manually
qWarning("Tried to reset %s with invalid index %u!",
qPrintable(model
->index(def.index.row(), DeviceModel::NameColumn,
def.index.parent())
.data()
.toString()),
index);
continue;
}
} else {
text = (data.unit().has_value())
? QString("%1 %2").arg(
def.defaultValue.toString(), data.unit().value())
: def.defaultValue.toString();
}
setAssignableVariantData(model, def.index, text, def.defaultValue);
setAssignableVariantData(model, def.index, def.defaultValue);
}
}
void DeviceModelDelegate::setAssignableVariantData(
QAbstractItemModel *model, const QModelIndex &index, QString text, QVariant data) {
QAbstractItemModel *model, const QModelIndex &index, QVariant data) {
auto assData = index.data(DeviceModel::AssignableRole).value<AssignableItemData>();
assData.setValue(data);
QVariant v;
v.setValue(assData);
model->setData(index, text, Qt::DisplayRole);
model->setData(index, v, DeviceModel::AssignableRole);
}

View File

@ -32,10 +32,9 @@ protected:
private:
void commitAndClose();
template <typename T>
static void setAssignableData(
QAbstractItemModel *, const QModelIndex &, QString text, T data);
static void setAssignableData(QAbstractItemModel *, const QModelIndex &, T data);
static void setAssignableVariantData(
QAbstractItemModel *, const QModelIndex &, QString text, QVariant data);
QAbstractItemModel *, const QModelIndex &, QVariant data);
// Whether to show reset action for a node
bool subtreeHasAssignableDefaults(QAbstractItemModel *, const QModelIndex &);
QVector<AssignableDefaultData> subtreeAssignableDefaults(

View File

@ -7,7 +7,6 @@ public:
AbstractAssignableEditor(QWidget *parent = nullptr) : QWidget(parent) {}
virtual ~AbstractAssignableEditor() {}
virtual QVariant assignableData() = 0;
virtual QString displayData() = 0;
virtual void setAssignableData(QVariant data) = 0;
signals:
void editingDone();

View File

@ -36,7 +36,6 @@ public:
setRange(range);
}
virtual QVariant assignableData() override { return m_spinBox->value(); }
virtual QString displayData() override { return QString::number(m_spinBox->value()); }
virtual void setAssignableData(QVariant data) override {
m_spinBox->setValue(data.toDouble());
}

View File

@ -46,10 +46,7 @@ QVariant EnumEditor::assignableData() {
auto r = m_model.index(m_comboBox->currentIndex(), 0).data(KeyRole).toUInt();
return r;
}
QString EnumEditor::displayData() {
auto r = m_model.index(m_comboBox->currentIndex(), 0).data(Qt::DisplayRole).toString();
return r;
}
void EnumEditor::setAssignableData(QVariant data) {
// TODO: make worst case better than O(n)
auto u = data.toUInt();

View File

@ -11,7 +11,6 @@ public:
EnumEditor(QWidget *parent = nullptr);
EnumEditor(TuxClocker::Device::EnumerationVec enums, QWidget *parent = nullptr);
virtual QVariant assignableData() override;
virtual QString displayData() override;
virtual void setAssignableData(QVariant data) override;
protected:
bool eventFilter(QObject *, QEvent *) override;

View File

@ -36,7 +36,6 @@ public:
}
virtual QVariant assignableData() override { return m_slider->value(); }
virtual QString displayData() override { return QString::number(m_slider->value()); }
virtual void setAssignableData(QVariant data) override { m_slider->setValue(data.toInt()); }
void setRange(TC::Device::Range<int> range) { m_slider->setRange(range.min, range.max); }
int value() { return m_slider->value(); }