void NodeInstanceView::updateChildren(const NodeAbstractProperty &newPropertyParent) { QVector<ModelNode> childNodeVector = newPropertyParent.directSubNodes().toVector(); qint32 parentInstanceId = newPropertyParent.parentModelNode().internalId(); foreach (const ModelNode &childNode, childNodeVector) { qint32 instanceId = childNode.internalId(); if (hasInstanceForId(instanceId)) { NodeInstance instance = instanceForId(instanceId); if (instance.directUpdates()) instance.setParentId(parentInstanceId); } }
static bool isInEditedPath(const NodeAbstractProperty &propertyParent, const ModelNode &editingPathViewModelNode) { if (editingPathViewModelNode.isValid()) { if (editingPathViewModelNode.hasNodeProperty("path")) { ModelNode pathModelNode = editingPathViewModelNode.nodeProperty("path").modelNode(); if (pathModelNode.metaInfo().isSubclassOf("QtQuick.Path")) { if (propertyParent.name() == "pathElements" && propertyParent.parentModelNode() == pathModelNode) return true; } } } return false; }
void ModelToTextMerger::nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent, const NodeAbstractProperty &oldPropertyParent, AbstractView::PropertyChangeFlags propertyChange) { if (isInHierarchy(oldPropertyParent) && isInHierarchy(newPropertyParent)) { // the node is moved schedule(new ReparentNodeRewriteAction(node, oldPropertyParent, newPropertyParent, propertyType(newPropertyParent))); } else if (isInHierarchy(oldPropertyParent) && !isInHierarchy(newPropertyParent)) { // the node is removed from hierarchy if (oldPropertyParent.isNodeProperty()) { // ignore, the subsequent remove property will take care of all } else if (oldPropertyParent.isNodeListProperty()) { if (!oldPropertyParent.isDefaultProperty() && oldPropertyParent.toNodeListProperty().toModelNodeList().size() == 0) { schedule(new RemovePropertyRewriteAction(oldPropertyParent)); } else { schedule(new RemoveNodeRewriteAction(node)); } } else { schedule(new RemoveNodeRewriteAction(node)); } } else if (!isInHierarchy(oldPropertyParent) && isInHierarchy(newPropertyParent)) { // the node is inserted into to hierarchy switch (propertyChange) { case AbstractView::PropertiesAdded: schedule(new AddPropertyRewriteAction(newPropertyParent, QmlTextGenerator(getPropertyOrder())(node), propertyType(newPropertyParent), node)); break; case AbstractView::NoAdditionalChanges: schedule(new ChangePropertyRewriteAction(newPropertyParent, QmlTextGenerator(getPropertyOrder())(node), propertyType(newPropertyParent), node)); break; case AbstractView::EmptyPropertiesRemoved: break; default: Q_ASSERT(!"Unknown PropertyChange value"); } } else { // old is outside of hierarchy, new is outside of hierarchy, so who cares? } }
void NavigatorView::nodeReparented(const ModelNode &node, const NodeAbstractProperty & newPropertyParent, const NodeAbstractProperty & /*oldPropertyParent*/, AbstractView::PropertyChangeFlags /*propertyChange*/) { bool blocked = blockSelectionChangedSignal(true); m_treeModel->removeSubTree(node); if (node.isInHierarchy()) m_treeModel->addSubTree(node); // make sure selection is in sync again updateItemSelection(); if (newPropertyParent.parentModelNode().isValid()) { QModelIndex index = m_treeModel->indexForNode(newPropertyParent.parentModelNode()); treeWidget()->expand(index); } blockSelectionChangedSignal(blocked); }
void ModelNode::setParentProperty(NodeAbstractProperty parent) { if (!isValid()) { Q_ASSERT_X(isValid(), Q_FUNC_INFO, "model node is invalid"); throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); } if (!parent.parentModelNode().isValid()) throw InvalidArgumentException(__LINE__, __FUNCTION__, __FILE__, "newParentNode"); if (*this == parent.parentModelNode()) { Q_ASSERT_X(*this != parent.parentModelNode(), Q_FUNC_INFO, "cannot set parent to itself"); throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); } if (parent == parentProperty()) return; parent.reparentHere(*this); }
void FormEditorView::propertiesAboutToBeRemoved(const QList<AbstractProperty>& propertyList) { foreach(const AbstractProperty &property, propertyList) { if (property.isNodeAbstractProperty()) { NodeAbstractProperty nodeAbstractProperty = property.toNodeAbstractProperty(); QList<FormEditorItem*> removedItemList; foreach(const ModelNode &modelNode, nodeAbstractProperty.allSubNodes()) { QmlItemNode qmlItemNode(modelNode); if (qmlItemNode.isValid() && m_scene->hasItemForQmlItemNode(qmlItemNode)) { FormEditorItem *item = m_scene->itemForQmlItemNode(qmlItemNode); removedItemList.append(item); delete item; } } m_currentTool->itemsAboutToRemoved(removedItemList); } }
bool NavigatorTreeModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &dropIndex) { if (action == Qt::IgnoreAction) return true; if (action != Qt::LinkAction) return false; if (!data->hasFormat("application/vnd.modelnode.list")) return false; if (column > 1) return false; if (dropIndex.model() != this) return false; QModelIndex parentIndex, parentItemIndex; PropertyName parentPropertyName; int targetIndex; parentIndex = dropIndex.sibling(dropIndex.row(), 0); targetIndex = (row > -1)? row : rowCount(parentIndex); if (this->data(parentIndex, NavigatorRole).isValid()) { parentItemIndex = parentIndex; ModelNode parentNode = nodeForIndex(parentItemIndex); if (!parentNode.metaInfo().hasDefaultProperty()) return false; targetIndex -= visibleProperties(parentNode).count(); parentPropertyName = parentNode.metaInfo().defaultPropertyName(); } else { parentItemIndex = parentIndex.parent(); parentPropertyName = parentIndex.data(Qt::DisplayRole).toByteArray(); } // Disallow dropping items between properties, which are listed first. if (targetIndex < 0) return false; Q_ASSERT(parentItemIndex.isValid()); QByteArray encodedData = data->data("application/vnd.modelnode.list"); QDataStream stream(&encodedData, QIODevice::ReadOnly); QList<ModelNode> nodeList; while (!stream.atEnd()) { uint nodeHash; stream >> nodeHash; if (containsNodeHash(nodeHash)) { ModelNode node(nodeForHash(nodeHash)); nodeList.append(node); } } ModelNode parentNode(nodeForIndex(parentItemIndex)); NodeAbstractProperty parentProperty = parentNode.nodeAbstractProperty(parentPropertyName); if (parentProperty.isNodeProperty() && nodeList.count() > 1) { return false; } moveNodesInteractive(parentProperty, nodeList, targetIndex); propagateInvisible(parentNode, isNodeInvisible(parentNode)); return false; // don't let the view do drag&drop on its own }
NodeAbstractProperty::NodeAbstractProperty(const NodeAbstractProperty &property, AbstractView *view) : AbstractProperty(property.name(), property.internalNode(), property.model(), view) { }
QDebug operator<<(QDebug debug, const NodeAbstractProperty &property) { return debug.nospace() << "NodeAbstractProperty(" << (property.isValid() ? property.name() : QLatin1String("invalid")) << ')'; }
void StatesEditorView::nodeAboutToBeReparented(const ModelNode &node, const NodeAbstractProperty &/*newPropertyParent*/, const NodeAbstractProperty &oldPropertyParent, AbstractView::PropertyChangeFlags /*propertyChange*/) { if (oldPropertyParent.isValid() && oldPropertyParent.parentModelNode().isRootNode() && oldPropertyParent.name() == "states") m_lastIndex = oldPropertyParent.indexOf(node); }