From c7df1d72e8004dbfdc5f898eb9f16968913eaedc Mon Sep 17 00:00:00 2001 From: jussi Date: Thu, 24 Oct 2019 16:34:50 +0300 Subject: [PATCH] qt: use Qt::UserRole to store assignable data --- .../qt/data/AssignableEditorDelegate.cpp | 76 +++++++++++++++---- .../qt/data/AssignableEditorDelegate.h | 6 +- .../interface/qt/widgets/AssignableWidget.cpp | 16 ++-- .../interface/qt/widgets/IntRangeEditor.cpp | 7 ++ .../interface/qt/widgets/IntRangeEditor.h | 1 + 5 files changed, 80 insertions(+), 26 deletions(-) diff --git a/src/modules/interface/qt/data/AssignableEditorDelegate.cpp b/src/modules/interface/qt/data/AssignableEditorDelegate.cpp index f8f4ad9..e01442f 100644 --- a/src/modules/interface/qt/data/AssignableEditorDelegate.cpp +++ b/src/modules/interface/qt/data/AssignableEditorDelegate.cpp @@ -4,16 +4,35 @@ #include #include +#include AssignableEditorDelegate::AssignableEditorDelegate(QObject *parent) : QStyledItemDelegate(parent) { } +void AssignableEditorDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { + /*if (index.data().canConvert()) { + // Display current value of item when not editing + qDebug() << option.state; + if (!(option.state & QStyle::State_Selected)) { + AssignableData data = qvariant_cast(index.data()); + painter->drawText(option.rect, Qt::AlignCenter, QString::number(data.value().toInt())); + } + + //AssignableData data = qvariant_cast(index.data()); + //painter->drawText(option.rect, Qt::AlignCenter, QString::number(data.value().toInt())); + } + else { + QStyledItemDelegate::paint(painter, option, index); + } + */ + + QStyledItemDelegate::paint(painter, option, index); +} + QWidget *AssignableEditorDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { // Check which type the editor should be - AssignableData data = qvariant_cast(index.model()->data(index)); - - qDebug() << data.m_valueCategory; + AssignableData data = qvariant_cast(index.model()->data(index, Qt::UserRole)); switch (data.m_valueCategory) { case TC_ASSIGNABLE_RANGE: @@ -21,12 +40,12 @@ QWidget *AssignableEditorDelegate::createEditor(QWidget *parent, const QStyleOpt case TC_ASSIGNABLE_RANGE_INT: return new IntRangeEditor(parent, data); default: - return nullptr; + return QStyledItemDelegate::createEditor(parent, option, index); } case TC_ASSIGNABLE_ENUM: return new EnumEditor(parent, data); default: - return nullptr; + return QStyledItemDelegate::createEditor(parent, option, index); } } @@ -34,22 +53,49 @@ void AssignableEditorDelegate::updateEditorGeometry(QWidget *editor, const QStyl editor->setGeometry(option.rect); } -void AssignableEditorDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { - AssignableData data = qvariant_cast(index.model()->data(index)); - QStandardItemModel *s_model = qobject_cast(model); +void AssignableEditorDelegate::setEditorData(QWidget* editor, const QModelIndex &index) const { + AssignableData data = qvariant_cast(index.model()->data(index, Qt::UserRole)); - /*switch (data.m_valueCategory) { + switch (data.m_valueCategory) { + case TC_ASSIGNABLE_RANGE: + switch (data.m_rangeInfo.range_data_type) { + case TC_ASSIGNABLE_RANGE_INT: { + IntRangeEditor *ed = static_cast(editor); + ed->setValue(data.value().toInt()); + break; + } + default: + break; + } + default: + break; + } +} + +void AssignableEditorDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { + AssignableData data = qvariant_cast(index.model()->data(index, Qt::UserRole)); + QVariant v; + QStandardItemModel *s_model = static_cast(model); + + switch (data.m_valueCategory) { case TC_ASSIGNABLE_ENUM: { - EnumEditor *ed = qobject_cast(editor); - // Set the editor item text to current selection - s_model->itemFromIndex(index)->setText(ed->value()); + EnumEditor *ed = static_cast(editor); + data.setValue(ed->value()); + v.setValue(data); + + s_model->setData(index, v, Qt::UserRole); + s_model->setData(index, ed->value(), Qt::DisplayRole); break; } case TC_ASSIGNABLE_RANGE: switch (data.m_rangeInfo.range_data_type) { case TC_ASSIGNABLE_RANGE_INT: { - IntRangeEditor *ed = qobject_cast(editor); - s_model->itemFromIndex(index)->setText(QString(ed->value())); + IntRangeEditor *ed = static_cast(editor); + data.setValue(ed->value()); + v.setValue(data); + + s_model->setData(index, v, Qt::UserRole); + s_model->setData(index, ed->value(), Qt::DisplayRole); break; } default: @@ -57,5 +103,5 @@ void AssignableEditorDelegate::setModelData(QWidget *editor, QAbstractItemModel } default: break; - }*/ + } } diff --git a/src/modules/interface/qt/data/AssignableEditorDelegate.h b/src/modules/interface/qt/data/AssignableEditorDelegate.h index 19f2c82..a847941 100644 --- a/src/modules/interface/qt/data/AssignableEditorDelegate.h +++ b/src/modules/interface/qt/data/AssignableEditorDelegate.h @@ -7,8 +7,10 @@ class AssignableEditorDelegate : public QStyledItemDelegate { Q_OBJECT public: AssignableEditorDelegate(QObject *parent = nullptr); - QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; + void paint(QPainter * painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; + QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const; - void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override; + void setEditorData(QWidget * editor, const QModelIndex &index) const; + void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; }; diff --git a/src/modules/interface/qt/widgets/AssignableWidget.cpp b/src/modules/interface/qt/widgets/AssignableWidget.cpp index cbc00f3..6667aae 100644 --- a/src/modules/interface/qt/widgets/AssignableWidget.cpp +++ b/src/modules/interface/qt/widgets/AssignableWidget.cpp @@ -26,7 +26,8 @@ AssignableWidget::~AssignableWidget() { } void AssignableWidget::genAssignableTree(QTreeView *treeView) { - /*tc_module_t *nv_mod = tc_module_find(TC_CATEGORY_ASSIGNABLE, "nvidia"); + + tc_module_t *nv_mod = tc_module_find(TC_CATEGORY_ASSIGNABLE, "nvidia"); if (nv_mod != NULL) { if (nv_mod->init_callback() != TC_SUCCESS) { @@ -42,7 +43,7 @@ void AssignableWidget::genAssignableTree(QTreeView *treeView) { if (root == NULL) { return; - }*/ + } QStandardItemModel *assignableModel = new QStandardItemModel(0, 2); // Add header items @@ -78,7 +79,7 @@ void AssignableWidget::genAssignableTree(QTreeView *treeView) { QVariant v; AssignableData data(node); v.setValue(data); - editorItem->setData(v, Qt::EditRole); + editorItem->setData(v, Qt::UserRole); //editorItem->setText(node->name); rowItems.append(editorItem); } @@ -92,11 +93,8 @@ void AssignableWidget::genAssignableTree(QTreeView *treeView) { QStandardItem *parentItem = assignableModel->invisibleRootItem(); - // Get root nodes from manager - //QVector rootNodes = m_assignableManager->rootNodes(); - - //delete m_assignableManager; + //QList rootNodes = m_assignableManager->rootNodes(); /*for (tc_assignable_node_t *root : rootNodes) { traverse(root, parentItem); @@ -104,9 +102,9 @@ void AssignableWidget::genAssignableTree(QTreeView *treeView) { // We don't want to display root nodes from the modules - /*for (uint32_t i = 0; i < root->children_count; i++) { + for (uint32_t i = 0; i < root->children_count; i++) { traverse(root->children_nodes[i], parentItem); - }*/ + } m_assignableTreeView->setModel(assignableModel); diff --git a/src/modules/interface/qt/widgets/IntRangeEditor.cpp b/src/modules/interface/qt/widgets/IntRangeEditor.cpp index 08dabc0..0fff6d9 100644 --- a/src/modules/interface/qt/widgets/IntRangeEditor.cpp +++ b/src/modules/interface/qt/widgets/IntRangeEditor.cpp @@ -20,6 +20,8 @@ IntRangeEditor::IntRangeEditor(QWidget *parent) : QWidget(parent) { m_slider->setDisabled(true); setLayout(m_mainLayout); + // Avoids the display text from overlapping during editing + setAutoFillBackground(true); } IntRangeEditor::IntRangeEditor(QWidget* parent, const AssignableData &data) : QWidget(parent) { @@ -40,12 +42,17 @@ IntRangeEditor::IntRangeEditor(QWidget* parent, const AssignableData &data) : QW m_slider->setRange(data.m_rangeInfo.int_range.min, data.m_rangeInfo.int_range.max); setLayout(m_mainLayout); + setAutoFillBackground(true); } int IntRangeEditor::value() { return m_slider->value(); } +void IntRangeEditor::setValue(int64_t value) { + m_slider->setValue(value); +} + void IntRangeEditor::setRange(const tc_assignable_range_int_t &range) { m_range = range; diff --git a/src/modules/interface/qt/widgets/IntRangeEditor.h b/src/modules/interface/qt/widgets/IntRangeEditor.h index fce63b0..cad6f38 100644 --- a/src/modules/interface/qt/widgets/IntRangeEditor.h +++ b/src/modules/interface/qt/widgets/IntRangeEditor.h @@ -16,6 +16,7 @@ public: IntRangeEditor(QWidget *parent = nullptr); IntRangeEditor(QWidget *parent = nullptr, const AssignableData &data = nullptr); int value(); + void setValue(int64_t value); void setRange(const tc_assignable_range_int_t &range); private: QHBoxLayout *m_mainLayout;