fix: correct macro placement position mismatch

Fix macro elements jumping to upper-left corner instead of being placed
at the correct drop position.

Root cause: The preview offset used itemsBoundingRect() (all items
including children), while Diagram::fromXml() computed its translation
offset from top-level items only. This mismatch caused fromXml to
translate elements to the wrong position.

Changes:
- Compute top-level-only bounding rect in dummy diagram constructor
  to get the correct m_items_top_left reference point
- Pass final_pos + m_items_top_left to fromXml() so the internal
  translation yields the intended final position
- Add braces around single-statement for-loop in fromXml
- Remove empty else block leftovers from debug cleanup
This commit is contained in:
Kellermorph
2026-09-20 21:24:38 +02:00
parent 83fb525e27
commit 2efce1752d
3 changed files with 28 additions and 12 deletions
+21 -7
View File
@@ -67,7 +67,19 @@ m_preview_item(nullptr)
dummy_diagram->setDisplayGrid(false);
dummy_diagram->fromXml(diagram_node, QPointF(0, 0), false, nullptr);
// Compute bounding rect of TOP-LEVEL items only (matching fromXml's added_items logic)
// Child items (DynamicElementTextItem, Terminal) are NOT included - they move with parents
QRectF top_level_rect;
for (auto *item : dummy_diagram->items()) {
if (!item->parentItem()) {
top_level_rect = top_level_rect.united(
item->mapToScene(item->boundingRect()).boundingRect());
}
}
m_items_top_left = top_level_rect.topLeft();
QRectF scene_rect = dummy_diagram->itemsBoundingRect();
if (!scene_rect.isEmpty()) {
QPixmap pixmap(scene_rect.toAlignedRect().size());
pixmap.fill(Qt::transparent);
@@ -80,10 +92,11 @@ m_preview_item(nullptr)
}
}
if (m_preview_item) {
m_preview_item->setPos(Diagram::snapToGrid(pos));
m_preview_item->setOpacity(0.6);
m_diagram->addItem(m_preview_item);
if (m_preview_item) {
QPointF snapped = Diagram::snapToGrid(pos);
m_preview_item->setPos(snapped);
m_preview_item->setOpacity(0.6);
m_diagram->addItem(m_preview_item);
m_running = true;
}
@@ -117,6 +130,7 @@ void DiagramEventAddMacro::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
if (m_preview_item) {
const auto pos_{Diagram::snapToGrid(event->scenePos())};
m_preview_item->setPos(pos_);
if (m_status_bar) {
@@ -141,7 +155,8 @@ void DiagramEventAddMacro::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
emit finish();
}
else if (event->button() == Qt::LeftButton) {
addMacro(Diagram::snapToGrid(event->scenePos()));
QPointF snapped = Diagram::snapToGrid(event->scenePos());
addMacro(snapped);
}
}
event->setAccepted(true);
@@ -238,10 +253,9 @@ void DiagramEventAddMacro::addMacro(QPointF final_pos)
if (!diagram_node.isNull()) {
QDomElement cloned_node = diagram_node.cloneNode(true).toElement();
DiagramContent pasted_content;
m_diagram->fromXml(cloned_node, final_pos, false, &pasted_content);
m_diagram->fromXml(cloned_node, final_pos + m_items_top_left, false, &pasted_content);
m_diagram->refreshContents();
// Prevent PasteDiagramCommand from erasing labels (BMK)