QmlDesigner: Create proper ListView delegate for assigned model

Task-number: QDS-11776
Change-Id: I210a9803725b59a7cfe7887908922c38d969bc2d
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io>
This commit is contained in:
Ali Kianian
2024-02-13 17:00:50 +02:00
parent bb63198f8a
commit cae86d6977

View File

@@ -37,6 +37,22 @@ inline bool isStudioCollectionModel(const QmlDesigner::ModelNode &node)
|| node.metaInfo().typeName() == CSVCOLLECTIONMODEL_TYPENAME; || node.metaInfo().typeName() == CSVCOLLECTIONMODEL_TYPENAME;
} }
inline void setVariantPropertyValue(const QmlDesigner::ModelNode &node,
const QmlDesigner::PropertyName &propertyName,
const QVariant &value)
{
QmlDesigner::VariantProperty property = node.variantProperty(propertyName);
property.setValue(value);
}
inline void setBindingPropertyExpression(const QmlDesigner::ModelNode &node,
const QmlDesigner::PropertyName &propertyName,
const QString &expression)
{
QmlDesigner::BindingProperty property = node.bindingProperty(propertyName);
property.setExpression(expression);
}
} // namespace } // namespace
namespace QmlDesigner { namespace QmlDesigner {
@@ -235,18 +251,50 @@ void CollectionView::addResource(const QUrl &url, const QString &name, const QSt
void CollectionView::assignCollectionToNode(const QString &collectionName, const ModelNode &node) void CollectionView::assignCollectionToNode(const QString &collectionName, const ModelNode &node)
{ {
m_dataStore->assignCollectionToNode( using DataType = CollectionDetails::DataType;
this, executeInTransaction("CollectionView::assignCollectionToNode", [&]() {
node, m_dataStore->assignCollectionToNode(
collectionName, this,
[&](const QString &collectionName, const QString &columnName) -> bool { node,
const CollectionReference reference{dataStoreNode(), collectionName}; collectionName,
return m_widget->collectionDetailsModel()->collectionHasColumn(reference, columnName); [&](const QString &collectionName, const QString &columnName) -> bool {
}, const CollectionReference reference{dataStoreNode(), collectionName};
[&](const QString &collectionName) -> QString { return m_widget->collectionDetailsModel()->collectionHasColumn(reference, columnName);
const CollectionReference reference{dataStoreNode(), collectionName}; },
return m_widget->collectionDetailsModel()->getFirstColumnName(reference); [&](const QString &collectionName) -> QString {
}); const CollectionReference reference{dataStoreNode(), collectionName};
return m_widget->collectionDetailsModel()->getFirstColumnName(reference);
});
// Create and assign a delegate to the list view item
if (node.metaInfo().isQtQuickListView()) {
CollectionDetails collection = m_widget->collectionDetailsModel()->upToDateConstCollection(
{dataStoreNode(), collectionName});
ModelNode rowItem(createModelNode("QtQuick.Row"));
::setVariantPropertyValue(rowItem, "spacing", 5);
const int columnsCount = collection.columns();
for (int column = 0; column < columnsCount; ++column) {
const DataType dataType = collection.typeAt(column);
const QString columnName = collection.propertyAt(column);
ModelNode cellItem;
if (dataType == DataType::Color) {
cellItem = createModelNode("QtQuick.Rectangle");
::setBindingPropertyExpression(cellItem, "color", columnName);
::setVariantPropertyValue(cellItem, "height", 20);
} else {
cellItem = createModelNode("QtQuick.Text");
::setBindingPropertyExpression(cellItem, "text", columnName);
}
::setVariantPropertyValue(cellItem, "width", 100);
rowItem.defaultNodeAbstractProperty().reparentHere(cellItem);
}
NodeProperty delegateProperty = node.nodeProperty("delegate");
delegateProperty.setModelNode(rowItem);
}
});
} }
void CollectionView::assignCollectionToSelectedNode(const QString &collectionName) void CollectionView::assignCollectionToSelectedNode(const QString &collectionName)