65 std::vector<ax::NodeEditor::NodeId> selectedNodeIds;
66 selectedNodeIds.resize(
static_cast<size_t>(ed::GetSelectedObjectCount()));
68 auto selectedNodesCount = ed::GetSelectedNodes(selectedNodeIds.data(), ed::GetSelectedObjectCount());
69 selectedNodeIds.resize(
static_cast<size_t>(selectedNodesCount));
74 for (
const auto& nodeId : selectedNodeIds)
78 clipboard[
"nodes"][
"node-" + std::to_string(
size_t(node->
id))] = *node;
79 clipboard[
"nodes"][
"node-" + std::to_string(
size_t(node->
id))][
"data"] = node->
save();
83 for (
const auto& link : outputPin.links)
85 auto& j = clipboard[
"links"][
"link-" + std::to_string(
size_t(link.linkId))];
86 j[
"id"] = size_t(link.linkId);
87 j[
"startPinId"] = size_t(outputPin.id);
88 j[
"endPinId"] = size_t(link.connectedPinId);
95 elementsCutted =
true;
103 std::vector<ax::NodeEditor::NodeId> selectedNodeIds;
104 selectedNodeIds.resize(
static_cast<size_t>(ed::GetSelectedObjectCount()));
106 auto selectedNodesCount = ed::GetSelectedNodes(selectedNodeIds.data(), ed::GetSelectedObjectCount());
107 selectedNodeIds.resize(
static_cast<size_t>(selectedNodesCount));
111 for (
const auto& nodeId : selectedNodeIds)
115 clipboard[
"nodes"][
"node-" + std::to_string(
size_t(node->
id))] = *node;
116 clipboard[
"nodes"][
"node-" + std::to_string(
size_t(node->
id))][
"data"] = node->
save();
118 for (
const auto& outputPin : node->
outputPins)
120 for (
const auto& link : outputPin.links)
122 auto& j = clipboard[
"links"][
"link-" + std::to_string(
size_t(link.linkId))];
123 j[
"id"] = size_t(link.linkId);
124 j[
"startPinId"] = size_t(outputPin.id);
125 j[
"endPinId"] = size_t(link.connectedPinId);
130 elementsCutted =
false;
140 LOG_DEBUG(
"Pasting clipboard {}", clipboard.dump(4));
145 ImVec2 leftTopMostPos{ std::numeric_limits<float>::infinity(), std::numeric_limits<float>::infinity() };
146 if (clipboard.contains(
"nodes"))
148 for (
const auto& nodeJson : clipboard.at(
"nodes"))
151 if (nodeJson.contains(
"pos"))
153 nodeJson.at(
"pos").get_to(pos);
155 leftTopMostPos.x = std::min(pos.x, leftTopMostPos.x);
156 leftTopMostPos.y = std::min(pos.y, leftTopMostPos.y);
162 auto viewRect =
reinterpret_cast<ax::NodeEditor::Detail::EditorContext*
>(ed::GetCurrentEditor())->GetViewRect();
163 ImVec2 mousePos = ImGui::GetMousePos();
166 mousePos *= ed::GetCurrentZoom();
167 mousePos += viewRect.GetTL();
170 for (
size_t i = nodeCountBeforeLoad; i <
nm::m_Nodes().size(); i++)
173 ed::SetNodePosition(node->id, mousePos + (ed::GetNodePosition(node->id) - leftTopMostPos));
177 std::map<size_t, ed::NodeId> newlyLinkedNodes;
180 if (clipboard.contains(
"links"))
182 for (
const auto& linkJson : clipboard.at(
"links"))
184 auto startPinId = linkJson.at(
"startPinId").get<
size_t>();
185 auto endPinId = linkJson.at(
"endPinId").get<
size_t>();
187 size_t startPinOldParentNodeId = 0;
188 size_t startPinParentNodeIndex = 0;
189 size_t startPinIndex = 0;
192 size_t endPinOldParentNodeId = 0;
193 size_t endPinParentNodeIndex = 0;
194 size_t endPinIndex = 0;
198 if (clipboard.contains(
"nodes"))
200 size_t nodeIndex = 0;
201 for (
const auto& nodeJson : clipboard.at(
"nodes"))
203 if (nodeJson.contains(
"inputPins"))
206 for (
const auto& pinJson : nodeJson.at(
"inputPins"))
208 if (pinJson.at(
"id").get<
size_t>() == startPinId)
210 startPinOldParentNodeId = nodeJson.at(
"id");
211 startPinParentNodeIndex = nodeCountBeforeLoad + nodeIndex;
212 startPinIndex = pinIndex;
215 if (pinJson.at(
"id").get<
size_t>() == endPinId)
217 endPinOldParentNodeId = nodeJson.at(
"id");
218 endPinParentNodeIndex = nodeCountBeforeLoad + nodeIndex;
219 endPinIndex = pinIndex;
225 if (nodeJson.contains(
"outputPins"))
228 for (
const auto& pinJson : nodeJson.at(
"outputPins"))
230 if (pinJson.at(
"id").get<
size_t>() == startPinId)
232 startPinOldParentNodeId = nodeJson.at(
"id");
233 startPinParentNodeIndex = nodeCountBeforeLoad + nodeIndex;
234 startPinIndex = pinIndex;
237 if (pinJson.at(
"id").get<
size_t>() == endPinId)
239 endPinOldParentNodeId = nodeJson.at(
"id");
240 endPinParentNodeIndex = nodeCountBeforeLoad + nodeIndex;
241 endPinIndex = pinIndex;
255 auto& startPin =
nm::m_Nodes().at(startPinParentNodeIndex)->outputPins.at(startPinIndex);
256 auto& endPin =
nm::m_Nodes().at(endPinParentNodeIndex)->inputPins.at(endPinIndex);
258 if (!endPin.isPinLinked())
260 startPin.createLink(endPin);
264 newlyLinkedNodes[startPinOldParentNodeId] =
nm::m_Nodes().at(startPinParentNodeIndex)->id;
265 newlyLinkedNodes[endPinOldParentNodeId] =
nm::m_Nodes().at(endPinParentNodeIndex)->id;
269 if (clipboard.contains(
"nodes"))
271 for (
auto [oldId, newId] : newlyLinkedNodes)
275 if (clipboard.at(
"nodes").contains(
"node-" + std::to_string(oldId)))
279 LOG_DEBUG(
"Calling restoreAtferLink() for new node '{}', which was copied from node '{}'", node->nameId(), oldNode->nameId());
281 const auto& nodeJson = clipboard.at(
"nodes").at(
"node-" + std::to_string(oldId));
282 if (nodeJson.contains(
"data"))
284 node->restoreAtferLink(nodeJson.at(
"data"));
290 elementsCutted =
false;