| 87 | //--------------------------------------------------- |
| 88 | |
| 89 | void RecursiveNodeReorder(AbsBehaviorTree& tree, PortLayout layout) |
| 90 | { |
| 91 | std::function<void(unsigned, AbstractTreeNode*)> recursiveStep; |
| 92 | |
| 93 | std::vector<QPointF> layer_cursor; |
| 94 | std::vector< std::vector<AbstractTreeNode*> > nodes_by_level(1); |
| 95 | |
| 96 | const qreal LEVEL_SPACING = 80; |
| 97 | const qreal NODE_SPACING = 40; |
| 98 | |
| 99 | recursiveStep = [&](unsigned current_layer, AbstractTreeNode* node) |
| 100 | { |
| 101 | node->pos = layer_cursor[current_layer]; |
| 102 | nodes_by_level[current_layer].push_back( node ); |
| 103 | |
| 104 | //------------------------------------ |
| 105 | if( node->children_index.size() == 0 ) |
| 106 | { |
| 107 | return; |
| 108 | } |
| 109 | qreal recommended_pos = NODE_SPACING * 0.5; |
| 110 | |
| 111 | current_layer++; |
| 112 | |
| 113 | if( layout == PortLayout::Vertical) |
| 114 | { |
| 115 | recommended_pos += (node->pos.x() + node->size.width()*0.5) ; |
| 116 | for(int index: node->children_index) |
| 117 | { |
| 118 | const auto& child_node = tree.nodes()[index]; |
| 119 | recommended_pos -= (child_node.size.width() + NODE_SPACING) * 0.5; |
| 120 | } |
| 121 | |
| 122 | if( current_layer >= layer_cursor.size()) |
| 123 | { |
| 124 | QPointF new_cursor( recommended_pos, |
| 125 | node->pos.y() + LEVEL_SPACING ); |
| 126 | layer_cursor.push_back( new_cursor ); |
| 127 | nodes_by_level.push_back( std::vector<AbstractTreeNode*>() ); |
| 128 | } |
| 129 | else{ |
| 130 | recommended_pos = std::max( recommended_pos, layer_cursor[current_layer].x() ); |
| 131 | layer_cursor[current_layer].setX(recommended_pos); |
| 132 | } |
| 133 | }//------------------------------------ |
| 134 | else |
| 135 | { |
| 136 | recommended_pos += node->pos.y() + node->size.height()*0.5; |
| 137 | for(int index: node->children_index) |
| 138 | { |
| 139 | const auto& child_node = tree.nodes()[index]; |
| 140 | recommended_pos -= (child_node.size.height() + NODE_SPACING) * 0.5; |
| 141 | } |
| 142 | |
| 143 | if( current_layer >= layer_cursor.size()) |
| 144 | { |
| 145 | QPointF new_cursor( node->pos.x() + LEVEL_SPACING, |
| 146 | recommended_pos); |
no test coverage detected