qt: use Qt::UserRole to store assignable data

This commit is contained in:
jussi 2019-10-24 16:34:50 +03:00
parent aea64c9261
commit c7df1d72e8
5 changed files with 80 additions and 26 deletions

View File

@ -4,16 +4,35 @@
#include <IntRangeEditor.h>
#include <QDebug>
#include <QPainter>
AssignableEditorDelegate::AssignableEditorDelegate(QObject *parent) : QStyledItemDelegate(parent) {
}
void AssignableEditorDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const {
/*if (index.data().canConvert<AssignableData>()) {
// Display current value of item when not editing
qDebug() << option.state;
if (!(option.state & QStyle::State_Selected)) {
AssignableData data = qvariant_cast<AssignableData>(index.data());
painter->drawText(option.rect, Qt::AlignCenter, QString::number(data.value().toInt()));
}
//AssignableData data = qvariant_cast<AssignableData>(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<AssignableData>(index.model()->data(index));
qDebug() << data.m_valueCategory;
AssignableData data = qvariant_cast<AssignableData>(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<AssignableData>(index.model()->data(index));
QStandardItemModel *s_model = qobject_cast<QStandardItemModel*>(model);
void AssignableEditorDelegate::setEditorData(QWidget* editor, const QModelIndex &index) const {
AssignableData data = qvariant_cast<AssignableData>(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<IntRangeEditor*>(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<AssignableData>(index.model()->data(index, Qt::UserRole));
QVariant v;
QStandardItemModel *s_model = static_cast<QStandardItemModel*>(model);
switch (data.m_valueCategory) {
case TC_ASSIGNABLE_ENUM: {
EnumEditor *ed = qobject_cast<EnumEditor*>(editor);
// Set the editor item text to current selection
s_model->itemFromIndex(index)->setText(ed->value());
EnumEditor *ed = static_cast<EnumEditor*>(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<IntRangeEditor*>(editor);
s_model->itemFromIndex(index)->setText(QString(ed->value()));
IntRangeEditor *ed = static_cast<IntRangeEditor*>(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;
}*/
}
}

View File

@ -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;
};

View File

@ -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 <tc_assignable_node_t*> rootNodes = m_assignableManager->rootNodes();
//delete m_assignableManager;
//QList <tc_assignable_node_t*> 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);

View File

@ -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;

View File

@ -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;