| 542 | } |
| 543 | |
| 544 | void ViewNodeTree::setRootViewNode(Ref<ViewNode> rootViewNode, bool useDefaultViewFactory) { |
| 545 | auto oldRootViewNode = std::move(_rootViewNode); |
| 546 | if (oldRootViewNode != nullptr) { |
| 547 | setViewToRootViewNode(oldRootViewNode, nullptr); |
| 548 | } |
| 549 | |
| 550 | auto& viewTransactionScope = getCurrentViewTransactionScope(); |
| 551 | |
| 552 | _rootViewNode = std::move(rootViewNode); |
| 553 | |
| 554 | if (_rootViewNode != nullptr) { |
| 555 | _rootViewNode->removeFromParent(viewTransactionScope); |
| 556 | if (useDefaultViewFactory) { |
| 557 | SC_ASSERT_NOTNULL(_viewManager); |
| 558 | _rootViewNode->setViewFactory(viewTransactionScope, |
| 559 | getOrCreateViewFactory(_viewManager->getDefaultViewClass())); |
| 560 | } |
| 561 | |
| 562 | if (_rootViewNode->isFlexLayoutDirty()) { |
| 563 | onLayoutDirty(); |
| 564 | } |
| 565 | } |
| 566 | |
| 567 | setViewToRootViewNode(_rootViewNode, _rootView); |
| 568 | |
| 569 | if (oldRootViewNode != nullptr && |
| 570 | (_rootViewNode != nullptr && _rootViewNode->getRawId() != oldRootViewNode->getRawId())) { |
| 571 | // If we are switching from a root view node to another one with a different id, we automatically destroy |
| 572 | // the previous view node to ensure we don't have a dangling subtree |
| 573 | removeViewNode(oldRootViewNode->getRawId()); |
| 574 | } |
| 575 | } |
| 576 | |
| 577 | void ViewNodeTree::addViewNode(const Ref<ViewNode>& viewNode) { |
| 578 | SC_ASSERT(viewNode->getRawId() != 0); |