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; }
void BindingModel::bindingRemoved(const BindingProperty &bindingProperty) { m_handleDataChanged = false; QList<ModelNode> selectedNodes = connectionView()->selectedModelNodes(); if (!selectedNodes.contains(bindingProperty.parentModelNode())) return; if (!m_lock) { int rowNumber = findRowForBinding(bindingProperty); removeRow(rowNumber); } m_handleDataChanged = true; }
QStringList DynamicPropertiesModel::possibleTargetProperties(const BindingProperty &bindingProperty) const { const ModelNode modelNode = bindingProperty.parentModelNode(); if (!modelNode.isValid()) { qWarning() << " BindingModel::possibleTargetPropertiesForRow invalid model node"; return QStringList(); } NodeMetaInfo metaInfo = modelNode.metaInfo(); if (metaInfo.isValid()) { QStringList possibleProperties; foreach (const PropertyName &propertyName, metaInfo.propertyNames()) { if (metaInfo.propertyIsWritable(propertyName)) possibleProperties << QString::fromLatin1(propertyName); } return possibleProperties; }
BindingProperty::BindingProperty(const BindingProperty &property, AbstractView *view) : AbstractProperty(property.name(), property.internalNode(), property.model(), view) { }