| 2428 | } |
| 2429 | |
| 2430 | void SceneTreeEditor::NodeCache::remove(Node *p_node, bool p_recursive) { |
| 2431 | if (!p_node) { |
| 2432 | return; |
| 2433 | } |
| 2434 | |
| 2435 | if (p_node == editor->selected) { |
| 2436 | editor->selected = nullptr; |
| 2437 | } |
| 2438 | |
| 2439 | if (p_node == current_pinned_node) { |
| 2440 | current_pinned_node = nullptr; |
| 2441 | current_has_pin = false; |
| 2442 | } |
| 2443 | |
| 2444 | editor->marked.erase(p_node); |
| 2445 | |
| 2446 | HashMap<Node *, CachedNode>::Iterator I = cache.find(p_node); |
| 2447 | if (I) { |
| 2448 | if (p_recursive) { |
| 2449 | int cc = p_node->get_child_count(false); |
| 2450 | |
| 2451 | for (int i = 0; i < cc; i++) { |
| 2452 | remove(p_node->get_child(i, false), p_recursive); |
| 2453 | } |
| 2454 | } |
| 2455 | |
| 2456 | if (current_scene_node != p_node) { |
| 2457 | // Do not remove from the Tree control here. See delete_pending below. |
| 2458 | I->value.item->deselect(0); |
| 2459 | I->value.delete_serial = delete_serial; |
| 2460 | I->value.index = -1; |
| 2461 | I->value.cache_iterator = I; |
| 2462 | to_delete.insert(&I->value); |
| 2463 | } else { |
| 2464 | // If it is the root node, we leave the TreeItem and reuse it later. |
| 2465 | cache.remove(I); |
| 2466 | } |
| 2467 | } |
| 2468 | } |
| 2469 | |
| 2470 | void SceneTreeEditor::NodeCache::mark_dirty(Node *p_node, bool p_parents) { |
| 2471 | Node *node = p_node; |