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 <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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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(
|
||||
|
@ -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();
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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(); }
|
||||
|
Loading…
Reference in New Issue
Block a user