| 784 | } |
| 785 | |
| 786 | void MainWindow::onDestroySubTree(const QString &ID) |
| 787 | { |
| 788 | auto sub_container = getTabByName(ID); |
| 789 | |
| 790 | for(auto& it: _tab_info) |
| 791 | { |
| 792 | if( it.first == ID ) |
| 793 | { |
| 794 | continue; |
| 795 | } |
| 796 | auto container = it.second; |
| 797 | auto tree = BuildTreeFromScene(container->scene()); |
| 798 | for( const auto& abs_node: tree.nodes()) |
| 799 | { |
| 800 | auto qt_node = abs_node.graphic_node; |
| 801 | auto bt_node = dynamic_cast<BehaviorTreeDataModel*>(qt_node->nodeDataModel()); |
| 802 | if(bt_node->nodeType() == NodeType::SUBTREE && bt_node->instanceName() == ID) |
| 803 | { |
| 804 | auto new_node = qt_node; |
| 805 | auto subtree_model = dynamic_cast<SubtreeNodeModel*>(bt_node); |
| 806 | if( subtree_model && subtree_model->expanded() == false ) |
| 807 | { |
| 808 | new_node = subTreeExpand( *container, *qt_node, |
| 809 | SubtreeExpandOption::SUBTREE_EXPAND ); |
| 810 | } |
| 811 | container->lockSubtreeEditing(*new_node, false, false); |
| 812 | container->onSmartRemove( new_node ); |
| 813 | } |
| 814 | } |
| 815 | container->nodeReorder(); |
| 816 | } |
| 817 | |
| 818 | for( int index = 0; index < ui->tabWidget->count(); index++) |
| 819 | { |
| 820 | if( ui->tabWidget->tabText(index) == ID) |
| 821 | { |
| 822 | sub_container->scene()->clearScene(); |
| 823 | sub_container->deleteLater(); |
| 824 | ui->tabWidget->removeTab( index ); |
| 825 | _tab_info.erase(ID); |
| 826 | break; |
| 827 | } |
| 828 | } |
| 829 | |
| 830 | if( ui->tabWidget->count() == 1 ) |
| 831 | { |
| 832 | onTabSetMainTree(0); |
| 833 | } |
| 834 | |
| 835 | // TODO: this is a work around until we find a better solution |
| 836 | clearUndoStacks(); |
| 837 | } |
| 838 | |
| 839 | void MainWindow::onModelRemoveRequested(QString ID) |
| 840 | { |
nothing calls this directly
no test coverage detected