diff options
Diffstat (limited to 'editor/project_settings_editor.cpp')
-rw-r--r-- | editor/project_settings_editor.cpp | 292 |
1 files changed, 127 insertions, 165 deletions
diff --git a/editor/project_settings_editor.cpp b/editor/project_settings_editor.cpp index 76290b4b62..db12e90540 100644 --- a/editor/project_settings_editor.cpp +++ b/editor/project_settings_editor.cpp @@ -72,17 +72,9 @@ void ProjectSettingsEditor::_setting_edited(const String &p_name) { queue_save(); } -void ProjectSettingsEditor::_advanced_pressed() { - if (advanced->is_pressed()) { - _update_advanced_bar(); - advanced_bar->show(); - EditorSettings::get_singleton()->set_project_metadata("project_settings", "advanced_mode", true); - inspector->set_restrict_to_basic_settings(false); - } else { - advanced_bar->hide(); - EditorSettings::get_singleton()->set_project_metadata("project_settings", "advanced_mode", false); - inspector->set_restrict_to_basic_settings(true); - } +void ProjectSettingsEditor::_advanced_toggled(bool p_button_pressed) { + EditorSettings::get_singleton()->set_project_metadata("project_settings", "advanced_mode", p_button_pressed); + inspector->set_restrict_to_basic_settings(!p_button_pressed); } void ProjectSettingsEditor::_setting_selected(const String &p_path) { @@ -90,12 +82,9 @@ void ProjectSettingsEditor::_setting_selected(const String &p_path) { return; } - category_box->set_text(inspector->get_current_section()); - property_box->set_text(p_path); + property_box->set_text(inspector->get_current_section() + "/" + p_path); - if (advanced_bar->is_visible()) { - _update_advanced_bar(); // set_text doesn't trigger text_changed - } + _update_property_box(); // set_text doesn't trigger text_changed } void ProjectSettingsEditor::_add_setting() { @@ -104,7 +93,7 @@ void ProjectSettingsEditor::_add_setting() { // Initialize the property with the default value for the given type. Callable::CallError ce; Variant value; - Variant::construct(Variant::Type(type->get_selected_id()), value, nullptr, 0, ce); + Variant::construct(Variant::Type(type_box->get_selected_id()), value, nullptr, 0, ce); undo_redo->create_action(TTR("Add Project Setting")); undo_redo->add_do_property(ps, setting, value); @@ -117,19 +106,14 @@ void ProjectSettingsEditor::_add_setting() { undo_redo->commit_action(); inspector->set_current_section(setting.get_slice("/", 1)); + add_button->release_focus(); } -void ProjectSettingsEditor::_delete_setting(bool p_confirmed) { +void ProjectSettingsEditor::_delete_setting() { String setting = _get_setting_name(); Variant value = ps->get(setting); int order = ps->get_order(setting); - if (!p_confirmed) { - del_confirmation->set_text(vformat(TTR("Are you sure you want to delete '%s'?"), setting)); - del_confirmation->popup_centered(); - return; - } - undo_redo->create_action(TTR("Delete Item")); undo_redo->add_do_method(ps, "clear", setting); @@ -144,65 +128,84 @@ void ProjectSettingsEditor::_delete_setting(bool p_confirmed) { undo_redo->commit_action(); property_box->clear(); + del_button->release_focus(); } -void ProjectSettingsEditor::_text_field_changed(const String &p_text) { - _update_advanced_bar(); +void ProjectSettingsEditor::_property_box_changed(const String &p_text) { + _update_property_box(); } void ProjectSettingsEditor::_feature_selected(int p_index) { - _update_advanced_bar(); + Vector<String> t = property_box->get_text().strip_edges().split(".", true, 1); + const String feature = p_index ? "." + feature_box->get_item_text(p_index) : ""; + property_box->set_text(t[0] + feature); + _update_property_box(); } -void ProjectSettingsEditor::_update_advanced_bar() { - const String property_text = property_box->get_text().strip_edges(); +void ProjectSettingsEditor::_update_property_box() { + const String setting = _get_setting_name(); + const Vector<String> t = setting.split(".", true, 1); + const String name = t[0]; + const String feature = (t.size() == 2) ? t[1] : ""; + bool feature_invalid = (t.size() == 2) && (t[1] == ""); + + add_button->set_disabled(true); + del_button->set_disabled(true); + + if (feature != "") { + feature_invalid = true; + for (int i = 1; i < feature_box->get_item_count(); i++) { + if (feature == feature_box->get_item_text(i)) { + feature_invalid = false; + feature_box->select(i); + break; + } + } + } - String error_msg = ""; - bool disable_add = true; - bool disable_del = true; + if (feature == "" || feature_invalid) { + feature_box->select(0); + } - if (!property_box->get_text().is_empty()) { - const String setting = _get_setting_name(); - bool setting_exists = ps->has_setting(setting); - if (setting_exists) { - error_msg = TTR(" - Cannot add already existing setting."); + if (property_box->get_text() == "") { + return; + } - disable_del = ps->is_builtin_setting(setting); - if (disable_del) { - String msg = TTR(" - Cannot delete built-in setting."); - error_msg += (error_msg == "") ? msg : "\n" + msg; - } + if (ps->has_setting(setting)) { + del_button->set_disabled(ps->is_builtin_setting(setting)); + _select_type(ps->get_setting(setting).get_type()); + } else { + if (ps->has_setting(name)) { + _select_type(ps->get_setting(name).get_type()); } else { - bool bad_category = false; // Allow empty string. - Vector<String> cats = category_box->get_text().strip_edges().split("/"); - for (int i = 0; i < cats.size(); i++) { - if (!cats[i].is_valid_identifier()) { - bad_category = true; - error_msg = TTR(" - Invalid category name."); - break; - } - } + type_box->select(0); + } - disable_add = bad_category; + if (feature_invalid) { + return; + } - if (!property_text.is_valid_identifier()) { - disable_add = true; - String msg = TTR(" - Invalid property name."); - error_msg += (error_msg == "") ? msg : "\n" + msg; + const Vector<String> names = name.split("/"); + for (int i = 0; i < names.size(); i++) { + if (!names[i].is_valid_identifier()) { + return; } } + + add_button->set_disabled(false); } +} - add_button->set_disabled(disable_add); - del_button->set_disabled(disable_del); +void ProjectSettingsEditor::_select_type(Variant::Type p_type) { + type_box->select(type_box->get_item_index(p_type)); } String ProjectSettingsEditor::_get_setting_name() const { - const String cat = category_box->get_text(); - const String name = (cat.is_empty() ? "global" : cat.strip_edges()).plus_file(property_box->get_text().strip_edges()); - const String feature = feature_override->get_item_text(feature_override->get_selected()); - - return (feature == "") ? name : (name + "." + feature); + String name = property_box->get_text().strip_edges(); + if (name.find("/") == -1) { + name = "global/" + name; + } + return name; } void ProjectSettingsEditor::_add_feature_overrides() { @@ -219,23 +222,22 @@ void ProjectSettingsEditor::_add_feature_overrides() { presets.insert("standalone"); presets.insert("32"); presets.insert("64"); - presets.insert("Server"); // Not available as an export platform yet, so it needs to be added manually EditorExport *ee = EditorExport::get_singleton(); for (int i = 0; i < ee->get_export_platform_count(); i++) { List<String> p; ee->get_export_platform(i)->get_platform_features(&p); - for (List<String>::Element *E = p.front(); E; E = E->next()) { - presets.insert(E->get()); + for (const String &E : p) { + presets.insert(E); } } for (int i = 0; i < ee->get_export_preset_count(); i++) { List<String> p; ee->get_export_preset(i)->get_platform()->get_preset_features(ee->get_export_preset(i), &p); - for (List<String>::Element *E = p.front(); E; E = E->next()) { - presets.insert(E->get()); + for (const String &E : p) { + presets.insert(E); } String custom = ee->get_export_preset(i)->get_custom_features(); @@ -248,11 +250,11 @@ void ProjectSettingsEditor::_add_feature_overrides() { } } - feature_override->clear(); - feature_override->add_item("", 0); // So it is always on top. + feature_box->clear(); + feature_box->add_item(TTR("(All)"), 0); // So it is always on top. int id = 1; for (Set<String>::Element *E = presets.front(); E; E = E->next()) { - feature_override->add_item(E->get(), id++); + feature_box->add_item(E->get(), id++); } } @@ -388,8 +390,7 @@ void ProjectSettingsEditor::_action_reordered(const String &p_action_name, const undo_redo->create_action(TTR("Update Input Action Order")); - for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) { - PropertyInfo prop = E->get(); + for (const PropertyInfo &prop : props) { // Skip builtins and non-inputs if (ProjectSettings::get_singleton()->is_builtin_setting(prop.name) || !prop.name.begins_with("input/")) { continue; @@ -441,9 +442,9 @@ void ProjectSettingsEditor::_update_action_map_editor() { List<PropertyInfo> props; ProjectSettings::get_singleton()->get_property_list(&props); - const Ref<Texture2D> builtin_icon = get_theme_icon("PinPressed", "EditorIcons"); - for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) { - const String property_name = E->get().name; + const Ref<Texture2D> builtin_icon = get_theme_icon(SNAME("PinPressed"), SNAME("EditorIcons")); + for (const PropertyInfo &E : props) { + const String property_name = E.name; if (!property_name.begins_with("input/")) { continue; @@ -480,21 +481,18 @@ void ProjectSettingsEditor::_notification(int p_what) { case NOTIFICATION_ENTER_TREE: { inspector->edit(ps); - add_button->set_icon(get_theme_icon("Add", "EditorIcons")); - del_button->set_icon(get_theme_icon("Remove", "EditorIcons")); - - search_box->set_right_icon(get_theme_icon("Search", "EditorIcons")); + search_box->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); search_box->set_clear_button_enabled(true); - restart_close_button->set_icon(get_theme_icon("Close", "EditorIcons")); - restart_container->add_theme_style_override("panel", get_theme_stylebox("bg", "Tree")); - restart_icon->set_texture(get_theme_icon("StatusWarning", "EditorIcons")); - restart_label->add_theme_color_override("font_color", get_theme_color("warning_color", "Editor")); + restart_close_button->set_icon(get_theme_icon(SNAME("Close"), SNAME("EditorIcons"))); + restart_container->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + restart_icon->set_texture(get_theme_icon(SNAME("StatusWarning"), SNAME("EditorIcons"))); + restart_label->add_theme_color_override("font_color", get_theme_color(SNAME("warning_color"), SNAME("Editor"))); _update_action_map_editor(); } break; case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { - search_box->set_right_icon(get_theme_icon("Search", "EditorIcons")); + search_box->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); search_box->set_clear_button_enabled(true); } break; } @@ -525,87 +523,56 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { general_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL); tab_container->add_child(general_editor); - VBoxContainer *header = memnew(VBoxContainer); - header->set_h_size_flags(Control::SIZE_EXPAND_FILL); - general_editor->add_child(header); + HBoxContainer *search_bar = memnew(HBoxContainer); + general_editor->add_child(search_bar); - { - // Search bar. - search_bar = memnew(HBoxContainer); - search_bar->set_h_size_flags(Control::SIZE_EXPAND_FILL); - header->add_child(search_bar); - - search_box = memnew(LineEdit); - search_box->set_placeholder(TTR("Search")); - search_box->set_h_size_flags(Control::SIZE_EXPAND_FILL); - search_bar->add_child(search_box); - - advanced = memnew(CheckButton); - advanced->set_text(TTR("Advanced Settings")); - advanced->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_advanced_pressed)); - search_bar->add_child(advanced); - } + search_box = memnew(LineEdit); + search_box->set_placeholder(TTR("Filter Settings")); + search_box->set_h_size_flags(Control::SIZE_EXPAND_FILL); + search_bar->add_child(search_box); - { - // Advanced bar. - advanced_bar = memnew(HBoxContainer); - advanced_bar->hide(); - header->add_child(advanced_bar); - - HBoxContainer *hbc = advanced_bar; - hbc->set_h_size_flags(Control::SIZE_EXPAND_FILL); - - category_box = memnew(LineEdit); - category_box->set_h_size_flags(Control::SIZE_EXPAND_FILL); - category_box->connect("text_changed", callable_mp(this, &ProjectSettingsEditor::_text_field_changed)); - category_box->set_placeholder(TTR("Category")); - hbc->add_child(category_box); - - Label *l = memnew(Label); - l->set_text(" / "); - hbc->add_child(l); - - property_box = memnew(LineEdit); - property_box->set_h_size_flags(Control::SIZE_EXPAND_FILL); - property_box->set_placeholder(TTR("Property")); - property_box->connect("text_changed", callable_mp(this, &ProjectSettingsEditor::_text_field_changed)); - hbc->add_child(property_box); - - l = memnew(Label); - l->set_text(TTR("Type:")); - hbc->add_child(l); - - type = memnew(OptionButton); - type->set_custom_minimum_size(Size2(100, 0) * EDSCALE); - hbc->add_child(type); - - for (int i = 0; i < Variant::VARIANT_MAX; i++) { - // There's no point in adding Nil types, and Object types - // can't be serialized correctly in the project settings. - if (i != Variant::NIL && i != Variant::OBJECT) { - type->add_item(Variant::get_type_name(Variant::Type(i)), i); - } - } + advanced = memnew(CheckButton); + advanced->set_text(TTR("Advanced Settings")); + advanced->connect("toggled", callable_mp(this, &ProjectSettingsEditor::_advanced_toggled)); + search_bar->add_child(advanced); - l = memnew(Label); - l->set_text(TTR("Feature Override:")); - hbc->add_child(l); + HBoxContainer *header = memnew(HBoxContainer); + general_editor->add_child(header); - feature_override = memnew(OptionButton); - feature_override->set_custom_minimum_size(Size2(100, 0) * EDSCALE); - feature_override->connect("item_selected", callable_mp(this, &ProjectSettingsEditor::_feature_selected)); - hbc->add_child(feature_override); + property_box = memnew(LineEdit); + property_box->set_placeholder(TTR("Select a setting or type its name")); + property_box->set_h_size_flags(Control::SIZE_EXPAND_FILL); + property_box->connect("text_changed", callable_mp(this, &ProjectSettingsEditor::_property_box_changed)); + header->add_child(property_box); + + feature_box = memnew(OptionButton); + feature_box->set_custom_minimum_size(Size2(120, 0) * EDSCALE); + feature_box->connect("item_selected", callable_mp(this, &ProjectSettingsEditor::_feature_selected)); + header->add_child(feature_box); + + type_box = memnew(OptionButton); + type_box->set_custom_minimum_size(Size2(120, 0) * EDSCALE); + header->add_child(type_box); + + for (int i = 0; i < Variant::VARIANT_MAX; i++) { + // There's no point in adding Nil types, and Object types + // can't be serialized correctly in the project settings. + if (i != Variant::NIL && i != Variant::OBJECT) { + type_box->add_item(Variant::get_type_name(Variant::Type(i)), i); + } + } - add_button = memnew(Button); - add_button->set_flat(true); - add_button->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_add_setting)); - hbc->add_child(add_button); + add_button = memnew(Button); + add_button->set_text(TTR("Add")); + add_button->set_disabled(true); + add_button->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_add_setting)); + header->add_child(add_button); - del_button = memnew(Button); - del_button->set_flat(true); - del_button->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_delete_setting), varray(false)); - hbc->add_child(del_button); - } + del_button = memnew(Button); + del_button->set_text(TTR("Delete")); + del_button->set_disabled(true); + del_button->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_delete_setting)); + header->add_child(del_button); inspector = memnew(SectionedInspector); inspector->get_inspector()->set_undo_redo(EditorNode::get_singleton()->get_undo_redo()); @@ -676,10 +643,6 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { timer->set_one_shot(true); add_child(timer); - del_confirmation = memnew(ConfirmationDialog); - del_confirmation->connect("confirmed", callable_mp(this, &ProjectSettingsEditor::_delete_setting), varray(true)); - add_child(del_confirmation); - get_ok_button()->set_text(TTR("Close")); set_hide_on_ok(true); @@ -687,7 +650,6 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { if (use_advanced) { advanced->set_pressed(true); - advanced_bar->show(); } inspector->set_restrict_to_basic_settings(!use_advanced); |