Skip to content
Snippets Groups Projects
Commit ae9da516 authored by Marco Bubke's avatar Marco Bubke
Browse files

Don't overwrite bindings

parent 49edd820
No related branches found
No related tags found
No related merge requests found
...@@ -145,15 +145,29 @@ void MoveManipulator::begin(const QPointF &beginPoint) ...@@ -145,15 +145,29 @@ void MoveManipulator::begin(const QPointF &beginPoint)
QPointF MoveManipulator::findSnappingOffset(const QList<QRectF> &boundingRectList) QPointF MoveManipulator::findSnappingOffset(const QHash<FormEditorItem*, QRectF> &boundingRectHash)
{ {
QPointF offset; QPointF offset;
QMap<double, double> verticalOffsetMap; QMap<double, double> verticalOffsetMap;
foreach (const QRectF &boundingRect, boundingRectList) { QMap<double, double> horizontalOffsetMap;
double verticalOffset = m_snapper.snappedVerticalOffset(boundingRect);
if (verticalOffset < std::numeric_limits<double>::max()) QHashIterator<FormEditorItem*, QRectF> hashIterator(boundingRectHash);
verticalOffsetMap.insert(qAbs(verticalOffset), verticalOffset); while(hashIterator.hasNext()) {
hashIterator.next();
FormEditorItem *formEditorItem = hashIterator.key();
QRectF boundingRect = hashIterator.value();
if (!formEditorItem->qmlItemNode().hasBindingProperty("x")) {
double verticalOffset = m_snapper.snappedVerticalOffset(boundingRect);
if (verticalOffset < std::numeric_limits<double>::max())
verticalOffsetMap.insert(qAbs(verticalOffset), verticalOffset);
}
if (!formEditorItem->qmlItemNode().hasBindingProperty("y")) {
double horizontalOffset = m_snapper.snappedHorizontalOffset(boundingRect);
if (horizontalOffset < std::numeric_limits<double>::max())
horizontalOffsetMap.insert(qAbs(horizontalOffset), horizontalOffset);
}
} }
...@@ -161,15 +175,6 @@ QPointF MoveManipulator::findSnappingOffset(const QList<QRectF> &boundingRectLis ...@@ -161,15 +175,6 @@ QPointF MoveManipulator::findSnappingOffset(const QList<QRectF> &boundingRectLis
offset.rx() = verticalOffsetMap.begin().value(); offset.rx() = verticalOffsetMap.begin().value();
QMap<double, double> horizontalOffsetMap;
foreach (const QRectF &boundingRect, boundingRectList) {
double horizontalOffset = m_snapper.snappedHorizontalOffset(boundingRect);
if (horizontalOffset < std::numeric_limits<double>::max())
horizontalOffsetMap.insert(qAbs(horizontalOffset), horizontalOffset);
}
if (!horizontalOffsetMap.isEmpty()) if (!horizontalOffsetMap.isEmpty())
offset.ry() = horizontalOffsetMap.begin().value(); offset.ry() = horizontalOffsetMap.begin().value();
...@@ -177,22 +182,33 @@ QPointF MoveManipulator::findSnappingOffset(const QList<QRectF> &boundingRectLis ...@@ -177,22 +182,33 @@ QPointF MoveManipulator::findSnappingOffset(const QList<QRectF> &boundingRectLis
} }
void MoveManipulator::generateSnappingLines(const QList<QRectF> &boundingRectList) void MoveManipulator::generateSnappingLines(const QHash<FormEditorItem*, QRectF> &boundingRectHash)
{ {
m_graphicsLineList = m_snapper.generateSnappingLines(boundingRectList, m_graphicsLineList = m_snapper.generateSnappingLines(boundingRectHash.values(),
m_layerItem.data(), m_layerItem.data(),
m_snapper.transformtionSpaceFormEditorItem()->sceneTransform()); m_snapper.transformtionSpaceFormEditorItem()->sceneTransform());
} }
QList<QRectF> MoveManipulator::tanslatedBoundingRects(const QList<QRectF> &boundingRectList, const QPointF& offsetVector) QHash<FormEditorItem*, QRectF> MoveManipulator::tanslatedBoundingRects(const QHash<FormEditorItem*, QRectF> &boundingRectHash, const QPointF& offsetVector)
{ {
QList<QRectF> translatedBoundingRectList; QHash<FormEditorItem*, QRectF> translatedBoundingRectHash;
foreach (const QRectF &boundingRect, boundingRectList)
translatedBoundingRectList.append(boundingRect.translated(offsetVector)); QHashIterator<FormEditorItem*, QRectF> hashIterator(boundingRectHash);
while(hashIterator.hasNext()) {
QPointF alignedOffset(offsetVector);
hashIterator.next();
FormEditorItem *formEditorItem = hashIterator.key();
QRectF boundingRect = hashIterator.value();
if (formEditorItem->qmlItemNode().hasBindingProperty("x"))
alignedOffset.setX(0);
if (formEditorItem->qmlItemNode().hasBindingProperty("y"))
alignedOffset.setY(0);
translatedBoundingRectHash.insert(formEditorItem, boundingRect.translated(offsetVector));
}
return translatedBoundingRectList; return translatedBoundingRectHash;
} }
...@@ -220,8 +236,8 @@ void MoveManipulator::update(const QPointF& updatePoint, Snapping useSnapping, S ...@@ -220,8 +236,8 @@ void MoveManipulator::update(const QPointF& updatePoint, Snapping useSnapping, S
} }
if (useSnapping == UseSnapping || useSnapping == UseSnappingAndAnchoring) { if (useSnapping == UseSnapping || useSnapping == UseSnappingAndAnchoring) {
offsetVector -= findSnappingOffset(tanslatedBoundingRects(m_beginItemRectHash.values(), offsetVector)); offsetVector -= findSnappingOffset(tanslatedBoundingRects(m_beginItemRectHash, offsetVector));
generateSnappingLines(tanslatedBoundingRects(m_beginItemRectHash.values(), offsetVector)); generateSnappingLines(tanslatedBoundingRects(m_beginItemRectHash, offsetVector));
} }
foreach (FormEditorItem* item, m_itemList) { foreach (FormEditorItem* item, m_itemList) {
...@@ -255,7 +271,7 @@ void MoveManipulator::update(const QPointF& updatePoint, Snapping useSnapping, S ...@@ -255,7 +271,7 @@ void MoveManipulator::update(const QPointF& updatePoint, Snapping useSnapping, S
anchors.setMargin(AnchorLine::VerticalCenter, m_beginVerticalCenterHash.value(item) + offsetVector.y()); anchors.setMargin(AnchorLine::VerticalCenter, m_beginVerticalCenterHash.value(item) + offsetVector.y());
} }
item->qmlItemNode().setPosition(positionInContainerSpace); setPosition(item->qmlItemNode(), positionInContainerSpace);
} else { } else {
item->qmlItemNode().modelNode().variantProperty("x").setValue(qRound(positionInContainerSpace.x())); item->qmlItemNode().modelNode().variantProperty("x").setValue(qRound(positionInContainerSpace.x()));
item->qmlItemNode().modelNode().variantProperty("y").setValue(qRound(positionInContainerSpace.y())); item->qmlItemNode().modelNode().variantProperty("y").setValue(qRound(positionInContainerSpace.y()));
...@@ -345,8 +361,8 @@ void MoveManipulator::moveBy(double deltaX, double deltaY) ...@@ -345,8 +361,8 @@ void MoveManipulator::moveBy(double deltaX, double deltaY)
anchors.setMargin(AnchorLine::VerticalCenter, anchors.instanceMargin(AnchorLine::VerticalCenter) + deltaY); anchors.setMargin(AnchorLine::VerticalCenter, anchors.instanceMargin(AnchorLine::VerticalCenter) + deltaY);
} }
item->qmlItemNode().setPosition(QPointF(item->qmlItemNode().instanceValue("x").toDouble() + deltaX, setPosition(item->qmlItemNode(), QPointF(item->qmlItemNode().instanceValue("x").toDouble() + deltaX,
item->qmlItemNode().instanceValue("y").toDouble() + deltaY)); item->qmlItemNode().instanceValue("y").toDouble() + deltaY));
} }
} }
...@@ -381,4 +397,13 @@ bool MoveManipulator::isActive() const ...@@ -381,4 +397,13 @@ bool MoveManipulator::isActive() const
return m_isActive; return m_isActive;
} }
void MoveManipulator::setPosition(QmlItemNode itemNode, const QPointF &position)
{
if (!itemNode.hasBindingProperty("x"))
itemNode.setVariantProperty("x", qRound(position.x()));
if (!itemNode.hasBindingProperty("y"))
itemNode.setVariantProperty("y", qRound(position.y()));
}
} }
...@@ -86,19 +86,21 @@ public: ...@@ -86,19 +86,21 @@ public:
protected: protected:
void setOpacityForAllElements(qreal opacity); void setOpacityForAllElements(qreal opacity);
QPointF findSnappingOffset(const QList<QRectF> &boundingRectList); QPointF findSnappingOffset(const QHash<FormEditorItem*, QRectF> &boundingRectHash);
void deleteSnapLines(); void deleteSnapLines();
QList<QRectF> tanslatedBoundingRects(const QList<QRectF> &boundingRectList, const QPointF& offset); QHash<FormEditorItem*, QRectF> tanslatedBoundingRects(const QHash<FormEditorItem*, QRectF> &boundingRectHash, const QPointF& offset);
QPointF calculateBoundingRectMovementOffset(const QPointF& updatePoint); QPointF calculateBoundingRectMovementOffset(const QPointF& updatePoint);
QRectF boundingRect(FormEditorItem* item, const QPointF& updatePoint); QRectF boundingRect(FormEditorItem* item, const QPointF& updatePoint);
void generateSnappingLines(const QList<QRectF> &boundingRectList); void generateSnappingLines(const QHash<FormEditorItem*, QRectF> &boundingRectHash);
void updateHashes(); void updateHashes();
bool itemsCanReparented() const; bool itemsCanReparented() const;
void setPosition(QmlItemNode itemNode, const QPointF &position);
private: private:
Snapper m_snapper; Snapper m_snapper;
QWeakPointer<LayerItem> m_layerItem; QWeakPointer<LayerItem> m_layerItem;
......
...@@ -146,7 +146,7 @@ void ResizeManipulator::update(const QPointF& updatePoint, Snapping useSnapping) ...@@ -146,7 +146,7 @@ void ResizeManipulator::update(const QPointF& updatePoint, Snapping useSnapping)
if (boundingRect.height() < minimumHeight) if (boundingRect.height() < minimumHeight)
boundingRect.setHeight(minimumHeight); boundingRect.setHeight(minimumHeight);
formEditorItem->qmlItemNode().setSize(boundingRect.size()); setSize(formEditorItem->qmlItemNode(), boundingRect.size());
if (anchors.instanceHasAnchor(AnchorLine::Bottom)) { if (anchors.instanceHasAnchor(AnchorLine::Bottom)) {
...@@ -186,8 +186,8 @@ void ResizeManipulator::update(const QPointF& updatePoint, Snapping useSnapping) ...@@ -186,8 +186,8 @@ void ResizeManipulator::update(const QPointF& updatePoint, Snapping useSnapping)
if (boundingRect.height() < minimumHeight) if (boundingRect.height() < minimumHeight)
boundingRect.setTop(boundingRect.top() - minimumHeight + boundingRect.height()); boundingRect.setTop(boundingRect.top() - minimumHeight + boundingRect.height());
formEditorItem->qmlItemNode().setSize(boundingRect.size()); setSize(formEditorItem->qmlItemNode(), boundingRect.size());
formEditorItem->qmlItemNode().setPositionWithBorder(m_beginToParentTransform.map(boundingRect.topLeft())); setPosition(formEditorItem->qmlItemNode(), m_beginToParentTransform.map(boundingRect.topLeft()));
if (anchors.instanceHasAnchor(AnchorLine::Top)) { if (anchors.instanceHasAnchor(AnchorLine::Top)) {
...@@ -227,8 +227,8 @@ void ResizeManipulator::update(const QPointF& updatePoint, Snapping useSnapping) ...@@ -227,8 +227,8 @@ void ResizeManipulator::update(const QPointF& updatePoint, Snapping useSnapping)
if (boundingRect.width() < minimumWidth) if (boundingRect.width() < minimumWidth)
boundingRect.setWidth(minimumWidth); boundingRect.setWidth(minimumWidth);
formEditorItem->qmlItemNode().setSize(boundingRect.size()); setSize(formEditorItem->qmlItemNode(), boundingRect.size());
formEditorItem->qmlItemNode().setPositionWithBorder(m_beginToParentTransform.map(boundingRect.topLeft())); setPosition(formEditorItem->qmlItemNode(), m_beginToParentTransform.map(boundingRect.topLeft()));
if (anchors.instanceHasAnchor(AnchorLine::Top)) { if (anchors.instanceHasAnchor(AnchorLine::Top)) {
anchors.setMargin(AnchorLine::Top, anchors.setMargin(AnchorLine::Top,
...@@ -267,8 +267,8 @@ void ResizeManipulator::update(const QPointF& updatePoint, Snapping useSnapping) ...@@ -267,8 +267,8 @@ void ResizeManipulator::update(const QPointF& updatePoint, Snapping useSnapping)
if (boundingRect.width() < minimumWidth) if (boundingRect.width() < minimumWidth)
boundingRect.setLeft(boundingRect.left() - minimumWidth + boundingRect.width()); boundingRect.setLeft(boundingRect.left() - minimumWidth + boundingRect.width());
formEditorItem->qmlItemNode().setSize(boundingRect.size()); setSize(formEditorItem->qmlItemNode(), boundingRect.size());
formEditorItem->qmlItemNode().setPositionWithBorder(m_beginToParentTransform.map(boundingRect.topLeft())); setPosition(formEditorItem->qmlItemNode(), m_beginToParentTransform.map(boundingRect.topLeft()));
if (anchors.instanceHasAnchor(AnchorLine::Left)) { if (anchors.instanceHasAnchor(AnchorLine::Left)) {
anchors.setMargin(AnchorLine::Left, anchors.setMargin(AnchorLine::Left,
...@@ -297,7 +297,7 @@ void ResizeManipulator::update(const QPointF& updatePoint, Snapping useSnapping) ...@@ -297,7 +297,7 @@ void ResizeManipulator::update(const QPointF& updatePoint, Snapping useSnapping)
if (boundingRect.height() < minimumHeight) if (boundingRect.height() < minimumHeight)
boundingRect.setHeight(minimumHeight); boundingRect.setHeight(minimumHeight);
formEditorItem->qmlItemNode().setSize(boundingRect.size()); setSize(formEditorItem->qmlItemNode(), boundingRect.size());
if (anchors.instanceHasAnchor(AnchorLine::Bottom)) { if (anchors.instanceHasAnchor(AnchorLine::Bottom)) {
anchors.setMargin(AnchorLine::Bottom, anchors.setMargin(AnchorLine::Bottom,
...@@ -321,8 +321,8 @@ void ResizeManipulator::update(const QPointF& updatePoint, Snapping useSnapping) ...@@ -321,8 +321,8 @@ void ResizeManipulator::update(const QPointF& updatePoint, Snapping useSnapping)
if (boundingRect.height() < minimumHeight) if (boundingRect.height() < minimumHeight)
boundingRect.setTop(boundingRect.top() - minimumHeight + boundingRect.height()); boundingRect.setTop(boundingRect.top() - minimumHeight + boundingRect.height());
formEditorItem->qmlItemNode().setSize(boundingRect.size()); setSize(formEditorItem->qmlItemNode(), boundingRect.size());
formEditorItem->qmlItemNode().setPositionWithBorder(m_beginToParentTransform.map(boundingRect.topLeft())); setPosition(formEditorItem->qmlItemNode(), m_beginToParentTransform.map(boundingRect.topLeft()));
if (anchors.instanceHasAnchor(AnchorLine::Top)) { if (anchors.instanceHasAnchor(AnchorLine::Top)) {
anchors.setMargin(AnchorLine::Top, anchors.setMargin(AnchorLine::Top,
...@@ -346,7 +346,7 @@ void ResizeManipulator::update(const QPointF& updatePoint, Snapping useSnapping) ...@@ -346,7 +346,7 @@ void ResizeManipulator::update(const QPointF& updatePoint, Snapping useSnapping)
if (boundingRect.width() < minimumWidth) if (boundingRect.width() < minimumWidth)
boundingRect.setWidth(minimumWidth); boundingRect.setWidth(minimumWidth);
formEditorItem->qmlItemNode().setSize(boundingRect.size()); setSize(formEditorItem->qmlItemNode(), boundingRect.size());
if (anchors.instanceHasAnchor(AnchorLine::Right)) { if (anchors.instanceHasAnchor(AnchorLine::Right)) {
...@@ -371,8 +371,8 @@ void ResizeManipulator::update(const QPointF& updatePoint, Snapping useSnapping) ...@@ -371,8 +371,8 @@ void ResizeManipulator::update(const QPointF& updatePoint, Snapping useSnapping)
if (boundingRect.width() < minimumWidth) if (boundingRect.width() < minimumWidth)
boundingRect.setLeft(boundingRect.left() - minimumWidth + boundingRect.width()); boundingRect.setLeft(boundingRect.left() - minimumWidth + boundingRect.width());
formEditorItem->qmlItemNode().setSize(boundingRect.size()); setSize(formEditorItem->qmlItemNode(), boundingRect.size());
formEditorItem->qmlItemNode().setPositionWithBorder(m_beginToParentTransform.map(boundingRect.topLeft())); setPosition(formEditorItem->qmlItemNode(), m_beginToParentTransform.map(boundingRect.topLeft()));
if (anchors.instanceHasAnchor(AnchorLine::Left)) { if (anchors.instanceHasAnchor(AnchorLine::Left)) {
anchors.setMargin(AnchorLine::Left, anchors.setMargin(AnchorLine::Left,
...@@ -503,4 +503,23 @@ void ResizeManipulator::clear() ...@@ -503,4 +503,23 @@ void ResizeManipulator::clear()
removeHandle(); removeHandle();
} }
void ResizeManipulator::setSize(QmlItemNode itemNode, const QSizeF &size)
{
int penWidth = (itemNode.instancePenWidth() / 2) * 2;
if (!itemNode.hasBindingProperty("width"))
itemNode.setVariantProperty("width", qRound(size.width()) - penWidth);
if (!itemNode.hasBindingProperty("height"))
itemNode.setVariantProperty("height", qRound(size.height()) - penWidth);
}
void ResizeManipulator::setPosition(QmlItemNode itemNode, const QPointF &position)
{
if (!itemNode.hasBindingProperty("x"))
itemNode.setVariantProperty("x", qRound(position.x()) + (itemNode.instancePenWidth() / 2));
if (!itemNode.hasBindingProperty("y"))
itemNode.setVariantProperty("y", qRound(position.y()) + (itemNode.instancePenWidth() / 2));
}
} }
...@@ -68,6 +68,8 @@ protected: ...@@ -68,6 +68,8 @@ protected:
bool isInvalidSize(const QSizeF & size); bool isInvalidSize(const QSizeF & size);
void deleteSnapLines(); void deleteSnapLines();
ResizeHandleItem *resizeHandle(); ResizeHandleItem *resizeHandle();
void setSize(QmlItemNode itemNode, const QSizeF &size);
void setPosition(QmlItemNode itemNode, const QPointF &position);
private: private:
Snapper m_snapper; Snapper m_snapper;
......
...@@ -71,12 +71,10 @@ public: ...@@ -71,12 +71,10 @@ public:
QTransform instanceSceneTransform() const; QTransform instanceSceneTransform() const;
QPointF instancePosition() const; QPointF instancePosition() const;
QSizeF instanceSize() const; QSizeF instanceSize() const;
int instancePenWidth() const;
void paintInstance(QPainter *painter) const;
void setSize(const QSizeF &size); void paintInstance(QPainter *painter) const;
void setPosition(const QPointF &position);
void setPositionWithBorder(const QPointF &position);
void selectNode(); void selectNode();
void deselectNode(); void deselectNode();
......
...@@ -196,6 +196,9 @@ QRectF QmlGraphicsItemNodeInstance::boundingRect() const ...@@ -196,6 +196,9 @@ QRectF QmlGraphicsItemNodeInstance::boundingRect() const
void QmlGraphicsItemNodeInstance::setPropertyVariant(const QString &name, const QVariant &value) void QmlGraphicsItemNodeInstance::setPropertyVariant(const QString &name, const QVariant &value)
{ {
if (name == "state")
return; // states are only set by us
if (name == "height") { if (name == "height") {
if (value.isValid()) if (value.isValid())
m_hasHeight = true; m_hasHeight = true;
...@@ -215,6 +218,9 @@ void QmlGraphicsItemNodeInstance::setPropertyVariant(const QString &name, const ...@@ -215,6 +218,9 @@ void QmlGraphicsItemNodeInstance::setPropertyVariant(const QString &name, const
void QmlGraphicsItemNodeInstance::setPropertyBinding(const QString &name, const QString &expression) void QmlGraphicsItemNodeInstance::setPropertyBinding(const QString &name, const QString &expression)
{ {
if (name == "state")
return; // states are only set by us
GraphicsObjectNodeInstance::setPropertyBinding(name, expression); GraphicsObjectNodeInstance::setPropertyBinding(name, expression);
} }
......
...@@ -191,32 +191,15 @@ QSizeF QmlItemNode::instanceSize() const ...@@ -191,32 +191,15 @@ QSizeF QmlItemNode::instanceSize() const
return nodeInstance().size(); return nodeInstance().size();
} }
void QmlItemNode::paintInstance(QPainter *painter) const int QmlItemNode::instancePenWidth() const
{
if (nodeInstance().isValid())
nodeInstance().paint(painter);
}
void QmlItemNode::setSize(const QSizeF &size)
{ {
int penWidth = (nodeInstance().penWidth() / 2) * 2; return nodeInstance().penWidth();
RewriterTransaction transaction = qmlModelView()->beginRewriterTransaction();
setVariantProperty("width", qRound(size.width()) - penWidth);
setVariantProperty("height", qRound(size.height()) - penWidth);
} }
void QmlItemNode::setPosition(const QPointF &position) void QmlItemNode::paintInstance(QPainter *painter) const
{
RewriterTransaction transaction = qmlModelView()->beginRewriterTransaction();
setVariantProperty("x", qRound(position.x()));
setVariantProperty("y", qRound(position.y()));
}
void QmlItemNode::setPositionWithBorder(const QPointF &position)
{ {
RewriterTransaction transaction = qmlModelView()->beginRewriterTransaction(); if (nodeInstance().isValid())
setVariantProperty("x", qRound(position.x()) + (nodeInstance().penWidth() / 2)); nodeInstance().paint(painter);
setVariantProperty("y", qRound(position.y()) + (nodeInstance().penWidth() / 2));
} }
void QmlItemNode::selectNode() void QmlItemNode::selectNode()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment