@@ -924,12 +924,19 @@ void SceneTreeEditor::_update_tree(bool p_scroll_to_selected) {
924
924
// If pinned state changed, update the currently pinned node.
925
925
if (AnimationPlayerEditor::get_singleton ()->is_pinned () != node_cache.current_has_pin ) {
926
926
node_cache.current_has_pin = AnimationPlayerEditor::get_singleton ()->is_pinned ();
927
- node_cache.mark_dirty (pinned_node);
927
+ if (node_cache.has (pinned_node)) {
928
+ node_cache.mark_dirty (pinned_node);
929
+ }
928
930
}
929
931
// If the current pinned node changed update both the old and new node.
930
932
if (node_cache.current_pinned_node != pinned_node) {
931
- node_cache.mark_dirty (pinned_node);
932
- node_cache.mark_dirty (node_cache.current_pinned_node );
933
+ // get_editing_node() will return deleted nodes. If the nodes are not in cache don't try to mark them.
934
+ if (node_cache.has (pinned_node)) {
935
+ node_cache.mark_dirty (pinned_node);
936
+ }
937
+ if (node_cache.has (node_cache.current_pinned_node )) {
938
+ node_cache.mark_dirty (node_cache.current_pinned_node );
939
+ }
933
940
node_cache.current_pinned_node = pinned_node;
934
941
}
935
942
@@ -2373,6 +2380,14 @@ HashMap<Node *, SceneTreeEditor::CachedNode>::Iterator SceneTreeEditor::NodeCach
2373
2380
return I;
2374
2381
}
2375
2382
2383
+ bool SceneTreeEditor::NodeCache::has (Node *p_node) {
2384
+ HashMap<Node *, CachedNode>::Iterator I = get (p_node, false );
2385
+ if (I) {
2386
+ return true ;
2387
+ }
2388
+ return false ;
2389
+ }
2390
+
2376
2391
void SceneTreeEditor::NodeCache::remove (Node *p_node, bool p_recursive) {
2377
2392
if (!p_node) {
2378
2393
return ;
@@ -2382,6 +2397,11 @@ void SceneTreeEditor::NodeCache::remove(Node *p_node, bool p_recursive) {
2382
2397
editor->selected = nullptr ;
2383
2398
}
2384
2399
2400
+ if (p_node == current_pinned_node) {
2401
+ current_pinned_node = nullptr ;
2402
+ current_has_pin = false ;
2403
+ }
2404
+
2385
2405
editor->marked .erase (p_node);
2386
2406
2387
2407
HashMap<Node *, CachedNode>::Iterator I = cache.find (p_node);
@@ -2419,6 +2439,7 @@ void SceneTreeEditor::NodeCache::mark_dirty(Node *p_node, bool p_parents) {
2419
2439
if (!p_parents) {
2420
2440
break ;
2421
2441
}
2442
+
2422
2443
node = node->get_parent ();
2423
2444
}
2424
2445
}
@@ -2483,4 +2504,6 @@ void SceneTreeEditor::NodeCache::clear() {
2483
2504
}
2484
2505
cache.clear ();
2485
2506
to_delete.clear ();
2507
+ current_pinned_node = nullptr ;
2508
+ current_has_pin = false ;
2486
2509
}
0 commit comments