diff options
| -rw-r--r-- | doc/classes/Node.xml | 4 | ||||
| -rw-r--r-- | editor/editor_node.cpp | 18 | ||||
| -rw-r--r-- | editor/project_manager.cpp | 25 | ||||
| -rw-r--r-- | editor/project_manager.h | 2 | ||||
| -rw-r--r-- | scene/main/node.cpp | 2 |
5 files changed, 37 insertions, 14 deletions
diff --git a/doc/classes/Node.xml b/doc/classes/Node.xml index 58c85abe1c..7cf84d72c9 100644 --- a/doc/classes/Node.xml +++ b/doc/classes/Node.xml @@ -858,8 +858,8 @@ [b]Note:[/b] Auto-generated names might include the [code]@[/code] character, which is reserved for unique names when using [method add_child]. When setting the name manually, any [code]@[/code] will be removed. </member> <member name="owner" type="Node" setter="set_owner" getter="get_owner"> - The node owner. A node can have any other node as owner (as long as it is a valid parent, grandparent, etc. ascending in the tree). When saving a node (using [PackedScene]), all the nodes it owns will be saved with it. This allows for the creation of complex [SceneTree]s, with instancing and subinstancing. - [b]Note:[/b] If you want a child to be persisted to a [PackedScene], you must set [member owner] in addition to calling [method add_child]. This is typically relevant for [url=$DOCS_URL/tutorials/plugins/running_code_in_the_editor.html]tool scripts[/url] and [url=$DOCS_URL/tutorials/plugins/editor/index.html]editor plugins[/url]. If [method add_child] is called without setting [member owner], the newly added [Node] will not be visible in the scene tree, though it will be visible in the 2D/3D view. + The node owner. A node can have any ancestor node as owner (i.e. a parent, grandparent, etc. node ascending in the tree). This implies that [method add_child] should be called before setting the owner, so that this relationship of parenting exists. When saving a node (using [PackedScene]), all the nodes it owns will be saved with it. This allows for the creation of complex scene trees, with instancing and subinstancing. + [b]Note:[/b] If you want a child to be persisted to a [PackedScene], you must set [member owner] in addition to calling [method add_child]. This is typically relevant for [url=$DOCS_URL/tutorials/plugins/running_code_in_the_editor.html]tool scripts[/url] and [url=$DOCS_URL/tutorials/plugins/editor/index.html]editor plugins[/url]. If a new node is added to the tree without setting its owner as an ancestor in that tree, it will be visible in the 2D/3D view, but not in the scene tree (and not persisted when packing or saving). </member> <member name="process_mode" type="int" setter="set_process_mode" getter="get_process_mode" enum="Node.ProcessMode" default="0"> Can be used to pause or unpause the node, or make the node paused based on the [SceneTree], or make it inherit the process mode from its parent (default). diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 0c74468816..f3c35e80fc 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -5275,21 +5275,29 @@ void EditorNode::_save_central_editor_layout_to_config(Ref<ConfigFile> p_config_ void EditorNode::_load_central_editor_layout_from_config(Ref<ConfigFile> p_config_file) { // Bottom panel. - if (p_config_file->has_section_key(EDITOR_NODE_CONFIG_SECTION, "center_split_offset")) { - int center_split_offset = p_config_file->get_value(EDITOR_NODE_CONFIG_SECTION, "center_split_offset"); - center_split->set_split_offset(center_split_offset); - } - + bool has_active_tab = false; if (p_config_file->has_section_key(EDITOR_NODE_CONFIG_SECTION, "selected_bottom_panel_item")) { int selected_bottom_panel_item_idx = p_config_file->get_value(EDITOR_NODE_CONFIG_SECTION, "selected_bottom_panel_item"); if (selected_bottom_panel_item_idx >= 0 && selected_bottom_panel_item_idx < bottom_panel_items.size()) { // Make sure we don't try to open contextual editors which are not enabled in the current context. if (bottom_panel_items[selected_bottom_panel_item_idx].button->is_visible()) { _bottom_panel_switch(true, selected_bottom_panel_item_idx); + has_active_tab = true; } } } + if (p_config_file->has_section_key(EDITOR_NODE_CONFIG_SECTION, "center_split_offset")) { + int center_split_offset = p_config_file->get_value(EDITOR_NODE_CONFIG_SECTION, "center_split_offset"); + center_split->set_split_offset(center_split_offset); + + // If there is no active tab we need to collapse the panel. + if (!has_active_tab) { + bottom_panel_items[0].control->show(); // _bottom_panel_switch() can collapse only visible tabs. + _bottom_panel_switch(false, 0); + } + } + // Debugger tab. if (p_config_file->has_section_key(EDITOR_NODE_CONFIG_SECTION, "selected_default_debugger_tab_idx")) { diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp index 3b9a3dc2ed..f7480ce9df 100644 --- a/editor/project_manager.cpp +++ b/editor/project_manager.cpp @@ -1042,10 +1042,25 @@ void ProjectListItemControl::set_project_icon(const Ref<Texture2D> &p_icon) { project_icon->set_texture(p_icon); } -void ProjectListItemControl::set_unsupported_features(const PackedStringArray &p_features) { +bool _project_feature_looks_like_version(const String &p_feature) { + return p_feature.contains(".") && p_feature.substr(0, 3).is_numeric(); +} + +void ProjectListItemControl::set_unsupported_features(PackedStringArray p_features) { if (p_features.size() > 0) { - String unsupported_features_str = String(", ").join(p_features); - project_unsupported_features->set_tooltip_text(TTR("The project uses features unsupported by the current build:") + "\n" + unsupported_features_str); + String tooltip_text = ""; + for (int i = 0; i < p_features.size(); i++) { + if (_project_feature_looks_like_version(p_features[i])) { + tooltip_text += TTR("This project was last edited in a different Godot version: ") + p_features[i] + "\n"; + p_features.remove_at(i); + i--; + } + } + if (p_features.size() > 0) { + String unsupported_features_str = String(", ").join(p_features); + tooltip_text += TTR("This project uses features unsupported by the current build:") + "\n" + unsupported_features_str; + } + project_unsupported_features->set_tooltip_text(tooltip_text); project_unsupported_features->show(); } else { project_unsupported_features->hide(); @@ -1450,7 +1465,7 @@ void ProjectList::_create_project_item_control(int p_index) { hb->set_project_path(item.path); hb->set_tooltip_text(item.description); hb->set_tags(item.tags, this); - hb->set_unsupported_features(item.unsupported_features); + hb->set_unsupported_features(item.unsupported_features.duplicate()); hb->set_is_favorite(item.favorite); hb->set_is_missing(item.missing); @@ -2297,7 +2312,7 @@ void ProjectManager::_open_selected_projects_ask() { warning_message += TTR("Warning: This project uses C#, but this build of Godot does not have\nthe Mono module. If you proceed you will not be able to use any C# scripts.\n\n"); unsupported_features.remove_at(i); i--; - } else if (feature.substr(0, 3).is_numeric()) { + } else if (_project_feature_looks_like_version(feature)) { warning_message += vformat(TTR("Warning: This project was built in Godot %s.\nOpening will upgrade or downgrade the project to Godot %s.\n\n"), Variant(feature), Variant(VERSION_BRANCH)); unsupported_features.remove_at(i); i--; diff --git a/editor/project_manager.h b/editor/project_manager.h index bd82fd0578..043178fb6f 100644 --- a/editor/project_manager.h +++ b/editor/project_manager.h @@ -166,7 +166,7 @@ public: void set_project_path(const String &p_path); void set_tags(const PackedStringArray &p_tags, ProjectList *p_parent_list); void set_project_icon(const Ref<Texture2D> &p_icon); - void set_unsupported_features(const PackedStringArray &p_features); + void set_unsupported_features(PackedStringArray p_features); bool should_load_project_icon() const; void set_selected(bool p_selected); diff --git a/scene/main/node.cpp b/scene/main/node.cpp index 3715c06a33..6b18e47f2d 100644 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -1906,7 +1906,7 @@ void Node::set_owner(Node *p_owner) { check = check->data.parent; } - ERR_FAIL_COND(!owner_valid); + ERR_FAIL_COND_MSG(!owner_valid, "Invalid owner. Owner must be an ancestor in the tree."); _set_owner_nocheck(p_owner); |
