| 1249 | } |
| 1250 | |
| 1251 | bool RibbonMenu::drawMergeSubtreeButton( const std::vector<std::shared_ptr<Object>>& selected ) |
| 1252 | { |
| 1253 | std::vector<TypedFlatTree> subtrees; |
| 1254 | for ( const auto& subtree : getFlatSubtrees( selected ) ) |
| 1255 | subtrees.emplace_back( TypedFlatTree::fromFlatTree( subtree ) ); |
| 1256 | if ( subtrees.empty() ) |
| 1257 | return false; |
| 1258 | |
| 1259 | bool needToMerge = false; |
| 1260 | for ( const auto& subtree : subtrees ) |
| 1261 | { |
| 1262 | const auto& rootObj = subtree.root; |
| 1263 | needToMerge = needToMerge |
| 1264 | || ( subtree.objsMesh.size() + int( rootObj->asType<ObjectMesh>() != nullptr ) > 1 ) |
| 1265 | || ( subtree.objsLines.size() + int( rootObj->asType<ObjectLines>() != nullptr ) > 1 ) |
| 1266 | || ( subtree.objsPoints.size() + int( rootObj->asType<ObjectPoints>() != nullptr ) > 1 ); |
| 1267 | } |
| 1268 | if ( !needToMerge ) |
| 1269 | return false; |
| 1270 | |
| 1271 | if ( !UI::button( _tr( "Combine Subtree" ), Vector2f( -1, 0 ) ) ) |
| 1272 | return false; |
| 1273 | |
| 1274 | SCOPED_HISTORY( _t( "Combine Subtree" ) ); |
| 1275 | for ( auto& subtree : subtrees ) |
| 1276 | mergeSubtree( std::move( subtree ) ); |
| 1277 | |
| 1278 | return true; |
| 1279 | } |
| 1280 | |
| 1281 | void RibbonMenu::drawBigButtonItem_( const MenuItemInfo& item ) |
| 1282 | { |
no test coverage detected