ui: Split aggregation edges when expanding nodes if possible

This commit is contained in:
Eberhard Graether
2017-01-26 16:29:11 +01:00
parent 5e2c0f2c1f
commit 9583b6bbea
4 changed files with 96 additions and 15 deletions
@@ -150,6 +150,39 @@ void GraphController::handleMessage(MessageGraphNodeExpand* message)
DummyNode* node = getDummyGraphNodeById(message->tokenId);
if (node)
{
if (!node->active && message->expand)
{
for (size_t i = 0, l = m_dummyEdges.size(); i < l; i++)
{
std::shared_ptr<DummyEdge> edge = m_dummyEdges[i];
if (edge && edge->data && edge->data->isType(Edge::EDGE_AGGREGATION) &&
(edge->targetId == node->tokenId || edge->ownerId == node->tokenId))
{
std::vector<Id> aggregationIds =
utility::toVector<Id>(edge->data->getComponent<TokenComponentAggregation>()->getAggregationIds());
if (m_graph->getEdgeById(aggregationIds[0]) != nullptr)
{
break;
}
std::shared_ptr<Graph> graph = m_storageAccess->getGraphForActiveTokenIds(aggregationIds);
graph->forEachEdge(
[this](Edge* e)
{
if (!e->isType(Edge::EDGE_MEMBER))
{
m_dummyEdges.push_back(std::make_shared<DummyEdge>(
e->getFrom()->getId(), e->getTo()->getId(), m_graph->addEdgeAsPlainCopy(e)));
}
}
);
}
}
}
node->expanded = message->expand;
setActiveAndVisibility(utility::concat(m_activeNodeIds, m_activeEdgeIds));