QmlDesigner: Some support for non default properties in navigator

* Using hints to determine if properties/nodes should be visible, even
  if they are not in a default property.

* Using hints to add items to properties that are not the default property.

Change-Id: Iab461287807d0c82a535b7d182b989e42f96d21c
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Thomas Hartmann
2019-06-14 14:29:34 +02:00
parent 3a7a1c5e81
commit dfc5e76830

View File

@@ -246,14 +246,29 @@ Qt::ItemFlags NavigatorTreeModel::flags(const QModelIndex &index) const
| Qt::ItemNeverHasChildren;
}
void static appendForcedNodes(const NodeListProperty &property, QList<ModelNode> &list)
{
const QStringList visibleProperties = NodeHints::fromModelNode(property.parentModelNode()).visibleNonDefaultProperties();
for (const ModelNode &node : property.parentModelNode().directSubModelNodes()) {
if (!list.contains(node) && visibleProperties.contains(QString::fromUtf8(node.parentProperty().name())))
list.append(node);
}
}
QList<ModelNode> filteredList(const NodeListProperty &property, bool filter)
{
if (!filter)
return property.toModelNodeList();
return Utils::filtered(property.toModelNodeList(), [] (const ModelNode &arg) {
QList<ModelNode> list;
list.append(Utils::filtered(property.toModelNodeList(), [] (const ModelNode &arg) {
return QmlItemNode::isValidQmlItemNode(arg) || NodeHints::fromModelNode(arg).visibleInNavigator();
});
}));
appendForcedNodes(property, list);
return list;
}
QModelIndex NavigatorTreeModel::index(int row, int column,
@@ -431,7 +446,8 @@ bool NavigatorTreeModel::dropMimeData(const QMimeData *mimeData,
static bool findTargetProperty(const QModelIndex &rowModelIndex,
NavigatorTreeModel *navigatorTreeModel,
NodeAbstractProperty *targetProperty,
int *targetRowNumber)
int *targetRowNumber,
const QString &propertyName = {})
{
QModelIndex targetItemIndex;
PropertyName targetPropertyName;
@@ -445,7 +461,10 @@ static bool findTargetProperty(const QModelIndex &rowModelIndex,
if (!targetNode.metaInfo().hasDefaultProperty())
return false;
targetPropertyName = targetNode.metaInfo().defaultPropertyName();
if (propertyName.isEmpty())
targetPropertyName = targetNode.metaInfo().defaultPropertyName();
else
targetPropertyName = propertyName.toUtf8();
}
// Disallow dropping items between properties, which are listed first.
@@ -494,12 +513,16 @@ void NavigatorTreeModel::handleItemLibraryItemDrop(const QMimeData *mimeData, in
int targetRowNumber = rowNumber;
NodeAbstractProperty targetProperty;
bool foundTarget = findTargetProperty(rowModelIndex, this, &targetProperty, &targetRowNumber);
const ItemLibraryEntry itemLibraryEntry =
createItemLibraryEntryFromMimeData(mimeData->data("application/vnd.bauhaus.itemlibraryinfo"));
const NodeHints hints = NodeHints::fromItemLibraryEntry(itemLibraryEntry);
const QString targetPropertyName = hints.forceNonDefaultProperty();
bool foundTarget = findTargetProperty(rowModelIndex, this, &targetProperty, &targetRowNumber, targetPropertyName);
if (foundTarget) {
const ItemLibraryEntry itemLibraryEntry =
createItemLibraryEntryFromMimeData(mimeData->data("application/vnd.bauhaus.itemlibraryinfo"));
if (!NodeHints::fromItemLibraryEntry(itemLibraryEntry).canBeDroppedInNavigator())
return;