mirror of
https://github.com/Lurkki14/tuxclocker.git
synced 2025-02-25 18:55:24 -06:00
centralize most item text handling to AssignableItem
This commit is contained in:
parent
a7d7db474c
commit
b149159d27
@ -1,5 +1,7 @@
|
|||||||
#include "AssignableItem.hpp"
|
#include "AssignableItem.hpp"
|
||||||
|
|
||||||
|
#include <DynamicReadableConnection.hpp>
|
||||||
|
|
||||||
Q_DECLARE_METATYPE(AssignableItemData)
|
Q_DECLARE_METATYPE(AssignableItemData)
|
||||||
|
|
||||||
void AssignableItem::setData(const QVariant &v, int role) {
|
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();
|
auto data = v.value<AssignableItemData>().value();
|
||||||
// Value is not empty
|
// Value is not empty
|
||||||
if (data.isValid()) {
|
if (data.isValid()) {
|
||||||
|
updateText(v.value<AssignableItemData>());
|
||||||
|
|
||||||
QVariant vr;
|
QVariant vr;
|
||||||
vr.setValue(data);
|
vr.setValue(data);
|
||||||
emit assignableDataChanged(vr);
|
emit assignableDataChanged(vr);
|
||||||
@ -18,3 +22,31 @@ void AssignableItem::setData(const QVariant &v, int role) {
|
|||||||
}
|
}
|
||||||
QStandardItem::setData(v, 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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
#include "DeviceModel.hpp"
|
#include "DeviceModel.hpp"
|
||||||
|
|
||||||
|
#include <AssignableItemData.hpp>
|
||||||
|
#include <Device.hpp>
|
||||||
|
#include <optional>
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QStandardItem>
|
#include <QStandardItem>
|
||||||
|
|
||||||
@ -10,7 +13,10 @@
|
|||||||
// Forgive me for the sin of multiple inheritance
|
// Forgive me for the sin of multiple inheritance
|
||||||
class AssignableItem : public QObject, public QStandardItem {
|
class AssignableItem : public QObject, public QStandardItem {
|
||||||
public:
|
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; }
|
bool committal() { return m_committed; }
|
||||||
// Whether or not the set value shall be applied. Doesn't reset or change it.
|
// Whether or not the set value shall be applied. Doesn't reset or change it.
|
||||||
void setCommittal(bool on) { m_committed = on; }
|
void setCommittal(bool on) { m_committed = on; }
|
||||||
@ -21,5 +27,8 @@ signals:
|
|||||||
private:
|
private:
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
|
void updateText(AssignableItemData);
|
||||||
|
|
||||||
|
std::optional<QString> m_unit;
|
||||||
bool m_committed = false;
|
bool m_committed = false;
|
||||||
};
|
};
|
||||||
|
@ -122,7 +122,7 @@ QString fromAssignmentArgument(AssignmentArgument a_arg) {
|
|||||||
|
|
||||||
QStandardItem *DeviceModel::createAssignable(
|
QStandardItem *DeviceModel::createAssignable(
|
||||||
TC::TreeNode<TCDBus::DeviceNode> node, QDBusConnection conn, AssignableItemData itemData) {
|
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);
|
auto proxy = new AssignableProxy(node.value().path, conn, this);
|
||||||
|
|
||||||
connect(proxy, &AssignableProxy::connectionValueChanged, [=](auto result, auto text) {
|
connect(proxy, &AssignableProxy::connectionValueChanged, [=](auto result, auto text) {
|
||||||
|
@ -78,11 +78,7 @@ void DeviceModelDelegate::setModelData(
|
|||||||
auto a_editor = static_cast<AbstractAssignableEditor *>(editor);
|
auto a_editor = static_cast<AbstractAssignableEditor *>(editor);
|
||||||
auto data = index.data(DeviceModel::AssignableRole).value<AssignableItemData>();
|
auto data = index.data(DeviceModel::AssignableRole).value<AssignableItemData>();
|
||||||
|
|
||||||
auto text = (data.unit().has_value())
|
setAssignableData(model, index, a_editor->assignableData());
|
||||||
? QString("%1 %2").arg(a_editor->displayData(), data.unit().value())
|
|
||||||
: a_editor->displayData();
|
|
||||||
|
|
||||||
setAssignableData(model, index, text, a_editor->assignableData());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,7 +145,7 @@ bool DeviceModelDelegate::editorEvent(QEvent *event, QAbstractItemModel *model,
|
|||||||
// TODO: not handled in AssignableProxy
|
// TODO: not handled in AssignableProxy
|
||||||
connect(m_functionEditor, &FunctionEditor::connectionDataChanged,
|
connect(m_functionEditor, &FunctionEditor::connectionDataChanged,
|
||||||
[=](auto data) {
|
[=](auto data) {
|
||||||
setAssignableData(model, index, "(Parametrized)", data);
|
setAssignableData(model, index, data);
|
||||||
Globals::g_mainStack->setCurrentWidget(
|
Globals::g_mainStack->setCurrentWidget(
|
||||||
Globals::g_deviceBrowser);
|
Globals::g_deviceBrowser);
|
||||||
});
|
});
|
||||||
@ -163,7 +159,7 @@ bool DeviceModelDelegate::editorEvent(QEvent *event, QAbstractItemModel *model,
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void DeviceModelDelegate::setAssignableData(
|
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>();
|
auto assData = index.data(DeviceModel::AssignableRole).value<AssignableItemData>();
|
||||||
QVariant assV;
|
QVariant assV;
|
||||||
assV.setValue(data);
|
assV.setValue(data);
|
||||||
@ -172,7 +168,6 @@ void DeviceModelDelegate::setAssignableData(
|
|||||||
QVariant v;
|
QVariant v;
|
||||||
v.setValue(assData);
|
v.setValue(assData);
|
||||||
|
|
||||||
model->setData(index, text, Qt::DisplayRole);
|
|
||||||
model->setData(index, v, DeviceModel::AssignableRole);
|
model->setData(index, v, DeviceModel::AssignableRole);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,44 +176,18 @@ void DeviceModelDelegate::setAssignableDefaults(
|
|||||||
for (auto &def : defaults) {
|
for (auto &def : defaults) {
|
||||||
auto data = def.index.data(DeviceModel::AssignableRole).value<AssignableItemData>();
|
auto data = def.index.data(DeviceModel::AssignableRole).value<AssignableItemData>();
|
||||||
|
|
||||||
QString text;
|
setAssignableVariantData(model, def.index, def.defaultValue);
|
||||||
// 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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeviceModelDelegate::setAssignableVariantData(
|
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>();
|
auto assData = index.data(DeviceModel::AssignableRole).value<AssignableItemData>();
|
||||||
assData.setValue(data);
|
assData.setValue(data);
|
||||||
|
|
||||||
QVariant v;
|
QVariant v;
|
||||||
v.setValue(assData);
|
v.setValue(assData);
|
||||||
|
|
||||||
model->setData(index, text, Qt::DisplayRole);
|
|
||||||
model->setData(index, v, DeviceModel::AssignableRole);
|
model->setData(index, v, DeviceModel::AssignableRole);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,10 +32,9 @@ protected:
|
|||||||
private:
|
private:
|
||||||
void commitAndClose();
|
void commitAndClose();
|
||||||
template <typename T>
|
template <typename T>
|
||||||
static void setAssignableData(
|
static void setAssignableData(QAbstractItemModel *, const QModelIndex &, T data);
|
||||||
QAbstractItemModel *, const QModelIndex &, QString text, T data);
|
|
||||||
static void setAssignableVariantData(
|
static void setAssignableVariantData(
|
||||||
QAbstractItemModel *, const QModelIndex &, QString text, QVariant data);
|
QAbstractItemModel *, const QModelIndex &, QVariant data);
|
||||||
// Whether to show reset action for a node
|
// Whether to show reset action for a node
|
||||||
bool subtreeHasAssignableDefaults(QAbstractItemModel *, const QModelIndex &);
|
bool subtreeHasAssignableDefaults(QAbstractItemModel *, const QModelIndex &);
|
||||||
QVector<AssignableDefaultData> subtreeAssignableDefaults(
|
QVector<AssignableDefaultData> subtreeAssignableDefaults(
|
||||||
|
@ -7,7 +7,6 @@ public:
|
|||||||
AbstractAssignableEditor(QWidget *parent = nullptr) : QWidget(parent) {}
|
AbstractAssignableEditor(QWidget *parent = nullptr) : QWidget(parent) {}
|
||||||
virtual ~AbstractAssignableEditor() {}
|
virtual ~AbstractAssignableEditor() {}
|
||||||
virtual QVariant assignableData() = 0;
|
virtual QVariant assignableData() = 0;
|
||||||
virtual QString displayData() = 0;
|
|
||||||
virtual void setAssignableData(QVariant data) = 0;
|
virtual void setAssignableData(QVariant data) = 0;
|
||||||
signals:
|
signals:
|
||||||
void editingDone();
|
void editingDone();
|
||||||
|
@ -36,7 +36,6 @@ public:
|
|||||||
setRange(range);
|
setRange(range);
|
||||||
}
|
}
|
||||||
virtual QVariant assignableData() override { return m_spinBox->value(); }
|
virtual QVariant assignableData() override { return m_spinBox->value(); }
|
||||||
virtual QString displayData() override { return QString::number(m_spinBox->value()); }
|
|
||||||
virtual void setAssignableData(QVariant data) override {
|
virtual void setAssignableData(QVariant data) override {
|
||||||
m_spinBox->setValue(data.toDouble());
|
m_spinBox->setValue(data.toDouble());
|
||||||
}
|
}
|
||||||
|
@ -46,10 +46,7 @@ QVariant EnumEditor::assignableData() {
|
|||||||
auto r = m_model.index(m_comboBox->currentIndex(), 0).data(KeyRole).toUInt();
|
auto r = m_model.index(m_comboBox->currentIndex(), 0).data(KeyRole).toUInt();
|
||||||
return r;
|
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) {
|
void EnumEditor::setAssignableData(QVariant data) {
|
||||||
// TODO: make worst case better than O(n)
|
// TODO: make worst case better than O(n)
|
||||||
auto u = data.toUInt();
|
auto u = data.toUInt();
|
||||||
|
@ -11,7 +11,6 @@ public:
|
|||||||
EnumEditor(QWidget *parent = nullptr);
|
EnumEditor(QWidget *parent = nullptr);
|
||||||
EnumEditor(TuxClocker::Device::EnumerationVec enums, QWidget *parent = nullptr);
|
EnumEditor(TuxClocker::Device::EnumerationVec enums, QWidget *parent = nullptr);
|
||||||
virtual QVariant assignableData() override;
|
virtual QVariant assignableData() override;
|
||||||
virtual QString displayData() override;
|
|
||||||
virtual void setAssignableData(QVariant data) override;
|
virtual void setAssignableData(QVariant data) override;
|
||||||
protected:
|
protected:
|
||||||
bool eventFilter(QObject *, QEvent *) override;
|
bool eventFilter(QObject *, QEvent *) override;
|
||||||
|
@ -36,7 +36,6 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
virtual QVariant assignableData() override { return m_slider->value(); }
|
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()); }
|
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); }
|
void setRange(TC::Device::Range<int> range) { m_slider->setRange(range.min, range.max); }
|
||||||
int value() { return m_slider->value(); }
|
int value() { return m_slider->value(); }
|
||||||
|
Loading…
Reference in New Issue
Block a user