Skip to content

Commit

Permalink
Fix setting link IDs when duplicating nodes in groups
Browse files Browse the repository at this point in the history
  • Loading branch information
kduske committed Feb 15, 2024
1 parent 88cb8cb commit c6ec43c
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 3 deletions.
7 changes: 4 additions & 3 deletions common/src/View/MapDocument.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1776,10 +1776,11 @@ void MapDocument::duplicateObjects()
{
auto* suggestedParent = parentForNodes({original});

const auto isLinkedNode =
Model::collectLinkedNodes({m_world.get()}, *original).size() > 1;
const auto isLinkedGroup =
dynamic_cast<const Model::GroupNode*>(original) != nullptr
&& Model::collectLinkedNodes({m_world.get()}, *original).size() > 1;
const auto setLinkIds =
isLinkedNode ? Model::SetLinkId::keep : Model::SetLinkId::generate;
isLinkedGroup ? Model::SetLinkId::keep : Model::SetLinkId::generate;
auto* clone = original->cloneRecursively(m_worldBounds, setLinkIds);

if (shouldCloneParentWhenCloningNode(original))
Expand Down
69 changes: 69 additions & 0 deletions common/test/src/View/tst_GroupNodes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,75 @@ TEST_CASE_METHOD(MapDocumentTest, "GroupNodesTest.duplicateNodeInGroup")

auto* brushNodeCopy = document->selectedNodes().brushes().at(0u);
CHECK(brushNodeCopy->parent() == groupNode);
CHECK(brushNodeCopy->linkId() != brushNode->linkId());
}

TEST_CASE_METHOD(MapDocumentTest, "GroupNodesTest.duplicateLinkedGroup")
{
auto* brushNode = createBrushNode();
document->addNodes({{document->parentForNodes(), {brushNode}}});
document->selectNodes({brushNode});

auto* groupNode = document->groupSelection("test");
REQUIRE(groupNode != nullptr);

auto* linkedGroupNode = document->createLinkedDuplicate();
REQUIRE(linkedGroupNode->linkId() == groupNode->linkId());

document->duplicateObjects();

auto* groupNodeCopy = document->selectedNodes().groups().at(0u);
CHECK(groupNodeCopy->linkId() == groupNode->linkId());
}

TEST_CASE_METHOD(MapDocumentTest, "GroupNodesTest.duplicateNodeInLinkedGroup")
{
auto* brushNode = createBrushNode();
document->addNodes({{document->parentForNodes(), {brushNode}}});
document->selectNodes({brushNode});

auto* groupNode = document->groupSelection("test");
REQUIRE(groupNode != nullptr);

auto* linkedGroupNode = document->createLinkedDuplicate();
REQUIRE(linkedGroupNode->linkId() == groupNode->linkId());

document->openGroup(groupNode);

document->selectNodes({brushNode});
document->duplicateObjects();

auto* brushNodeCopy = document->selectedNodes().brushes().at(0u);
CHECK(brushNodeCopy->linkId() != brushNode->linkId());
}

TEST_CASE_METHOD(MapDocumentTest, "GroupNodesTest.duplicateGroupInLinkedGroup")
{
auto* brushNode = createBrushNode();
document->addNodes({{document->parentForNodes(), {brushNode}}});
document->selectNodes({brushNode});

auto* innerGroupNode = document->groupSelection("inner");
REQUIRE(innerGroupNode != nullptr);

auto* outerGroupNode = document->groupSelection("outer");
REQUIRE(outerGroupNode != nullptr);

auto* linkedOuterGroupNode = document->createLinkedDuplicate();
REQUIRE(linkedOuterGroupNode->linkId() == outerGroupNode->linkId());

auto* linkedInnerGroupNode =
dynamic_cast<Model::GroupNode*>(linkedOuterGroupNode->children().front());
REQUIRE(linkedInnerGroupNode != nullptr);
REQUIRE(linkedInnerGroupNode->linkId() == innerGroupNode->linkId());

document->openGroup(outerGroupNode);

document->selectNodes({innerGroupNode});
document->duplicateObjects();

auto* innerGroupNodeCopy = document->selectedNodes().groups().at(0u);
CHECK(innerGroupNodeCopy->linkId() == innerGroupNode->linkId());
}

TEST_CASE_METHOD(MapDocumentTest, "GroupNodesTest.ungroupInnerGroup")
Expand Down

0 comments on commit c6ec43c

Please sign in to comment.