QWidget *DynamicPropertiesDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { QWidget *widget = QStyledItemDelegate::createEditor(parent, option, index); const DynamicPropertiesModel *model = qobject_cast<const DynamicPropertiesModel*>(index.model()); model->connectionView()->allModelNodes(); // PropertiesComboBox *dynamicPropertiesComboBox = qobject_cast<DynamicPropertiesComboBox*>(widget); // if (!dynamicPropertiesComboBox) { // return widget; // } if (!model) { qWarning() << "BindingDelegate::createEditor no model"; return widget; } if (!model->connectionView()) { qWarning() << "BindingDelegate::createEditor no connection view"; return widget; } BindingProperty bindingProperty = model->bindingPropertyForRow(index.row()); switch (index.column()) { case DynamicPropertiesModel::TargetModelNodeRow: { return 0; //no editor } break; case DynamicPropertiesModel::PropertyNameRow: { return QStyledItemDelegate::createEditor(parent, option, index); } break; case DynamicPropertiesModel::PropertyTypeRow: { PropertiesComboBox *dynamicPropertiesComboBox = new PropertiesComboBox(parent); connect(dynamicPropertiesComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), this, [=]() { auto delegate = const_cast<DynamicPropertiesDelegate*>(this); emit delegate->commitData(dynamicPropertiesComboBox); }); dynamicPropertiesComboBox->addItem(QLatin1String("alias")); //dynamicPropertiesComboBox->addItem(QLatin1String("Item")); dynamicPropertiesComboBox->addItem(QLatin1String("real")); dynamicPropertiesComboBox->addItem(QLatin1String("int")); dynamicPropertiesComboBox->addItem(QLatin1String("string")); dynamicPropertiesComboBox->addItem(QLatin1String("bool")); dynamicPropertiesComboBox->addItem(QLatin1String("url")); dynamicPropertiesComboBox->addItem(QLatin1String("color")); dynamicPropertiesComboBox->addItem(QLatin1String("variant")); return dynamicPropertiesComboBox; } break; case DynamicPropertiesModel::PropertyValueRow: { return QStyledItemDelegate::createEditor(parent, option, index); } break; default: qWarning() << "BindingDelegate::createEditor column" << index.column(); } return 0; }
QWidget *BindingDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { QWidget *widget = QStyledItemDelegate::createEditor(parent, option, index); const BindingModel *model = qobject_cast<const BindingModel*>(index.model()); if (!model) { qWarning() << "BindingDelegate::createEditor no model"; return widget; } if (!model->connectionView()) { qWarning() << "BindingDelegate::createEditor no connection view"; return widget; } model->connectionView()->allModelNodes(); PropertiesComboBox *bindingComboBox = qobject_cast<PropertiesComboBox*>(widget); if (!bindingComboBox) { qWarning() << "BindingDelegate::createEditor no bindingComboBox"; return widget; } BindingProperty bindingProperty = model->bindingPropertyForRow(index.row()); switch (index.column()) { case BindingModel::TargetModelNodeRow: return nullptr; //no editor case BindingModel::TargetPropertyNameRow: { bindingComboBox->addItems(model->possibleTargetProperties(bindingProperty)); } break; case BindingModel::SourceModelNodeRow: { foreach (const ModelNode &modelNode, model->connectionView()->allModelNodes()) { if (!modelNode.id().isEmpty()) { bindingComboBox->addItem(modelNode.id()); } } if (!bindingProperty.parentModelNode().isRootNode()) bindingComboBox->addItem(QLatin1String("parent")); } break; case BindingModel::SourcePropertyNameRow: { bindingComboBox->addItems(model->possibleSourceProperties(bindingProperty)); bindingComboBox->disableValidator(); } break; default: qWarning() << "BindingDelegate::createEditor column" << index.column(); } connect(bindingComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), this, [=]() { auto delegate = const_cast<BindingDelegate*>(this); emit delegate->commitData(bindingComboBox); }); return widget; }