diff options
Diffstat (limited to 'editor')
162 files changed, 3214 insertions, 2185 deletions
diff --git a/editor/action_map_editor.cpp b/editor/action_map_editor.cpp index fe1401bdf9..1c3ba89cd3 100644 --- a/editor/action_map_editor.cpp +++ b/editor/action_map_editor.cpp @@ -631,6 +631,7 @@ InputEventConfigurationDialog::InputEventConfigurationDialog() { additional_options_container->hide(); Label *opts_label = memnew(Label); + opts_label->set_theme_type_variation("HeaderSmall"); opts_label->set_text("Additional Options"); additional_options_container->add_child(opts_label); @@ -639,6 +640,7 @@ InputEventConfigurationDialog::InputEventConfigurationDialog() { device_container->set_h_size_flags(Control::SIZE_EXPAND_FILL); Label *device_label = memnew(Label); + device_label->set_theme_type_variation("HeaderSmall"); device_label->set_text("Device:"); device_container->add_child(device_label); @@ -858,6 +860,7 @@ Variant ActionMapEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from String name = selected->get_text(0); Label *label = memnew(Label(name)); + label->set_theme_type_variation("HeaderSmall"); label->set_modulate(Color(1, 1, 1, 1.0f)); action_tree->set_drag_preview(label); @@ -1123,6 +1126,7 @@ ActionMapEditor::ActionMapEditor() { action_tree->set_hide_root(true); action_tree->set_column_titles_visible(true); action_tree->set_column_title(0, TTR("Action")); + action_tree->set_column_clip_content(0, true); action_tree->set_column_title(1, TTR("Deadzone")); action_tree->set_column_expand(1, false); action_tree->set_column_custom_minimum_width(1, 80 * EDSCALE); diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp index f61fb6bab3..05945a8ae2 100644 --- a/editor/animation_track_editor.cpp +++ b/editor/animation_track_editor.cpp @@ -4450,7 +4450,7 @@ void AnimationTrackEditor::_new_track_node_selected(NodePath p_path) { } if (node == AnimationPlayerEditor::singleton->get_player()) { - EditorNode::get_singleton()->show_warning(TTR("An animation player can't animate itself, only other players.")); + EditorNode::get_singleton()->show_warning(TTR("AnimationPlayer can't animate itself, only other players.")); return; } @@ -5334,7 +5334,7 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) { } break; case EDIT_PASTE_TRACKS: { if (track_clipboard.size() == 0) { - EditorNode::get_singleton()->show_warning(TTR("Clipboard is empty")); + EditorNode::get_singleton()->show_warning(TTR("Clipboard is empty!")); break; } @@ -5784,7 +5784,7 @@ AnimationTrackEditor::AnimationTrackEditor() { info_message->set_text(TTR("Select an AnimationPlayer node to create and edit animations.")); info_message->set_valign(Label::VALIGN_CENTER); info_message->set_align(Label::ALIGN_CENTER); - info_message->set_autowrap(true); + info_message->set_autowrap_mode(Label::AUTOWRAP_WORD_SMART); info_message->set_custom_minimum_size(Size2(100 * EDSCALE, 0)); info_message->set_anchors_and_offsets_preset(PRESET_WIDE, PRESET_MODE_KEEP_SIZE, 8 * EDSCALE); main_panel->add_child(info_message); diff --git a/editor/audio_stream_preview.h b/editor/audio_stream_preview.h index 61567598ed..9cf47fd51a 100644 --- a/editor/audio_stream_preview.h +++ b/editor/audio_stream_preview.h @@ -75,6 +75,15 @@ class AudioStreamPreviewGenerator : public Node { thread = p_rhs.thread; return *this; } + Preview(const Preview &p_rhs) { + preview = p_rhs.preview; + base_stream = p_rhs.base_stream; + playback = p_rhs.playback; + generating.set_to(generating.is_set()); + id = p_rhs.id; + thread = p_rhs.thread; + } + Preview() {} }; Map<ObjectID, Preview> previews; diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp index 3e4f382383..03914bec3b 100644 --- a/editor/code_editor.cpp +++ b/editor/code_editor.cpp @@ -738,8 +738,8 @@ void CodeTextEditor::_input(const Ref<InputEvent> &event) { accept_event(); return; } - if (ED_IS_SHORTCUT("script_text_editor/clone_down", key_event)) { - clone_lines_down(); + if (ED_IS_SHORTCUT("script_text_editor/duplicate_selection", key_event)) { + duplicate_selection(); accept_event(); return; } @@ -1287,7 +1287,7 @@ void CodeTextEditor::delete_lines() { text_editor->end_complex_operation(); } -void CodeTextEditor::clone_lines_down() { +void CodeTextEditor::duplicate_selection() { const int cursor_column = text_editor->cursor_get_column(); int from_line = text_editor->cursor_get_line(); int to_line = text_editor->cursor_get_line(); diff --git a/editor/code_editor.h b/editor/code_editor.h index 28b09e0a5d..0e5a84b3d5 100644 --- a/editor/code_editor.h +++ b/editor/code_editor.h @@ -225,7 +225,7 @@ public: void move_lines_up(); void move_lines_down(); void delete_lines(); - void clone_lines_down(); + void duplicate_selection(); /// Toggle inline comment on currently selected lines, or on current line if nothing is selected, /// by adding or removing comment delimiter diff --git a/editor/connections_dialog.cpp b/editor/connections_dialog.cpp index de6407da73..c79a8d9a0e 100644 --- a/editor/connections_dialog.cpp +++ b/editor/connections_dialog.cpp @@ -1121,7 +1121,7 @@ ConnectionsDock::ConnectionsDock(EditorNode *p_editor) { add_child(slot_menu); slot_menu->connect("id_pressed", callable_mp(this, &ConnectionsDock::_handle_slot_menu_option)); slot_menu->add_item(TTR("Edit..."), EDIT); - slot_menu->add_item(TTR("Go To Method"), GO_TO_SCRIPT); + slot_menu->add_item(TTR("Go to Method"), GO_TO_SCRIPT); slot_menu->add_item(TTR("Disconnect"), DISCONNECT); connect_dialog->connect("connected", callable_mp(this, &ConnectionsDock::_make_or_edit_connection)); diff --git a/editor/debugger/editor_network_profiler.cpp b/editor/debugger/editor_network_profiler.cpp index af83baeff8..1c781c4d98 100644 --- a/editor/debugger/editor_network_profiler.cpp +++ b/editor/debugger/editor_network_profiler.cpp @@ -178,18 +178,23 @@ EditorNetworkProfiler::EditorNetworkProfiler() { counters_display->set_column_titles_visible(true); counters_display->set_column_title(0, TTR("Node")); counters_display->set_column_expand(0, true); + counters_display->set_column_clip_content(0, true); counters_display->set_column_custom_minimum_width(0, 60 * EDSCALE); counters_display->set_column_title(1, TTR("Incoming RPC")); counters_display->set_column_expand(1, false); + counters_display->set_column_clip_content(1, true); counters_display->set_column_custom_minimum_width(1, 120 * EDSCALE); counters_display->set_column_title(2, TTR("Incoming RSET")); counters_display->set_column_expand(2, false); + counters_display->set_column_clip_content(2, true); counters_display->set_column_custom_minimum_width(2, 120 * EDSCALE); counters_display->set_column_title(3, TTR("Outgoing RPC")); counters_display->set_column_expand(3, false); + counters_display->set_column_clip_content(3, true); counters_display->set_column_custom_minimum_width(3, 120 * EDSCALE); counters_display->set_column_title(4, TTR("Outgoing RSET")); counters_display->set_column_expand(4, false); + counters_display->set_column_clip_content(4, true); counters_display->set_column_custom_minimum_width(4, 120 * EDSCALE); add_child(counters_display); diff --git a/editor/debugger/editor_performance_profiler.cpp b/editor/debugger/editor_performance_profiler.cpp index fc0104c07a..08609080c5 100644 --- a/editor/debugger/editor_performance_profiler.cpp +++ b/editor/debugger/editor_performance_profiler.cpp @@ -380,7 +380,7 @@ EditorPerformanceProfiler::EditorPerformanceProfiler() { info_message->set_text(TTR("Pick one or more items from the list to display the graph.")); info_message->set_valign(Label::VALIGN_CENTER); info_message->set_align(Label::ALIGN_CENTER); - info_message->set_autowrap(true); + info_message->set_autowrap_mode(Label::AUTOWRAP_WORD_SMART); info_message->set_custom_minimum_size(Size2(100 * EDSCALE, 0)); info_message->set_anchors_and_offsets_preset(PRESET_WIDE, PRESET_MODE_KEEP_SIZE, 8 * EDSCALE); monitor_draw->add_child(info_message); diff --git a/editor/debugger/editor_profiler.cpp b/editor/debugger/editor_profiler.cpp index 449aaa42ff..5f4d1b6f36 100644 --- a/editor/debugger/editor_profiler.cpp +++ b/editor/debugger/editor_profiler.cpp @@ -315,7 +315,7 @@ void EditorProfiler::_update_plot() { graph_texture->create_from_image(img); } - graph_texture->update(img, true); + graph_texture->update(img); graph->set_texture(graph_texture); graph->update(); @@ -631,13 +631,16 @@ EditorProfiler::EditorProfiler() { variables->set_column_titles_visible(true); variables->set_column_title(0, TTR("Name")); variables->set_column_expand(0, true); - variables->set_column_custom_minimum_width(0, 60 * EDSCALE); + variables->set_column_clip_content(0, true); + variables->set_column_expand_ratio(0, 60); variables->set_column_title(1, TTR("Time")); variables->set_column_expand(1, false); - variables->set_column_custom_minimum_width(1, 100 * EDSCALE); + variables->set_column_clip_content(1, true); + variables->set_column_expand_ratio(1, 100); variables->set_column_title(2, TTR("Calls")); variables->set_column_expand(2, false); - variables->set_column_custom_minimum_width(2, 60 * EDSCALE); + variables->set_column_clip_content(2, true); + variables->set_column_expand_ratio(2, 60); variables->connect("item_edited", callable_mp(this, &EditorProfiler::_item_edited)); graph = memnew(TextureRect); diff --git a/editor/debugger/editor_visual_profiler.cpp b/editor/debugger/editor_visual_profiler.cpp index d3948dee97..a0e8a3bd35 100644 --- a/editor/debugger/editor_visual_profiler.cpp +++ b/editor/debugger/editor_visual_profiler.cpp @@ -309,7 +309,7 @@ void EditorVisualProfiler::_update_plot() { graph_texture->create_from_image(img); } - graph_texture->update(img, true); + graph_texture->update(img); graph->set_texture(graph_texture); graph->update(); @@ -773,12 +773,15 @@ EditorVisualProfiler::EditorVisualProfiler() { variables->set_column_titles_visible(true); variables->set_column_title(0, TTR("Name")); variables->set_column_expand(0, true); + variables->set_column_clip_content(0, true); variables->set_column_custom_minimum_width(0, 60); variables->set_column_title(1, TTR("CPU")); variables->set_column_expand(1, false); + variables->set_column_clip_content(1, true); variables->set_column_custom_minimum_width(1, 60 * EDSCALE); variables->set_column_title(2, TTR("GPU")); variables->set_column_expand(2, false); + variables->set_column_clip_content(2, true); variables->set_column_custom_minimum_width(2, 60 * EDSCALE); variables->connect("cell_selected", callable_mp(this, &EditorVisualProfiler::_item_selected)); diff --git a/editor/debugger/script_editor_debugger.cpp b/editor/debugger/script_editor_debugger.cpp index 0d3fd8c7f6..09bbf846fe 100644 --- a/editor/debugger/script_editor_debugger.cpp +++ b/editor/debugger/script_editor_debugger.cpp @@ -1535,7 +1535,7 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) { reason->set_text(""); hbc->add_child(reason); reason->set_h_size_flags(SIZE_EXPAND_FILL); - reason->set_autowrap(true); + reason->set_autowrap_mode(Label::AUTOWRAP_WORD_SMART); reason->set_max_lines_visible(3); reason->set_mouse_filter(Control::MOUSE_FILTER_PASS); @@ -1644,8 +1644,10 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) { error_tree->set_column_expand(0, false); error_tree->set_column_custom_minimum_width(0, 140); + error_tree->set_column_clip_content(0, true); error_tree->set_column_expand(1, true); + error_tree->set_column_clip_content(1, true); error_tree->set_select_mode(Tree::SELECT_ROW); error_tree->set_hide_root(true); @@ -1698,6 +1700,8 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) { VBoxContainer *vmem_vb = memnew(VBoxContainer); HBoxContainer *vmem_hb = memnew(HBoxContainer); Label *vmlb = memnew(Label(TTR("List of Video Memory Usage by Resource:") + " ")); + vmlb->set_theme_type_variation("HeaderSmall"); + vmlb->set_h_size_flags(SIZE_EXPAND_FILL); vmem_hb->add_child(vmlb); vmem_hb->add_child(memnew(Label(TTR("Total:") + " "))); diff --git a/editor/dependency_editor.cpp b/editor/dependency_editor.cpp index 74a8ad9077..e26344f3ec 100644 --- a/editor/dependency_editor.cpp +++ b/editor/dependency_editor.cpp @@ -226,12 +226,18 @@ DependencyEditor::DependencyEditor() { tree->set_columns(2); tree->set_column_titles_visible(true); tree->set_column_title(0, TTR("Resource")); + tree->set_column_clip_content(0, true); + tree->set_column_expand_ratio(0, 2); tree->set_column_title(1, TTR("Path")); + tree->set_column_clip_content(1, true); + tree->set_column_expand_ratio(1, 1); tree->set_hide_root(true); tree->connect("button_pressed", callable_mp(this, &DependencyEditor::_load_pressed)); HBoxContainer *hbc = memnew(HBoxContainer); Label *label = memnew(Label(TTR("Dependencies:"))); + label->set_theme_type_variation("HeaderSmall"); + hbc->add_child(label); hbc->add_spacer(); fixdeps = memnew(Button(TTR("Fix Broken"))); @@ -769,9 +775,11 @@ OrphanResourcesDialog::OrphanResourcesDialog() { files = memnew(Tree); files->set_columns(2); files->set_column_titles_visible(true); - files->set_column_custom_minimum_width(1, 100); + files->set_column_custom_minimum_width(1, 100 * EDSCALE); files->set_column_expand(0, true); + files->set_column_clip_content(0, true); files->set_column_expand(1, false); + files->set_column_clip_content(1, true); files->set_column_title(0, TTR("Resource")); files->set_column_title(1, TTR("Owns")); files->set_hide_root(true); diff --git a/editor/editor_about.cpp b/editor/editor_about.cpp index b8504ad02a..1f1446a8a8 100644 --- a/editor/editor_about.cpp +++ b/editor/editor_about.cpp @@ -92,6 +92,7 @@ ScrollContainer *EditorAbout::_populate_list(const String &p_name, const List<St const char *const *names_ptr = p_src[i]; if (*names_ptr) { Label *lbl = memnew(Label); + lbl->set_theme_type_variation("HeaderSmall"); lbl->set_text(p_sections[i]); vbc->add_child(lbl); @@ -212,7 +213,7 @@ EditorAbout::EditorAbout() { Label *tpl_label = memnew(Label); tpl_label->set_h_size_flags(Control::SIZE_EXPAND_FILL); - tpl_label->set_autowrap(true); + tpl_label->set_autowrap_mode(Label::AUTOWRAP_WORD_SMART); tpl_label->set_text(TTR("Godot Engine relies on a number of third-party free and open source libraries, all compatible with the terms of its MIT license. The following is an exhaustive list of all such third-party components with their respective copyright statements and license terms.")); tpl_label->set_size(Size2(630, 1) * EDSCALE); license_thirdparty->add_child(tpl_label); diff --git a/editor/editor_asset_installer.cpp b/editor/editor_asset_installer.cpp index 38f417a8ce..dc90f26d48 100644 --- a/editor/editor_asset_installer.cpp +++ b/editor/editor_asset_installer.cpp @@ -112,7 +112,7 @@ void EditorAssetInstaller::open(const String &p_path, int p_depth) { unzFile pkg = unzOpen2(p_path.utf8().get_data(), &io); if (!pkg) { - error->set_text(TTR("Error opening package file, not in ZIP format.")); + error->set_text(vformat(TTR("Error opening asset file for \"%s\" (not in ZIP format)."), asset_name)); return; } @@ -132,14 +132,54 @@ void EditorAssetInstaller::open(const String &p_path, int p_depth) { Map<String, Ref<Texture2D>> extension_guess; { - extension_guess["png"] = tree->get_theme_icon("ImageTexture", "EditorIcons"); + extension_guess["bmp"] = tree->get_theme_icon("ImageTexture", "EditorIcons"); + extension_guess["dds"] = tree->get_theme_icon("ImageTexture", "EditorIcons"); + extension_guess["exr"] = tree->get_theme_icon("ImageTexture", "EditorIcons"); + extension_guess["hdr"] = tree->get_theme_icon("ImageTexture", "EditorIcons"); extension_guess["jpg"] = tree->get_theme_icon("ImageTexture", "EditorIcons"); - extension_guess["atlastex"] = tree->get_theme_icon("AtlasTexture", "EditorIcons"); + extension_guess["jpeg"] = tree->get_theme_icon("ImageTexture", "EditorIcons"); + extension_guess["png"] = tree->get_theme_icon("ImageTexture", "EditorIcons"); + extension_guess["svg"] = tree->get_theme_icon("ImageTexture", "EditorIcons"); + extension_guess["svgz"] = tree->get_theme_icon("ImageTexture", "EditorIcons"); + extension_guess["tga"] = tree->get_theme_icon("ImageTexture", "EditorIcons"); + extension_guess["webp"] = tree->get_theme_icon("ImageTexture", "EditorIcons"); + + extension_guess["wav"] = tree->get_theme_icon("AudioStreamSample", "EditorIcons"); + extension_guess["ogg"] = tree->get_theme_icon("AudioStreamOGGVorbis", "EditorIcons"); + extension_guess["mp3"] = tree->get_theme_icon("AudioStreamMP3", "EditorIcons"); + extension_guess["scn"] = tree->get_theme_icon("PackedScene", "EditorIcons"); extension_guess["tscn"] = tree->get_theme_icon("PackedScene", "EditorIcons"); + extension_guess["escn"] = tree->get_theme_icon("PackedScene", "EditorIcons"); + extension_guess["dae"] = tree->get_theme_icon("PackedScene", "EditorIcons"); + extension_guess["gltf"] = tree->get_theme_icon("PackedScene", "EditorIcons"); + extension_guess["glb"] = tree->get_theme_icon("PackedScene", "EditorIcons"); + extension_guess["gdshader"] = tree->get_theme_icon("Shader", "EditorIcons"); extension_guess["gd"] = tree->get_theme_icon("GDScript", "EditorIcons"); + if (Engine::get_singleton()->has_singleton("GodotSharp")) { + extension_guess["cs"] = tree->get_theme_icon("CSharpScript", "EditorIcons"); + } else { + // Mark C# support as unavailable. + extension_guess["cs"] = tree->get_theme_icon("ImportFail", "EditorIcons"); + } extension_guess["vs"] = tree->get_theme_icon("VisualScript", "EditorIcons"); + + extension_guess["res"] = tree->get_theme_icon("Resource", "EditorIcons"); + extension_guess["tres"] = tree->get_theme_icon("Resource", "EditorIcons"); + extension_guess["atlastex"] = tree->get_theme_icon("AtlasTexture", "EditorIcons"); + // By default, OBJ files are imported as Mesh resources rather than PackedScenes. + extension_guess["obj"] = tree->get_theme_icon("Mesh", "EditorIcons"); + + extension_guess["txt"] = tree->get_theme_icon("TextFile", "EditorIcons"); + extension_guess["md"] = tree->get_theme_icon("TextFile", "EditorIcons"); + extension_guess["rst"] = tree->get_theme_icon("TextFile", "EditorIcons"); + extension_guess["json"] = tree->get_theme_icon("TextFile", "EditorIcons"); + extension_guess["yml"] = tree->get_theme_icon("TextFile", "EditorIcons"); + extension_guess["yaml"] = tree->get_theme_icon("TextFile", "EditorIcons"); + extension_guess["toml"] = tree->get_theme_icon("TextFile", "EditorIcons"); + extension_guess["cfg"] = tree->get_theme_icon("TextFile", "EditorIcons"); + extension_guess["ini"] = tree->get_theme_icon("TextFile", "EditorIcons"); } Ref<Texture2D> generic_extension = tree->get_theme_icon("Object", "EditorIcons"); @@ -156,6 +196,8 @@ void EditorAssetInstaller::open(const String &p_path, int p_depth) { root->set_editable(0, true); Map<String, TreeItem *> dir_map; + int num_file_conflicts = 0; + for (Set<String>::Element *E = files_sorted.front(); E; E = E->next()) { String path = E->get(); int depth = p_depth; @@ -214,8 +256,9 @@ void EditorAssetInstaller::open(const String &p_path, int p_depth) { String res_path = "res://" + path; if (FileAccess::exists(res_path)) { + num_file_conflicts += 1; ti->set_custom_color(0, tree->get_theme_color("error_color", "Editor")); - ti->set_tooltip(0, vformat(TTR("%s (Already Exists)"), res_path)); + ti->set_tooltip(0, vformat(TTR("%s (already exists)"), res_path)); ti->set_checked(0, false); } else { ti->set_tooltip(0, res_path); @@ -226,6 +269,13 @@ void EditorAssetInstaller::open(const String &p_path, int p_depth) { status_map[E->get()] = ti; } + + if (num_file_conflicts >= 1) { + asset_contents->set_text(vformat(TTR("Contents of asset \"%s\" - %d file(s) conflict with your project:"), asset_name, num_file_conflicts)); + } else { + asset_contents->set_text(vformat(TTR("Contents of asset \"%s\" - No files conflict with your project:"), asset_name)); + } + popup_centered_ratio(); updating = false; } @@ -236,7 +286,7 @@ void EditorAssetInstaller::ok_pressed() { unzFile pkg = unzOpen2(package_path.utf8().get_data(), &io); if (!pkg) { - error->set_text(TTR("Error opening package file, not in ZIP format.")); + error->set_text(vformat(TTR("Error opening asset file for \"%s\" (not in ZIP format)."), asset_name)); return; } @@ -303,10 +353,10 @@ void EditorAssetInstaller::ok_pressed() { unzClose(pkg); if (failed_files.size()) { - String msg = TTR("The following files failed extraction from package:") + "\n\n"; + String msg = vformat(TTR("The following files failed extraction from asset \"%s\":"), asset_name) + "\n\n"; for (int i = 0; i < failed_files.size(); i++) { if (i > 15) { - msg += "\n" + vformat(TTR("And %s more files."), itos(failed_files.size() - i)); + msg += "\n" + vformat(TTR("(and %s more files)"), itos(failed_files.size() - i)); break; } msg += failed_files[i]; @@ -316,12 +366,20 @@ void EditorAssetInstaller::ok_pressed() { } } else { if (EditorNode::get_singleton() != nullptr) { - EditorNode::get_singleton()->show_warning(TTR("Package installed successfully!"), TTR("Success!")); + EditorNode::get_singleton()->show_warning(vformat(TTR("Asset \"%s\" installed successfully!"), asset_name), TTR("Success!")); } } EditorFileSystem::get_singleton()->scan_changes(); } +void EditorAssetInstaller::set_asset_name(const String &p_asset_name) { + asset_name = p_asset_name; +} + +String EditorAssetInstaller::get_asset_name() const { + return asset_name; +} + void EditorAssetInstaller::_bind_methods() { } @@ -329,14 +387,18 @@ EditorAssetInstaller::EditorAssetInstaller() { VBoxContainer *vb = memnew(VBoxContainer); add_child(vb); + asset_contents = memnew(Label); + vb->add_child(asset_contents); + tree = memnew(Tree); - vb->add_margin_child(TTR("Package Contents:"), tree, true); + tree->set_v_size_flags(Control::SIZE_EXPAND_FILL); tree->connect("item_edited", callable_mp(this, &EditorAssetInstaller::_item_edited)); + vb->add_child(tree); error = memnew(AcceptDialog); add_child(error); get_ok_button()->set_text(TTR("Install")); - set_title(TTR("Package Installer")); + set_title(TTR("Asset Installer")); updating = false; diff --git a/editor/editor_asset_installer.h b/editor/editor_asset_installer.h index d9233a5ce8..9fafe2792a 100644 --- a/editor/editor_asset_installer.h +++ b/editor/editor_asset_installer.h @@ -37,7 +37,9 @@ class EditorAssetInstaller : public ConfirmationDialog { GDCLASS(EditorAssetInstaller, ConfirmationDialog); Tree *tree; + Label *asset_contents; String package_path; + String asset_name; AcceptDialog *error; Map<String, TreeItem *> status_map; bool updating; @@ -51,6 +53,10 @@ protected: public: void open(const String &p_path, int p_depth = 0); + + void set_asset_name(const String &p_asset_name); + String get_asset_name() const; + EditorAssetInstaller(); }; diff --git a/editor/editor_autoload_settings.cpp b/editor/editor_autoload_settings.cpp index 306a88047a..12ae55fbc1 100644 --- a/editor/editor_autoload_settings.cpp +++ b/editor/editor_autoload_settings.cpp @@ -882,19 +882,17 @@ EditorAutoloadSettings::EditorAutoloadSettings() { tree->set_column_title(0, TTR("Name")); tree->set_column_expand(0, true); - tree->set_column_custom_minimum_width(0, 100 * EDSCALE); + tree->set_column_expand_ratio(0, 1); tree->set_column_title(1, TTR("Path")); tree->set_column_expand(1, true); - tree->set_column_custom_minimum_width(1, 100 * EDSCALE); + tree->set_column_clip_content(1, true); + tree->set_column_expand_ratio(1, 2); tree->set_column_title(2, TTR("Global Variable")); tree->set_column_expand(2, false); - // Reserve enough space for translations of "Global Variable" which may be longer. - tree->set_column_custom_minimum_width(2, 150 * EDSCALE); tree->set_column_expand(3, false); - tree->set_column_custom_minimum_width(3, 120 * EDSCALE); tree->connect("cell_selected", callable_mp(this, &EditorAutoloadSettings::_autoload_selected)); tree->connect("item_edited", callable_mp(this, &EditorAutoloadSettings::_autoload_edited)); diff --git a/editor/editor_file_dialog.cpp b/editor/editor_file_dialog.cpp index fe4c6f490d..a07b3a7c19 100644 --- a/editor/editor_file_dialog.cpp +++ b/editor/editor_file_dialog.cpp @@ -1510,7 +1510,9 @@ EditorFileDialog::EditorFileDialog() { dir_next->connect("pressed", callable_mp(this, &EditorFileDialog::_go_forward)); dir_up->connect("pressed", callable_mp(this, &EditorFileDialog::_go_up)); - pathhb->add_child(memnew(Label(TTR("Path:")))); + Label *l = memnew(Label(TTR("Path:"))); + l->set_theme_type_variation("HeaderSmall"); + pathhb->add_child(l); drives_container = memnew(HBoxContainer); pathhb->add_child(drives_container); @@ -1591,7 +1593,11 @@ EditorFileDialog::EditorFileDialog() { fav_vb->set_v_size_flags(Control::SIZE_EXPAND_FILL); HBoxContainer *fav_hb = memnew(HBoxContainer); fav_vb->add_child(fav_hb); - fav_hb->add_child(memnew(Label(TTR("Favorites:")))); + + l = memnew(Label(TTR("Favorites:"))); + l->set_theme_type_variation("HeaderSmall"); + fav_hb->add_child(l); + fav_hb->add_spacer(); fav_up = memnew(Button); fav_up->set_flat(true); @@ -1626,7 +1632,10 @@ EditorFileDialog::EditorFileDialog() { VBoxContainer *list_vb = memnew(VBoxContainer); list_vb->set_h_size_flags(Control::SIZE_EXPAND_FILL); - list_vb->add_child(memnew(Label(TTR("Directories & Files:")))); + + l = memnew(Label(TTR("Directories & Files:"))); + l->set_theme_type_variation("HeaderSmall"); + list_vb->add_child(l); preview_hb->add_child(list_vb); // Item (files and folders) list with context menu. @@ -1653,7 +1662,11 @@ EditorFileDialog::EditorFileDialog() { preview_vb->hide(); file_box = memnew(HBoxContainer); - file_box->add_child(memnew(Label(TTR("File:")))); + + l = memnew(Label(TTR("File:"))); + l->set_theme_type_variation("HeaderSmall"); + file_box->add_child(l); + file = memnew(LineEdit); file->set_structured_text_bidi_override(Control::STRUCTURED_TEXT_FILE); file->set_stretch_ratio(4); diff --git a/editor/editor_fonts.cpp b/editor/editor_fonts.cpp index d548196a2d..8968e562c1 100644 --- a/editor/editor_fonts.cpp +++ b/editor/editor_fonts.cpp @@ -319,7 +319,19 @@ void editor_register_fonts(Ref<Theme> p_theme) { p_theme->set_font_size("main_button_font_size", "EditorFonts", default_font_size + 1 * EDSCALE); p_theme->set_font("main_button_font", "EditorFonts", df_bold); - p_theme->set_font("font", "Label", df_bold); + p_theme->set_font("font", "Label", df); + + p_theme->set_type_variation("HeaderSmall", "Label"); + p_theme->set_font("font", "HeaderSmall", df_bold); + p_theme->set_font_size("font_size", "HeaderSmall", default_font_size); + + p_theme->set_type_variation("HeaderMedium", "Label"); + p_theme->set_font("font", "HeaderMedium", df_bold); + p_theme->set_font_size("font_size", "HeaderMedium", default_font_size + 1 * EDSCALE); + + p_theme->set_type_variation("HeaderLarge", "Label"); + p_theme->set_font("font", "HeaderLarge", df_bold); + p_theme->set_font_size("font_size", "HeaderLarge", default_font_size + 3 * EDSCALE); // Documentation fonts MAKE_SOURCE_FONT(df_code); diff --git a/editor/editor_help_search.cpp b/editor/editor_help_search.cpp index 57ddc64e95..a9bbb92079 100644 --- a/editor/editor_help_search.cpp +++ b/editor/editor_help_search.cpp @@ -237,9 +237,11 @@ EditorHelpSearch::EditorHelpSearch() { results_tree->set_v_size_flags(Control::SIZE_EXPAND_FILL); results_tree->set_columns(2); results_tree->set_column_title(0, TTR("Name")); + results_tree->set_column_clip_content(0, true); results_tree->set_column_title(1, TTR("Member Type")); results_tree->set_column_expand(1, false); results_tree->set_column_custom_minimum_width(1, 150 * EDSCALE); + results_tree->set_column_clip_content(1, true); results_tree->set_custom_minimum_size(Size2(0, 100) * EDSCALE); results_tree->set_hide_root(true); results_tree->set_select_mode(Tree::SELECT_ROW); diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp index cfce37ea1b..4dd57cb1a8 100644 --- a/editor/editor_inspector.cpp +++ b/editor/editor_inspector.cpp @@ -1038,7 +1038,7 @@ void EditorInspectorPlugin::parse_category(Object *p_object, const String &p_par } } -bool EditorInspectorPlugin::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) { +bool EditorInspectorPlugin::parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide) { if (get_script_instance()) { Variant arg[6] = { p_object, p_type, p_path, p_hint, p_hint_text, p_usage @@ -1182,15 +1182,19 @@ void EditorInspectorSection::_notification(int p_what) { Size2 size = get_size(); Point2 offset; + Rect2 rect; offset.y = font->get_height(font_size); if (arrow.is_valid()) { offset.y = MAX(offset.y, arrow->get_height()); } offset.y += get_theme_constant("vseparation", "Tree"); - offset.x += get_theme_constant("inspector_margin", "Editor"); - - Rect2 rect(offset, size - offset); + if (is_layout_rtl()) { + rect = Rect2(offset, size - offset - Vector2(get_theme_constant("inspector_margin", "Editor"), 0)); + } else { + offset.x += get_theme_constant("inspector_margin", "Editor"); + rect = Rect2(offset, size - offset); + } //set children for (int i = 0; i < get_child_count(); i++) { @@ -1433,7 +1437,7 @@ EditorInspectorSection::~EditorInspectorSection() { Ref<EditorInspectorPlugin> EditorInspector::inspector_plugins[MAX_PLUGINS]; int EditorInspector::inspector_plugin_count = 0; -EditorProperty *EditorInspector::instantiate_property_editor(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) { +EditorProperty *EditorInspector::instantiate_property_editor(Object *p_object, const Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide) { for (int i = inspector_plugin_count - 1; i >= 0; i--) { inspector_plugins[i]->parse_property(p_object, p_type, p_path, p_hint, p_hint_text, p_usage, p_wide); if (inspector_plugins[i]->added_editors.size()) { diff --git a/editor/editor_inspector.h b/editor/editor_inspector.h index f493290b09..ee70bd4397 100644 --- a/editor/editor_inspector.h +++ b/editor/editor_inspector.h @@ -198,7 +198,7 @@ public: virtual bool can_handle(Object *p_object); virtual void parse_begin(Object *p_object); virtual void parse_category(Object *p_object, const String &p_parse_category); - virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide = false); + virtual bool parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide = false); virtual void parse_end(); }; @@ -356,7 +356,7 @@ public: static void remove_inspector_plugin(const Ref<EditorInspectorPlugin> &p_plugin); static void cleanup_plugins(); - static EditorProperty *instantiate_property_editor(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide = false); + static EditorProperty *instantiate_property_editor(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide = false); void set_undo_redo(UndoRedo *p_undo_redo); diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index b962ea6e3e..f09a6f678a 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -31,7 +31,6 @@ #include "editor_node.h" #include "core/config/project_settings.h" -#include "core/core_bind.h" #include "core/extension/native_extension_manager.h" #include "core/input/input.h" #include "core/io/config_file.h" @@ -137,6 +136,7 @@ #include "editor/plugins/gpu_particles_3d_editor_plugin.h" #include "editor/plugins/gpu_particles_collision_sdf_editor_plugin.h" #include "editor/plugins/gradient_editor_plugin.h" +#include "editor/plugins/input_event_editor_plugin.h" #include "editor/plugins/item_list_editor_plugin.h" #include "editor/plugins/light_occluder_2d_editor_plugin.h" #include "editor/plugins/lightmap_gi_editor_plugin.h" @@ -167,6 +167,7 @@ #include "editor/plugins/sprite_2d_editor_plugin.h" #include "editor/plugins/sprite_frames_editor_plugin.h" #include "editor/plugins/style_box_editor_plugin.h" +#include "editor/plugins/sub_viewport_preview_editor_plugin.h" #include "editor/plugins/text_editor.h" #include "editor/plugins/texture_3d_editor_plugin.h" #include "editor/plugins/texture_editor_plugin.h" @@ -591,8 +592,7 @@ void EditorNode::_notification(int p_what) { _initializing_addons = false; } - RenderingServer::get_singleton()->viewport_set_hide_scenario(get_scene_root()->get_viewport_rid(), true); - RenderingServer::get_singleton()->viewport_set_hide_canvas(get_scene_root()->get_viewport_rid(), true); + RenderingServer::get_singleton()->viewport_set_disable_2d(get_scene_root()->get_viewport_rid(), true); RenderingServer::get_singleton()->viewport_set_disable_environment(get_viewport()->get_viewport_rid(), true); feature_profile_manager->notify_changed(); @@ -709,6 +709,7 @@ void EditorNode::_notification(int p_what) { p->set_item_icon(p->get_item_index(HELP_DOCS), gui_base->get_theme_icon("Instance", "EditorIcons")); p->set_item_icon(p->get_item_index(HELP_QA), gui_base->get_theme_icon("Instance", "EditorIcons")); p->set_item_icon(p->get_item_index(HELP_REPORT_A_BUG), gui_base->get_theme_icon("Instance", "EditorIcons")); + p->set_item_icon(p->get_item_index(HELP_SUGGEST_A_FEATURE), gui_base->get_theme_icon("Instance", "EditorIcons")); p->set_item_icon(p->get_item_index(HELP_SEND_DOCS_FEEDBACK), gui_base->get_theme_icon("Instance", "EditorIcons")); p->set_item_icon(p->get_item_index(HELP_COMMUNITY), gui_base->get_theme_icon("Instance", "EditorIcons")); p->set_item_icon(p->get_item_index(HELP_ABOUT), gui_base->get_theme_icon("Godot", "EditorIcons")); @@ -2712,7 +2713,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { } save_confirmation->get_ok_button()->set_text(TTR("Save & Quit")); - save_confirmation->set_text((p_option == FILE_QUIT ? TTR("Save changes to the following scene(s) before quitting?") : TTR("Save changes the following scene(s) before opening Project Manager?")) + unsaved_scenes); + save_confirmation->set_text((p_option == FILE_QUIT ? TTR("Save changes to the following scene(s) before quitting?") : TTR("Save changes to the following scene(s) before opening Project Manager?")) + unsaved_scenes); save_confirmation->popup_centered(); } } @@ -2796,6 +2797,9 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { case HELP_REPORT_A_BUG: { OS::get_singleton()->shell_open("https://github.com/godotengine/godot/issues"); } break; + case HELP_SUGGEST_A_FEATURE: { + OS::get_singleton()->shell_open("https://github.com/godotengine/godot-proposals#readme"); + } break; case HELP_SEND_DOCS_FEEDBACK: { OS::get_singleton()->shell_open("https://github.com/godotengine/godot-docs/issues"); } break; @@ -3732,46 +3736,46 @@ void EditorNode::register_editor_types() { ResourceLoader::set_timestamp_on_load(true); ResourceSaver::set_timestamp_on_save(true); - ClassDB::register_class<EditorPaths>(); - ClassDB::register_class<EditorPlugin>(); - ClassDB::register_class<EditorTranslationParserPlugin>(); - ClassDB::register_class<EditorImportPlugin>(); - ClassDB::register_class<EditorScript>(); - ClassDB::register_class<EditorSelection>(); - ClassDB::register_class<EditorFileDialog>(); - ClassDB::register_virtual_class<EditorSettings>(); - ClassDB::register_class<EditorNode3DGizmo>(); - ClassDB::register_class<EditorNode3DGizmoPlugin>(); - ClassDB::register_virtual_class<EditorResourcePreview>(); - ClassDB::register_class<EditorResourcePreviewGenerator>(); - ClassDB::register_virtual_class<EditorFileSystem>(); - ClassDB::register_class<EditorFileSystemDirectory>(); - ClassDB::register_class<EditorVCSInterface>(); - ClassDB::register_virtual_class<ScriptEditor>(); - ClassDB::register_virtual_class<ScriptEditorBase>(); - ClassDB::register_class<EditorSyntaxHighlighter>(); - ClassDB::register_virtual_class<EditorInterface>(); - ClassDB::register_class<EditorExportPlugin>(); - ClassDB::register_class<EditorResourceConversionPlugin>(); - ClassDB::register_class<EditorSceneImporter>(); - ClassDB::register_class<EditorInspector>(); - ClassDB::register_class<EditorInspectorPlugin>(); - ClassDB::register_class<EditorProperty>(); - ClassDB::register_class<AnimationTrackEditPlugin>(); - ClassDB::register_class<ScriptCreateDialog>(); - ClassDB::register_class<EditorFeatureProfile>(); - ClassDB::register_class<EditorSpinSlider>(); - ClassDB::register_class<EditorResourcePicker>(); - ClassDB::register_class<EditorScriptPicker>(); - ClassDB::register_class<EditorSceneImporterMesh>(); - ClassDB::register_class<EditorSceneImporterMeshNode3D>(); - - ClassDB::register_virtual_class<FileSystemDock>(); + GDREGISTER_CLASS(EditorPaths); + GDREGISTER_CLASS(EditorPlugin); + GDREGISTER_CLASS(EditorTranslationParserPlugin); + GDREGISTER_CLASS(EditorImportPlugin); + GDREGISTER_CLASS(EditorScript); + GDREGISTER_CLASS(EditorSelection); + GDREGISTER_CLASS(EditorFileDialog); + GDREGISTER_VIRTUAL_CLASS(EditorSettings); + GDREGISTER_CLASS(EditorNode3DGizmo); + GDREGISTER_CLASS(EditorNode3DGizmoPlugin); + GDREGISTER_VIRTUAL_CLASS(EditorResourcePreview); + GDREGISTER_CLASS(EditorResourcePreviewGenerator); + GDREGISTER_VIRTUAL_CLASS(EditorFileSystem); + GDREGISTER_CLASS(EditorFileSystemDirectory); + GDREGISTER_CLASS(EditorVCSInterface); + GDREGISTER_VIRTUAL_CLASS(ScriptEditor); + GDREGISTER_VIRTUAL_CLASS(ScriptEditorBase); + GDREGISTER_CLASS(EditorSyntaxHighlighter); + GDREGISTER_VIRTUAL_CLASS(EditorInterface); + GDREGISTER_CLASS(EditorExportPlugin); + GDREGISTER_CLASS(EditorResourceConversionPlugin); + GDREGISTER_CLASS(EditorSceneImporter); + GDREGISTER_CLASS(EditorInspector); + GDREGISTER_CLASS(EditorInspectorPlugin); + GDREGISTER_CLASS(EditorProperty); + GDREGISTER_CLASS(AnimationTrackEditPlugin); + GDREGISTER_CLASS(ScriptCreateDialog); + GDREGISTER_CLASS(EditorFeatureProfile); + GDREGISTER_CLASS(EditorSpinSlider); + GDREGISTER_CLASS(EditorResourcePicker); + GDREGISTER_CLASS(EditorScriptPicker); + GDREGISTER_CLASS(EditorSceneImporterMesh); + GDREGISTER_CLASS(EditorSceneImporterMeshNode3D); + + GDREGISTER_VIRTUAL_CLASS(FileSystemDock); // FIXME: Is this stuff obsolete, or should it be ported to new APIs? - ClassDB::register_class<EditorScenePostImport>(); + GDREGISTER_CLASS(EditorScenePostImport); //ClassDB::register_type<EditorImportExport>(); - ClassDB::register_class<EditorDebuggerPlugin>(); + GDREGISTER_CLASS(EditorDebuggerPlugin); NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_EDITOR); } @@ -3871,6 +3875,21 @@ Ref<ImageTexture> EditorNode::_load_custom_class_icon(const String &p_path) cons return nullptr; } +void EditorNode::_pick_main_scene_custom_action(const String &p_custom_action_name) { + if (p_custom_action_name == "select_current") { + Node *scene = editor_data.get_edited_scene_root(); + + if (!scene) { + show_accept(TTR("There is no defined scene to run."), TTR("OK")); + return; + } + + pick_main_scene->hide(); + current_option = SETTINGS_PICK_MAIN_SCENE; + _dialog_action(scene->get_filename()); + } +} + Ref<Texture2D> EditorNode::get_object_icon(const Object *p_object, const String &p_fallback) const { ERR_FAIL_COND_V(!p_object || !gui_base, nullptr); @@ -4665,6 +4684,14 @@ bool EditorNode::ensure_main_scene(bool p_from_native) { current_option = -1; pick_main_scene->set_text(TTR("No main scene has ever been defined, select one?\nYou can change it later in \"Project Settings\" under the 'application' category.")); pick_main_scene->popup_centered(); + + if (editor_data.get_edited_scene_root()) { + select_current_scene_button->set_disabled(false); + select_current_scene_button->grab_focus(); + } else { + select_current_scene_button->set_disabled(true); + } + return false; } @@ -6112,9 +6139,9 @@ EditorNode::EditorNode() { scene_root_parent->set_v_size_flags(Control::SIZE_EXPAND_FILL); scene_root = memnew(SubViewport); - //scene_root->set_usage(Viewport::USAGE_2D); canvas BG mode prevents usage of this as 2D + scene_root->set_embed_subwindows_hint(true); + scene_root->set_disable_3d(true); - RenderingServer::get_singleton()->viewport_set_hide_scenario(scene_root->get_viewport_rid(), true); scene_root->set_disable_input(true); scene_root->set_as_audio_listener_2d(true); @@ -6361,6 +6388,7 @@ EditorNode::EditorNode() { p->add_icon_shortcut(gui_base->get_theme_icon("Instance", "EditorIcons"), ED_SHORTCUT("editor/online_docs", TTR("Online Documentation")), HELP_DOCS); p->add_icon_shortcut(gui_base->get_theme_icon("Instance", "EditorIcons"), ED_SHORTCUT("editor/q&a", TTR("Questions & Answers")), HELP_QA); p->add_icon_shortcut(gui_base->get_theme_icon("Instance", "EditorIcons"), ED_SHORTCUT("editor/report_a_bug", TTR("Report a Bug")), HELP_REPORT_A_BUG); + p->add_icon_shortcut(gui_base->get_theme_icon("Instance", "EditorIcons"), ED_SHORTCUT("editor/suggest_a_feature", TTR("Suggest a Feature")), HELP_SUGGEST_A_FEATURE); p->add_icon_shortcut(gui_base->get_theme_icon("Instance", "EditorIcons"), ED_SHORTCUT("editor/send_docs_feedback", TTR("Send Docs Feedback")), HELP_SEND_DOCS_FEEDBACK); p->add_icon_shortcut(gui_base->get_theme_icon("Instance", "EditorIcons"), ED_SHORTCUT("editor/community", TTR("Community")), HELP_COMMUNITY); p->add_separator(); @@ -6812,6 +6840,8 @@ EditorNode::EditorNode() { add_editor_plugin(memnew(MeshEditorPlugin(this))); add_editor_plugin(memnew(MaterialEditorPlugin(this))); add_editor_plugin(memnew(GPUParticlesCollisionSDFEditorPlugin(this))); + add_editor_plugin(memnew(InputEventEditorPlugin(this))); + add_editor_plugin(memnew(SubViewportPreviewEditorPlugin(this))); for (int i = 0; i < EditorPlugins::get_plugin_count(); i++) { add_editor_plugin(EditorPlugins::create(i, this)); @@ -6940,6 +6970,8 @@ EditorNode::EditorNode() { gui_base->add_child(pick_main_scene); pick_main_scene->get_ok_button()->set_text(TTR("Select")); pick_main_scene->connect("confirmed", callable_mp(this, &EditorNode::_menu_option), varray(SETTINGS_PICK_MAIN_SCENE)); + select_current_scene_button = pick_main_scene->add_button(TTR("Select Current"), true, "select_current"); + pick_main_scene->connect("custom_action", callable_mp(this, &EditorNode::_pick_main_scene_custom_action)); for (int i = 0; i < _init_callbacks.size(); i++) { _init_callbacks[i](); diff --git a/editor/editor_node.h b/editor/editor_node.h index 9a135cfdd7..07bed6999b 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -194,6 +194,7 @@ private: HELP_DOCS, HELP_QA, HELP_REPORT_A_BUG, + HELP_SUGGEST_A_FEATURE, HELP_SEND_DOCS_FEEDBACK, HELP_COMMUNITY, HELP_ABOUT, @@ -300,6 +301,7 @@ private: ConfirmationDialog *save_confirmation; ConfirmationDialog *import_confirmation; ConfirmationDialog *pick_main_scene; + Button *select_current_scene_button; AcceptDialog *accept; EditorAbout *about; AcceptDialog *warning; @@ -662,6 +664,8 @@ private: bool _is_class_editor_disabled_by_feature_profile(const StringName &p_class); Ref<ImageTexture> _load_custom_class_icon(const String &p_path) const; + void _pick_main_scene_custom_action(const String &p_custom_action_name); + protected: void _notification(int p_what); diff --git a/editor/editor_plugin_settings.cpp b/editor/editor_plugin_settings.cpp index 62fbad7bcf..a16a2f327e 100644 --- a/editor/editor_plugin_settings.cpp +++ b/editor/editor_plugin_settings.cpp @@ -192,7 +192,9 @@ EditorPluginSettings::EditorPluginSettings() { add_child(plugin_config_dialog); HBoxContainer *title_hb = memnew(HBoxContainer); - title_hb->add_child(memnew(Label(TTR("Installed Plugins:")))); + Label *l = memnew(Label(TTR("Installed Plugins:"))); + l->set_theme_type_variation("HeaderSmall"); + title_hb->add_child(l); title_hb->add_spacer(); create_plugin = memnew(Button(TTR("Create"))); create_plugin->connect("pressed", callable_mp(this, &EditorPluginSettings::_create_clicked)); @@ -212,10 +214,15 @@ EditorPluginSettings::EditorPluginSettings() { plugin_list->set_column_title(3, TTR("Status:")); plugin_list->set_column_title(4, TTR("Edit:")); plugin_list->set_column_expand(0, true); + plugin_list->set_column_clip_content(0, true); plugin_list->set_column_expand(1, false); + plugin_list->set_column_clip_content(1, true); plugin_list->set_column_expand(2, false); + plugin_list->set_column_clip_content(2, true); plugin_list->set_column_expand(3, false); + plugin_list->set_column_clip_content(3, true); plugin_list->set_column_expand(4, false); + plugin_list->set_column_clip_content(4, true); plugin_list->set_column_custom_minimum_width(1, 100 * EDSCALE); plugin_list->set_column_custom_minimum_width(2, 250 * EDSCALE); plugin_list->set_column_custom_minimum_width(3, 80 * EDSCALE); diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp index 5ca596417b..ebd8d6427b 100644 --- a/editor/editor_properties.cpp +++ b/editor/editor_properties.cpp @@ -180,44 +180,150 @@ EditorPropertyMultilineText::EditorPropertyMultilineText() { ///////////////////// TEXT ENUM ///////////////////////// -void EditorPropertyTextEnum::_option_selected(int p_which) { +void EditorPropertyTextEnum::_emit_changed_value(String p_string) { if (string_name) { - emit_changed(get_edited_property(), StringName(options->get_item_text(p_which))); + emit_changed(get_edited_property(), StringName(p_string)); } else { - emit_changed(get_edited_property(), options->get_item_text(p_which)); + emit_changed(get_edited_property(), p_string); } } +void EditorPropertyTextEnum::_option_selected(int p_which) { + _emit_changed_value(option_button->get_item_text(p_which)); +} + +void EditorPropertyTextEnum::_edit_custom_value() { + default_layout->hide(); + edit_custom_layout->show(); + custom_value_edit->grab_focus(); +} + +void EditorPropertyTextEnum::_custom_value_submitted(String p_value) { + edit_custom_layout->hide(); + default_layout->show(); + + _emit_changed_value(p_value.strip_edges()); +} + +void EditorPropertyTextEnum::_custom_value_accepted() { + String new_value = custom_value_edit->get_text().strip_edges(); + _custom_value_submitted(new_value); +} + +void EditorPropertyTextEnum::_custom_value_cancelled() { + custom_value_edit->set_text(get_edited_object()->get(get_edited_property())); + + edit_custom_layout->hide(); + default_layout->show(); +} + void EditorPropertyTextEnum::update_property() { - String which = get_edited_object()->get(get_edited_property()); - for (int i = 0; i < options->get_item_count(); i++) { - String t = options->get_item_text(i); - if (t == which) { - options->select(i); - return; + String current_value = get_edited_object()->get(get_edited_property()); + int default_option = options.find(current_value); + + // The list can change in the loose mode. + if (loose_mode) { + custom_value_edit->set_text(current_value); + option_button->clear(); + + // Manually entered value. + if (default_option < 0 && !current_value.is_empty()) { + option_button->add_item(current_value, options.size() + 1001); + option_button->select(0); + + option_button->add_separator(); } + + // Add an explicit empty value for clearing the property. + option_button->add_item("", options.size() + 1000); + + for (int i = 0; i < options.size(); i++) { + option_button->add_item(options[i], i); + if (options[i] == current_value) { + option_button->select(option_button->get_item_count() - 1); + } + } + } else { + option_button->select(default_option); } } -void EditorPropertyTextEnum::setup(const Vector<String> &p_options, bool p_string_name) { +void EditorPropertyTextEnum::setup(const Vector<String> &p_options, bool p_string_name, bool p_loose_mode) { + string_name = p_string_name; + loose_mode = p_loose_mode; + + options.clear(); + + if (loose_mode) { + // Add an explicit empty value for clearing the property in the loose mode. + option_button->add_item("", options.size() + 1000); + } + for (int i = 0; i < p_options.size(); i++) { - options->add_item(p_options[i], i); + options.append(p_options[i]); + option_button->add_item(p_options[i], i); + } + + if (loose_mode) { + edit_button->show(); } - string_name = p_string_name; } void EditorPropertyTextEnum::_bind_methods() { } -EditorPropertyTextEnum::EditorPropertyTextEnum() { - options = memnew(OptionButton); - options->set_clip_text(true); - options->set_flat(true); - string_name = false; +void EditorPropertyTextEnum::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: + edit_button->set_icon(get_theme_icon("Edit", "EditorIcons")); + accept_button->set_icon(get_theme_icon("ImportCheck", "EditorIcons")); + cancel_button->set_icon(get_theme_icon("ImportFail", "EditorIcons")); + break; + } +} - add_child(options); - add_focusable(options); - options->connect("item_selected", callable_mp(this, &EditorPropertyTextEnum::_option_selected)); +EditorPropertyTextEnum::EditorPropertyTextEnum() { + default_layout = memnew(HBoxContainer); + add_child(default_layout); + + edit_custom_layout = memnew(HBoxContainer); + edit_custom_layout->hide(); + add_child(edit_custom_layout); + + option_button = memnew(OptionButton); + option_button->set_h_size_flags(SIZE_EXPAND_FILL); + option_button->set_clip_text(true); + option_button->set_flat(true); + default_layout->add_child(option_button); + option_button->connect("item_selected", callable_mp(this, &EditorPropertyTextEnum::_option_selected)); + + edit_button = memnew(Button); + edit_button->set_flat(true); + edit_button->hide(); + default_layout->add_child(edit_button); + edit_button->connect("pressed", callable_mp(this, &EditorPropertyTextEnum::_edit_custom_value)); + + custom_value_edit = memnew(LineEdit); + custom_value_edit->set_h_size_flags(SIZE_EXPAND_FILL); + edit_custom_layout->add_child(custom_value_edit); + custom_value_edit->connect("text_submitted", callable_mp(this, &EditorPropertyTextEnum::_custom_value_submitted)); + + accept_button = memnew(Button); + accept_button->set_flat(true); + edit_custom_layout->add_child(accept_button); + accept_button->connect("pressed", callable_mp(this, &EditorPropertyTextEnum::_custom_value_accepted)); + + cancel_button = memnew(Button); + cancel_button->set_flat(true); + edit_custom_layout->add_child(cancel_button); + cancel_button->connect("pressed", callable_mp(this, &EditorPropertyTextEnum::_custom_value_cancelled)); + + add_focusable(option_button); + add_focusable(edit_button); + add_focusable(custom_value_edit); + add_focusable(accept_button); + add_focusable(cancel_button); } ///////////////////// PATH ///////////////////////// @@ -893,11 +999,17 @@ void EditorPropertyFloat::_value_changed(double val) { return; } + if (angle_in_radians) { + val = Math::deg2rad(val); + } emit_changed(get_edited_property(), val); } void EditorPropertyFloat::update_property() { double val = get_edited_object()->get(get_edited_property()); + if (angle_in_radians) { + val = Math::rad2deg(val); + } setting = true; spin->set_value(val); setting = false; @@ -906,7 +1018,8 @@ void EditorPropertyFloat::update_property() { void EditorPropertyFloat::_bind_methods() { } -void EditorPropertyFloat::setup(double p_min, double p_max, double p_step, bool p_no_slider, bool p_exp_range, bool p_greater, bool p_lesser) { +void EditorPropertyFloat::setup(double p_min, double p_max, double p_step, bool p_no_slider, bool p_exp_range, bool p_greater, bool p_lesser, const String &p_suffix, bool p_angle_in_radians) { + angle_in_radians = p_angle_in_radians; spin->set_min(p_min); spin->set_max(p_max); spin->set_step(p_step); @@ -914,6 +1027,7 @@ void EditorPropertyFloat::setup(double p_min, double p_max, double p_step, bool spin->set_exp_ratio(p_exp_range); spin->set_allow_greater(p_greater); spin->set_allow_lesser(p_lesser); + spin->set_suffix(p_suffix); } EditorPropertyFloat::EditorPropertyFloat() { @@ -922,7 +1036,6 @@ EditorPropertyFloat::EditorPropertyFloat() { add_child(spin); add_focusable(spin); spin->connect("value_changed", callable_mp(this, &EditorPropertyFloat::_value_changed)); - setting = false; } ///////////////////// EASING ///////////////////////// @@ -1172,7 +1285,7 @@ void EditorPropertyVector2::_notification(int p_what) { void EditorPropertyVector2::_bind_methods() { } -void EditorPropertyVector2::setup(double p_min, double p_max, double p_step, bool p_no_slider) { +void EditorPropertyVector2::setup(double p_min, double p_max, double p_step, bool p_no_slider, const String &p_suffix) { for (int i = 0; i < 2; i++) { spin[i]->set_min(p_min); spin[i]->set_max(p_max); @@ -1180,6 +1293,7 @@ void EditorPropertyVector2::setup(double p_min, double p_max, double p_step, boo spin[i]->set_hide_slider(p_no_slider); spin[i]->set_allow_greater(true); spin[i]->set_allow_lesser(true); + spin[i]->set_suffix(p_suffix); } } @@ -1258,7 +1372,7 @@ void EditorPropertyRect2::_notification(int p_what) { void EditorPropertyRect2::_bind_methods() { } -void EditorPropertyRect2::setup(double p_min, double p_max, double p_step, bool p_no_slider) { +void EditorPropertyRect2::setup(double p_min, double p_max, double p_step, bool p_no_slider, const String &p_suffix) { for (int i = 0; i < 4; i++) { spin[i]->set_min(p_min); spin[i]->set_max(p_max); @@ -1266,6 +1380,7 @@ void EditorPropertyRect2::setup(double p_min, double p_max, double p_step, bool spin[i]->set_hide_slider(p_no_slider); spin[i]->set_allow_greater(true); spin[i]->set_allow_lesser(true); + spin[i]->set_suffix(p_suffix); } } @@ -1326,6 +1441,11 @@ void EditorPropertyVector3::_value_changed(double val, const String &p_name) { v3.x = spin[0]->get_value(); v3.y = spin[1]->get_value(); v3.z = spin[2]->get_value(); + if (angle_in_radians) { + v3.x = Math::deg2rad(v3.x); + v3.y = Math::deg2rad(v3.y); + v3.z = Math::deg2rad(v3.z); + } emit_changed(get_edited_property(), v3, p_name); } @@ -1334,6 +1454,11 @@ void EditorPropertyVector3::update_property() { } void EditorPropertyVector3::update_using_vector(Vector3 p_vector) { + if (angle_in_radians) { + p_vector.x = Math::rad2deg(p_vector.x); + p_vector.y = Math::rad2deg(p_vector.y); + p_vector.z = Math::rad2deg(p_vector.z); + } setting = true; spin[0]->set_value(p_vector.x); spin[1]->set_value(p_vector.y); @@ -1346,6 +1471,12 @@ Vector3 EditorPropertyVector3::get_vector() { v3.x = spin[0]->get_value(); v3.y = spin[1]->get_value(); v3.z = spin[2]->get_value(); + if (angle_in_radians) { + v3.x = Math::deg2rad(v3.x); + v3.y = Math::deg2rad(v3.y); + v3.z = Math::deg2rad(v3.z); + } + return v3; } @@ -1363,7 +1494,8 @@ void EditorPropertyVector3::_notification(int p_what) { void EditorPropertyVector3::_bind_methods() { } -void EditorPropertyVector3::setup(double p_min, double p_max, double p_step, bool p_no_slider) { +void EditorPropertyVector3::setup(double p_min, double p_max, double p_step, bool p_no_slider, const String &p_suffix, bool p_angle_in_radians) { + angle_in_radians = p_angle_in_radians; for (int i = 0; i < 3; i++) { spin[i]->set_min(p_min); spin[i]->set_max(p_max); @@ -1371,6 +1503,7 @@ void EditorPropertyVector3::setup(double p_min, double p_max, double p_step, boo spin[i]->set_hide_slider(p_no_slider); spin[i]->set_allow_greater(true); spin[i]->set_allow_lesser(true); + spin[i]->set_suffix(p_suffix); } } @@ -1407,7 +1540,6 @@ EditorPropertyVector3::EditorPropertyVector3(bool p_force_wide) { if (!horizontal) { set_label_reference(spin[0]); //show text and buttons around this } - setting = false; } ///////////////////// VECTOR2i ///////////////////////// @@ -1445,7 +1577,7 @@ void EditorPropertyVector2i::_notification(int p_what) { void EditorPropertyVector2i::_bind_methods() { } -void EditorPropertyVector2i::setup(int p_min, int p_max, bool p_no_slider) { +void EditorPropertyVector2i::setup(int p_min, int p_max, bool p_no_slider, const String &p_suffix) { for (int i = 0; i < 2; i++) { spin[i]->set_min(p_min); spin[i]->set_max(p_max); @@ -1453,6 +1585,7 @@ void EditorPropertyVector2i::setup(int p_min, int p_max, bool p_no_slider) { spin[i]->set_hide_slider(p_no_slider); spin[i]->set_allow_greater(true); spin[i]->set_allow_lesser(true); + spin[i]->set_suffix(p_suffix); } } @@ -1531,7 +1664,7 @@ void EditorPropertyRect2i::_notification(int p_what) { void EditorPropertyRect2i::_bind_methods() { } -void EditorPropertyRect2i::setup(int p_min, int p_max, bool p_no_slider) { +void EditorPropertyRect2i::setup(int p_min, int p_max, bool p_no_slider, const String &p_suffix) { for (int i = 0; i < 4; i++) { spin[i]->set_min(p_min); spin[i]->set_max(p_max); @@ -1539,6 +1672,7 @@ void EditorPropertyRect2i::setup(int p_min, int p_max, bool p_no_slider) { spin[i]->set_hide_slider(p_no_slider); spin[i]->set_allow_greater(true); spin[i]->set_allow_lesser(true); + spin[i]->set_suffix(p_suffix); } } @@ -1625,7 +1759,7 @@ void EditorPropertyVector3i::_notification(int p_what) { void EditorPropertyVector3i::_bind_methods() { } -void EditorPropertyVector3i::setup(int p_min, int p_max, bool p_no_slider) { +void EditorPropertyVector3i::setup(int p_min, int p_max, bool p_no_slider, const String &p_suffix) { for (int i = 0; i < 3; i++) { spin[i]->set_min(p_min); spin[i]->set_max(p_max); @@ -1633,6 +1767,7 @@ void EditorPropertyVector3i::setup(int p_min, int p_max, bool p_no_slider) { spin[i]->set_hide_slider(p_no_slider); spin[i]->set_allow_greater(true); spin[i]->set_allow_lesser(true); + spin[i]->set_suffix(p_suffix); } } @@ -1710,7 +1845,7 @@ void EditorPropertyPlane::_notification(int p_what) { void EditorPropertyPlane::_bind_methods() { } -void EditorPropertyPlane::setup(double p_min, double p_max, double p_step, bool p_no_slider) { +void EditorPropertyPlane::setup(double p_min, double p_max, double p_step, bool p_no_slider, const String &p_suffix) { for (int i = 0; i < 4; i++) { spin[i]->set_min(p_min); spin[i]->set_max(p_max); @@ -1718,6 +1853,7 @@ void EditorPropertyPlane::setup(double p_min, double p_max, double p_step, bool spin[i]->set_hide_slider(p_no_slider); spin[i]->set_allow_greater(true); spin[i]->set_allow_lesser(true); + spin[i]->set_suffix(p_suffix); } } @@ -1796,7 +1932,7 @@ void EditorPropertyQuaternion::_notification(int p_what) { void EditorPropertyQuaternion::_bind_methods() { } -void EditorPropertyQuaternion::setup(double p_min, double p_max, double p_step, bool p_no_slider) { +void EditorPropertyQuaternion::setup(double p_min, double p_max, double p_step, bool p_no_slider, const String &p_suffix) { for (int i = 0; i < 4; i++) { spin[i]->set_min(p_min); spin[i]->set_max(p_max); @@ -1804,6 +1940,7 @@ void EditorPropertyQuaternion::setup(double p_min, double p_max, double p_step, spin[i]->set_hide_slider(p_no_slider); spin[i]->set_allow_greater(true); spin[i]->set_allow_lesser(true); + spin[i]->set_suffix(p_suffix); } } @@ -1885,7 +2022,7 @@ void EditorPropertyAABB::_notification(int p_what) { void EditorPropertyAABB::_bind_methods() { } -void EditorPropertyAABB::setup(double p_min, double p_max, double p_step, bool p_no_slider) { +void EditorPropertyAABB::setup(double p_min, double p_max, double p_step, bool p_no_slider, const String &p_suffix) { for (int i = 0; i < 6; i++) { spin[i]->set_min(p_min); spin[i]->set_max(p_max); @@ -1893,6 +2030,7 @@ void EditorPropertyAABB::setup(double p_min, double p_max, double p_step, bool p spin[i]->set_hide_slider(p_no_slider); spin[i]->set_allow_greater(true); spin[i]->set_allow_lesser(true); + spin[i]->set_suffix(p_suffix); } } @@ -1961,7 +2099,7 @@ void EditorPropertyTransform2D::_notification(int p_what) { void EditorPropertyTransform2D::_bind_methods() { } -void EditorPropertyTransform2D::setup(double p_min, double p_max, double p_step, bool p_no_slider) { +void EditorPropertyTransform2D::setup(double p_min, double p_max, double p_step, bool p_no_slider, const String &p_suffix) { for (int i = 0; i < 6; i++) { spin[i]->set_min(p_min); spin[i]->set_max(p_max); @@ -1969,6 +2107,7 @@ void EditorPropertyTransform2D::setup(double p_min, double p_max, double p_step, spin[i]->set_hide_slider(p_no_slider); spin[i]->set_allow_greater(true); spin[i]->set_allow_lesser(true); + spin[i]->set_suffix(p_suffix); } } @@ -2042,7 +2181,7 @@ void EditorPropertyBasis::_notification(int p_what) { void EditorPropertyBasis::_bind_methods() { } -void EditorPropertyBasis::setup(double p_min, double p_max, double p_step, bool p_no_slider) { +void EditorPropertyBasis::setup(double p_min, double p_max, double p_step, bool p_no_slider, const String &p_suffix) { for (int i = 0; i < 9; i++) { spin[i]->set_min(p_min); spin[i]->set_max(p_max); @@ -2050,6 +2189,7 @@ void EditorPropertyBasis::setup(double p_min, double p_max, double p_step, bool spin[i]->set_hide_slider(p_no_slider); spin[i]->set_allow_greater(true); spin[i]->set_allow_lesser(true); + spin[i]->set_suffix(p_suffix); } } @@ -2131,7 +2271,7 @@ void EditorPropertyTransform3D::_notification(int p_what) { void EditorPropertyTransform3D::_bind_methods() { } -void EditorPropertyTransform3D::setup(double p_min, double p_max, double p_step, bool p_no_slider) { +void EditorPropertyTransform3D::setup(double p_min, double p_max, double p_step, bool p_no_slider, const String &p_suffix) { for (int i = 0; i < 12; i++) { spin[i]->set_min(p_min); spin[i]->set_max(p_max); @@ -2139,6 +2279,7 @@ void EditorPropertyTransform3D::setup(double p_min, double p_max, double p_step, spin[i]->set_hide_slider(p_no_slider); spin[i]->set_allow_greater(true); spin[i]->set_allow_lesser(true); + spin[i]->set_suffix(p_suffix); } } @@ -2699,7 +2840,7 @@ void EditorInspectorDefaultPlugin::parse_begin(Object *p_object) { //do none } -bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) { +bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide) { Control *editor = EditorInspectorDefaultPlugin::get_editor_for_property(p_object, p_type, p_path, p_hint, p_hint_text, p_usage, p_wide); if (editor) { add_property_editor(p_path, editor); @@ -2711,7 +2852,61 @@ void EditorInspectorDefaultPlugin::parse_end() { //do none } -EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) { +struct EditorPropertyRangeHint { + bool angle_in_degrees = false; + bool greater = true; + bool lesser = true; + double min = -99999; + double max = 99999; + double step = 0; + String suffix; + bool exp_range = false; + bool hide_slider = true; + bool radians = false; +}; + +static EditorPropertyRangeHint _parse_range_hint(PropertyHint p_hint, const String &p_hint_text, double p_default_step) { + EditorPropertyRangeHint hint; + hint.step = p_default_step; + bool degrees = false; + if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { + hint.greater = false; //if using ranged, assume false by default + hint.lesser = false; + + hint.min = p_hint_text.get_slice(",", 0).to_float(); + hint.max = p_hint_text.get_slice(",", 1).to_float(); + if (p_hint_text.get_slice_count(",") >= 3) { + hint.step = p_hint_text.get_slice(",", 2).to_float(); + } + hint.hide_slider = false; + for (int i = 2; i < p_hint_text.get_slice_count(","); i++) { + String slice = p_hint_text.get_slice(",", i).strip_edges(); + if (slice == "radians") { + hint.radians = true; + } else if (slice == "degrees") { + degrees = true; + } else if (slice == "or_greater") { + hint.greater = true; + } else if (slice == "or_lesser") { + hint.lesser = true; + } else if (slice == "noslider") { + hint.hide_slider = true; + } else if (slice == "exp") { + hint.exp_range = true; + } else if (slice.begins_with("suffix:")) { + hint.suffix = " " + slice.replace_first("suffix:", "").strip_edges(); + } + } + } + + if ((hint.radians || degrees) && hint.suffix == String()) { + hint.suffix = U"\u00B0"; + } + + return hint; +} + +EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide) { double default_float_step = EDITOR_GET("interface/inspector/default_float_step"); switch (p_type) { @@ -2776,31 +2971,10 @@ EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_ } else { EditorPropertyInteger *editor = memnew(EditorPropertyInteger); - int min = 0, max = 65535, step = 1; - bool greater = true, lesser = true; - if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { - greater = false; //if using ranged, assume false by default - lesser = false; - min = p_hint_text.get_slice(",", 0).to_int(); - max = p_hint_text.get_slice(",", 1).to_int(); + EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1); - if (p_hint_text.get_slice_count(",") >= 3) { - step = p_hint_text.get_slice(",", 2).to_int(); - } - - for (int i = 2; i < p_hint_text.get_slice_count(","); i++) { - String slice = p_hint_text.get_slice(",", i).strip_edges(); - if (slice == "or_greater") { - greater = true; - } - if (slice == "or_lesser") { - lesser = true; - } - } - } - - editor->setup(min, max, step, greater, lesser); + editor->setup(hint.min, hint.max, hint.step, hint.greater, hint.lesser); return editor; } @@ -2826,42 +3000,18 @@ EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_ } else { EditorPropertyFloat *editor = memnew(EditorPropertyFloat); - double min = -65535, max = 65535, step = default_float_step; - bool hide_slider = true; - bool exp_range = false; - bool greater = true, lesser = true; - - if ((p_hint == PROPERTY_HINT_RANGE || p_hint == PROPERTY_HINT_EXP_RANGE) && p_hint_text.get_slice_count(",") >= 2) { - greater = false; //if using ranged, assume false by default - lesser = false; - min = p_hint_text.get_slice(",", 0).to_float(); - max = p_hint_text.get_slice(",", 1).to_float(); - if (p_hint_text.get_slice_count(",") >= 3) { - step = p_hint_text.get_slice(",", 2).to_float(); - } - hide_slider = false; - exp_range = p_hint == PROPERTY_HINT_EXP_RANGE; - for (int i = 2; i < p_hint_text.get_slice_count(","); i++) { - String slice = p_hint_text.get_slice(",", i).strip_edges(); - if (slice == "or_greater") { - greater = true; - } - if (slice == "or_lesser") { - lesser = true; - } - } - } - editor->setup(min, max, step, hide_slider, exp_range, greater, lesser); + EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, default_float_step); + editor->setup(hint.min, hint.max, hint.step, hint.hide_slider, hint.exp_range, hint.greater, hint.lesser, hint.suffix, hint.radians); return editor; } } break; case Variant::STRING: { - if (p_hint == PROPERTY_HINT_ENUM) { + if (p_hint == PROPERTY_HINT_ENUM || p_hint == PROPERTY_HINT_ENUM_SUGGESTION) { EditorPropertyTextEnum *editor = memnew(EditorPropertyTextEnum); - Vector<String> options = p_hint_text.split(","); - editor->setup(options); + Vector<String> options = p_hint_text.split(",", false); + editor->setup(options, false, (p_hint == PROPERTY_HINT_ENUM_SUGGESTION)); return editor; } else if (p_hint == PROPERTY_HINT_MULTILINE_TEXT) { EditorPropertyMultilineText *editor = memnew(EditorPropertyMultilineText); @@ -2933,203 +3083,81 @@ EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_ case Variant::VECTOR2: { EditorPropertyVector2 *editor = memnew(EditorPropertyVector2(p_wide)); - double min = -65535, max = 65535, step = default_float_step; - bool hide_slider = true; - - if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { - min = p_hint_text.get_slice(",", 0).to_float(); - max = p_hint_text.get_slice(",", 1).to_float(); - if (p_hint_text.get_slice_count(",") >= 3) { - step = p_hint_text.get_slice(",", 2).to_float(); - } - hide_slider = false; - } - editor->setup(min, max, step, hide_slider); + EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, default_float_step); + editor->setup(hint.min, hint.max, hint.step, hint.hide_slider, hint.suffix); return editor; } break; case Variant::VECTOR2I: { EditorPropertyVector2i *editor = memnew(EditorPropertyVector2i(p_wide)); - int min = -65535, max = 65535; - bool hide_slider = true; - - if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { - min = p_hint_text.get_slice(",", 0).to_float(); - max = p_hint_text.get_slice(",", 1).to_float(); - hide_slider = false; - } - - editor->setup(min, max, hide_slider); + EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1); + editor->setup(hint.min, hint.max, hint.hide_slider, hint.suffix); return editor; } break; case Variant::RECT2: { EditorPropertyRect2 *editor = memnew(EditorPropertyRect2(p_wide)); - double min = -65535, max = 65535, step = default_float_step; - bool hide_slider = true; - - if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { - min = p_hint_text.get_slice(",", 0).to_float(); - max = p_hint_text.get_slice(",", 1).to_float(); - if (p_hint_text.get_slice_count(",") >= 3) { - step = p_hint_text.get_slice(",", 2).to_float(); - } - hide_slider = false; - } - - editor->setup(min, max, step, hide_slider); + EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, default_float_step); + editor->setup(hint.min, hint.max, hint.step, hint.hide_slider, hint.suffix); return editor; } break; case Variant::RECT2I: { EditorPropertyRect2i *editor = memnew(EditorPropertyRect2i(p_wide)); - int min = -65535, max = 65535; - bool hide_slider = true; + EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1); + editor->setup(hint.min, hint.max, hint.hide_slider, hint.suffix); - if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { - min = p_hint_text.get_slice(",", 0).to_float(); - max = p_hint_text.get_slice(",", 1).to_float(); - hide_slider = false; - } - - editor->setup(min, max, hide_slider); return editor; } break; case Variant::VECTOR3: { EditorPropertyVector3 *editor = memnew(EditorPropertyVector3(p_wide)); - double min = -65535, max = 65535, step = default_float_step; - bool hide_slider = true; - - if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { - min = p_hint_text.get_slice(",", 0).to_float(); - max = p_hint_text.get_slice(",", 1).to_float(); - if (p_hint_text.get_slice_count(",") >= 3) { - step = p_hint_text.get_slice(",", 2).to_float(); - } - hide_slider = false; - } - - editor->setup(min, max, step, hide_slider); + EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, default_float_step); + editor->setup(hint.min, hint.max, hint.step, hint.hide_slider, hint.suffix, hint.radians); return editor; } break; case Variant::VECTOR3I: { EditorPropertyVector3i *editor = memnew(EditorPropertyVector3i(p_wide)); - int min = -65535, max = 65535; - bool hide_slider = true; - - if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { - min = p_hint_text.get_slice(",", 0).to_float(); - max = p_hint_text.get_slice(",", 1).to_float(); - - hide_slider = false; - } - - editor->setup(min, max, hide_slider); + EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1); + editor->setup(hint.min, hint.max, hint.hide_slider, hint.suffix); return editor; } break; case Variant::TRANSFORM2D: { EditorPropertyTransform2D *editor = memnew(EditorPropertyTransform2D); - double min = -65535, max = 65535, step = default_float_step; - bool hide_slider = true; - - if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { - min = p_hint_text.get_slice(",", 0).to_float(); - max = p_hint_text.get_slice(",", 1).to_float(); - if (p_hint_text.get_slice_count(",") >= 3) { - step = p_hint_text.get_slice(",", 2).to_float(); - } - hide_slider = false; - } - - editor->setup(min, max, step, hide_slider); + EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, default_float_step); + editor->setup(hint.min, hint.max, hint.step, hint.hide_slider, hint.suffix); return editor; } break; case Variant::PLANE: { EditorPropertyPlane *editor = memnew(EditorPropertyPlane(p_wide)); - double min = -65535, max = 65535, step = default_float_step; - bool hide_slider = true; - - if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { - min = p_hint_text.get_slice(",", 0).to_float(); - max = p_hint_text.get_slice(",", 1).to_float(); - if (p_hint_text.get_slice_count(",") >= 3) { - step = p_hint_text.get_slice(",", 2).to_float(); - } - hide_slider = false; - } - - editor->setup(min, max, step, hide_slider); + EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, default_float_step); + editor->setup(hint.min, hint.max, hint.step, hint.hide_slider, hint.suffix); return editor; } break; case Variant::QUATERNION: { EditorPropertyQuaternion *editor = memnew(EditorPropertyQuaternion); - double min = -65535, max = 65535, step = default_float_step; - bool hide_slider = true; - - if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { - min = p_hint_text.get_slice(",", 0).to_float(); - max = p_hint_text.get_slice(",", 1).to_float(); - if (p_hint_text.get_slice_count(",") >= 3) { - step = p_hint_text.get_slice(",", 2).to_float(); - } - hide_slider = false; - } - - editor->setup(min, max, step, hide_slider); + EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, default_float_step); + editor->setup(hint.min, hint.max, hint.step, hint.hide_slider, hint.suffix); return editor; } break; case Variant::AABB: { EditorPropertyAABB *editor = memnew(EditorPropertyAABB); - double min = -65535, max = 65535, step = default_float_step; - bool hide_slider = true; - - if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { - min = p_hint_text.get_slice(",", 0).to_float(); - max = p_hint_text.get_slice(",", 1).to_float(); - if (p_hint_text.get_slice_count(",") >= 3) { - step = p_hint_text.get_slice(",", 2).to_float(); - } - hide_slider = false; - } - - editor->setup(min, max, step, hide_slider); + EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, default_float_step); + editor->setup(hint.min, hint.max, hint.step, hint.hide_slider, hint.suffix); return editor; } break; case Variant::BASIS: { EditorPropertyBasis *editor = memnew(EditorPropertyBasis); - double min = -65535, max = 65535, step = default_float_step; - bool hide_slider = true; - - if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { - min = p_hint_text.get_slice(",", 0).to_float(); - max = p_hint_text.get_slice(",", 1).to_float(); - if (p_hint_text.get_slice_count(",") >= 3) { - step = p_hint_text.get_slice(",", 2).to_float(); - } - hide_slider = false; - } - - editor->setup(min, max, step, hide_slider); + EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, default_float_step); + editor->setup(hint.min, hint.max, hint.step, hint.hide_slider, hint.suffix); return editor; } break; case Variant::TRANSFORM3D: { EditorPropertyTransform3D *editor = memnew(EditorPropertyTransform3D); - double min = -65535, max = 65535, step = default_float_step; - bool hide_slider = true; - - if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { - min = p_hint_text.get_slice(",", 0).to_float(); - max = p_hint_text.get_slice(",", 1).to_float(); - if (p_hint_text.get_slice_count(",") >= 3) { - step = p_hint_text.get_slice(",", 2).to_float(); - } - hide_slider = false; - } - - editor->setup(min, max, step, hide_slider); + EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, default_float_step); + editor->setup(hint.min, hint.max, hint.step, hint.hide_slider, hint.suffix); return editor; } break; @@ -3141,10 +3169,10 @@ EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_ return editor; } break; case Variant::STRING_NAME: { - if (p_hint == PROPERTY_HINT_ENUM) { + if (p_hint == PROPERTY_HINT_ENUM || p_hint == PROPERTY_HINT_ENUM_SUGGESTION) { EditorPropertyTextEnum *editor = memnew(EditorPropertyTextEnum); - Vector<String> options = p_hint_text.split(","); - editor->setup(options, true); + Vector<String> options = p_hint_text.split(",", false); + editor->setup(options, true, (p_hint == PROPERTY_HINT_ENUM_SUGGESTION)); return editor; } else { EditorPropertyText *editor = memnew(EditorPropertyText); diff --git a/editor/editor_properties.h b/editor/editor_properties.h index 522f4eebf6..0cb21bb391 100644 --- a/editor/editor_properties.h +++ b/editor/editor_properties.h @@ -91,16 +91,35 @@ public: class EditorPropertyTextEnum : public EditorProperty { GDCLASS(EditorPropertyTextEnum, EditorProperty); - OptionButton *options; + HBoxContainer *default_layout; + HBoxContainer *edit_custom_layout; + + OptionButton *option_button; + Button *edit_button; + + LineEdit *custom_value_edit; + Button *accept_button; + Button *cancel_button; + + Vector<String> options; + bool string_name = false; + bool loose_mode = false; + + void _emit_changed_value(String p_string); void _option_selected(int p_which); - bool string_name; + + void _edit_custom_value(); + void _custom_value_submitted(String p_value); + void _custom_value_accepted(); + void _custom_value_cancelled(); protected: static void _bind_methods(); + void _notification(int p_what); public: - void setup(const Vector<String> &p_options, bool p_string_name = false); + void setup(const Vector<String> &p_options, bool p_string_name = false, bool p_loose_mode = false); virtual void update_property() override; EditorPropertyTextEnum(); }; @@ -298,7 +317,8 @@ public: class EditorPropertyFloat : public EditorProperty { GDCLASS(EditorPropertyFloat, EditorProperty); EditorSpinSlider *spin; - bool setting; + bool setting = false; + bool angle_in_radians = false; void _value_changed(double p_val); protected: @@ -306,7 +326,7 @@ protected: public: virtual void update_property() override; - void setup(double p_min, double p_max, double p_step, bool p_no_slider, bool p_exp_range, bool p_greater, bool p_lesser); + void setup(double p_min, double p_max, double p_step, bool p_no_slider, bool p_exp_range, bool p_greater, bool p_lesser, const String &p_suffix = String(), bool p_angle_in_radians = false); EditorPropertyFloat(); }; @@ -363,7 +383,7 @@ protected: public: virtual void update_property() override; - void setup(double p_min, double p_max, double p_step, bool p_no_slider); + void setup(double p_min, double p_max, double p_step, bool p_no_slider, const String &p_suffix = String()); EditorPropertyVector2(bool p_force_wide = false); }; @@ -379,14 +399,15 @@ protected: public: virtual void update_property() override; - void setup(double p_min, double p_max, double p_step, bool p_no_slider); + void setup(double p_min, double p_max, double p_step, bool p_no_slider, const String &p_suffix = String()); EditorPropertyRect2(bool p_force_wide = false); }; class EditorPropertyVector3 : public EditorProperty { GDCLASS(EditorPropertyVector3, EditorProperty); EditorSpinSlider *spin[3]; - bool setting; + bool setting = false; + bool angle_in_radians = false; void _value_changed(double p_val, const String &p_name); protected: @@ -397,7 +418,7 @@ public: virtual void update_property() override; virtual void update_using_vector(Vector3 p_vector); virtual Vector3 get_vector(); - void setup(double p_min, double p_max, double p_step, bool p_no_slider); + void setup(double p_min, double p_max, double p_step, bool p_no_slider, const String &p_suffix = String(), bool p_angle_in_radians = false); EditorPropertyVector3(bool p_force_wide = false); }; @@ -413,7 +434,7 @@ protected: public: virtual void update_property() override; - void setup(int p_min, int p_max, bool p_no_slider); + void setup(int p_min, int p_max, bool p_no_slider, const String &p_suffix = String()); EditorPropertyVector2i(bool p_force_wide = false); }; @@ -429,7 +450,7 @@ protected: public: virtual void update_property() override; - void setup(int p_min, int p_max, bool p_no_slider); + void setup(int p_min, int p_max, bool p_no_slider, const String &p_suffix = String()); EditorPropertyRect2i(bool p_force_wide = false); }; @@ -445,7 +466,7 @@ protected: public: virtual void update_property() override; - void setup(int p_min, int p_max, bool p_no_slider); + void setup(int p_min, int p_max, bool p_no_slider, const String &p_suffix = String()); EditorPropertyVector3i(bool p_force_wide = false); }; @@ -461,7 +482,7 @@ protected: public: virtual void update_property() override; - void setup(double p_min, double p_max, double p_step, bool p_no_slider); + void setup(double p_min, double p_max, double p_step, bool p_no_slider, const String &p_suffix = String()); EditorPropertyPlane(bool p_force_wide = false); }; @@ -477,7 +498,7 @@ protected: public: virtual void update_property() override; - void setup(double p_min, double p_max, double p_step, bool p_no_slider); + void setup(double p_min, double p_max, double p_step, bool p_no_slider, const String &p_suffix = String()); EditorPropertyQuaternion(); }; @@ -493,7 +514,7 @@ protected: public: virtual void update_property() override; - void setup(double p_min, double p_max, double p_step, bool p_no_slider); + void setup(double p_min, double p_max, double p_step, bool p_no_slider, const String &p_suffix = String()); EditorPropertyAABB(); }; @@ -509,7 +530,7 @@ protected: public: virtual void update_property() override; - void setup(double p_min, double p_max, double p_step, bool p_no_slider); + void setup(double p_min, double p_max, double p_step, bool p_no_slider, const String &p_suffix = String()); EditorPropertyTransform2D(); }; @@ -525,7 +546,7 @@ protected: public: virtual void update_property() override; - void setup(double p_min, double p_max, double p_step, bool p_no_slider); + void setup(double p_min, double p_max, double p_step, bool p_no_slider, const String &p_suffix = String()); EditorPropertyBasis(); }; @@ -542,7 +563,7 @@ protected: public: virtual void update_property() override; virtual void update_using_transform(Transform3D p_transform); - void setup(double p_min, double p_max, double p_step, bool p_no_slider); + void setup(double p_min, double p_max, double p_step, bool p_no_slider, const String &p_suffix = String()); EditorPropertyTransform3D(); }; @@ -647,10 +668,10 @@ class EditorInspectorDefaultPlugin : public EditorInspectorPlugin { public: virtual bool can_handle(Object *p_object) override; virtual void parse_begin(Object *p_object) override; - virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide = false) override; + virtual bool parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide = false) override; virtual void parse_end() override; - static EditorProperty *get_editor_for_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide = false); + static EditorProperty *get_editor_for_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide = false); }; #endif // EDITOR_PROPERTIES_H diff --git a/editor/editor_properties_array_dict.cpp b/editor/editor_properties_array_dict.cpp index 9987aaf3fe..8b67b67571 100644 --- a/editor/editor_properties_array_dict.cpp +++ b/editor/editor_properties_array_dict.cpp @@ -30,16 +30,18 @@ #include "editor_properties_array_dict.h" +#include "core/input/input.h" #include "core/io/marshalls.h" +#include "editor/editor_node.h" #include "editor/editor_scale.h" #include "editor_properties.h" bool EditorPropertyArrayObject::_set(const StringName &p_name, const Variant &p_value) { - String pn = p_name; + String name = p_name; - if (pn.begins_with("indices")) { - int idx = pn.get_slicec('/', 1).to_int(); - array.set(idx, p_value); + if (name.begins_with("indices")) { + int index = name.get_slicec('/', 1).to_int(); + array.set(index, p_value); return true; } @@ -47,12 +49,12 @@ bool EditorPropertyArrayObject::_set(const StringName &p_name, const Variant &p_ } bool EditorPropertyArrayObject::_get(const StringName &p_name, Variant &r_ret) const { - String pn = p_name; + String name = p_name; - if (pn.begins_with("indices")) { - int idx = pn.get_slicec('/', 1).to_int(); + if (name.begins_with("indices")) { + int index = name.get_slicec('/', 1).to_int(); bool valid; - r_ret = array.get(idx, &valid); + r_ret = array.get(index, &valid); if (r_ret.get_type() == Variant::OBJECT && Object::cast_to<EncodedObjectAsID>(r_ret)) { r_ret = Object::cast_to<EncodedObjectAsID>(r_ret)->get_object_id(); } @@ -77,21 +79,21 @@ EditorPropertyArrayObject::EditorPropertyArrayObject() { /////////////////// bool EditorPropertyDictionaryObject::_set(const StringName &p_name, const Variant &p_value) { - String pn = p_name; + String name = p_name; - if (pn == "new_item_key") { + if (name == "new_item_key") { new_item_key = p_value; return true; } - if (pn == "new_item_value") { + if (name == "new_item_value") { new_item_value = p_value; return true; } - if (pn.begins_with("indices")) { - int idx = pn.get_slicec('/', 1).to_int(); - Variant key = dict.get_key_at_index(idx); + if (name.begins_with("indices")) { + int index = name.get_slicec('/', 1).to_int(); + Variant key = dict.get_key_at_index(index); dict[key] = p_value; return true; } @@ -100,21 +102,21 @@ bool EditorPropertyDictionaryObject::_set(const StringName &p_name, const Varian } bool EditorPropertyDictionaryObject::_get(const StringName &p_name, Variant &r_ret) const { - String pn = p_name; + String name = p_name; - if (pn == "new_item_key") { + if (name == "new_item_key") { r_ret = new_item_key; return true; } - if (pn == "new_item_value") { + if (name == "new_item_value") { r_ret = new_item_value; return true; } - if (pn.begins_with("indices")) { - int idx = pn.get_slicec('/', 1).to_int(); - Variant key = dict.get_key_at_index(idx); + if (name.begins_with("indices")) { + int index = name.get_slicec('/', 1).to_int(); + Variant key = dict.get_key_at_index(index); r_ret = dict[key]; if (r_ret.get_type() == Variant::OBJECT && Object::cast_to<EncodedObjectAsID>(r_ret)) { r_ret = Object::cast_to<EncodedObjectAsID>(r_ret)->get_object_id(); @@ -157,13 +159,13 @@ EditorPropertyDictionaryObject::EditorPropertyDictionaryObject() { void EditorPropertyArray::_property_changed(const String &p_property, Variant p_value, const String &p_name, bool p_changing) { if (p_property.begins_with("indices")) { - int idx = p_property.get_slice("/", 1).to_int(); + int index = p_property.get_slice("/", 1).to_int(); Variant array = object->get_array(); - array.set(idx, p_value); + array.set(index, p_value); emit_changed(get_edited_property(), array, "", true); if (array.get_type() == Variant::ARRAY) { - array = array.call("duplicate"); //dupe, so undo/redo works better + array = array.call("duplicate"); // Duplicate, so undo/redo works better. } object->set_array(array); } @@ -171,7 +173,7 @@ void EditorPropertyArray::_property_changed(const String &p_property, Variant p_ void EditorPropertyArray::_change_type(Object *p_button, int p_index) { Button *button = Object::cast_to<Button>(p_button); - changing_type_idx = p_index; + changing_type_index = p_index; Rect2 rect = button->get_screen_rect(); change_type->set_as_minsize(); change_type->set_position(rect.position + rect.size - Vector2(change_type->get_contents_minimum_size().x, 0)); @@ -180,7 +182,7 @@ void EditorPropertyArray::_change_type(Object *p_button, int p_index) { void EditorPropertyArray::_change_type_menu(int p_index) { if (p_index == Variant::VARIANT_MAX) { - _remove_pressed(changing_type_idx); + _remove_pressed(changing_type_index); return; } @@ -188,12 +190,12 @@ void EditorPropertyArray::_change_type_menu(int p_index) { Callable::CallError ce; Variant::construct(Variant::Type(p_index), value, nullptr, 0, ce); Variant array = object->get_array(); - array.set(changing_type_idx, value); + array.set(changing_type_index, value); emit_changed(get_edited_property(), array, "", true); if (array.get_type() == Variant::ARRAY) { - array = array.call("duplicate"); //dupe, so undo/redo works better + array = array.call("duplicate"); // Duplicate, so undo/redo works better. } object->set_array(array); @@ -213,7 +215,7 @@ void EditorPropertyArray::update_property() { arrtype = "Array"; } break; - // arrays + // Arrays. case Variant::PACKED_BYTE_ARRAY: { arrtype = "PackedByteArray"; } break; @@ -256,7 +258,12 @@ void EditorPropertyArray::update_property() { return; } - edit->set_text(arrtype + " (size " + itos(array.call("size")) + ")"); + int size = array.call("size"); + int pages = MAX(0, size - 1) / page_length + 1; + page_index = MIN(page_index, pages - 1); + int offset = page_index * page_length; + + edit->set_text(arrtype + " (size " + itos(size) + ")"); bool unfolded = get_edited_object()->editor_is_section_unfolded(get_edited_property()); if (edit->is_pressed() != unfolded) { @@ -270,50 +277,50 @@ void EditorPropertyArray::update_property() { vbox = memnew(VBoxContainer); add_child(vbox); set_bottom_editor(vbox); - HBoxContainer *hbc = memnew(HBoxContainer); - vbox->add_child(hbc); + + HBoxContainer *hbox = memnew(HBoxContainer); + vbox->add_child(hbox); + Label *label = memnew(Label(TTR("Size: "))); label->set_h_size_flags(SIZE_EXPAND_FILL); - hbc->add_child(label); - length = memnew(EditorSpinSlider); - length->set_step(1); - length->set_max(1000000); - length->set_h_size_flags(SIZE_EXPAND_FILL); - hbc->add_child(length); - length->connect("value_changed", callable_mp(this, &EditorPropertyArray::_length_changed)); - - page_hb = memnew(HBoxContainer); - vbox->add_child(page_hb); - label = memnew(Label(TTR("Page: "))); - label->set_h_size_flags(SIZE_EXPAND_FILL); - page_hb->add_child(label); - page = memnew(EditorSpinSlider); - page->set_step(1); - page_hb->add_child(page); - page->set_h_size_flags(SIZE_EXPAND_FILL); - page->connect("value_changed", callable_mp(this, &EditorPropertyArray::_page_changed)); - } else { - //bye bye children of the box - while (vbox->get_child_count() > 2) { - vbox->get_child(2)->queue_delete(); // button still needed after pressed is called - vbox->remove_child(vbox->get_child(2)); - } - } + hbox->add_child(label); - int len = array.call("size"); + size_slider = memnew(EditorSpinSlider); + size_slider->set_step(1); + size_slider->set_max(1000000); + size_slider->set_h_size_flags(SIZE_EXPAND_FILL); + size_slider->connect("value_changed", callable_mp(this, &EditorPropertyArray::_length_changed)); + hbox->add_child(size_slider); - length->set_value(len); + page_hbox = memnew(HBoxContainer); + vbox->add_child(page_hbox); - int pages = MAX(0, len - 1) / page_len + 1; + label = memnew(Label(TTR("Page: "))); + label->set_h_size_flags(SIZE_EXPAND_FILL); + page_hbox->add_child(label); - page->set_max(pages); - page_idx = MIN(page_idx, pages - 1); - page->set_value(page_idx); - page_hb->set_visible(pages > 1); + page_slider = memnew(EditorSpinSlider); + page_slider->set_step(1); + page_slider->set_h_size_flags(SIZE_EXPAND_FILL); + page_slider->connect("value_changed", callable_mp(this, &EditorPropertyArray::_page_changed)); + page_hbox->add_child(page_slider); + } else { + // Bye bye children of the box. + for (int i = vbox->get_child_count() - 1; i >= 2; i--) { + Node *child = vbox->get_child(i); + if (child == reorder_selected_element_hbox) { + continue; // Don't remove the property that the user is moving. + } - int offset = page_idx * page_len; + child->queue_delete(); // Button still needed after pressed is called. + vbox->remove_child(child); + } + } - int amount = MIN(len - offset, page_len); + size_slider->set_value(size); + page_slider->set_max(pages); + page_slider->set_value(page_index); + page_hbox->set_visible(pages > 1); if (array.get_type() == Variant::ARRAY) { array = array.call("duplicate"); @@ -321,7 +328,31 @@ void EditorPropertyArray::update_property() { object->set_array(array); + int amount = MIN(size - offset, page_length); for (int i = 0; i < amount; i++) { + bool reorder_is_from_current_page = reorder_from_index / page_length == page_index; + if (reorder_is_from_current_page && i == reorder_from_index % page_length) { + // Don't duplicate the property that the user is moving. + continue; + } + if (!reorder_is_from_current_page && i == reorder_to_index % page_length) { + // Don't create the property the moving property will take the place of, + // e.g. (if page_length == 20) don't create element 20 if dragging an item from + // the first page to the second page because element 20 would become element 19. + continue; + } + + HBoxContainer *hbox = memnew(HBoxContainer); + vbox->add_child(hbox); + + Button *reorder_button = memnew(Button); + reorder_button->set_icon(get_theme_icon("TripleBar", "EditorIcons")); + reorder_button->set_default_cursor_shape(Control::CURSOR_MOVE); + reorder_button->connect("gui_input", callable_mp(this, &EditorPropertyArray::_reorder_button_gui_input)); + reorder_button->connect("button_down", callable_mp(this, &EditorPropertyArray::_reorder_button_down), varray(i + offset)); + reorder_button->connect("button_up", callable_mp(this, &EditorPropertyArray::_reorder_button_up)); + hbox->add_child(reorder_button); + String prop_name = "indices/" + itos(i + offset); EditorProperty *prop = nullptr; @@ -337,7 +368,7 @@ void EditorPropertyArray::update_property() { editor->setup("Object"); prop = editor; } else { - prop = EditorInspector::instantiate_property_editor(nullptr, value_type, "", subtype_hint, subtype_hint_string, 0); + prop = EditorInspector::instantiate_property_editor(nullptr, value_type, "", subtype_hint, subtype_hint_string, PROPERTY_USAGE_NONE); } prop->set_object_and_property(object.ptr(), prop_name); @@ -346,29 +377,29 @@ void EditorPropertyArray::update_property() { prop->connect("property_changed", callable_mp(this, &EditorPropertyArray::_property_changed)); prop->connect("object_id_selected", callable_mp(this, &EditorPropertyArray::_object_id_selected)); prop->set_h_size_flags(SIZE_EXPAND_FILL); - - HBoxContainer *hb = memnew(HBoxContainer); - - vbox->add_child(hb); - hb->add_child(prop); + hbox->add_child(prop); bool is_untyped_array = array.get_type() == Variant::ARRAY && subtype == Variant::NIL; if (is_untyped_array) { Button *edit = memnew(Button); edit->set_icon(get_theme_icon("Edit", "EditorIcons")); - hb->add_child(edit); + hbox->add_child(edit); edit->connect("pressed", callable_mp(this, &EditorPropertyArray::_change_type), varray(edit, i + offset)); } else { Button *remove = memnew(Button); remove->set_icon(get_theme_icon("Remove", "EditorIcons")); remove->connect("pressed", callable_mp(this, &EditorPropertyArray::_remove_pressed), varray(i + offset)); - hb->add_child(remove); + hbox->add_child(remove); } prop->update_property(); } + if (reorder_to_index % page_length > 0) { + vbox->move_child(vbox->get_child(2), reorder_to_index % page_length + 2); + } + updating = false; } else { @@ -384,12 +415,7 @@ void EditorPropertyArray::_remove_pressed(int p_index) { Variant array = object->get_array(); array.call("remove", p_index); - if (array.get_type() == Variant::ARRAY) { - array = array.call("duplicate"); - } - emit_changed(get_edited_property(), array, "", false); - object->set_array(array); update_property(); } @@ -414,14 +440,14 @@ bool EditorPropertyArray::_is_drop_valid(const Dictionary &p_drag_data) const { for (int j = 0; j < allowed_type.get_slice_count(","); j++) { String at = allowed_type.get_slice(",", j).strip_edges(); - // Fail if one of the files is not of allowed type + // Fail if one of the files is not of allowed type. if (!ClassDB::is_parent_class(ftype, at)) { return false; } } } - // If no files fail, drop is valid + // If no files fail, drop is valid. return true; } @@ -442,13 +468,13 @@ void EditorPropertyArray::drop_data_fw(const Point2 &p_point, const Variant &p_d Variant array = object->get_array(); - // Handle the case where array is not initialised yet + // Handle the case where array is not initialised yet. if (!array.is_array()) { Callable::CallError ce; Variant::construct(array_type, array, nullptr, 0, ce); } - // Loop the file array and add to existing array + // Loop the file array and add to existing array. for (int i = 0; i < files.size(); i++) { String file = files[i]; @@ -504,7 +530,7 @@ void EditorPropertyArray::_page_changed(double p_page) { if (updating) { return; } - page_idx = p_page; + page_index = p_page; update_property(); } @@ -530,10 +556,10 @@ void EditorPropertyArray::_length_changed(double p_page) { } } } - array = array.call("duplicate"); //dupe, so undo/redo works better + array = array.call("duplicate"); // Duplicate, so undo/redo works better. } else { int size = array.call("size"); - // Pool*Array don't initialize their elements, have to do it manually + // Pool*Array don't initialize their elements, have to do it manually. for (int i = previous_size; i < size; i++) { Callable::CallError ce; Variant r; @@ -551,7 +577,7 @@ void EditorPropertyArray::setup(Variant::Type p_array_type, const String &p_hint array_type = p_array_type; // The format of p_hint_string is: - // subType/subTypeHint:nextSubtype ... etc + // subType/subTypeHint:nextSubtype ... etc. if (array_type == Variant::ARRAY && !p_hint_string.is_empty()) { int hint_subtype_separator = p_hint_string.find(":"); if (hint_subtype_separator >= 0) { @@ -568,6 +594,73 @@ void EditorPropertyArray::setup(Variant::Type p_array_type, const String &p_hint } } +void EditorPropertyArray::_reorder_button_gui_input(const Ref<InputEvent> &p_event) { + if (reorder_from_index < 0) { + return; + } + + Ref<InputEventMouseMotion> mm = p_event; + if (mm.is_valid()) { + Variant array = object->get_array(); + int size = array.call("size"); + + if ((reorder_to_index == 0 && mm->get_relative().y < 0.0f) || (reorder_to_index == size - 1 && mm->get_relative().y > 0.0f)) { + return; + } + + reorder_mouse_y_delta += mm->get_relative().y; + float required_y_distance = 20.0f * EDSCALE; + if (ABS(reorder_mouse_y_delta) > required_y_distance) { + int direction = reorder_mouse_y_delta > 0.0f ? 1 : -1; + reorder_mouse_y_delta -= required_y_distance * direction; + + reorder_to_index += direction; + if ((direction < 0 && reorder_to_index % page_length == page_length - 1) || (direction > 0 && reorder_to_index % page_length == 0)) { + // Automatically move to the next/previous page. + page_slider->set_value(page_index + direction); + } + vbox->move_child(reorder_selected_element_hbox, reorder_to_index % page_length + 2); + // Ensure the moving element is visible. + EditorNode::get_singleton()->get_inspector()->ensure_control_visible(reorder_selected_element_hbox); + } + } +} + +void EditorPropertyArray::_reorder_button_down(int p_index) { + reorder_from_index = p_index; + reorder_to_index = p_index; + reorder_selected_element_hbox = Object::cast_to<HBoxContainer>(vbox->get_child(p_index % page_length + 2)); + reorder_selected_button = Object::cast_to<Button>(reorder_selected_element_hbox->get_child(0)); + // Ideally it'd to be able to show the mouse but I had issues with + // Control's `mouse_exit()`/`mouse_entered()` signals not getting called. + Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_CAPTURED); +} + +void EditorPropertyArray::_reorder_button_up() { + if (reorder_from_index != reorder_to_index) { + // Move the element. + Variant array = object->get_array(); + + Variant value_to_move = array.get(reorder_from_index); + array.call("remove", reorder_from_index); + array.call("insert", reorder_to_index, value_to_move); + + emit_changed(get_edited_property(), array, "", false); + object->set_array(array); + update_property(); + } + + reorder_from_index = -1; + reorder_to_index = -1; + reorder_mouse_y_delta = 0.0f; + + Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE); + reorder_selected_button->warp_mouse(reorder_selected_button->get_size() / 2.0f); + + reorder_selected_element_hbox = nullptr; + reorder_selected_button = nullptr; +} + void EditorPropertyArray::_bind_methods() { ClassDB::bind_method(D_METHOD("_can_drop_data_fw"), &EditorPropertyArray::can_drop_data_fw); ClassDB::bind_method(D_METHOD("_drop_data_fw"), &EditorPropertyArray::drop_data_fw); @@ -575,7 +668,7 @@ void EditorPropertyArray::_bind_methods() { EditorPropertyArray::EditorPropertyArray() { object.instantiate(); - page_len = int(EDITOR_GET("interface/inspector/max_array_dictionary_items_per_page")); + page_length = int(EDITOR_GET("interface/inspector/max_array_dictionary_items_per_page")); edit = memnew(Button); edit->set_h_size_flags(SIZE_EXPAND_FILL); edit->set_clip_text(true); @@ -586,8 +679,8 @@ EditorPropertyArray::EditorPropertyArray() { add_child(edit); add_focusable(edit); vbox = nullptr; - page = nullptr; - length = nullptr; + page_slider = nullptr; + size_slider = nullptr; updating = false; change_type = memnew(PopupMenu); add_child(change_type); @@ -599,7 +692,7 @@ EditorPropertyArray::EditorPropertyArray() { } change_type->add_separator(); change_type->add_item(TTR("Remove Item"), Variant::VARIANT_MAX); - changing_type_idx = -1; + changing_type_index = -1; subtype = Variant::NIL; subtype_hint = PROPERTY_HINT_NONE; @@ -616,14 +709,14 @@ void EditorPropertyDictionary::_property_changed(const String &p_property, Varia } else if (p_property == "new_item_value") { object->set_new_item_value(p_value); } else if (p_property.begins_with("indices")) { - int idx = p_property.get_slice("/", 1).to_int(); + int index = p_property.get_slice("/", 1).to_int(); Dictionary dict = object->get_dict(); - Variant key = dict.get_key_at_index(idx); + Variant key = dict.get_key_at_index(index); dict[key] = p_value; emit_changed(get_edited_property(), dict, "", true); - dict = dict.duplicate(); //dupe, so undo/redo works better + dict = dict.duplicate(); // Duplicate, so undo/redo works better\. object->set_dict(dict); } } @@ -635,7 +728,7 @@ void EditorPropertyDictionary::_change_type(Object *p_button, int p_index) { change_type->set_as_minsize(); change_type->set_position(rect.position + rect.size - Vector2(change_type->get_contents_minimum_size().x, 0)); change_type->popup(); - changing_type_idx = p_index; + changing_type_index = p_index; } void EditorPropertyDictionary::_add_key_value() { @@ -652,17 +745,17 @@ void EditorPropertyDictionary::_add_key_value() { emit_changed(get_edited_property(), dict, "", false); - dict = dict.duplicate(); //dupe, so undo/redo works better + dict = dict.duplicate(); // Duplicate, so undo/redo works better. object->set_dict(dict); update_property(); } void EditorPropertyDictionary::_change_type_menu(int p_index) { - if (changing_type_idx < 0) { + if (changing_type_index < 0) { Variant value; Callable::CallError ce; Variant::construct(Variant::Type(p_index), value, nullptr, 0, ce); - if (changing_type_idx == -1) { + if (changing_type_index == -1) { object->set_new_item_key(value); } else { object->set_new_item_value(value); @@ -677,16 +770,16 @@ void EditorPropertyDictionary::_change_type_menu(int p_index) { Variant value; Callable::CallError ce; Variant::construct(Variant::Type(p_index), value, nullptr, 0, ce); - Variant key = dict.get_key_at_index(changing_type_idx); + Variant key = dict.get_key_at_index(changing_type_index); dict[key] = value; } else { - Variant key = dict.get_key_at_index(changing_type_idx); + Variant key = dict.get_key_at_index(changing_type_index); dict.erase(key); } emit_changed(get_edited_property(), dict, "", false); - dict = dict.duplicate(); //dupe, so undo/redo works better + dict = dict.duplicate(); // Duplicate, so undo/redo works better\. object->set_dict(dict); update_property(); } @@ -695,7 +788,7 @@ void EditorPropertyDictionary::update_property() { Variant updated_val = get_edited_object()->get(get_edited_property()); if (updated_val.get_type() == Variant::NIL) { - edit->set_text("Dictionary (Nil)"); //This provides symmetry with the array property. + edit->set_text("Dictionary (Nil)"); // This provides symmetry with the array property. edit->set_pressed(false); if (vbox) { set_bottom_editor(nullptr); @@ -722,16 +815,16 @@ void EditorPropertyDictionary::update_property() { add_child(vbox); set_bottom_editor(vbox); - page_hb = memnew(HBoxContainer); - vbox->add_child(page_hb); + page_hbox = memnew(HBoxContainer); + vbox->add_child(page_hbox); Label *label = memnew(Label(TTR("Page: "))); label->set_h_size_flags(SIZE_EXPAND_FILL); - page_hb->add_child(label); - page = memnew(EditorSpinSlider); - page->set_step(1); - page_hb->add_child(page); - page->set_h_size_flags(SIZE_EXPAND_FILL); - page->connect("value_changed", callable_mp(this, &EditorPropertyDictionary::_page_changed)); + page_hbox->add_child(label); + page_slider = memnew(EditorSpinSlider); + page_slider->set_step(1); + page_hbox->add_child(page_slider); + page_slider->set_h_size_flags(SIZE_EXPAND_FILL); + page_slider->connect("value_changed", callable_mp(this, &EditorPropertyDictionary::_page_changed)); } else { // Queue children for deletion, deleting immediately might cause errors. for (int i = 1; i < vbox->get_child_count(); i++) { @@ -739,18 +832,18 @@ void EditorPropertyDictionary::update_property() { } } - int len = dict.size(); + int size = dict.size(); - int pages = MAX(0, len - 1) / page_len + 1; + int pages = MAX(0, size - 1) / page_length + 1; - page->set_max(pages); - page_idx = MIN(page_idx, pages - 1); - page->set_value(page_idx); - page_hb->set_visible(pages > 1); + page_slider->set_max(pages); + page_index = MIN(page_index, pages - 1); + page_slider->set_value(page_index); + page_hbox->set_visible(pages > 1); - int offset = page_idx * page_len; + int offset = page_index * page_length; - int amount = MIN(len - offset, page_len); + int amount = MIN(size - offset, page_length); dict = dict.duplicate(); @@ -782,7 +875,7 @@ void EditorPropertyDictionary::update_property() { } break; - // atomic types + // Atomic types. case Variant::BOOL: { prop = memnew(EditorPropertyCheck); @@ -803,7 +896,7 @@ void EditorPropertyDictionary::update_property() { } break; - // math types + // Math types. case Variant::VECTOR2: { EditorPropertyVector2 *editor = memnew(EditorPropertyVector2); editor->setup(-100000, 100000, 0.001, true); @@ -877,7 +970,7 @@ void EditorPropertyDictionary::update_property() { } break; - // misc types + // Miscellaneous types. case Variant::COLOR: { prop = memnew(EditorPropertyColor); @@ -919,7 +1012,7 @@ void EditorPropertyDictionary::update_property() { prop = editor; } break; - // arrays + // Arrays. case Variant::PACKED_BYTE_ARRAY: { EditorPropertyArray *editor = memnew(EditorPropertyArray); editor->setup(Variant::PACKED_BYTE_ARRAY); @@ -1003,17 +1096,17 @@ void EditorPropertyDictionary::update_property() { prop->connect("property_changed", callable_mp(this, &EditorPropertyDictionary::_property_changed)); prop->connect("object_id_selected", callable_mp(this, &EditorPropertyDictionary::_object_id_selected)); - HBoxContainer *hb = memnew(HBoxContainer); + HBoxContainer *hbox = memnew(HBoxContainer); if (add_vbox) { - add_vbox->add_child(hb); + add_vbox->add_child(hbox); } else { - vbox->add_child(hb); + vbox->add_child(hbox); } - hb->add_child(prop); + hbox->add_child(prop); prop->set_h_size_flags(SIZE_EXPAND_FILL); Button *edit = memnew(Button); edit->set_icon(get_theme_icon("Edit", "EditorIcons")); - hb->add_child(edit); + hbox->add_child(edit); edit->connect("pressed", callable_mp(this, &EditorPropertyDictionary::_change_type), varray(edit, change_index)); prop->update_property(); @@ -1060,7 +1153,7 @@ void EditorPropertyDictionary::_page_changed(double p_page) { if (updating) { return; } - page_idx = p_page; + page_index = p_page; update_property(); } @@ -1069,7 +1162,7 @@ void EditorPropertyDictionary::_bind_methods() { EditorPropertyDictionary::EditorPropertyDictionary() { object.instantiate(); - page_len = int(EDITOR_GET("interface/inspector/max_array_dictionary_items_per_page")); + page_length = int(EDITOR_GET("interface/inspector/max_array_dictionary_items_per_page")); edit = memnew(Button); edit->set_h_size_flags(SIZE_EXPAND_FILL); edit->set_clip_text(true); @@ -1078,7 +1171,7 @@ EditorPropertyDictionary::EditorPropertyDictionary() { add_child(edit); add_focusable(edit); vbox = nullptr; - page = nullptr; + page_slider = nullptr; updating = false; change_type = memnew(PopupMenu); add_child(change_type); @@ -1090,5 +1183,5 @@ EditorPropertyDictionary::EditorPropertyDictionary() { } change_type->add_separator(); change_type->add_item(TTR("Remove Item"), Variant::VARIANT_MAX); - changing_type_idx = -1; + changing_type_index = -1; } diff --git a/editor/editor_properties_array_dict.h b/editor/editor_properties_array_dict.h index aa2d8744b1..7547d57346 100644 --- a/editor/editor_properties_array_dict.h +++ b/editor/editor_properties_array_dict.h @@ -84,19 +84,25 @@ class EditorPropertyArray : public EditorProperty { bool dropping; Ref<EditorPropertyArrayObject> object; - int page_len = 20; - int page_idx = 0; - int changing_type_idx; + int page_length = 20; + int page_index = 0; + int changing_type_index; Button *edit; VBoxContainer *vbox; - EditorSpinSlider *length; - EditorSpinSlider *page; - HBoxContainer *page_hb; + EditorSpinSlider *size_slider; + EditorSpinSlider *page_slider; + HBoxContainer *page_hbox; Variant::Type array_type; Variant::Type subtype; PropertyHint subtype_hint; String subtype_hint_string; + int reorder_from_index = -1; + int reorder_to_index = -1; + float reorder_mouse_y_delta = 0.0f; + HBoxContainer *reorder_selected_element_hbox = nullptr; + Button *reorder_selected_button = nullptr; + void _page_changed(double p_page); void _length_changed(double p_page); void _edit_pressed(); @@ -112,6 +118,10 @@ class EditorPropertyArray : public EditorProperty { bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const; void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from); + void _reorder_button_gui_input(const Ref<InputEvent> &p_event); + void _reorder_button_down(int p_index); + void _reorder_button_up(); + protected: static void _bind_methods(); void _notification(int p_what); @@ -129,14 +139,14 @@ class EditorPropertyDictionary : public EditorProperty { bool updating; Ref<EditorPropertyDictionaryObject> object; - int page_len = 20; - int page_idx = 0; - int changing_type_idx; + int page_length = 20; + int page_index = 0; + int changing_type_index; Button *edit; VBoxContainer *vbox; - EditorSpinSlider *length; - EditorSpinSlider *page; - HBoxContainer *page_hb; + EditorSpinSlider *size_slider; + EditorSpinSlider *page_slider; + HBoxContainer *page_hbox; void _page_changed(double p_page); void _edit_pressed(); diff --git a/editor/editor_resource_picker.cpp b/editor/editor_resource_picker.cpp index 350fc5eccb..4d9865622c 100644 --- a/editor/editor_resource_picker.cpp +++ b/editor/editor_resource_picker.cpp @@ -205,7 +205,7 @@ void EditorResourcePicker::_update_menu_items() { icon = get_theme_icon(what, "Resource"); } - edit_menu->add_icon_item(icon, vformat(TTR("Convert To %s"), what), CONVERT_BASE_ID + i); + edit_menu->add_icon_item(icon, vformat(TTR("Convert to %s"), what), CONVERT_BASE_ID + i); } } } diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index 3f02b76ff6..b6f889268f 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -240,19 +240,19 @@ void EditorSettings::_get_property_list(List<PropertyInfo> *p_list) const { } for (Set<_EVCSort>::Element *E = vclist.front(); E; E = E->next()) { - int pinfo = 0; + uint32_t pusage = PROPERTY_USAGE_NONE; if (E->get().save || !optimize_save) { - pinfo |= PROPERTY_USAGE_STORAGE; + pusage |= PROPERTY_USAGE_STORAGE; } if (!E->get().name.begins_with("_") && !E->get().name.begins_with("projects/")) { - pinfo |= PROPERTY_USAGE_EDITOR; + pusage |= PROPERTY_USAGE_EDITOR; } else { - pinfo |= PROPERTY_USAGE_STORAGE; //hiddens must always be saved + pusage |= PROPERTY_USAGE_STORAGE; //hiddens must always be saved } PropertyInfo pi(E->get().type, E->get().name); - pi.usage = pinfo; + pi.usage = pusage; if (hints.has(E->get().name)) { pi = hints[E->get().name]; } @@ -631,6 +631,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { _initial_set("editors/3d/navigation/zoom_style", 0); hints["editors/3d/navigation/zoom_style"] = PropertyInfo(Variant::INT, "editors/3d/navigation/zoom_style", PROPERTY_HINT_ENUM, "Vertical, Horizontal"); + _initial_set("editors/3d/navigation/emulate_numpad", false); _initial_set("editors/3d/navigation/emulate_3_button_mouse", false); _initial_set("editors/3d/navigation/orbit_modifier", 0); hints["editors/3d/navigation/orbit_modifier"] = PropertyInfo(Variant::INT, "editors/3d/navigation/orbit_modifier", PROPERTY_HINT_ENUM, "None,Shift,Alt,Meta,Ctrl"); @@ -883,7 +884,7 @@ void EditorSettings::create() { return; } - ClassDB::register_class<EditorSettings>(); // Otherwise it can't be unserialized. + GDREGISTER_CLASS(EditorSettings); // Otherwise it can't be unserialized. String config_file_path; Ref<ConfigFile> extra_config = memnew(ConfigFile); diff --git a/editor/editor_spin_slider.cpp b/editor/editor_spin_slider.cpp index d8c765911c..aa4a394d30 100644 --- a/editor/editor_spin_slider.cpp +++ b/editor/editor_spin_slider.cpp @@ -206,24 +206,34 @@ void EditorSpinSlider::_notification(int p_what) { // EditorSpinSliders with a label have more space on the left, so add an // higher margin to match the location where the text begins. // The margin values below were determined by empirical testing. - stylebox->set_default_margin(SIDE_LEFT, (get_label() != String() ? 23 : 16) * EDSCALE); + if (is_layout_rtl()) { + stylebox->set_default_margin(SIDE_LEFT, 0); + stylebox->set_default_margin(SIDE_RIGHT, (get_label() != String() ? 23 : 16) * EDSCALE); + } else { + stylebox->set_default_margin(SIDE_LEFT, (get_label() != String() ? 23 : 16) * EDSCALE); + stylebox->set_default_margin(SIDE_RIGHT, 0); + } value_input->add_theme_style_override("normal", stylebox); } if (p_what == NOTIFICATION_DRAW) { updown_offset = -1; + RID ci = get_canvas_item(); + bool rtl = is_layout_rtl(); + Vector2 size = get_size(); + Ref<StyleBox> sb = get_theme_stylebox("normal", "LineEdit"); if (!flat) { - draw_style_box(sb, Rect2(Vector2(), get_size())); + draw_style_box(sb, Rect2(Vector2(), size)); } Ref<Font> font = get_theme_font("font", "LineEdit"); int font_size = get_theme_font_size("font_size", "LineEdit"); int sep_base = 4 * EDSCALE; int sep = sep_base + sb->get_offset().x; //make it have the same margin on both sides, looks better - int string_width = font->get_string_size(label, font_size).width; - int number_width = get_size().width - sb->get_minimum_size().width - string_width - sep; + int label_width = font->get_string_size(label, font_size).width; + int number_width = size.width - sb->get_minimum_size().width - label_width - sep; Ref<Texture2D> updown = get_theme_icon("updown", "SpinBox"); @@ -233,7 +243,7 @@ void EditorSpinSlider::_notification(int p_what) { String numstr = get_text_value(); - int vofs = (get_size().height - font->get_height(font_size)) / 2 + font->get_ascent(font_size); + int vofs = (size.height - font->get_height(font_size)) / 2 + font->get_ascent(font_size); Color fc = get_theme_color("font_color", "LineEdit"); Color lc; @@ -245,22 +255,59 @@ void EditorSpinSlider::_notification(int p_what) { if (flat && label != String()) { Color label_bg_color = get_theme_color("dark_color_3", "Editor"); - draw_rect(Rect2(Vector2(), Vector2(sb->get_offset().x * 2 + string_width, get_size().height)), label_bg_color); + if (rtl) { + draw_rect(Rect2(Vector2(size.width - (sb->get_offset().x * 2 + label_width), 0), Vector2(sb->get_offset().x * 2 + label_width, size.height)), label_bg_color); + } else { + draw_rect(Rect2(Vector2(), Vector2(sb->get_offset().x * 2 + label_width, size.height)), label_bg_color); + } } if (has_focus()) { Ref<StyleBox> focus = get_theme_stylebox("focus", "LineEdit"); - draw_style_box(focus, Rect2(Vector2(), get_size())); + draw_style_box(focus, Rect2(Vector2(), size)); } - draw_string(font, Vector2(Math::round(sb->get_offset().x), vofs), label, HALIGN_LEFT, -1, font_size, lc * Color(1, 1, 1, 0.5)); + if (rtl) { + draw_string(font, Vector2(Math::round(size.width - sb->get_offset().x - label_width), vofs), label, HALIGN_RIGHT, -1, font_size, lc * Color(1, 1, 1, 0.5)); + } else { + draw_string(font, Vector2(Math::round(sb->get_offset().x), vofs), label, HALIGN_LEFT, -1, font_size, lc * Color(1, 1, 1, 0.5)); + } - draw_string(font, Vector2(Math::round(sb->get_offset().x + string_width + sep), vofs), numstr, HALIGN_LEFT, number_width, font_size, fc); + int suffix_start = numstr.length(); + RID num_rid = TS->create_shaped_text(); + TS->shaped_text_add_string(num_rid, numstr + U"\u2009" + suffix, font->get_rids(), font_size); + + float text_start = rtl ? Math::round(sb->get_offset().x) : Math::round(sb->get_offset().x + label_width + sep); + Vector2 text_ofs = rtl ? Vector2(text_start + (number_width - TS->shaped_text_get_width(num_rid)), vofs) : Vector2(text_start, vofs); + const Vector<TextServer::Glyph> visual = TS->shaped_text_get_glyphs(num_rid); + int v_size = visual.size(); + const TextServer::Glyph *glyphs = visual.ptr(); + for (int i = 0; i < v_size; i++) { + for (int j = 0; j < glyphs[i].repeat; j++) { + if (text_ofs.x >= text_start && (text_ofs.x + glyphs[i].advance) <= (text_start + number_width)) { + Color color = fc; + if (glyphs[i].start >= suffix_start) { + color.a *= 0.4; + } + if (glyphs[i].font_rid != RID()) { + TS->font_draw_glyph(glyphs[i].font_rid, ci, glyphs[i].font_size, text_ofs + Vector2(glyphs[i].x_off, glyphs[i].y_off), glyphs[i].index, color); + } else if ((glyphs[i].flags & TextServer::GRAPHEME_IS_VIRTUAL) != TextServer::GRAPHEME_IS_VIRTUAL) { + TS->draw_hex_code_box(ci, glyphs[i].font_size, text_ofs + Vector2(glyphs[i].x_off, glyphs[i].y_off), glyphs[i].index, color); + } + } + text_ofs.x += glyphs[i].advance; + } + } + TS->free(num_rid); if (get_step() == 1) { Ref<Texture2D> updown2 = get_theme_icon("updown", "SpinBox"); - int updown_vofs = (get_size().height - updown2->get_height()) / 2; - updown_offset = get_size().width - sb->get_margin(SIDE_RIGHT) - updown2->get_width(); + int updown_vofs = (size.height - updown2->get_height()) / 2; + if (rtl) { + updown_offset = sb->get_margin(SIDE_LEFT); + } else { + updown_offset = size.width - sb->get_margin(SIDE_RIGHT) - updown2->get_width(); + } Color c(1, 1, 1); if (hover_updown) { c *= Color(1.2, 1.2, 1.2); @@ -271,9 +318,9 @@ void EditorSpinSlider::_notification(int p_what) { } } else if (!hide_slider) { int grabber_w = 4 * EDSCALE; - int width = get_size().width - sb->get_minimum_size().width - grabber_w; + int width = size.width - sb->get_minimum_size().width - grabber_w; int ofs = sb->get_offset().x; - int svofs = (get_size().height + vofs) / 2 - 1; + int svofs = (size.height + vofs) / 2 - 1; Color c = fc; c.a = 0.2; @@ -365,6 +412,15 @@ String EditorSpinSlider::get_label() const { return label; } +void EditorSpinSlider::set_suffix(const String &p_suffix) { + suffix = p_suffix; + update(); +} + +String EditorSpinSlider::get_suffix() const { + return suffix; +} + void EditorSpinSlider::_evaluate_input_text() { // Replace comma with dot to support it as decimal separator (GH-6028). // This prevents using functions like `pow()`, but using functions @@ -468,6 +524,9 @@ void EditorSpinSlider::_bind_methods() { ClassDB::bind_method(D_METHOD("set_label", "label"), &EditorSpinSlider::set_label); ClassDB::bind_method(D_METHOD("get_label"), &EditorSpinSlider::get_label); + ClassDB::bind_method(D_METHOD("set_suffix", "suffix"), &EditorSpinSlider::set_suffix); + ClassDB::bind_method(D_METHOD("get_suffix"), &EditorSpinSlider::get_suffix); + ClassDB::bind_method(D_METHOD("set_read_only", "read_only"), &EditorSpinSlider::set_read_only); ClassDB::bind_method(D_METHOD("is_read_only"), &EditorSpinSlider::is_read_only); @@ -477,6 +536,7 @@ void EditorSpinSlider::_bind_methods() { ClassDB::bind_method(D_METHOD("_gui_input"), &EditorSpinSlider::_gui_input); ADD_PROPERTY(PropertyInfo(Variant::STRING, "label"), "set_label", "get_label"); + ADD_PROPERTY(PropertyInfo(Variant::STRING, "suffix"), "set_suffix", "get_suffix"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "read_only"), "set_read_only", "is_read_only"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "flat"), "set_flat", "is_flat"); } diff --git a/editor/editor_spin_slider.h b/editor/editor_spin_slider.h index 50d04c9583..c30ff30390 100644 --- a/editor/editor_spin_slider.h +++ b/editor/editor_spin_slider.h @@ -39,6 +39,7 @@ class EditorSpinSlider : public Range { GDCLASS(EditorSpinSlider, Range); String label; + String suffix; int updown_offset; bool hover_updown; bool mouse_hover; @@ -93,6 +94,9 @@ public: void set_label(const String &p_label); String get_label() const; + void set_suffix(const String &p_suffix); + String get_suffix() const; + void set_hide_slider(bool p_hide); bool is_hiding_slider() const; diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp index 131a77e52f..986fc147f9 100644 --- a/editor/editor_themes.cpp +++ b/editor/editor_themes.cpp @@ -1004,6 +1004,9 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { // LineEdit Ref<StyleBoxFlat> style_line_edit = style_widget->duplicate(); + // The original style_widget style has an extra 1 pixel offset that makes LineEdits not align with Buttons, + // so this compensates for that. + style_line_edit->set_default_margin(SIDE_TOP, style_line_edit->get_default_margin(SIDE_TOP) - 1 * EDSCALE); // Add a bottom line to make LineEdits more visible, especially in sectioned inspectors // such as the Project Settings. style_line_edit->set_border_width(SIDE_BOTTOM, Math::round(2 * EDSCALE)); diff --git a/editor/editor_vcs_interface.h b/editor/editor_vcs_interface.h index af952eaffc..52ab6d68ee 100644 --- a/editor/editor_vcs_interface.h +++ b/editor/editor_vcs_interface.h @@ -46,16 +46,16 @@ protected: static void _bind_methods(); // Implemented by addons as end points for the proxy functions - bool _initialize(String p_project_root_path); - bool _is_vcs_initialized(); - Dictionary _get_modified_files_data(); - void _stage_file(String p_file_path); - void _unstage_file(String p_file_path); - void _commit(String p_msg); - Array _get_file_diff(String p_file_path); - bool _shut_down(); - String _get_project_name(); - String _get_vcs_name(); + virtual bool _initialize(String p_project_root_path); + virtual bool _is_vcs_initialized(); + virtual Dictionary _get_modified_files_data(); + virtual void _stage_file(String p_file_path); + virtual void _unstage_file(String p_file_path); + virtual void _commit(String p_msg); + virtual Array _get_file_diff(String p_file_path); + virtual bool _shut_down(); + virtual String _get_project_name(); + virtual String _get_vcs_name(); public: static EditorVCSInterface *get_singleton(); diff --git a/editor/editor_zoom_widget.cpp b/editor/editor_zoom_widget.cpp index f9be829493..44751a480a 100644 --- a/editor/editor_zoom_widget.cpp +++ b/editor/editor_zoom_widget.cpp @@ -51,17 +51,17 @@ void EditorZoomWidget::_update_zoom_label() { } void EditorZoomWidget::_button_zoom_minus() { - set_zoom_by_increments(-6); + set_zoom_by_increments(-6, Input::get_singleton()->is_key_pressed(KEY_ALT)); emit_signal("zoom_changed", zoom); } void EditorZoomWidget::_button_zoom_reset() { - set_zoom(1.0); + set_zoom(1.0 * MAX(1, EDSCALE)); emit_signal("zoom_changed", zoom); } void EditorZoomWidget::_button_zoom_plus() { - set_zoom_by_increments(6); + set_zoom_by_increments(6, Input::get_singleton()->is_key_pressed(KEY_ALT)); emit_signal("zoom_changed", zoom); } @@ -76,31 +76,69 @@ void EditorZoomWidget::set_zoom(float p_zoom) { } } -void EditorZoomWidget::set_zoom_by_increments(int p_increment_count) { - // Base increment factor defined as the twelveth root of two. - // This allow a smooth geometric evolution of the zoom, with the advantage of - // visiting all integer power of two scale factors. - // note: this is analogous to the 'semitones' interval in the music world - // In order to avoid numerical imprecisions, we compute and edit a zoom index - // with the following relation: zoom = 2 ^ (index / 12) - - if (zoom < CMP_EPSILON || p_increment_count == 0) { - return; - } +void EditorZoomWidget::set_zoom_by_increments(int p_increment_count, bool p_integer_only) { + // Remove editor scale from the index computation. + const float zoom_noscale = zoom / MAX(1, EDSCALE); + + if (p_integer_only) { + // Only visit integer scaling factors above 100%, and fractions with an integer denominator below 100% + // (1/2 = 50%, 1/3 = 33.33%, 1/4 = 25%, …). + // This is useful when working on pixel art projects to avoid distortion. + // This algorithm is designed to handle fractional start zoom values correctly + // (e.g. 190% will zoom up to 200% and down to 100%). + if (zoom_noscale + p_increment_count * 0.001 >= 1.0 - CMP_EPSILON) { + // New zoom is certain to be above 100%. + if (p_increment_count >= 1) { + // Zooming. + set_zoom(Math::floor(zoom_noscale + p_increment_count) * MAX(1, EDSCALE)); + } else { + // Dezooming. + set_zoom(Math::ceil(zoom_noscale + p_increment_count) * MAX(1, EDSCALE)); + } + } else { + if (p_increment_count >= 1) { + // Zooming. Convert the current zoom into a denominator. + float new_zoom = 1.0 / Math::ceil(1.0 / zoom_noscale - p_increment_count); + if (Math::is_equal_approx(zoom_noscale, new_zoom)) { + // New zoom is identical to the old zoom, so try again. + // This can happen due to floating-point precision issues. + new_zoom = 1.0 / Math::ceil(1.0 / zoom_noscale - p_increment_count - 1); + } + set_zoom(new_zoom * MAX(1, EDSCALE)); + } else { + // Dezooming. Convert the current zoom into a denominator. + float new_zoom = 1.0 / Math::floor(1.0 / zoom_noscale - p_increment_count); + if (Math::is_equal_approx(zoom_noscale, new_zoom)) { + // New zoom is identical to the old zoom, so try again. + // This can happen due to floating-point precision issues. + new_zoom = 1.0 / Math::floor(1.0 / zoom_noscale - p_increment_count + 1); + } + set_zoom(new_zoom * MAX(1, EDSCALE)); + } + } + } else { + // Base increment factor defined as the twelveth root of two. + // This allow a smooth geometric evolution of the zoom, with the advantage of + // visiting all integer power of two scale factors. + // note: this is analogous to the 'semitones' interval in the music world + // In order to avoid numerical imprecisions, we compute and edit a zoom index + // with the following relation: zoom = 2 ^ (index / 12) - // Remove Editor scale from the index computation - float zoom_noscale = zoom / MAX(1, EDSCALE); + if (zoom < CMP_EPSILON || p_increment_count == 0) { + return; + } - // zoom = 2**(index/12) => log2(zoom) = index/12 - float closest_zoom_index = Math::round(Math::log(zoom_noscale) * 12.f / Math::log(2.f)); + // zoom = 2**(index/12) => log2(zoom) = index/12 + float closest_zoom_index = Math::round(Math::log(zoom_noscale) * 12.f / Math::log(2.f)); - float new_zoom_index = closest_zoom_index + p_increment_count; - float new_zoom = Math::pow(2.f, new_zoom_index / 12.f); + float new_zoom_index = closest_zoom_index + p_increment_count; + float new_zoom = Math::pow(2.f, new_zoom_index / 12.f); - // Restore Editor scale transformation - new_zoom *= MAX(1, EDSCALE); + // Restore Editor scale transformation + new_zoom *= MAX(1, EDSCALE); - set_zoom(new_zoom); + set_zoom(new_zoom); + } } void EditorZoomWidget::_notification(int p_what) { @@ -118,7 +156,7 @@ void EditorZoomWidget::_notification(int p_what) { void EditorZoomWidget::_bind_methods() { ClassDB::bind_method(D_METHOD("set_zoom", "zoom"), &EditorZoomWidget::set_zoom); ClassDB::bind_method(D_METHOD("get_zoom"), &EditorZoomWidget::get_zoom); - ClassDB::bind_method(D_METHOD("set_zoom_by_increments", "increment"), &EditorZoomWidget::set_zoom_by_increments); + ClassDB::bind_method(D_METHOD("set_zoom_by_increments", "increment", "integer_only"), &EditorZoomWidget::set_zoom_by_increments); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "zoom"), "set_zoom", "get_zoom"); diff --git a/editor/editor_zoom_widget.h b/editor/editor_zoom_widget.h index 4e95018e52..c35faeefe7 100644 --- a/editor/editor_zoom_widget.h +++ b/editor/editor_zoom_widget.h @@ -56,7 +56,7 @@ public: float get_zoom(); void set_zoom(float p_zoom); - void set_zoom_by_increments(int p_increment_count); + void set_zoom_by_increments(int p_increment_count, bool p_integer_only = false); }; #endif // EDITOR_ZOOM_WIDGET_H diff --git a/editor/export_template_manager.cpp b/editor/export_template_manager.cpp index dd4ce74406..112a9e92a8 100644 --- a/editor/export_template_manager.cpp +++ b/editor/export_template_manager.cpp @@ -812,6 +812,7 @@ ExportTemplateManager::ExportTemplateManager() { main_vb->add_child(current_hb); Label *current_label = memnew(Label); + current_label->set_theme_type_variation("HeaderSmall"); current_label->set_text(TTR("Current Version:")); current_hb->add_child(current_label); @@ -821,6 +822,8 @@ ExportTemplateManager::ExportTemplateManager() { // Current version statuses. // Status: Current version is missing. current_missing_label = memnew(Label); + current_missing_label->set_theme_type_variation("HeaderSmall"); + current_missing_label->set_h_size_flags(Control::SIZE_EXPAND_FILL); current_missing_label->set_align(Label::ALIGN_RIGHT); current_missing_label->set_text(TTR("Export templates are missing. Download them or install from a file.")); @@ -828,6 +831,7 @@ ExportTemplateManager::ExportTemplateManager() { // Status: Current version is installed. current_installed_label = memnew(Label); + current_installed_label->set_theme_type_variation("HeaderSmall"); current_installed_label->set_h_size_flags(Control::SIZE_EXPAND_FILL); current_installed_label->set_align(Label::ALIGN_RIGHT); current_installed_label->set_text(TTR("Export templates are installed and ready to be used.")); @@ -947,6 +951,7 @@ ExportTemplateManager::ExportTemplateManager() { HBoxContainer *installed_versions_hb = memnew(HBoxContainer); main_vb->add_child(installed_versions_hb); Label *installed_label = memnew(Label); + installed_label->set_theme_type_variation("HeaderSmall"); installed_label->set_text(TTR("Other Installed Versions:")); installed_versions_hb->add_child(installed_label); diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp index cb89e5c7d0..3dc854d6bd 100644 --- a/editor/filesystem_dock.cpp +++ b/editor/filesystem_dock.cpp @@ -815,7 +815,8 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) { if (searched_string.length() > 0) { // Display the search results. - _search(EditorFileSystem::get_singleton()->get_filesystem(), &file_list, 128); + // Limit the number of results displayed to avoid an infinite loop. + _search(EditorFileSystem::get_singleton()->get_filesystem(), &file_list, 10000); } else { if (display_mode == DISPLAY_MODE_TREE_ONLY || always_show_folders) { // Display folders in the list. @@ -1985,20 +1986,6 @@ void FileSystemDock::_resource_created() { editor->save_resource_as(RES(r), fpath); } -void FileSystemDock::_focus_current_search_box() { - LineEdit *current_search_box = nullptr; - if (display_mode == DISPLAY_MODE_TREE_ONLY) { - current_search_box = tree_search_box; - } else if (display_mode == DISPLAY_MODE_SPLIT) { - current_search_box = file_list_search_box; - } - - if (current_search_box) { - current_search_box->grab_focus(); - current_search_box->select_all(); - } -} - void FileSystemDock::_search_changed(const String &p_text, const Control *p_from) { if (searched_string.length() == 0) { // Register the uncollapsed paths before they change. @@ -2040,7 +2027,17 @@ void FileSystemDock::fix_dependencies(const String &p_for_file) { } void FileSystemDock::focus_on_filter() { - file_list_search_box->grab_focus(); + LineEdit *current_search_box = nullptr; + if (display_mode == DISPLAY_MODE_TREE_ONLY) { + current_search_box = tree_search_box; + } else if (display_mode == DISPLAY_MODE_SPLIT) { + current_search_box = file_list_search_box; + } + + if (current_search_box) { + current_search_box->grab_focus(); + current_search_box->select_all(); + } } void FileSystemDock::set_file_list_display_mode(FileListDisplayMode p_mode) { @@ -2590,7 +2587,7 @@ void FileSystemDock::_tree_gui_input(Ref<InputEvent> p_event) { } else if (ED_IS_SHORTCUT("filesystem_dock/rename", p_event)) { _tree_rmb_option(FILE_RENAME); } else if (ED_IS_SHORTCUT("editor/open_search", p_event)) { - _focus_current_search_box(); + focus_on_filter(); } else { return; } @@ -2611,7 +2608,7 @@ void FileSystemDock::_file_list_gui_input(Ref<InputEvent> p_event) { } else if (ED_IS_SHORTCUT("filesystem_dock/rename", p_event)) { _file_list_rmb_option(FILE_RENAME); } else if (ED_IS_SHORTCUT("editor/open_search", p_event)) { - _focus_current_search_box(); + focus_on_filter(); } else { return; } diff --git a/editor/filesystem_dock.h b/editor/filesystem_dock.h index 12c567fb69..21a7abe622 100644 --- a/editor/filesystem_dock.h +++ b/editor/filesystem_dock.h @@ -253,7 +253,6 @@ private: void _toggle_split_mode(bool p_active); - void _focus_current_search_box(); void _search_changed(const String &p_text, const Control *p_from); MenuButton *_create_file_menu_button(); diff --git a/editor/groups_editor.cpp b/editor/groups_editor.cpp index 1b11ec4451..76fbee7490 100644 --- a/editor/groups_editor.cpp +++ b/editor/groups_editor.cpp @@ -424,6 +424,8 @@ GroupDialog::GroupDialog() { vbc_left->set_h_size_flags(Control::SIZE_EXPAND_FILL); Label *group_title = memnew(Label); + group_title->set_theme_type_variation("HeaderSmall"); + group_title->set_text(TTR("Groups")); vbc_left->add_child(group_title); @@ -458,6 +460,8 @@ GroupDialog::GroupDialog() { vbc_add->set_h_size_flags(Control::SIZE_EXPAND_FILL); Label *out_of_group_title = memnew(Label); + out_of_group_title->set_theme_type_variation("HeaderSmall"); + out_of_group_title->set_text(TTR("Nodes Not in Group")); vbc_add->add_child(out_of_group_title); @@ -506,6 +510,8 @@ GroupDialog::GroupDialog() { vbc_remove->set_h_size_flags(Control::SIZE_EXPAND_FILL); Label *in_group_title = memnew(Label); + in_group_title->set_theme_type_variation("HeaderSmall"); + in_group_title->set_text(TTR("Nodes in Group")); vbc_remove->add_child(in_group_title); @@ -528,10 +534,12 @@ GroupDialog::GroupDialog() { remove_filter->connect("text_changed", callable_mp(this, &GroupDialog::_remove_filter_changed)); group_empty = memnew(Label()); + group_empty->set_theme_type_variation("HeaderSmall"); + group_empty->set_text(TTR("Empty groups will be automatically removed.")); group_empty->set_valign(Label::VALIGN_CENTER); group_empty->set_align(Label::ALIGN_CENTER); - group_empty->set_autowrap(true); + group_empty->set_autowrap_mode(Label::AUTOWRAP_WORD_SMART); group_empty->set_custom_minimum_size(Size2(100 * EDSCALE, 0)); nodes_to_remove->add_child(group_empty); group_empty->set_anchors_and_offsets_preset(Control::PRESET_WIDE, Control::PRESET_MODE_KEEP_SIZE, 8 * EDSCALE); diff --git a/editor/icons/ImmediateMesh.svg b/editor/icons/ImmediateMesh.svg new file mode 100644 index 0000000000..9521530876 --- /dev/null +++ b/editor/icons/ImmediateMesh.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 14.999999 14.999999" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 2v2h5v-2zm5 2v3h2v-3zm2-2v2h5v-2zm-2 7v3h2v-3zm-5 3v2h5v-2zm7 0v2h5v-2z" fill="#ffca5f" transform="scale(.93749994)"/></svg> diff --git a/editor/icons/ORMMaterial3D.svg b/editor/icons/ORMMaterial3D.svg index 3d6db6910d..e09208155d 100644 --- a/editor/icons/ORMMaterial3D.svg +++ b/editor/icons/ORMMaterial3D.svg @@ -1 +1 @@ -<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5.0534707 10.652714q0 .729229-.4538398 1.253141-.4538403.516832-1.0868283.516832h-1.1943162q-.6389592 0-1.1047425-.509753-.47175502-.509751-.47175502-1.26022v-5.5223119q0-.7575473.47175502-1.2672998.4717549-.5097517 1.1047425-.5097517h1.1943162q.6270165 0 1.0868283.516832.4538398.5168313.4538398 1.2602195zm-1.0808559-.233636v-5.0550395q0-.5734707-.3344086-.8141867-.1074887-.0849591-.2567782-.0778788h-.9912826q-.2567779 0-.4120391.2690357-.1552611.2690357-.1552611.6230298v5.0550395q0 .559311.3164938.807108.1074885.08496.2508064.08496h.9912826q.2746925 0 .4359254-.276116.1552614-.276115.1552614-.61595z" fill="#f00"/><path d="m9.9872948 12.451006h-1.0427362l-1.4698137-3.9222572h-.7931457v3.9222572h-1.0094573v-9.076416h2.739956q.5435541 0 .9318066.4601926.3882524.4601933.3882524 1.1540217v2.1239667q0 1.0053443-.6766682 1.3168588-.2107668.099119-.4659043.099119zm-1.2590481-5.64267v-1.5858953q0-.4743524-.2884169-.6867495-.088743-.070798-.2052192-.063719h-1.5530114v2.9452329h1.7194053q.2828702-.00708.3161488-.389394.011093-.1132781.011093-.2194752z" fill="#008000"/><path d="m10.201004 3.7285848q0-.4106342.529158-.3681546.126777.014161.209458.014161v.00708h.115753l1.692202 4.9205216 1.697714-4.9205216h.06063v-.00708h.463013q.198434 0 .297651.212397.03307.063719.03307.1415978v8.694102h-1.01422v-5.6001914l-1.058314 3.2284284h-.953584l-1.058315-2.9310723v5.3028353h-1.014218z" fill="#00f"/></svg> +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 3.1191406-3.7636719 1.8808594 3.7636719 1.8828125 3.763672-1.8828125z" fill="#80ff45"/><path d="m3 6.6191406v2.3808594 1.382812l1.234375.617188 2.765625 1.382812v-1.382812-2-.3808594l-3.2382812-1.6191406z" fill="#ff4545"/><path d="m13 6.6191406-.761719.3808594-3.238281 1.6191406v3.7636714l2.765625-1.382812 1.234375-.617188v-1.382812z" fill="#45d7ff"/></svg> diff --git a/editor/icons/TripleBar.svg b/editor/icons/TripleBar.svg new file mode 100644 index 0000000000..2b521e6c15 --- /dev/null +++ b/editor/icons/TripleBar.svg @@ -0,0 +1 @@ +<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m1.9375 4h12.062zm0 4h12.062zm0 4h12.062z" fill="none" stroke="#e0e0e0" stroke-opacity=".99608" stroke-width=".92823"/></svg> diff --git a/editor/import/resource_importer_wav.cpp b/editor/import/resource_importer_wav.cpp index e845a90259..2db1db9e51 100644 --- a/editor/import/resource_importer_wav.cpp +++ b/editor/import/resource_importer_wav.cpp @@ -78,7 +78,7 @@ void ResourceImporterWAV::get_import_options(List<ImportOption> *r_options, int r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "force/8_bit"), false)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "force/mono"), false)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "force/max_rate", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), false)); - r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "force/max_rate_hz", PROPERTY_HINT_EXP_RANGE, "11025,192000,1"), 44100)); + r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "force/max_rate_hz", PROPERTY_HINT_RANGE, "11025,192000,1,exp"), 44100)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "edit/trim"), false)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "edit/normalize"), false)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "edit/loop"), false)); diff --git a/editor/import/scene_importer_mesh.cpp b/editor/import/scene_importer_mesh.cpp index ce78166d1e..f8e93df382 100644 --- a/editor/import/scene_importer_mesh.cpp +++ b/editor/import/scene_importer_mesh.cpp @@ -506,7 +506,7 @@ Vector<Ref<Shape3D>> EditorSceneImporterMesh::convex_decompose() const { const Vector<Face3> faces = get_faces(); - Vector<Vector<Face3>> decomposed = Mesh::convex_composition_function(faces); + Vector<Vector<Face3>> decomposed = Mesh::convex_composition_function(faces, -1); Vector<Ref<Shape3D>> ret; diff --git a/editor/localization_editor.cpp b/editor/localization_editor.cpp index 91a15f1131..977ca83671 100644 --- a/editor/localization_editor.cpp +++ b/editor/localization_editor.cpp @@ -656,7 +656,9 @@ LocalizationEditor::LocalizationEditor() { translations->add_child(tvb); HBoxContainer *thb = memnew(HBoxContainer); - thb->add_child(memnew(Label(TTR("Translations:")))); + Label *l = memnew(Label(TTR("Translations:"))); + l->set_theme_type_variation("HeaderSmall"); + thb->add_child(l); thb->add_spacer(); tvb->add_child(thb); @@ -684,7 +686,9 @@ LocalizationEditor::LocalizationEditor() { translations->add_child(tvb); HBoxContainer *thb = memnew(HBoxContainer); - thb->add_child(memnew(Label(TTR("Resources:")))); + Label *l = memnew(Label(TTR("Resources:"))); + l->set_theme_type_variation("HeaderSmall"); + thb->add_child(l); thb->add_spacer(); tvb->add_child(thb); @@ -708,7 +712,9 @@ LocalizationEditor::LocalizationEditor() { add_child(translation_res_file_open_dialog); thb = memnew(HBoxContainer); - thb->add_child(memnew(Label(TTR("Remaps by Locale:")))); + l = memnew(Label(TTR("Remaps by Locale:"))); + l->set_theme_type_variation("HeaderSmall"); + thb->add_child(l); thb->add_spacer(); tvb->add_child(thb); @@ -728,7 +734,9 @@ LocalizationEditor::LocalizationEditor() { translation_remap_options->set_column_title(1, TTR("Locale")); translation_remap_options->set_column_titles_visible(true); translation_remap_options->set_column_expand(0, true); + translation_remap_options->set_column_clip_content(0, true); translation_remap_options->set_column_expand(1, false); + translation_remap_options->set_column_clip_content(1, true); translation_remap_options->set_column_custom_minimum_width(1, 200); translation_remap_options->connect("item_edited", callable_mp(this, &LocalizationEditor::_translation_res_option_changed)); translation_remap_options->connect("button_pressed", callable_mp(this, &LocalizationEditor::_translation_res_option_delete)); @@ -756,7 +764,9 @@ LocalizationEditor::LocalizationEditor() { translation_locale_filter_mode->connect("item_selected", callable_mp(this, &LocalizationEditor::_translation_filter_mode_changed)); tmc->add_margin_child(TTR("Filter mode:"), translation_locale_filter_mode); - tmc->add_child(memnew(Label(TTR("Locales:")))); + Label *l = memnew(Label(TTR("Locales:"))); + l->set_theme_type_variation("HeaderSmall"); + tmc->add_child(l); translation_filter = memnew(Tree); translation_filter->set_v_size_flags(Control::SIZE_EXPAND_FILL); translation_filter->set_columns(1); @@ -770,7 +780,9 @@ LocalizationEditor::LocalizationEditor() { translations->add_child(tvb); HBoxContainer *thb = memnew(HBoxContainer); - thb->add_child(memnew(Label(TTR("Files with translation strings:")))); + Label *l = memnew(Label(TTR("Files with translation strings:"))); + l->set_theme_type_variation("HeaderSmall"); + thb->add_child(l); thb->add_spacer(); tvb->add_child(thb); diff --git a/editor/node_dock.cpp b/editor/node_dock.cpp index 43c9cabe01..95a2d81e00 100644 --- a/editor/node_dock.cpp +++ b/editor/node_dock.cpp @@ -130,6 +130,6 @@ NodeDock::NodeDock() { select_a_node->set_v_size_flags(SIZE_EXPAND_FILL); select_a_node->set_valign(Label::VALIGN_CENTER); select_a_node->set_align(Label::ALIGN_CENTER); - select_a_node->set_autowrap(true); + select_a_node->set_autowrap_mode(Label::AUTOWRAP_WORD_SMART); add_child(select_a_node); } diff --git a/editor/plugin_config_dialog.cpp b/editor/plugin_config_dialog.cpp index f55d77d782..cbcc3c9880 100644 --- a/editor/plugin_config_dialog.cpp +++ b/editor/plugin_config_dialog.cpp @@ -29,6 +29,7 @@ /*************************************************************************/ #include "plugin_config_dialog.h" + #include "core/io/config_file.h" #include "core/io/dir_access.h" #include "editor/editor_node.h" diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp index 48d7cfdee2..2b92943f7e 100644 --- a/editor/plugins/animation_player_editor_plugin.cpp +++ b/editor/plugins/animation_player_editor_plugin.cpp @@ -569,8 +569,10 @@ void AnimationPlayerEditor::_animation_blend() { blend_editor.dialog->popup_centered(Size2(400, 400) * EDSCALE); blend_editor.tree->set_hide_root(true); - blend_editor.tree->set_column_custom_minimum_width(0, 10); - blend_editor.tree->set_column_custom_minimum_width(1, 3); + blend_editor.tree->set_column_expand_ratio(0, 10); + blend_editor.tree->set_column_clip_content(0, true); + blend_editor.tree->set_column_expand_ratio(1, 3); + blend_editor.tree->set_column_clip_content(1, true); List<StringName> anims; player->get_animation_list(&anims); diff --git a/editor/plugins/asset_library_editor_plugin.cpp b/editor/plugins/asset_library_editor_plugin.cpp index cd61ebd418..596b2a6527 100644 --- a/editor/plugins/asset_library_editor_plugin.cpp +++ b/editor/plugins/asset_library_editor_plugin.cpp @@ -369,6 +369,9 @@ void EditorAssetLibraryItemDownload::_http_download_completed(int p_status, int progress->set_modulate(Color(0, 0, 0, 0)); set_process(false); + + // Automatically prompt for installation once the download is completed. + _install(); } void EditorAssetLibraryItemDownload::configure(const String &p_title, int p_asset_id, const Ref<Texture2D> &p_preview, const String &p_download_url, const String &p_sha256_hash) { @@ -456,6 +459,7 @@ void EditorAssetLibraryItemDownload::_install() { return; } + asset_installer->set_asset_name(title->get_text()); asset_installer->open(file, 1); } @@ -1296,6 +1300,7 @@ void EditorAssetLibrary::_asset_file_selected(const String &p_file) { } asset_installer = memnew(EditorAssetInstaller); + asset_installer->set_asset_name(p_file.get_basename()); add_child(asset_installer); asset_installer->open(p_file); } diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index 033a3e4fab..240e28a3c5 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -1149,8 +1149,9 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo view_offset.y += int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor(); update_viewport(); } else { - zoom_widget->set_zoom_by_increments(-1); - if (b->get_factor() != 1.f) { + zoom_widget->set_zoom_by_increments(-1, Input::get_singleton()->is_key_pressed(KEY_ALT)); + if (!Math::is_equal_approx(b->get_factor(), 1.0f)) { + // Handle high-precision (analog) scrolling. zoom_widget->set_zoom(zoom * ((zoom_widget->get_zoom() / zoom - 1.f) * b->get_factor() + 1.f)); } _zoom_on_position(zoom_widget->get_zoom(), b->get_position()); @@ -1164,8 +1165,9 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo view_offset.y -= int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor(); update_viewport(); } else { - zoom_widget->set_zoom_by_increments(1); - if (b->get_factor() != 1.f) { + zoom_widget->set_zoom_by_increments(1, Input::get_singleton()->is_key_pressed(KEY_ALT)); + if (!Math::is_equal_approx(b->get_factor(), 1.0f)) { + // Handle high-precision (analog) scrolling. zoom_widget->set_zoom(zoom * ((zoom_widget->get_zoom() / zoom - 1.f) * b->get_factor() + 1.f)); } _zoom_on_position(zoom_widget->get_zoom(), b->get_position()); @@ -1194,6 +1196,20 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo Ref<InputEventKey> k = p_event; if (k.is_valid()) { + if (k->is_pressed()) { + if (ED_GET_SHORTCUT("canvas_item_editor/zoom_100_percent")->is_shortcut(p_event)) { + _update_zoom(1.0 * MAX(1, EDSCALE)); + } else if (ED_GET_SHORTCUT("canvas_item_editor/zoom_200_percent")->is_shortcut(p_event)) { + _update_zoom(2.0 * MAX(1, EDSCALE)); + } else if (ED_GET_SHORTCUT("canvas_item_editor/zoom_400_percent")->is_shortcut(p_event)) { + _update_zoom(4.0 * MAX(1, EDSCALE)); + } else if (ED_GET_SHORTCUT("canvas_item_editor/zoom_800_percent")->is_shortcut(p_event)) { + _update_zoom(8.0 * MAX(1, EDSCALE)); + } else if (ED_GET_SHORTCUT("canvas_item_editor/zoom_1600_percent")->is_shortcut(p_event)) { + _update_zoom(16.0 * MAX(1, EDSCALE)); + } + } + bool is_pan_key = pan_view_shortcut.is_valid() && pan_view_shortcut->is_shortcut(p_event); if (is_pan_key && (EditorSettings::get_singleton()->get("editors/2d/simple_panning") || drag_type != DRAG_NONE)) { @@ -2189,7 +2205,7 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) { // Popup the selection menu list Point2 click = transform.affine_inverse().xform(b->get_position()); - _get_canvas_items_at_pos(click, selection_results, b->is_alt_pressed() && tool != TOOL_LIST_SELECT); + _get_canvas_items_at_pos(click, selection_results, b->is_alt_pressed() && tool == TOOL_SELECT); if (selection_results.size() == 1) { CanvasItem *item = selection_results[0].item; @@ -4242,7 +4258,7 @@ void CanvasItemEditor::_insert_animation_keys(bool p_location, bool p_rotation, AnimationPlayerEditor::singleton->get_track_editor()->insert_node_value_key(n2d, "position", n2d->get_position(), p_on_existing); } if (key_rot && p_rotation) { - AnimationPlayerEditor::singleton->get_track_editor()->insert_node_value_key(n2d, "rotation_degrees", Math::rad2deg(n2d->get_rotation()), p_on_existing); + AnimationPlayerEditor::singleton->get_track_editor()->insert_node_value_key(n2d, "rotation", n2d->get_rotation(), p_on_existing); } if (key_scale && p_scale) { AnimationPlayerEditor::singleton->get_track_editor()->insert_node_value_key(n2d, "scale", n2d->get_scale(), p_on_existing); @@ -4274,7 +4290,7 @@ void CanvasItemEditor::_insert_animation_keys(bool p_location, bool p_rotation, AnimationPlayerEditor::singleton->get_track_editor()->insert_node_value_key(F->get(), "position", F->get()->get_position(), p_on_existing); } if (key_rot) { - AnimationPlayerEditor::singleton->get_track_editor()->insert_node_value_key(F->get(), "rotation_degrees", Math::rad2deg(F->get()->get_rotation()), p_on_existing); + AnimationPlayerEditor::singleton->get_track_editor()->insert_node_value_key(F->get(), "rotation", F->get()->get_rotation(), p_on_existing); } if (key_scale) { AnimationPlayerEditor::singleton->get_track_editor()->insert_node_value_key(F->get(), "scale", F->get()->get_scale(), p_on_existing); @@ -4290,7 +4306,7 @@ void CanvasItemEditor::_insert_animation_keys(bool p_location, bool p_rotation, AnimationPlayerEditor::singleton->get_track_editor()->insert_node_value_key(ctrl, "rect_position", ctrl->get_position(), p_on_existing); } if (key_rot) { - AnimationPlayerEditor::singleton->get_track_editor()->insert_node_value_key(ctrl, "rect_rotation", ctrl->get_rotation_degrees(), p_on_existing); + AnimationPlayerEditor::singleton->get_track_editor()->insert_node_value_key(ctrl, "rect_rotation", ctrl->get_rotation(), p_on_existing); } if (key_scale) { AnimationPlayerEditor::singleton->get_track_editor()->insert_node_value_key(ctrl, "rect_size", ctrl->get_size(), p_on_existing); @@ -4317,11 +4333,11 @@ void CanvasItemEditor::_button_toggle_anchor_mode(bool p_status) { void CanvasItemEditor::_update_override_camera_button(bool p_game_running) { if (p_game_running) { override_camera_button->set_disabled(false); - override_camera_button->set_tooltip(TTR("Game Camera Override\nOverrides game camera with editor viewport camera.")); + override_camera_button->set_tooltip(TTR("Project Camera Override\nOverrides the running project's camera with the editor viewport camera.")); } else { override_camera_button->set_disabled(true); override_camera_button->set_pressed(false); - override_camera_button->set_tooltip(TTR("Game Camera Override\nNo game instance running.")); + override_camera_button->set_tooltip(TTR("Project Camera Override\nNo project instance running. Run the project from the editor to use this feature.")); } } @@ -5299,7 +5315,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { select_button->set_pressed(true); select_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/select_mode", TTR("Select Mode"), KEY_Q)); select_button->set_shortcut_context(this); - select_button->set_tooltip(keycode_get_string(KEY_MASK_CMD) + TTR("Drag: Rotate") + "\n" + TTR("Alt+Drag: Move") + "\n" + TTR("Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving).") + "\n" + TTR("Alt+RMB: Depth list selection")); + select_button->set_tooltip(keycode_get_string(KEY_MASK_CMD) + TTR("Drag: Rotate") + "\n" + TTR("Alt+Drag: Move") + "\n" + TTR("Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving).") + "\n" + TTR("Alt+RMB: Show list of all nodes at position clicked, including locked.")); hb->add_child(memnew(VSeparator)); @@ -5337,7 +5353,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { hb->add_child(list_select_button); list_select_button->set_toggle_mode(true); list_select_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_tool_select), make_binds(TOOL_LIST_SELECT)); - list_select_button->set_tooltip(TTR("Show a list of all objects at the position clicked\n(same as Alt+RMB in select mode).")); + list_select_button->set_tooltip(TTR("Show list of selectable nodes at position clicked.")); pivot_button = memnew(Button); pivot_button->set_flat(true); @@ -5422,25 +5438,33 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { hb->add_child(lock_button); lock_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback), varray(LOCK_SELECTED)); - lock_button->set_tooltip(TTR("Lock the selected object in place (can't be moved).")); + lock_button->set_tooltip(TTR("Lock selected node, preventing selection and movement.")); + // Define the shortcut globally (without a context) so that it works if the Scene tree dock is currently focused. + lock_button->set_shortcut(ED_SHORTCUT("editor/lock_selected_nodes", TTR("Lock Selected Node(s)"), KEY_MASK_CMD | KEY_L)); unlock_button = memnew(Button); unlock_button->set_flat(true); hb->add_child(unlock_button); unlock_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback), varray(UNLOCK_SELECTED)); - unlock_button->set_tooltip(TTR("Unlock the selected object (can be moved).")); + unlock_button->set_tooltip(TTR("Unlock selected node, allowing selection and movement.")); + // Define the shortcut globally (without a context) so that it works if the Scene tree dock is currently focused. + unlock_button->set_shortcut(ED_SHORTCUT("editor/unlock_selected_nodes", TTR("Unlock Selected Node(s)"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_L)); group_button = memnew(Button); group_button->set_flat(true); hb->add_child(group_button); group_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback), varray(GROUP_SELECTED)); group_button->set_tooltip(TTR("Makes sure the object's children are not selectable.")); + // Define the shortcut globally (without a context) so that it works if the Scene tree dock is currently focused. + group_button->set_shortcut(ED_SHORTCUT("editor/group_selected_nodes", TTR("Group Selected Node(s)"), KEY_MASK_CMD | KEY_G)); ungroup_button = memnew(Button); ungroup_button->set_flat(true); hb->add_child(ungroup_button); ungroup_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback), varray(UNGROUP_SELECTED)); ungroup_button->set_tooltip(TTR("Restores the object's children's ability to be selected.")); + // Define the shortcut globally (without a context) so that it works if the Scene tree dock is currently focused. + ungroup_button->set_shortcut(ED_SHORTCUT("editor/ungroup_selected_nodes", TTR("Ungroup Selected Node(s)"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_G)); hb->add_child(memnew(VSeparator)); @@ -5478,7 +5502,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { p = view_menu->get_popup(); p->set_hide_on_checkable_item_selection(false); - p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_grid", TTR("Always Show Grid"), KEY_MASK_CMD | KEY_G), SHOW_GRID); + p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_grid", TTR("Always Show Grid"), KEY_NUMBERSIGN), SHOW_GRID); p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_helpers", TTR("Show Helpers"), KEY_H), SHOW_HELPERS); p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_rulers", TTR("Show Rulers")), SHOW_RULERS); p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_guides", TTR("Show Guides"), KEY_Y), SHOW_GUIDES); @@ -5602,6 +5626,16 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { skeleton_menu->get_popup()->set_item_checked(skeleton_menu->get_popup()->get_item_index(SKELETON_SHOW_BONES), true); singleton = this; + // To ensure that scripts can parse the list of shortcuts correctly, we have to define + // those shortcuts one by one. + // Resetting zoom to 100% is a duplicate shortcut of `canvas_item_editor/reset_zoom`, + // but it ensures both 1 and Ctrl + 0 can be used to reset zoom. + ED_SHORTCUT("canvas_item_editor/zoom_100_percent", TTR("Zoom to 100%"), KEY_1); + ED_SHORTCUT("canvas_item_editor/zoom_200_percent", TTR("Zoom to 200%"), KEY_2); + ED_SHORTCUT("canvas_item_editor/zoom_400_percent", TTR("Zoom to 400%"), KEY_3); + ED_SHORTCUT("canvas_item_editor/zoom_800_percent", TTR("Zoom to 800%"), KEY_4); + ED_SHORTCUT("canvas_item_editor/zoom_1600_percent", TTR("Zoom to 1600%"), KEY_5); + set_process_unhandled_key_input(true); // Update the menus' checkboxes @@ -5623,12 +5657,12 @@ void CanvasItemEditorPlugin::make_visible(bool p_visible) { if (p_visible) { canvas_item_editor->show(); canvas_item_editor->set_physics_process(true); - RenderingServer::get_singleton()->viewport_set_hide_canvas(editor->get_scene_root()->get_viewport_rid(), false); + RenderingServer::get_singleton()->viewport_set_disable_2d(editor->get_scene_root()->get_viewport_rid(), false); } else { canvas_item_editor->hide(); canvas_item_editor->set_physics_process(false); - RenderingServer::get_singleton()->viewport_set_hide_canvas(editor->get_scene_root()->get_viewport_rid(), true); + RenderingServer::get_singleton()->viewport_set_disable_2d(editor->get_scene_root()->get_viewport_rid(), true); } } diff --git a/editor/plugins/collision_polygon_3d_editor_plugin.cpp b/editor/plugins/collision_polygon_3d_editor_plugin.cpp index 7873c1b136..6f90d278bd 100644 --- a/editor/plugins/collision_polygon_3d_editor_plugin.cpp +++ b/editor/plugins/collision_polygon_3d_editor_plugin.cpp @@ -358,9 +358,9 @@ void CollisionPolygon3DEditor::_polygon_draw() { float depth = _get_depth() * 0.5; - imgeom->clear(); + imesh->clear_surfaces(); imgeom->set_material_override(line_material); - imgeom->begin(Mesh::PRIMITIVE_LINES, Ref<Texture2D>()); + imesh->surface_begin(Mesh::PRIMITIVE_LINES); Rect2 rect; @@ -382,10 +382,10 @@ void CollisionPolygon3DEditor::_polygon_draw() { Vector3 point = Vector3(p.x, p.y, depth); Vector3 next_point = Vector3(p2.x, p2.y, depth); - imgeom->set_color(Color(1, 0.3, 0.1, 0.8)); - imgeom->add_vertex(point); - imgeom->set_color(Color(1, 0.3, 0.1, 0.8)); - imgeom->add_vertex(next_point); + imesh->surface_set_color(Color(1, 0.3, 0.1, 0.8)); + imesh->surface_add_vertex(point); + imesh->surface_set_color(Color(1, 0.3, 0.1, 0.8)); + imesh->surface_add_vertex(next_point); //Color col=Color(1,0.3,0.1,0.8); //vpc->draw_line(point,next_point,col,2); @@ -402,45 +402,43 @@ void CollisionPolygon3DEditor::_polygon_draw() { r.size.y = rect.size.y; r.size.z = 0; - imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2)); - imgeom->add_vertex(r.position); - imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2)); - imgeom->add_vertex(r.position + Vector3(0.3, 0, 0)); - imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2)); - imgeom->add_vertex(r.position); - imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2)); - imgeom->add_vertex(r.position + Vector3(0.0, 0.3, 0)); - - imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2)); - imgeom->add_vertex(r.position + Vector3(r.size.x, 0, 0)); - imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2)); - imgeom->add_vertex(r.position + Vector3(r.size.x, 0, 0) - Vector3(0.3, 0, 0)); - imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2)); - imgeom->add_vertex(r.position + Vector3(r.size.x, 0, 0)); - imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2)); - imgeom->add_vertex(r.position + Vector3(r.size.x, 0, 0) + Vector3(0, 0.3, 0)); - - imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2)); - imgeom->add_vertex(r.position + Vector3(0, r.size.y, 0)); - imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2)); - imgeom->add_vertex(r.position + Vector3(0, r.size.y, 0) - Vector3(0, 0.3, 0)); - imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2)); - imgeom->add_vertex(r.position + Vector3(0, r.size.y, 0)); - imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2)); - imgeom->add_vertex(r.position + Vector3(0, r.size.y, 0) + Vector3(0.3, 0, 0)); - - imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2)); - imgeom->add_vertex(r.position + r.size); - imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2)); - imgeom->add_vertex(r.position + r.size - Vector3(0.3, 0, 0)); - imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2)); - imgeom->add_vertex(r.position + r.size); - imgeom->set_color(Color(0.8, 0.8, 0.8, 0.2)); - imgeom->add_vertex(r.position + r.size - Vector3(0.0, 0.3, 0)); - - imgeom->end(); - - m->clear_surfaces(); + imesh->surface_set_color(Color(0.8, 0.8, 0.8, 0.2)); + imesh->surface_add_vertex(r.position); + imesh->surface_set_color(Color(0.8, 0.8, 0.8, 0.2)); + imesh->surface_add_vertex(r.position + Vector3(0.3, 0, 0)); + imesh->surface_set_color(Color(0.8, 0.8, 0.8, 0.2)); + imesh->surface_add_vertex(r.position); + imesh->surface_set_color(Color(0.8, 0.8, 0.8, 0.2)); + imesh->surface_add_vertex(r.position + Vector3(0.0, 0.3, 0)); + + imesh->surface_set_color(Color(0.8, 0.8, 0.8, 0.2)); + imesh->surface_add_vertex(r.position + Vector3(r.size.x, 0, 0)); + imesh->surface_set_color(Color(0.8, 0.8, 0.8, 0.2)); + imesh->surface_add_vertex(r.position + Vector3(r.size.x, 0, 0) - Vector3(0.3, 0, 0)); + imesh->surface_set_color(Color(0.8, 0.8, 0.8, 0.2)); + imesh->surface_add_vertex(r.position + Vector3(r.size.x, 0, 0)); + imesh->surface_set_color(Color(0.8, 0.8, 0.8, 0.2)); + imesh->surface_add_vertex(r.position + Vector3(r.size.x, 0, 0) + Vector3(0, 0.3, 0)); + + imesh->surface_set_color(Color(0.8, 0.8, 0.8, 0.2)); + imesh->surface_add_vertex(r.position + Vector3(0, r.size.y, 0)); + imesh->surface_set_color(Color(0.8, 0.8, 0.8, 0.2)); + imesh->surface_add_vertex(r.position + Vector3(0, r.size.y, 0) - Vector3(0, 0.3, 0)); + imesh->surface_set_color(Color(0.8, 0.8, 0.8, 0.2)); + imesh->surface_add_vertex(r.position + Vector3(0, r.size.y, 0)); + imesh->surface_set_color(Color(0.8, 0.8, 0.8, 0.2)); + imesh->surface_add_vertex(r.position + Vector3(0, r.size.y, 0) + Vector3(0.3, 0, 0)); + + imesh->surface_set_color(Color(0.8, 0.8, 0.8, 0.2)); + imesh->surface_add_vertex(r.position + r.size); + imesh->surface_set_color(Color(0.8, 0.8, 0.8, 0.2)); + imesh->surface_add_vertex(r.position + r.size - Vector3(0.3, 0, 0)); + imesh->surface_set_color(Color(0.8, 0.8, 0.8, 0.2)); + imesh->surface_add_vertex(r.position + r.size); + imesh->surface_set_color(Color(0.8, 0.8, 0.8, 0.2)); + imesh->surface_add_vertex(r.position + r.size - Vector3(0.0, 0.3, 0)); + + imesh->surface_end(); if (poly.size() == 0) { return; @@ -515,7 +513,9 @@ CollisionPolygon3DEditor::CollisionPolygon3DEditor(EditorNode *p_editor) { mode = MODE_EDIT; wip_active = false; - imgeom = memnew(ImmediateGeometry3D); + imgeom = memnew(MeshInstance3D); + imesh.instantiate(); + imgeom->set_mesh(imesh); imgeom->set_transform(Transform3D(Basis(), Vector3(0, 0, 0.00001))); line_material = Ref<StandardMaterial3D>(memnew(StandardMaterial3D)); diff --git a/editor/plugins/collision_polygon_3d_editor_plugin.h b/editor/plugins/collision_polygon_3d_editor_plugin.h index c66518e3e5..5db0f7308a 100644 --- a/editor/plugins/collision_polygon_3d_editor_plugin.h +++ b/editor/plugins/collision_polygon_3d_editor_plugin.h @@ -34,8 +34,8 @@ #include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "scene/3d/collision_polygon_3d.h" -#include "scene/3d/immediate_geometry_3d.h" #include "scene/3d/mesh_instance_3d.h" +#include "scene/resources/immediate_mesh.h" class CanvasItemEditor; @@ -60,7 +60,8 @@ class CollisionPolygon3DEditor : public HBoxContainer { EditorNode *editor; Panel *panel; Node3D *node; - ImmediateGeometry3D *imgeom; + Ref<ImmediateMesh> imesh; + MeshInstance3D *imgeom; MeshInstance3D *pointsm; Ref<ArrayMesh> m; diff --git a/editor/plugins/font_editor_plugin.cpp b/editor/plugins/font_editor_plugin.cpp index 9b0af37abb..e385a84087 100644 --- a/editor/plugins/font_editor_plugin.cpp +++ b/editor/plugins/font_editor_plugin.cpp @@ -290,7 +290,7 @@ void EditorInspectorPluginFont::parse_begin(Object *p_object) { add_custom_control(editor); } -bool EditorInspectorPluginFont::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) { +bool EditorInspectorPluginFont::parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide) { if (p_path.begins_with("language_support_override/") && p_object->is_class("FontData")) { String lang = p_path.replace("language_support_override/", ""); diff --git a/editor/plugins/font_editor_plugin.h b/editor/plugins/font_editor_plugin.h index 04e6c1dac7..71464003a0 100644 --- a/editor/plugins/font_editor_plugin.h +++ b/editor/plugins/font_editor_plugin.h @@ -94,7 +94,7 @@ class EditorInspectorPluginFont : public EditorInspectorPlugin { public: virtual bool can_handle(Object *p_object) override; virtual void parse_begin(Object *p_object) override; - virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) override; + virtual bool parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide = false) override; }; /*************************************************************************/ diff --git a/editor/plugins/input_event_editor_plugin.cpp b/editor/plugins/input_event_editor_plugin.cpp new file mode 100644 index 0000000000..f1aa10844b --- /dev/null +++ b/editor/plugins/input_event_editor_plugin.cpp @@ -0,0 +1,122 @@ +/*************************************************************************/ +/* input_event_editor_plugin.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "input_event_editor_plugin.h" + +void InputEventConfigContainer::_bind_methods() { +} + +void InputEventConfigContainer::_configure_pressed() { + config_dialog->popup_and_configure(input_event); +} + +void InputEventConfigContainer::_event_changed() { + input_event_text->set_text(input_event->as_text()); +} + +void InputEventConfigContainer::_config_dialog_confirmed() { + Ref<InputEvent> ie = config_dialog->get_event(); + input_event->copy_from(ie); + _event_changed(); +} + +Size2 InputEventConfigContainer::get_minimum_size() const { + // Don't bother with a minimum x size for the control - we don't want the inspector + // to jump in size if a long text is placed in the label (e.g. Joypad Axis description) + return Size2(0, HBoxContainer::get_minimum_size().y); +} + +void InputEventConfigContainer::set_event(const Ref<InputEvent> &p_event) { + Ref<InputEventKey> k = p_event; + Ref<InputEventMouseButton> m = p_event; + Ref<InputEventJoypadButton> jb = p_event; + Ref<InputEventJoypadMotion> jm = p_event; + + if (k.is_valid()) { + config_dialog->set_allowed_input_types(InputEventConfigurationDialog::InputType::INPUT_KEY); + } else if (m.is_valid()) { + config_dialog->set_allowed_input_types(InputEventConfigurationDialog::InputType::INPUT_MOUSE_BUTTON); + } else if (jb.is_valid()) { + config_dialog->set_allowed_input_types(InputEventConfigurationDialog::InputType::INPUT_JOY_BUTTON); + } else if (jm.is_valid()) { + config_dialog->set_allowed_input_types(InputEventConfigurationDialog::InputType::INPUT_JOY_MOTION); + } + + input_event = p_event; + _event_changed(); + input_event->connect("changed", callable_mp(this, &InputEventConfigContainer::_event_changed)); +} + +InputEventConfigContainer::InputEventConfigContainer() { + MarginContainer *mc = memnew(MarginContainer); + mc->add_theme_constant_override("margin_left", 10); + mc->add_theme_constant_override("margin_right", 10); + mc->add_theme_constant_override("margin_top", 10); + mc->add_theme_constant_override("margin_bottom", 10); + add_child(mc); + + HBoxContainer *hb = memnew(HBoxContainer); + mc->add_child(hb); + + open_config_button = memnew(Button); + open_config_button->set_text("Configure"); + open_config_button->connect("pressed", callable_mp(this, &InputEventConfigContainer::_configure_pressed)); + hb->add_child(open_config_button); + + input_event_text = memnew(Label); + hb->add_child(input_event_text); + + config_dialog = memnew(InputEventConfigurationDialog); + config_dialog->connect("confirmed", callable_mp(this, &InputEventConfigContainer::_config_dialog_confirmed)); + add_child(config_dialog); +} + +bool EditorInspectorPluginInputEvent::can_handle(Object *p_object) { + Ref<InputEventKey> k = Ref<InputEventKey>(p_object); + Ref<InputEventMouseButton> m = Ref<InputEventMouseButton>(p_object); + Ref<InputEventJoypadButton> jb = Ref<InputEventJoypadButton>(p_object); + Ref<InputEventJoypadMotion> jm = Ref<InputEventJoypadMotion>(p_object); + + return k.is_valid() || m.is_valid() || jb.is_valid() || jm.is_valid(); +} + +void EditorInspectorPluginInputEvent::parse_begin(Object *p_object) { + Ref<InputEvent> ie = Ref<InputEvent>(p_object); + + InputEventConfigContainer *picker_controls = memnew(InputEventConfigContainer); + picker_controls->set_event(ie); + add_custom_control(picker_controls); +} + +InputEventEditorPlugin::InputEventEditorPlugin(EditorNode *p_node) { + Ref<EditorInspectorPluginInputEvent> plugin; + plugin.instantiate(); + add_inspector_plugin(plugin); +} diff --git a/editor/plugins/input_event_editor_plugin.h b/editor/plugins/input_event_editor_plugin.h new file mode 100644 index 0000000000..bc8293c9e5 --- /dev/null +++ b/editor/plugins/input_event_editor_plugin.h @@ -0,0 +1,79 @@ +/*************************************************************************/ +/* input_event_editor_plugin.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef INPUT_EVENT_EDITOR_PLUGIN_H +#define INPUT_EVENT_EDITOR_PLUGIN_H + +#include "editor/action_map_editor.h" +#include "editor/editor_inspector.h" +#include "editor/editor_node.h" + +class InputEventConfigContainer : public HBoxContainer { + GDCLASS(InputEventConfigContainer, HBoxContainer); + + Label *input_event_text; + Button *open_config_button; + + Ref<InputEvent> input_event; + InputEventConfigurationDialog *config_dialog; + + void _config_dialog_confirmed(); + void _configure_pressed(); + + void _event_changed(); + +protected: + static void _bind_methods(); + +public: + virtual Size2 get_minimum_size() const override; + void set_event(const Ref<InputEvent> &p_event); + + InputEventConfigContainer(); +}; + +class EditorInspectorPluginInputEvent : public EditorInspectorPlugin { + GDCLASS(EditorInspectorPluginInputEvent, EditorInspectorPlugin); + +public: + virtual bool can_handle(Object *p_object) override; + virtual void parse_begin(Object *p_object) override; +}; + +class InputEventEditorPlugin : public EditorPlugin { + GDCLASS(InputEventEditorPlugin, EditorPlugin); + +public: + virtual String get_name() const override { return "InputEvent"; } + + InputEventEditorPlugin(EditorNode *p_node); +}; + +#endif // INPUT_EVENT_EDITOR_PLUGIN_H diff --git a/editor/plugins/mesh_instance_3d_editor_plugin.cpp b/editor/plugins/mesh_instance_3d_editor_plugin.cpp index 0d2b2ea2f5..7434accc1a 100644 --- a/editor/plugins/mesh_instance_3d_editor_plugin.cpp +++ b/editor/plugins/mesh_instance_3d_editor_plugin.cpp @@ -153,14 +153,18 @@ void MeshInstance3DEditor::_menu_option(int p_option) { ur->add_undo_method(node->get_parent(), "remove_child", cshape); ur->commit_action(); } break; - case MENU_OPTION_CREATE_SINGLE_CONVEX_COLLISION_SHAPE: { + + case MENU_OPTION_CREATE_SINGLE_CONVEX_COLLISION_SHAPE: + case MENU_OPTION_CREATE_SIMPLIFIED_CONVEX_COLLISION_SHAPE: { if (node == get_tree()->get_edited_scene_root()) { err_dialog->set_text(TTR("Can't create a single convex collision shape for the scene root.")); err_dialog->popup_centered(); return; } - Ref<Shape3D> shape = mesh->create_convex_shape(); + bool simplify = (p_option == MENU_OPTION_CREATE_SIMPLIFIED_CONVEX_COLLISION_SHAPE); + + Ref<Shape3D> shape = mesh->create_convex_shape(true, simplify); if (shape.is_null()) { err_dialog->set_text(TTR("Couldn't create a single convex collision shape.")); @@ -169,7 +173,11 @@ void MeshInstance3DEditor::_menu_option(int p_option) { } UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); - ur->create_action(TTR("Create Single Convex Shape")); + if (simplify) { + ur->create_action(TTR("Create Simplified Convex Shape")); + } else { + ur->create_action(TTR("Create Single Convex Shape")); + } CollisionShape3D *cshape = memnew(CollisionShape3D); cshape->set_shape(shape); @@ -186,6 +194,7 @@ void MeshInstance3DEditor::_menu_option(int p_option) { ur->commit_action(); } break; + case MENU_OPTION_CREATE_MULTIPLE_CONVEX_COLLISION_SHAPES: { if (node == get_tree()->get_edited_scene_root()) { err_dialog->set_text(TTR("Can't create multiple convex collision shapes for the scene root.")); @@ -441,8 +450,10 @@ MeshInstance3DEditor::MeshInstance3DEditor() { options->get_popup()->set_item_tooltip(options->get_popup()->get_item_count() - 1, TTR("Creates a polygon-based collision shape.\nThis is the most accurate (but slowest) option for collision detection.")); options->get_popup()->add_item(TTR("Create Single Convex Collision Sibling"), MENU_OPTION_CREATE_SINGLE_CONVEX_COLLISION_SHAPE); options->get_popup()->set_item_tooltip(options->get_popup()->get_item_count() - 1, TTR("Creates a single convex collision shape.\nThis is the fastest (but least accurate) option for collision detection.")); + options->get_popup()->add_item(TTR("Create Simplified Convex Collision Sibling"), MENU_OPTION_CREATE_SIMPLIFIED_CONVEX_COLLISION_SHAPE); + options->get_popup()->set_item_tooltip(options->get_popup()->get_item_count() - 1, TTR("Creates a simplified convex collision shape.\nThis is similar to single collision shape, but can result in a simpler geometry in some cases, at the cost of accuracy.")); options->get_popup()->add_item(TTR("Create Multiple Convex Collision Siblings"), MENU_OPTION_CREATE_MULTIPLE_CONVEX_COLLISION_SHAPES); - options->get_popup()->set_item_tooltip(options->get_popup()->get_item_count() - 1, TTR("Creates a polygon-based collision shape.\nThis is a performance middle-ground between the two above options.")); + options->get_popup()->set_item_tooltip(options->get_popup()->get_item_count() - 1, TTR("Creates a polygon-based collision shape.\nThis is a performance middle-ground between a single convex collision and a polygon-based collision.")); options->get_popup()->add_separator(); options->get_popup()->add_item(TTR("Create Navigation Mesh"), MENU_OPTION_CREATE_NAVMESH); options->get_popup()->add_separator(); diff --git a/editor/plugins/mesh_instance_3d_editor_plugin.h b/editor/plugins/mesh_instance_3d_editor_plugin.h index 69f494de7f..98b667c978 100644 --- a/editor/plugins/mesh_instance_3d_editor_plugin.h +++ b/editor/plugins/mesh_instance_3d_editor_plugin.h @@ -43,6 +43,7 @@ class MeshInstance3DEditor : public Control { MENU_OPTION_CREATE_STATIC_TRIMESH_BODY, MENU_OPTION_CREATE_TRIMESH_COLLISION_SHAPE, MENU_OPTION_CREATE_SINGLE_CONVEX_COLLISION_SHAPE, + MENU_OPTION_CREATE_SIMPLIFIED_CONVEX_COLLISION_SHAPE, MENU_OPTION_CREATE_MULTIPLE_CONVEX_COLLISION_SHAPES, MENU_OPTION_CREATE_NAVMESH, MENU_OPTION_CREATE_OUTLINE_MESH, diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index 59c0d81ae7..52f1178d06 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -467,22 +467,31 @@ void Node3DEditorViewport::_select_clicked(bool p_append, bool p_single, bool p_ } void Node3DEditorViewport::_select(Node *p_node, bool p_append, bool p_single) { - if (!p_append) { - editor_selection->clear(); - } - - if (editor_selection->is_selected(p_node)) { - //erase - editor_selection->remove_node(p_node); + // Add or remove a single node from the selection + if (p_append && p_single) { + if (editor_selection->is_selected(p_node)) { + // Already in the selection, remove it from the selected nodes + editor_selection->remove_node(p_node); + } else { + // Add the item to the selection + editor_selection->add_node(p_node); + } + } else if (p_append && !p_single) { + // Add the item to the selection + editor_selection->add_node(p_node); } else { + // No append; single select + editor_selection->clear(); editor_selection->add_node(p_node); - } - - if (p_single) { + // Reselect if (Engine::get_singleton()->is_editor_hint()) { editor->call("edit_node", p_node); } } + + if (editor_selection->get_selected_node_list().size() == 1) { + editor->push_item(editor_selection->get_selected_node_list()[0]); + } } ObjectID Node3DEditorViewport::_select_ray(const Point2 &p_pos, bool p_append, bool &r_includes_current, int *r_gizmo_handle, bool p_alt_select) { @@ -562,7 +571,7 @@ ObjectID Node3DEditorViewport::_select_ray(const Point2 &p_pos, bool p_append, b return closest; } -void Node3DEditorViewport::_find_items_at_pos(const Point2 &p_pos, bool &r_includes_current, Vector<_RayResult> &results, bool p_alt_select) { +void Node3DEditorViewport::_find_items_at_pos(const Point2 &p_pos, bool &r_includes_current, Vector<_RayResult> &results, bool p_alt_select, bool p_include_locked_nodes) { Vector3 ray = _get_ray(p_pos); Vector3 pos = _get_ray_pos(p_pos); @@ -605,6 +614,10 @@ void Node3DEditorViewport::_find_items_at_pos(const Point2 &p_pos, bool &r_inclu continue; } + if (!p_include_locked_nodes && _is_node_locked(spat)) { + continue; + } + if (editor_selection->is_selected(spat)) { r_includes_current = true; } @@ -1025,7 +1038,7 @@ bool Node3DEditorViewport ::_is_node_locked(const Node *p_node) { } void Node3DEditorViewport::_list_select(Ref<InputEventMouseButton> b) { - _find_items_at_pos(b->get_position(), clicked_includes_current, selection_results, b->is_shift_pressed()); + _find_items_at_pos(b->get_position(), clicked_includes_current, selection_results, b->is_shift_pressed(), spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT); Node *scene = editor->get_edited_scene(); @@ -1045,7 +1058,7 @@ void Node3DEditorViewport::_list_select(Ref<InputEventMouseButton> b) { selection_results.clear(); if (clicked.is_valid()) { - _select_clicked(clicked_wants_append, true, spatial_editor->get_tool_mode() != Node3DEditor::TOOL_MODE_LIST_SELECT); + _select_clicked(clicked_wants_append, true, spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT); clicked = ObjectID(); } @@ -1967,6 +1980,13 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { return; } + if (EditorSettings::get_singleton()->get("editors/3d/navigation/emulate_numpad")) { + const uint32_t code = k->get_keycode(); + if (code >= KEY_0 && code <= KEY_9) { + k->set_keycode(code - KEY_0 + KEY_KP_0); + } + } + if (ED_IS_SHORTCUT("spatial_editor/snap", p_event)) { if (_edit.mode != TRANSFORM_NONE) { _edit.snap = !_edit.snap; @@ -2504,25 +2524,21 @@ void Node3DEditorViewport::_notification(int p_what) { } if (show_info) { + const String viewport_size = vformat(String::utf8("%d × %d"), viewport->get_size().x, viewport->get_size().y); String text; - text += "X: " + rtos(current_camera->get_position().x).pad_decimals(1) + "\n"; - text += "Y: " + rtos(current_camera->get_position().y).pad_decimals(1) + "\n"; - text += "Z: " + rtos(current_camera->get_position().z).pad_decimals(1) + "\n"; - text += TTR("Pitch") + ": " + itos(Math::round(current_camera->get_rotation_degrees().x)) + "\n"; - text += TTR("Yaw") + ": " + itos(Math::round(current_camera->get_rotation_degrees().y)) + "\n\n"; - - text += TTR("Size") + - vformat( - ": %dx%d (%.1fMP)\n", - viewport->get_size().x, - viewport->get_size().y, - viewport->get_size().x * viewport->get_size().y * 0.000'001); - text += TTR("Objects Drawn") + ": " + itos(viewport->get_render_info(Viewport::RENDER_INFO_OBJECTS_IN_FRAME)) + "\n"; - text += TTR("Material Changes") + ": " + itos(viewport->get_render_info(Viewport::RENDER_INFO_MATERIAL_CHANGES_IN_FRAME)) + "\n"; - text += TTR("Shader Changes") + ": " + itos(viewport->get_render_info(Viewport::RENDER_INFO_SHADER_CHANGES_IN_FRAME)) + "\n"; - text += TTR("Surface Changes") + ": " + itos(viewport->get_render_info(Viewport::RENDER_INFO_SURFACE_CHANGES_IN_FRAME)) + "\n"; - text += TTR("Draw Calls") + ": " + itos(viewport->get_render_info(Viewport::RENDER_INFO_DRAW_CALLS_IN_FRAME)) + "\n"; - text += TTR("Vertices") + ": " + itos(viewport->get_render_info(Viewport::RENDER_INFO_VERTICES_IN_FRAME)); + text += vformat(TTR("X: %s\n"), rtos(current_camera->get_position().x).pad_decimals(1)); + text += vformat(TTR("Y: %s\n"), rtos(current_camera->get_position().y).pad_decimals(1)); + text += vformat(TTR("Z: %s\n"), rtos(current_camera->get_position().z).pad_decimals(1)); + text += "\n"; + text += vformat( + TTR("Size: %s (%.1fMP)\n"), + viewport_size, + viewport->get_size().x * viewport->get_size().y * 0.000001); + + text += "\n"; + text += vformat(TTR("Objects: %d\n"), viewport->get_render_info(Viewport::RENDER_INFO_TYPE_VISIBLE, Viewport::RENDER_INFO_OBJECTS_IN_FRAME)); + text += vformat(TTR("Primitives: %d\n"), viewport->get_render_info(Viewport::RENDER_INFO_TYPE_VISIBLE, Viewport::RENDER_INFO_PRIMITIVES_IN_FRAME)); + text += vformat(TTR("Draw Calls: %d"), viewport->get_render_info(Viewport::RENDER_INFO_TYPE_VISIBLE, Viewport::RENDER_INFO_DRAW_CALLS_IN_FRAME)); info_label->set_text(text); } @@ -3254,14 +3270,12 @@ void Node3DEditorViewport::_toggle_camera_preview(bool p_activate) { if (!preview) { preview_camera->hide(); } - view_menu->set_disabled(false); surface->update(); } else { previewing = preview; previewing->connect("tree_exiting", callable_mp(this, &Node3DEditorViewport::_preview_exited_scene)); RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), preview->get_camera()); //replace - view_menu->set_disabled(true); surface->update(); } } @@ -3296,7 +3310,7 @@ void Node3DEditorViewport::_selection_result_pressed(int p_result) { clicked = selection_results[p_result].item->get_instance_id(); if (clicked.is_valid()) { - _select_clicked(clicked_wants_append, true, spatial_editor->get_tool_mode() != Node3DEditor::TOOL_MODE_LIST_SELECT); + _select_clicked(clicked_wants_append, true, spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT); clicked = ObjectID(); } } @@ -3508,7 +3522,6 @@ void Node3DEditorViewport::set_state(const Dictionary &p_state) { previewing = Object::cast_to<Camera3D>(pv); previewing->connect("tree_exiting", callable_mp(this, &Node3DEditorViewport::_preview_exited_scene)); RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), previewing->get_camera()); //replace - view_menu->set_disabled(true); surface->update(); preview_camera->set_pressed(true); preview_camera->show(); @@ -6172,7 +6185,7 @@ void Node3DEditor::snap_selected_nodes_to_floor() { } if (snapped_to_floor) { - undo_redo->create_action(TTR("Snap Nodes To Floor")); + undo_redo->create_action(TTR("Snap Nodes to Floor")); // Perform snapping if at least one node can be snapped for (int i = 0; i < keys.size(); i++) { @@ -6218,31 +6231,47 @@ void Node3DEditor::_sun_environ_settings_pressed() { sun_environ_popup->popup(); } -void Node3DEditor::_add_sun_to_scene() { +void Node3DEditor::_add_sun_to_scene(bool p_already_added_environment) { sun_environ_popup->hide(); + if (!p_already_added_environment && world_env_count == 0 && Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { + // Prevent infinite feedback loop between the sun and environment methods. + _add_environment_to_scene(true); + } + Node *base = get_tree()->get_edited_scene_root(); if (!base) { - EditorNode::get_singleton()->show_warning(TTR("A root node is needed for this operation")); - return; + // Create a root node so we can add child nodes to it. + EditorNode::get_singleton()->get_scene_tree_dock()->add_root_node(memnew(Node3D)); + base = get_tree()->get_edited_scene_root(); } ERR_FAIL_COND(!base); Node *new_sun = preview_sun->duplicate(); undo_redo->create_action("Add Preview Sun to Scene"); undo_redo->add_do_method(base, "add_child", new_sun); + // Move to the beginning of the scene tree since more "global" nodes + // generally look better when placed at the top. + undo_redo->add_do_method(base, "move_child", new_sun, 0); undo_redo->add_do_method(new_sun, "set_owner", base); undo_redo->add_undo_method(base, "remove_child", new_sun); undo_redo->add_do_reference(new_sun); undo_redo->commit_action(); } -void Node3DEditor::_add_environment_to_scene() { + +void Node3DEditor::_add_environment_to_scene(bool p_already_added_sun) { sun_environ_popup->hide(); + if (!p_already_added_sun && directional_light_count == 0 && Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { + // Prevent infinite feedback loop between the sun and environment methods. + _add_sun_to_scene(true); + } + Node *base = get_tree()->get_edited_scene_root(); if (!base) { - EditorNode::get_singleton()->show_warning(TTR("A root node is needed for this operation")); - return; + // Create a root node so we can add child nodes to it. + EditorNode::get_singleton()->get_scene_tree_dock()->add_root_node(memnew(Node3D)); + base = get_tree()->get_edited_scene_root(); } ERR_FAIL_COND(!base); @@ -6251,6 +6280,9 @@ void Node3DEditor::_add_environment_to_scene() { undo_redo->create_action("Add Preview Environment to Scene"); undo_redo->add_do_method(base, "add_child", new_env); + // Move to the beginning of the scene tree since more "global" nodes + // generally look better when placed at the top. + undo_redo->add_do_method(base, "move_child", new_env, 0); undo_redo->add_do_method(new_env, "set_owner", base); undo_redo->add_undo_method(base, "remove_child", new_env); undo_redo->add_do_reference(new_env); @@ -6731,7 +6763,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { tool_button[TOOL_MODE_SELECT]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds); tool_button[TOOL_MODE_SELECT]->set_shortcut(ED_SHORTCUT("spatial_editor/tool_select", TTR("Select Mode"), KEY_Q)); tool_button[TOOL_MODE_SELECT]->set_shortcut_context(this); - tool_button[TOOL_MODE_SELECT]->set_tooltip(keycode_get_string(KEY_MASK_CMD) + TTR("Drag: Rotate\nAlt+Drag: Move\nAlt+RMB: Depth list selection")); + tool_button[TOOL_MODE_SELECT]->set_tooltip(keycode_get_string(KEY_MASK_CMD) + TTR("Drag: Rotate\nAlt+Drag: Move\nAlt+RMB: Show list of all nodes at position clicked, including locked.")); hbc_menu->add_child(memnew(VSeparator)); @@ -6770,21 +6802,25 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { tool_button[TOOL_MODE_LIST_SELECT]->set_flat(true); button_binds.write[0] = MENU_TOOL_LIST_SELECT; tool_button[TOOL_MODE_LIST_SELECT]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds); - tool_button[TOOL_MODE_LIST_SELECT]->set_tooltip(TTR("Show a list of all objects at the position clicked\n(same as Alt+RMB in select mode).")); + tool_button[TOOL_MODE_LIST_SELECT]->set_tooltip(TTR("Show list of selectable nodes at position clicked.")); tool_button[TOOL_LOCK_SELECTED] = memnew(Button); hbc_menu->add_child(tool_button[TOOL_LOCK_SELECTED]); tool_button[TOOL_LOCK_SELECTED]->set_flat(true); button_binds.write[0] = MENU_LOCK_SELECTED; tool_button[TOOL_LOCK_SELECTED]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds); - tool_button[TOOL_LOCK_SELECTED]->set_tooltip(TTR("Lock the selected object in place (can't be moved).")); + tool_button[TOOL_LOCK_SELECTED]->set_tooltip(TTR("Lock selected node, preventing selection and movement.")); + // Define the shortcut globally (without a context) so that it works if the Scene tree dock is currently focused. + tool_button[TOOL_LOCK_SELECTED]->set_shortcut(ED_SHORTCUT("editor/lock_selected_nodes", TTR("Lock Selected Node(s)"), KEY_MASK_CMD | KEY_L)); tool_button[TOOL_UNLOCK_SELECTED] = memnew(Button); hbc_menu->add_child(tool_button[TOOL_UNLOCK_SELECTED]); tool_button[TOOL_UNLOCK_SELECTED]->set_flat(true); button_binds.write[0] = MENU_UNLOCK_SELECTED; tool_button[TOOL_UNLOCK_SELECTED]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds); - tool_button[TOOL_UNLOCK_SELECTED]->set_tooltip(TTR("Unlock the selected object (can be moved).")); + tool_button[TOOL_UNLOCK_SELECTED]->set_tooltip(TTR("Unlock selected node, allowing selection and movement.")); + // Define the shortcut globally (without a context) so that it works if the Scene tree dock is currently focused. + tool_button[TOOL_UNLOCK_SELECTED]->set_shortcut(ED_SHORTCUT("editor/unlock_selected_nodes", TTR("Unlock Selected Node(s)"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_L)); tool_button[TOOL_GROUP_SELECTED] = memnew(Button); hbc_menu->add_child(tool_button[TOOL_GROUP_SELECTED]); @@ -6792,6 +6828,8 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { button_binds.write[0] = MENU_GROUP_SELECTED; tool_button[TOOL_GROUP_SELECTED]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds); tool_button[TOOL_GROUP_SELECTED]->set_tooltip(TTR("Makes sure the object's children are not selectable.")); + // Define the shortcut globally (without a context) so that it works if the Scene tree dock is currently focused. + tool_button[TOOL_GROUP_SELECTED]->set_shortcut(ED_SHORTCUT("editor/group_selected_nodes", TTR("Group Selected Node(s)"), KEY_MASK_CMD | KEY_G)); tool_button[TOOL_UNGROUP_SELECTED] = memnew(Button); hbc_menu->add_child(tool_button[TOOL_UNGROUP_SELECTED]); @@ -6799,6 +6837,8 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { button_binds.write[0] = MENU_UNGROUP_SELECTED; tool_button[TOOL_UNGROUP_SELECTED]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds); tool_button[TOOL_UNGROUP_SELECTED]->set_tooltip(TTR("Restores the object's children's ability to be selected.")); + // Define the shortcut globally (without a context) so that it works if the Scene tree dock is currently focused. + tool_button[TOOL_UNGROUP_SELECTED]->set_shortcut(ED_SHORTCUT("editor/ungroup_selected_nodes", TTR("Ungroup Selected Node(s)"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_G)); hbc_menu->add_child(memnew(VSeparator)); @@ -6917,7 +6957,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { p->add_separator(); p->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_origin", TTR("View Origin")), MENU_VIEW_ORIGIN); - p->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_grid", TTR("View Grid"), KEY_MASK_CMD + KEY_G), MENU_VIEW_GRID); + p->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_grid", TTR("View Grid"), KEY_NUMBERSIGN), MENU_VIEW_GRID); p->add_separator(); p->add_shortcut(ED_SHORTCUT("spatial_editor/settings", TTR("Settings...")), MENU_VIEW_CAMERA_SETTINGS); @@ -7073,8 +7113,6 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { xform_dialog->connect("confirmed", callable_mp(this, &Node3DEditor::_xform_dialog_action)); - scenario_debug = RenderingServer::SCENARIO_DEBUG_DISABLED; - selected = nullptr; set_process_unhandled_key_input(true); @@ -7103,6 +7141,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { sun_vb->hide(); sun_title = memnew(Label); + sun_title->set_theme_type_variation("HeaderSmall"); sun_vb->add_child(sun_title); sun_title->set_text(TTR("Preview Sun")); sun_title->set_align(Label::ALIGN_CENTER); @@ -7172,7 +7211,8 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { sun_add_to_scene = memnew(Button); sun_add_to_scene->set_text(TTR("Add Sun to Scene")); - sun_add_to_scene->connect("pressed", callable_mp(this, &Node3DEditor::_add_sun_to_scene)); + sun_add_to_scene->set_tooltip(TTR("Adds a DirectionalLight3D node matching the preview sun settings to the current scene.\nHold Shift while clicking to also add the preview environment to the current scene.")); + sun_add_to_scene->connect("pressed", callable_mp(this, &Node3DEditor::_add_sun_to_scene), varray(false)); sun_vb->add_spacer(); sun_vb->add_child(sun_add_to_scene); @@ -7193,6 +7233,8 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { environ_vb->hide(); environ_title = memnew(Label); + environ_title->set_theme_type_variation("HeaderSmall"); + environ_vb->add_child(environ_title); environ_title->set_text(TTR("Preview Environment")); environ_title->set_align(Label::ALIGN_CENTER); @@ -7236,7 +7278,8 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { environ_add_to_scene = memnew(Button); environ_add_to_scene->set_text(TTR("Add Environment to Scene")); - environ_add_to_scene->connect("pressed", callable_mp(this, &Node3DEditor::_add_environment_to_scene)); + environ_add_to_scene->set_tooltip(TTR("Adds a WorldEnvironment node matching the preview environment settings to the current scene.\nHold Shift while clicking to also add the preview sun to the current scene.")); + environ_add_to_scene->connect("pressed", callable_mp(this, &Node3DEditor::_add_environment_to_scene), varray(false)); environ_vb->add_spacer(); environ_vb->add_child(environ_add_to_scene); diff --git a/editor/plugins/node_3d_editor_plugin.h b/editor/plugins/node_3d_editor_plugin.h index fa432a5868..fa0f4e950f 100644 --- a/editor/plugins/node_3d_editor_plugin.h +++ b/editor/plugins/node_3d_editor_plugin.h @@ -34,7 +34,6 @@ #include "editor/editor_node.h" #include "editor/editor_plugin.h" #include "editor/editor_scale.h" -#include "scene/3d/immediate_geometry_3d.h" #include "scene/3d/light_3d.h" #include "scene/3d/visual_instance_3d.h" #include "scene/3d/world_environment.h" @@ -318,7 +317,7 @@ private: void _select_clicked(bool p_append, bool p_single, bool p_allow_locked = false); void _select(Node *p_node, bool p_append, bool p_single); ObjectID _select_ray(const Point2 &p_pos, bool p_append, bool &r_includes_current, int *r_gizmo_handle = nullptr, bool p_alt_select = false); - void _find_items_at_pos(const Point2 &p_pos, bool &r_includes_current, Vector<_RayResult> &results, bool p_alt_select = false); + void _find_items_at_pos(const Point2 &p_pos, bool &r_includes_current, Vector<_RayResult> &results, bool p_alt_select = false, bool p_include_locked_nodes = false); Vector3 _get_ray_pos(const Vector2 &p_pos) const; Vector3 _get_ray(const Vector2 &p_pos) const; Point2 _point_to_screen(const Vector3 &p_point); @@ -601,8 +600,6 @@ private: ToolMode tool_mode; - RenderingServer::ScenarioDebugMode scenario_debug; - RID origin; RID origin_instance; bool origin_enabled; @@ -808,8 +805,8 @@ private: void _preview_settings_changed(); void _sun_environ_settings_pressed(); - void _add_sun_to_scene(); - void _add_environment_to_scene(); + void _add_sun_to_scene(bool p_already_added_environment = false); + void _add_environment_to_scene(bool p_already_added_sun = false); protected: void _notification(int p_what); diff --git a/editor/plugins/ot_features_plugin.cpp b/editor/plugins/ot_features_plugin.cpp index baab9bc438..2ac90762e3 100644 --- a/editor/plugins/ot_features_plugin.cpp +++ b/editor/plugins/ot_features_plugin.cpp @@ -191,7 +191,7 @@ void EditorInspectorPluginOpenTypeFeatures::parse_begin(Object *p_object) { void EditorInspectorPluginOpenTypeFeatures::parse_category(Object *p_object, const String &p_parse_category) { } -bool EditorInspectorPluginOpenTypeFeatures::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) { +bool EditorInspectorPluginOpenTypeFeatures::parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide) { if (p_path == "opentype_features/_new") { OpenTypeFeaturesAdd *editor = memnew(OpenTypeFeaturesAdd); add_property_editor(p_path, editor); diff --git a/editor/plugins/ot_features_plugin.h b/editor/plugins/ot_features_plugin.h index 9559a6c0c3..dbafa3bbf6 100644 --- a/editor/plugins/ot_features_plugin.h +++ b/editor/plugins/ot_features_plugin.h @@ -88,7 +88,7 @@ public: virtual bool can_handle(Object *p_object) override; virtual void parse_begin(Object *p_object) override; virtual void parse_category(Object *p_object, const String &p_parse_category) override; - virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) override; + virtual bool parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide = false) override; }; /*************************************************************************/ diff --git a/editor/plugins/resource_preloader_editor_plugin.cpp b/editor/plugins/resource_preloader_editor_plugin.cpp index a7c11f8521..488aa8c861 100644 --- a/editor/plugins/resource_preloader_editor_plugin.cpp +++ b/editor/plugins/resource_preloader_editor_plugin.cpp @@ -367,8 +367,10 @@ ResourcePreloaderEditor::ResourcePreloaderEditor() { tree = memnew(Tree); tree->connect("button_pressed", callable_mp(this, &ResourcePreloaderEditor::_cell_button_pressed)); tree->set_columns(2); - tree->set_column_custom_minimum_width(0, 2); - tree->set_column_custom_minimum_width(1, 3); + tree->set_column_expand_ratio(0, 2); + tree->set_column_clip_content(0, true); + tree->set_column_expand_ratio(1, 3); + tree->set_column_clip_content(1, true); tree->set_column_expand(0, true); tree->set_column_expand(1, true); tree->set_v_size_flags(SIZE_EXPAND_FILL); diff --git a/editor/plugins/root_motion_editor_plugin.cpp b/editor/plugins/root_motion_editor_plugin.cpp index 1e6237ced1..120b0bc0bb 100644 --- a/editor/plugins/root_motion_editor_plugin.cpp +++ b/editor/plugins/root_motion_editor_plugin.cpp @@ -278,7 +278,7 @@ void EditorInspectorRootMotionPlugin::parse_begin(Object *p_object) { //do none } -bool EditorInspectorRootMotionPlugin::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) { +bool EditorInspectorRootMotionPlugin::parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide) { if (p_path == "root_motion_track" && p_object->is_class("AnimationTree") && p_type == Variant::NODE_PATH) { EditorPropertyRootMotion *editor = memnew(EditorPropertyRootMotion); if (p_hint == PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE && p_hint_text != String()) { diff --git a/editor/plugins/root_motion_editor_plugin.h b/editor/plugins/root_motion_editor_plugin.h index c70fff7db7..1484af62e8 100644 --- a/editor/plugins/root_motion_editor_plugin.h +++ b/editor/plugins/root_motion_editor_plugin.h @@ -65,7 +65,7 @@ class EditorInspectorRootMotionPlugin : public EditorInspectorPlugin { public: virtual bool can_handle(Object *p_object) override; virtual void parse_begin(Object *p_object) override; - virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide = false) override; + virtual bool parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide = false) override; virtual void parse_end() override; }; diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp index 5fc1f74089..cc0fbcc634 100644 --- a/editor/plugins/script_text_editor.cpp +++ b/editor/plugins/script_text_editor.cpp @@ -1051,8 +1051,8 @@ void ScriptTextEditor::_edit_option(int p_op) { case EDIT_DELETE_LINE: { code_editor->delete_lines(); } break; - case EDIT_CLONE_DOWN: { - code_editor->clone_lines_down(); + case EDIT_DUPLICATE_SELECTION: { + code_editor->duplicate_selection(); } break; case EDIT_TOGGLE_FOLD_LINE: { tx->toggle_foldable_line(tx->cursor_get_line()); @@ -1444,6 +1444,7 @@ void ScriptTextEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data } if (d.has("type") && (String(d["type"]) == "files" || String(d["type"]) == "files_and_dirs")) { + const String quote_style = EDITOR_DEF("text_editor/completion/use_single_quotes", false) ? "'" : "\""; Array files = d["files"]; String text_to_drop; @@ -1454,9 +1455,9 @@ void ScriptTextEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data } if (preload) { - text_to_drop += "preload(\"" + String(files[i]).c_escape() + "\")"; + text_to_drop += "preload(" + String(files[i]).c_escape().quote(quote_style) + ")"; } else { - text_to_drop += "\"" + String(files[i]).c_escape() + "\""; + text_to_drop += String(files[i]).c_escape().quote(quote_style); } } @@ -1759,7 +1760,7 @@ void ScriptTextEditor::_enable_code_editor() { edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/fold_all_lines"), EDIT_FOLD_ALL_LINES); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/unfold_all_lines"), EDIT_UNFOLD_ALL_LINES); edit_menu->get_popup()->add_separator(); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/clone_down"), EDIT_CLONE_DOWN); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/duplicate_selection"), EDIT_DUPLICATE_SELECTION); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_text_completion_query"), EDIT_COMPLETE); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/evaluate_selection"), EDIT_EVALUATE); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/trim_trailing_whitespace"), EDIT_TRIM_TRAILING_WHITESAPCE); @@ -1933,9 +1934,9 @@ void ScriptTextEditor::register_editor() { ED_SHORTCUT("script_text_editor/fold_all_lines", TTR("Fold All Lines"), 0); ED_SHORTCUT("script_text_editor/unfold_all_lines", TTR("Unfold All Lines"), 0); #ifdef OSX_ENABLED - ED_SHORTCUT("script_text_editor/clone_down", TTR("Clone Down"), KEY_MASK_SHIFT | KEY_MASK_CMD | KEY_C); + ED_SHORTCUT("script_text_editor/duplicate_selection", TTR("Duplicate Selection"), KEY_MASK_SHIFT | KEY_MASK_CMD | KEY_C); #else - ED_SHORTCUT("script_text_editor/clone_down", TTR("Clone Down"), KEY_MASK_SHIFT | KEY_MASK_CMD | KEY_D); + ED_SHORTCUT("script_text_editor/duplicate_selection", TTR("Duplicate Selection"), KEY_MASK_SHIFT | KEY_MASK_CMD | KEY_D); #endif ED_SHORTCUT("script_text_editor/evaluate_selection", TTR("Evaluate Selection"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_E); ED_SHORTCUT("script_text_editor/trim_trailing_whitespace", TTR("Trim Trailing Whitespace"), KEY_MASK_CMD | KEY_MASK_ALT | KEY_T); diff --git a/editor/plugins/script_text_editor.h b/editor/plugins/script_text_editor.h index 8a8e9aa737..e4a13951e4 100644 --- a/editor/plugins/script_text_editor.h +++ b/editor/plugins/script_text_editor.h @@ -117,7 +117,7 @@ class ScriptTextEditor : public ScriptEditorBase { EDIT_INDENT_RIGHT, EDIT_INDENT_LEFT, EDIT_DELETE_LINE, - EDIT_CLONE_DOWN, + EDIT_DUPLICATE_SELECTION, EDIT_PICK_COLOR, EDIT_TO_UPPERCASE, EDIT_TO_LOWERCASE, diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp index 173f1dd7fb..c1216a9732 100644 --- a/editor/plugins/shader_editor_plugin.cpp +++ b/editor/plugins/shader_editor_plugin.cpp @@ -334,8 +334,8 @@ void ShaderEditor::_menu_option(int p_option) { case EDIT_DELETE_LINE: { shader_editor->delete_lines(); } break; - case EDIT_CLONE_DOWN: { - shader_editor->clone_lines_down(); + case EDIT_DUPLICATE_SELECTION: { + shader_editor->duplicate_selection(); } break; case EDIT_TOGGLE_COMMENT: { if (shader.is_null()) { @@ -692,7 +692,7 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) { edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_right"), EDIT_INDENT_RIGHT); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/delete_line"), EDIT_DELETE_LINE); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_comment"), EDIT_TOGGLE_COMMENT); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/clone_down"), EDIT_CLONE_DOWN); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/duplicate_selection"), EDIT_DUPLICATE_SELECTION); edit_menu->get_popup()->add_separator(); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_text_completion_query"), EDIT_COMPLETE); edit_menu->get_popup()->connect("id_pressed", callable_mp(this, &ShaderEditor::_menu_option)); diff --git a/editor/plugins/shader_editor_plugin.h b/editor/plugins/shader_editor_plugin.h index d7da73f2ae..77579754d3 100644 --- a/editor/plugins/shader_editor_plugin.h +++ b/editor/plugins/shader_editor_plugin.h @@ -91,7 +91,7 @@ class ShaderEditor : public PanelContainer { EDIT_INDENT_LEFT, EDIT_INDENT_RIGHT, EDIT_DELETE_LINE, - EDIT_CLONE_DOWN, + EDIT_DUPLICATE_SELECTION, EDIT_TOGGLE_COMMENT, EDIT_COMPLETE, SEARCH_FIND, diff --git a/editor/plugins/style_box_editor_plugin.cpp b/editor/plugins/style_box_editor_plugin.cpp index 6954cacac6..91c5e96f08 100644 --- a/editor/plugins/style_box_editor_plugin.cpp +++ b/editor/plugins/style_box_editor_plugin.cpp @@ -44,7 +44,7 @@ void EditorInspectorPluginStyleBox::parse_begin(Object *p_object) { add_custom_control(preview); } -bool EditorInspectorPluginStyleBox::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) { +bool EditorInspectorPluginStyleBox::parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, bool p_wide) { return false; //do not want } diff --git a/editor/plugins/style_box_editor_plugin.h b/editor/plugins/style_box_editor_plugin.h index d4a235cd10..8ca348bd80 100644 --- a/editor/plugins/style_box_editor_plugin.h +++ b/editor/plugins/style_box_editor_plugin.h @@ -61,7 +61,7 @@ class EditorInspectorPluginStyleBox : public EditorInspectorPlugin { public: virtual bool can_handle(Object *p_object) override; virtual void parse_begin(Object *p_object) override; - virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide = false) override; + virtual bool parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide = false) override; virtual void parse_end() override; }; diff --git a/editor/plugins/sub_viewport_preview_editor_plugin.cpp b/editor/plugins/sub_viewport_preview_editor_plugin.cpp new file mode 100644 index 0000000000..5fd173cae3 --- /dev/null +++ b/editor/plugins/sub_viewport_preview_editor_plugin.cpp @@ -0,0 +1,49 @@ +/*************************************************************************/ +/* sub_viewport_preview_editor_plugin.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "sub_viewport_preview_editor_plugin.h" + +bool EditorInspectorPluginSubViewportPreview::can_handle(Object *p_object) { + return Object::cast_to<SubViewport>(p_object) != nullptr; +} + +void EditorInspectorPluginSubViewportPreview::parse_begin(Object *p_object) { + SubViewport *sub_viewport = Object::cast_to<SubViewport>(p_object); + + TexturePreview *sub_viewport_preview = memnew(TexturePreview(sub_viewport->get_texture(), false)); + sub_viewport->connect("size_changed", callable_mp((CanvasItem *)sub_viewport_preview->get_texture_display(), &CanvasItem::update)); + add_custom_control(sub_viewport_preview); +} + +SubViewportPreviewEditorPlugin::SubViewportPreviewEditorPlugin(EditorNode *p_node) { + Ref<EditorInspectorPluginSubViewportPreview> plugin; + plugin.instantiate(); + add_inspector_plugin(plugin); +} diff --git a/editor/plugins/sub_viewport_preview_editor_plugin.h b/editor/plugins/sub_viewport_preview_editor_plugin.h new file mode 100644 index 0000000000..03b8b678d1 --- /dev/null +++ b/editor/plugins/sub_viewport_preview_editor_plugin.h @@ -0,0 +1,56 @@ +/*************************************************************************/ +/* sub_viewport_preview_editor_plugin.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef SUB_VIEWPORT_PREVIEW_EDITOR_PLUGIN_H +#define SUB_VIEWPORT_PREVIEW_EDITOR_PLUGIN_H + +#include "editor/editor_node.h" +#include "editor/editor_plugin.h" +#include "editor/plugins/texture_editor_plugin.h" +#include "scene/main/viewport.h" + +class EditorInspectorPluginSubViewportPreview : public EditorInspectorPluginTexture { + GDCLASS(EditorInspectorPluginSubViewportPreview, EditorInspectorPluginTexture); + +public: + virtual bool can_handle(Object *p_object) override; + virtual void parse_begin(Object *p_object) override; +}; + +class SubViewportPreviewEditorPlugin : public EditorPlugin { + GDCLASS(SubViewportPreviewEditorPlugin, EditorPlugin); + +public: + virtual String get_name() const override { return "SubViewportPreview"; } + + SubViewportPreviewEditorPlugin(EditorNode *p_node); +}; + +#endif // SUB_VIEWPORT_PREVIEW_EDITOR_PLUGIN_H diff --git a/editor/plugins/text_editor.cpp b/editor/plugins/text_editor.cpp index d62be993af..5766646f7d 100644 --- a/editor/plugins/text_editor.cpp +++ b/editor/plugins/text_editor.cpp @@ -328,8 +328,8 @@ void TextEditor::_edit_option(int p_op) { case EDIT_DELETE_LINE: { code_editor->delete_lines(); } break; - case EDIT_CLONE_DOWN: { - code_editor->clone_lines_down(); + case EDIT_DUPLICATE_SELECTION: { + code_editor->duplicate_selection(); } break; case EDIT_TOGGLE_FOLD_LINE: { tx->toggle_foldable_line(tx->cursor_get_line()); @@ -559,7 +559,7 @@ TextEditor::TextEditor() { edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/fold_all_lines"), EDIT_FOLD_ALL_LINES); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/unfold_all_lines"), EDIT_UNFOLD_ALL_LINES); edit_menu->get_popup()->add_separator(); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/clone_down"), EDIT_CLONE_DOWN); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/duplicate_selection"), EDIT_DUPLICATE_SELECTION); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/trim_trailing_whitespace"), EDIT_TRIM_TRAILING_WHITESAPCE); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_indent_to_spaces"), EDIT_CONVERT_INDENT_TO_SPACES); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_indent_to_tabs"), EDIT_CONVERT_INDENT_TO_TABS); diff --git a/editor/plugins/text_editor.h b/editor/plugins/text_editor.h index 4e667dc676..86a4910ac0 100644 --- a/editor/plugins/text_editor.h +++ b/editor/plugins/text_editor.h @@ -66,7 +66,7 @@ private: EDIT_INDENT_RIGHT, EDIT_INDENT_LEFT, EDIT_DELETE_LINE, - EDIT_CLONE_DOWN, + EDIT_DUPLICATE_SELECTION, EDIT_TO_UPPERCASE, EDIT_TO_LOWERCASE, EDIT_CAPITALIZE, diff --git a/editor/plugins/texture_editor_plugin.cpp b/editor/plugins/texture_editor_plugin.cpp index 10b942d9ee..6ee652098d 100644 --- a/editor/plugins/texture_editor_plugin.cpp +++ b/editor/plugins/texture_editor_plugin.cpp @@ -30,132 +30,69 @@ #include "texture_editor_plugin.h" -#include "core/config/project_settings.h" -#include "core/io/resource_loader.h" -#include "editor/editor_settings.h" +#include "editor/editor_scale.h" -void TextureEditor::_gui_input(Ref<InputEvent> p_event) { +TextureRect *TexturePreview::get_texture_display() { + return texture_display; } -void TextureEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_READY) { - //get_scene()->connect("node_removed",this,"_node_removed"); - } - - if (p_what == NOTIFICATION_DRAW) { - Ref<Texture2D> checkerboard = get_theme_icon("Checkerboard", "EditorIcons"); - Size2 size = get_size(); - - draw_texture_rect(checkerboard, Rect2(Point2(), size), true); - - int tex_width = texture->get_width() * size.height / texture->get_height(); - int tex_height = size.height; - - if (tex_width > size.width) { - tex_width = size.width; - tex_height = texture->get_height() * tex_width / texture->get_width(); - } - - // Prevent the texture from being unpreviewable after the rescale, so that we can still see something - if (tex_height <= 0) { - tex_height = 1; - } - if (tex_width <= 0) { - tex_width = 1; - } +TexturePreview::TexturePreview(Ref<Texture2D> p_texture, bool p_show_metadata) { + Ref<Theme> theme = EditorNode::get_singleton()->get_editor_theme(); - int ofs_x = (size.width - tex_width) / 2; - int ofs_y = (size.height - tex_height) / 2; - - if (Object::cast_to<CurveTexture>(*texture)) { - // In the case of CurveTextures we know they are 1 in height, so fill the preview to see the gradient - ofs_y = 0; - tex_height = size.height; - } else if (Object::cast_to<GradientTexture>(*texture)) { - ofs_y = size.height / 4.0; - tex_height = size.height / 2.0; - } + TextureRect *checkerboard = memnew(TextureRect); + checkerboard->set_texture(theme->get_icon("Checkerboard", "EditorIcons")); + checkerboard->set_stretch_mode(TextureRect::STRETCH_TILE); + checkerboard->set_texture_repeat(CanvasItem::TEXTURE_REPEAT_ENABLED); + checkerboard->set_custom_minimum_size(Size2(0.0, 256.0) * EDSCALE); + add_child(checkerboard); - draw_texture_rect(texture, Rect2(ofs_x, ofs_y, tex_width, tex_height)); + texture_display = memnew(TextureRect); + texture_display->set_texture(p_texture); + texture_display->set_anchors_preset(TextureRect::PRESET_WIDE); + texture_display->set_stretch_mode(TextureRect::STRETCH_KEEP_ASPECT_CENTERED); + texture_display->set_expand(true); + add_child(texture_display); - Ref<Font> font = get_theme_font("font", "Label"); - int font_size = get_theme_font_size("font_size", "Label"); + if (p_show_metadata) { + Label *metadata_label = memnew(Label); String format; - if (Object::cast_to<ImageTexture>(*texture)) { - format = Image::get_format_name(Object::cast_to<ImageTexture>(*texture)->get_format()); - } else if (Object::cast_to<StreamTexture2D>(*texture)) { - format = Image::get_format_name(Object::cast_to<StreamTexture2D>(*texture)->get_format()); + if (Object::cast_to<ImageTexture>(*p_texture)) { + format = Image::get_format_name(Object::cast_to<ImageTexture>(*p_texture)->get_format()); + } else if (Object::cast_to<StreamTexture2D>(*p_texture)) { + format = Image::get_format_name(Object::cast_to<StreamTexture2D>(*p_texture)->get_format()); } else { - format = texture->get_class(); + format = p_texture->get_class(); } - String text = itos(texture->get_width()) + "x" + itos(texture->get_height()) + " " + format; - Size2 rect = font->get_string_size(text, font_size); + metadata_label->set_text(itos(p_texture->get_width()) + "x" + itos(p_texture->get_height()) + " " + format); - Vector2 draw_from = size - rect + Size2(-2, font->get_ascent(font_size) - 2); - if (draw_from.x < 0) { - draw_from.x = 0; - } + metadata_label->add_theme_font_size_override("font_size", 16 * EDSCALE); + metadata_label->add_theme_color_override("font_outline_color", Color::named("black")); + metadata_label->add_theme_constant_override("outline_size", 2 * EDSCALE); + Ref<Font> metadata_label_font = theme->get_font("expression", "EditorFonts"); + metadata_label->add_theme_font_override("font", metadata_label_font); - draw_string(font, draw_from + Vector2(2, 2), text, HALIGN_LEFT, size.width, font_size, Color(0, 0, 0, 0.5)); - draw_string(font, draw_from - Vector2(2, 2), text, HALIGN_LEFT, size.width, font_size, Color(0, 0, 0, 0.5)); - draw_string(font, draw_from, text, HALIGN_LEFT, size.width, font_size, Color(1, 1, 1, 1)); - } -} + // it's okay that these colors are static since the grid color is static too + metadata_label->add_theme_color_override("font_color", Color::named("white")); + metadata_label->add_theme_color_override("font_color_shadow", Color::named("black")); -void TextureEditor::_texture_changed() { - if (!is_visible()) { - return; - } - update(); -} + metadata_label->add_theme_constant_override("shadow_as_outline", 1); + metadata_label->set_h_size_flags(Control::SIZE_SHRINK_END); + metadata_label->set_v_size_flags(Control::SIZE_SHRINK_END); -void TextureEditor::edit(Ref<Texture2D> p_texture) { - if (!texture.is_null()) { - texture->disconnect("changed", callable_mp(this, &TextureEditor::_texture_changed)); + add_child(metadata_label); } - - texture = p_texture; - - if (!texture.is_null()) { - texture->connect("changed", callable_mp(this, &TextureEditor::_texture_changed)); - update(); - } else { - hide(); - } -} - -void TextureEditor::_bind_methods() { - ClassDB::bind_method(D_METHOD("_gui_input"), &TextureEditor::_gui_input); } -TextureEditor::TextureEditor() { - set_texture_repeat(TextureRepeat::TEXTURE_REPEAT_ENABLED); - set_custom_minimum_size(Size2(1, 150)); -} - -TextureEditor::~TextureEditor() { - if (!texture.is_null()) { - texture->disconnect("changed", callable_mp(this, &TextureEditor::_texture_changed)); - } -} - -// bool EditorInspectorPluginTexture::can_handle(Object *p_object) { return Object::cast_to<ImageTexture>(p_object) != nullptr || Object::cast_to<AtlasTexture>(p_object) != nullptr || Object::cast_to<StreamTexture2D>(p_object) != nullptr || Object::cast_to<AnimatedTexture>(p_object) != nullptr; } void EditorInspectorPluginTexture::parse_begin(Object *p_object) { - Texture2D *texture = Object::cast_to<Texture2D>(p_object); - if (!texture) { - return; - } - Ref<Texture2D> m(texture); + Ref<Texture> texture(Object::cast_to<Texture>(p_object)); - TextureEditor *editor = memnew(TextureEditor); - editor->edit(m); - add_custom_control(editor); + add_custom_control(memnew(TexturePreview(texture, true))); } TextureEditorPlugin::TextureEditorPlugin(EditorNode *p_node) { diff --git a/editor/plugins/texture_editor_plugin.h b/editor/plugins/texture_editor_plugin.h index ebe8882194..165090be93 100644 --- a/editor/plugins/texture_editor_plugin.h +++ b/editor/plugins/texture_editor_plugin.h @@ -35,21 +35,15 @@ #include "editor/editor_plugin.h" #include "scene/resources/texture.h" -class TextureEditor : public Control { - GDCLASS(TextureEditor, Control); +class TexturePreview : public MarginContainer { + GDCLASS(TexturePreview, MarginContainer); - Ref<Texture2D> texture; - -protected: - void _notification(int p_what); - void _gui_input(Ref<InputEvent> p_event); - void _texture_changed(); - static void _bind_methods(); +private: + TextureRect *texture_display; public: - void edit(Ref<Texture2D> p_texture); - TextureEditor(); - ~TextureEditor(); + TextureRect *get_texture_display(); + TexturePreview(Ref<Texture2D> p_texture, bool p_show_metadata); }; class EditorInspectorPluginTexture : public EditorInspectorPlugin { diff --git a/editor/plugins/theme_editor_plugin.cpp b/editor/plugins/theme_editor_plugin.cpp index 99d7267eac..0a8a0dcdce 100644 --- a/editor/plugins/theme_editor_plugin.cpp +++ b/editor/plugins/theme_editor_plugin.cpp @@ -930,11 +930,14 @@ ThemeItemImportTree::ThemeItemImportTree() { import_items_tree->set_column_title(IMPORT_ITEM, TTR("Import")); import_items_tree->set_column_title(IMPORT_ITEM_DATA, TTR("With Data")); import_items_tree->set_column_expand(0, true); + import_items_tree->set_column_clip_content(0, true); import_items_tree->set_column_expand(IMPORT_ITEM, false); import_items_tree->set_column_expand(IMPORT_ITEM_DATA, false); import_items_tree->set_column_custom_minimum_width(0, 160 * EDSCALE); import_items_tree->set_column_custom_minimum_width(IMPORT_ITEM, 80 * EDSCALE); import_items_tree->set_column_custom_minimum_width(IMPORT_ITEM_DATA, 80 * EDSCALE); + import_items_tree->set_column_clip_content(1, true); + import_items_tree->set_column_clip_content(2, true); ScrollContainer *import_bulk_sc = memnew(ScrollContainer); import_bulk_sc->set_custom_minimum_size(Size2(260.0, 0.0) * EDSCALE); @@ -1141,7 +1144,7 @@ ThemeItemImportTree::ThemeItemImportTree() { select_icons_warning = memnew(Label); select_icons_warning->set_text(TTR("Caution: Adding icon data may considerably increase the size of your Theme resource.")); - select_icons_warning->set_autowrap(true); + select_icons_warning->set_autowrap_mode(Label::AUTOWRAP_WORD_SMART); select_icons_warning->set_h_size_flags(Control::SIZE_EXPAND_FILL); select_icons_warning_hb->add_child(select_icons_warning); } @@ -1940,6 +1943,117 @@ ThemeItemEditorDialog::ThemeItemEditorDialog() { confirm_closing_dialog->connect("confirmed", callable_mp(this, &ThemeItemEditorDialog::_close_dialog)); } +void ThemeTypeDialog::_dialog_about_to_show() { + add_type_filter->set_text(""); + add_type_filter->grab_focus(); + + _update_add_type_options(); +} + +void ThemeTypeDialog::ok_pressed() { + emit_signal("type_selected", add_type_filter->get_text().strip_edges()); +} + +void ThemeTypeDialog::_update_add_type_options(const String &p_filter) { + add_type_options->clear(); + + List<StringName> names; + Theme::get_default()->get_type_list(&names); + if (include_own_types) { + edited_theme->get_type_list(&names); + } + names.sort_custom<StringName::AlphCompare>(); + + Vector<StringName> unique_names; + for (List<StringName>::Element *E = names.front(); E; E = E->next()) { + // Filter out undesired values. + if (!p_filter.is_subsequence_ofi(String(E->get()))) { + continue; + } + + // Skip duplicate values. + if (unique_names.has(E->get())) { + continue; + } + unique_names.append(E->get()); + + Ref<Texture2D> item_icon; + if (E->get() == "") { + item_icon = get_theme_icon("NodeDisabled", "EditorIcons"); + } else { + item_icon = EditorNode::get_singleton()->get_class_icon(E->get(), "NodeDisabled"); + } + + add_type_options->add_item(E->get(), item_icon); + } +} + +void ThemeTypeDialog::_add_type_filter_cbk(const String &p_value) { + _update_add_type_options(p_value); +} + +void ThemeTypeDialog::_add_type_options_cbk(int p_index) { + add_type_filter->set_text(add_type_options->get_item_text(p_index)); +} + +void ThemeTypeDialog::_add_type_dialog_entered(const String &p_value) { + emit_signal("type_selected", p_value.strip_edges()); + hide(); +} + +void ThemeTypeDialog::_add_type_dialog_activated(int p_index) { + emit_signal("type_selected", add_type_options->get_item_text(p_index)); + hide(); +} + +void ThemeTypeDialog::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { + connect("about_to_popup", callable_mp(this, &ThemeTypeDialog::_dialog_about_to_show)); + [[fallthrough]]; + } + case NOTIFICATION_THEME_CHANGED: { + _update_add_type_options(); + } break; + } +} + +void ThemeTypeDialog::_bind_methods() { + ADD_SIGNAL(MethodInfo("type_selected", PropertyInfo(Variant::STRING, "type_name"))); +} + +void ThemeTypeDialog::set_edited_theme(const Ref<Theme> &p_theme) { + edited_theme = p_theme; +} + +void ThemeTypeDialog::set_include_own_types(bool p_enable) { + include_own_types = p_enable; +} + +ThemeTypeDialog::ThemeTypeDialog() { + VBoxContainer *add_type_vb = memnew(VBoxContainer); + add_child(add_type_vb); + + Label *add_type_filter_label = memnew(Label); + add_type_filter_label->set_text(TTR("Name:")); + add_type_vb->add_child(add_type_filter_label); + + add_type_filter = memnew(LineEdit); + add_type_vb->add_child(add_type_filter); + add_type_filter->connect("text_changed", callable_mp(this, &ThemeTypeDialog::_add_type_filter_cbk)); + add_type_filter->connect("text_submitted", callable_mp(this, &ThemeTypeDialog::_add_type_dialog_entered)); + + Label *add_type_options_label = memnew(Label); + add_type_options_label->set_text(TTR("Node Types:")); + add_type_vb->add_child(add_type_options_label); + + add_type_options = memnew(ItemList); + add_type_options->set_v_size_flags(Control::SIZE_EXPAND_FILL); + add_type_vb->add_child(add_type_options); + add_type_options->connect("item_selected", callable_mp(this, &ThemeTypeDialog::_add_type_options_cbk)); + add_type_options->connect("item_activated", callable_mp(this, &ThemeTypeDialog::_add_type_dialog_activated)); +} + VBoxContainer *ThemeTypeEditor::_create_item_list(Theme::DataType p_data_type) { VBoxContainer *items_tab = memnew(VBoxContainer); items_tab->set_custom_minimum_size(Size2(0, 160) * EDSCALE); @@ -2045,36 +2159,18 @@ void ThemeTypeEditor::_update_type_list_debounced() { update_debounce_timer->start(); } -void ThemeTypeEditor::_update_add_type_options(const String &p_filter) { - add_type_options->clear(); - - List<StringName> names; - Theme::get_default()->get_type_list(&names); - names.sort_custom<StringName::AlphCompare>(); - - for (List<StringName>::Element *E = names.front(); E; E = E->next()) { - if (!p_filter.is_subsequence_ofi(String(E->get()))) { - continue; - } - - Ref<Texture2D> item_icon; - if (E->get() == "") { - item_icon = get_theme_icon("NodeDisabled", "EditorIcons"); - } else { - item_icon = EditorNode::get_singleton()->get_class_icon(E->get(), "NodeDisabled"); - } - - add_type_options->add_item(E->get(), item_icon); - } -} - OrderedHashMap<StringName, bool> ThemeTypeEditor::_get_type_items(String p_type_name, void (Theme::*get_list_func)(StringName, List<StringName> *) const, bool include_default) { OrderedHashMap<StringName, bool> items; List<StringName> names; if (include_default) { names.clear(); - (Theme::get_default().operator->()->*get_list_func)(p_type_name, &names); + String default_type = p_type_name; + if (edited_theme->get_type_variation_base(p_type_name) != StringName()) { + default_type = edited_theme->get_type_variation_base(p_type_name); + } + + (Theme::get_default().operator->()->*get_list_func)(default_type, &names); names.sort_custom<StringName::AlphCompare>(); for (List<StringName>::Element *E = names.front(); E; E = E->next()) { items[E->get()] = false; @@ -2432,6 +2528,20 @@ void ThemeTypeEditor::_update_type_items() { stylebox_items_list->add_child(item_control); } } + + // Various type settings. + if (ClassDB::class_exists(edited_type)) { + type_variation_edit->set_editable(false); + type_variation_edit->set_tooltip(TTR("A type associated with a built-in class cannot be marked as a variation of another type.")); + type_variation_edit->set_text(""); + type_variation_button->hide(); + } else { + type_variation_edit->set_editable(true); + type_variation_edit->set_tooltip(""); + type_variation_edit->set_text(edited_theme->get_type_variation_base(edited_type)); + _add_focusable(type_variation_edit); + type_variation_button->show(); + } } void ThemeTypeEditor::_list_type_selected(int p_index) { @@ -2440,34 +2550,18 @@ void ThemeTypeEditor::_list_type_selected(int p_index) { } void ThemeTypeEditor::_add_type_button_cbk() { + add_type_mode = ADD_THEME_TYPE; + add_type_dialog->set_title(TTR("Add Item Type")); + add_type_dialog->set_include_own_types(false); add_type_dialog->popup_centered(Size2(560, 420) * EDSCALE); - add_type_filter->grab_focus(); -} - -void ThemeTypeEditor::_add_type_filter_cbk(const String &p_value) { - _update_add_type_options(p_value); -} - -void ThemeTypeEditor::_add_type_options_cbk(int p_index) { - add_type_filter->set_text(add_type_options->get_item_text(p_index)); -} - -void ThemeTypeEditor::_add_type_dialog_confirmed() { - select_type(add_type_filter->get_text().strip_edges()); -} - -void ThemeTypeEditor::_add_type_dialog_entered(const String &p_value) { - select_type(p_value.strip_edges()); - add_type_dialog->hide(); -} - -void ThemeTypeEditor::_add_type_dialog_activated(int p_index) { - select_type(add_type_options->get_item_text(p_index)); - add_type_dialog->hide(); } void ThemeTypeEditor::_add_default_type_items() { List<StringName> names; + String default_type = edited_type; + if (edited_theme->get_type_variation_base(edited_type) != StringName()) { + default_type = edited_theme->get_type_variation_base(edited_type); + } updating = true; // Prevent changes from immediatelly being reported while the operation is still ongoing. @@ -2475,7 +2569,7 @@ void ThemeTypeEditor::_add_default_type_items() { { names.clear(); - Theme::get_default()->get_icon_list(edited_type, &names); + Theme::get_default()->get_icon_list(default_type, &names); for (List<StringName>::Element *E = names.front(); E; E = E->next()) { if (!edited_theme->has_icon(E->get(), edited_type)) { edited_theme->set_icon(E->get(), edited_type, Ref<Texture2D>()); @@ -2484,7 +2578,7 @@ void ThemeTypeEditor::_add_default_type_items() { } { names.clear(); - Theme::get_default()->get_stylebox_list(edited_type, &names); + Theme::get_default()->get_stylebox_list(default_type, &names); for (List<StringName>::Element *E = names.front(); E; E = E->next()) { if (!edited_theme->has_stylebox(E->get(), edited_type)) { edited_theme->set_stylebox(E->get(), edited_type, Ref<StyleBox>()); @@ -2493,7 +2587,7 @@ void ThemeTypeEditor::_add_default_type_items() { } { names.clear(); - Theme::get_default()->get_font_list(edited_type, &names); + Theme::get_default()->get_font_list(default_type, &names); for (List<StringName>::Element *E = names.front(); E; E = E->next()) { if (!edited_theme->has_font(E->get(), edited_type)) { edited_theme->set_font(E->get(), edited_type, Ref<Font>()); @@ -2502,28 +2596,28 @@ void ThemeTypeEditor::_add_default_type_items() { } { names.clear(); - Theme::get_default()->get_font_size_list(edited_type, &names); + Theme::get_default()->get_font_size_list(default_type, &names); for (List<StringName>::Element *E = names.front(); E; E = E->next()) { if (!edited_theme->has_font_size(E->get(), edited_type)) { - edited_theme->set_font_size(E->get(), edited_type, Theme::get_default()->get_font_size(E->get(), edited_type)); + edited_theme->set_font_size(E->get(), edited_type, Theme::get_default()->get_font_size(E->get(), default_type)); } } } { names.clear(); - Theme::get_default()->get_color_list(edited_type, &names); + Theme::get_default()->get_color_list(default_type, &names); for (List<StringName>::Element *E = names.front(); E; E = E->next()) { if (!edited_theme->has_color(E->get(), edited_type)) { - edited_theme->set_color(E->get(), edited_type, Theme::get_default()->get_color(E->get(), edited_type)); + edited_theme->set_color(E->get(), edited_type, Theme::get_default()->get_color(E->get(), default_type)); } } } { names.clear(); - Theme::get_default()->get_constant_list(edited_type, &names); + Theme::get_default()->get_constant_list(default_type, &names); for (List<StringName>::Element *E = names.front(); E; E = E->next()) { if (!edited_theme->has_constant(E->get(), edited_type)) { - edited_theme->set_constant(E->get(), edited_type, Theme::get_default()->get_constant(E->get(), edited_type)); + edited_theme->set_constant(E->get(), edited_type, Theme::get_default()->get_constant(E->get(), default_type)); } } } @@ -2814,6 +2908,30 @@ void ThemeTypeEditor::_update_stylebox_from_leading() { edited_theme->_unfreeze_and_propagate_changes(); } +void ThemeTypeEditor::_type_variation_changed(const String p_value) { + if (p_value.is_empty()) { + edited_theme->clear_type_variation(edited_type); + } else { + edited_theme->set_type_variation(edited_type, StringName(p_value)); + } +} + +void ThemeTypeEditor::_add_type_variation_cbk() { + add_type_mode = ADD_VARIATION_BASE; + add_type_dialog->set_title(TTR("Add Variation Base Type")); + add_type_dialog->set_include_own_types(true); + add_type_dialog->popup_centered(Size2(560, 420) * EDSCALE); +} + +void ThemeTypeEditor::_add_type_dialog_selected(const String p_type_name) { + if (add_type_mode == ADD_THEME_TYPE) { + select_type(p_type_name); + } else if (add_type_mode == ADD_VARIATION_BASE) { + _type_variation_changed(p_type_name); + _update_type_items(); + } +} + void ThemeTypeEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: @@ -2826,11 +2944,12 @@ void ThemeTypeEditor::_notification(int p_what) { data_type_tabs->set_tab_icon(3, get_theme_icon("FontSize", "EditorIcons")); data_type_tabs->set_tab_icon(4, get_theme_icon("ImageTexture", "EditorIcons")); data_type_tabs->set_tab_icon(5, get_theme_icon("StyleBoxFlat", "EditorIcons")); + data_type_tabs->set_tab_icon(6, get_theme_icon("Tools", "EditorIcons")); data_type_tabs->add_theme_style_override("tab_selected", get_theme_stylebox("tab_selected_odd", "TabContainer")); data_type_tabs->add_theme_style_override("panel", get_theme_stylebox("panel_odd", "TabContainer")); - _update_add_type_options(); + type_variation_button->set_icon(get_theme_icon("Add", "EditorIcons")); } break; } } @@ -2843,6 +2962,8 @@ void ThemeTypeEditor::set_edited_theme(const Ref<Theme> &p_theme) { edited_theme = p_theme; edited_theme->connect("changed", callable_mp(this, &ThemeTypeEditor::_update_type_list_debounced)); _update_type_list(); + + add_type_dialog->set_edited_theme(edited_theme); } void ThemeTypeEditor::select_type(String p_type_name) { @@ -2889,34 +3010,10 @@ ThemeTypeEditor::ThemeTypeEditor() { theme_type_list->connect("item_selected", callable_mp(this, &ThemeTypeEditor::_list_type_selected)); add_type_button = memnew(Button); - add_type_button->set_tooltip(TTR("Add Type")); + add_type_button->set_tooltip(TTR("Add a type from a list of available types or create a new one.")); type_list_hb->add_child(add_type_button); add_type_button->connect("pressed", callable_mp(this, &ThemeTypeEditor::_add_type_button_cbk)); - add_type_dialog = memnew(ConfirmationDialog); - add_type_dialog->set_title(TTR("Add Item Type")); - type_list_hb->add_child(add_type_dialog); - add_type_dialog->connect("confirmed", callable_mp(this, &ThemeTypeEditor::_add_type_dialog_confirmed)); - - VBoxContainer *add_type_vb = memnew(VBoxContainer); - add_type_dialog->add_child(add_type_vb); - - Label *add_type_filter_label = memnew(Label); - add_type_filter_label->set_text(TTR("Name:")); - add_type_vb->add_child(add_type_filter_label); - add_type_filter = memnew(LineEdit); - add_type_vb->add_child(add_type_filter); - add_type_filter->connect("text_changed", callable_mp(this, &ThemeTypeEditor::_add_type_filter_cbk)); - add_type_filter->connect("text_submitted", callable_mp(this, &ThemeTypeEditor::_add_type_dialog_entered)); - Label *add_type_options_label = memnew(Label); - add_type_options_label->set_text(TTR("Node Types:")); - add_type_vb->add_child(add_type_options_label); - add_type_options = memnew(ItemList); - add_type_options->set_v_size_flags(SIZE_EXPAND_FILL); - add_type_vb->add_child(add_type_options); - add_type_options->connect("item_selected", callable_mp(this, &ThemeTypeEditor::_add_type_options_cbk)); - add_type_options->connect("item_activated", callable_mp(this, &ThemeTypeEditor::_add_type_dialog_activated)); - HBoxContainer *type_controls = memnew(HBoxContainer); main_vb->add_child(type_controls); @@ -2947,6 +3044,39 @@ ThemeTypeEditor::ThemeTypeEditor() { icon_items_list = _create_item_list(Theme::DATA_TYPE_ICON); stylebox_items_list = _create_item_list(Theme::DATA_TYPE_STYLEBOX); + VBoxContainer *type_settings_tab = memnew(VBoxContainer); + type_settings_tab->set_custom_minimum_size(Size2(0, 160) * EDSCALE); + data_type_tabs->add_child(type_settings_tab); + data_type_tabs->set_tab_title(data_type_tabs->get_tab_count() - 1, ""); + + ScrollContainer *type_settings_sc = memnew(ScrollContainer); + type_settings_sc->set_v_size_flags(SIZE_EXPAND_FILL); + type_settings_sc->set_enable_h_scroll(false); + type_settings_tab->add_child(type_settings_sc); + VBoxContainer *type_settings_list = memnew(VBoxContainer); + type_settings_list->set_h_size_flags(SIZE_EXPAND_FILL); + type_settings_sc->add_child(type_settings_list); + + HBoxContainer *type_variation_hb = memnew(HBoxContainer); + type_settings_list->add_child(type_variation_hb); + Label *type_variation_label = memnew(Label); + type_variation_hb->add_child(type_variation_label); + type_variation_label->set_text(TTR("Base Type")); + type_variation_label->set_h_size_flags(Control::SIZE_EXPAND_FILL); + type_variation_edit = memnew(LineEdit); + type_variation_hb->add_child(type_variation_edit); + type_variation_edit->set_h_size_flags(Control::SIZE_EXPAND_FILL); + type_variation_edit->connect("text_changed", callable_mp(this, &ThemeTypeEditor::_type_variation_changed)); + type_variation_edit->connect("focus_exited", callable_mp(this, &ThemeTypeEditor::_update_type_items)); + type_variation_button = memnew(Button); + type_variation_hb->add_child(type_variation_button); + type_variation_button->set_tooltip(TTR("Select the variation base type from a list of available types.")); + type_variation_button->connect("pressed", callable_mp(this, &ThemeTypeEditor::_add_type_variation_cbk)); + + add_type_dialog = memnew(ThemeTypeDialog); + add_child(add_type_dialog); + add_type_dialog->connect("type_selected", callable_mp(this, &ThemeTypeEditor::_add_type_dialog_selected)); + update_debounce_timer = memnew(Timer); update_debounce_timer->set_one_shot(true); update_debounce_timer->set_wait_time(0.5); @@ -3091,6 +3221,7 @@ ThemeEditor::ThemeEditor() { theme_name = memnew(Label); theme_name->set_text(TTR("Theme") + ": "); + theme_name->set_theme_type_variation("HeaderSmall"); top_menu->add_child(theme_name); top_menu->add_spacer(false); diff --git a/editor/plugins/theme_editor_plugin.h b/editor/plugins/theme_editor_plugin.h index cdedbbec8d..3c114a375a 100644 --- a/editor/plugins/theme_editor_plugin.h +++ b/editor/plugins/theme_editor_plugin.h @@ -263,6 +263,36 @@ public: ThemeItemEditorDialog(); }; +class ThemeTypeDialog : public ConfirmationDialog { + GDCLASS(ThemeTypeDialog, ConfirmationDialog); + + Ref<Theme> edited_theme; + bool include_own_types = false; + + LineEdit *add_type_filter; + ItemList *add_type_options; + + void _dialog_about_to_show(); + void ok_pressed() override; + + void _update_add_type_options(const String &p_filter = ""); + + void _add_type_filter_cbk(const String &p_value); + void _add_type_options_cbk(int p_index); + void _add_type_dialog_entered(const String &p_value); + void _add_type_dialog_activated(int p_index); + +protected: + void _notification(int p_what); + static void _bind_methods(); + +public: + void set_edited_theme(const Ref<Theme> &p_theme); + void set_include_own_types(bool p_enable); + + ThemeTypeDialog(); +}; + class ThemeTypeEditor : public MarginContainer { GDCLASS(ThemeTypeEditor, MarginContainer); @@ -281,9 +311,6 @@ class ThemeTypeEditor : public MarginContainer { OptionButton *theme_type_list; Button *add_type_button; - ConfirmationDialog *add_type_dialog; - LineEdit *add_type_filter; - ItemList *add_type_options; CheckButton *show_default_items_button; @@ -295,13 +322,23 @@ class ThemeTypeEditor : public MarginContainer { VBoxContainer *icon_items_list; VBoxContainer *stylebox_items_list; + LineEdit *type_variation_edit; + Button *type_variation_button; + + enum TypeDialogMode { + ADD_THEME_TYPE, + ADD_VARIATION_BASE, + }; + + TypeDialogMode add_type_mode = ADD_THEME_TYPE; + ThemeTypeDialog *add_type_dialog; + Vector<Control *> focusables; Timer *update_debounce_timer; VBoxContainer *_create_item_list(Theme::DataType p_data_type); void _update_type_list(); void _update_type_list_debounced(); - void _update_add_type_options(const String &p_filter = ""); OrderedHashMap<StringName, bool> _get_type_items(String p_type_name, void (Theme::*get_list_func)(StringName, List<StringName> *) const, bool include_default); HBoxContainer *_create_property_control(Theme::DataType p_data_type, String p_item_name, bool p_editable); void _add_focusable(Control *p_control); @@ -310,11 +347,6 @@ class ThemeTypeEditor : public MarginContainer { void _list_type_selected(int p_index); void _select_type(String p_type_name); void _add_type_button_cbk(); - void _add_type_filter_cbk(const String &p_value); - void _add_type_options_cbk(int p_index); - void _add_type_dialog_confirmed(); - void _add_type_dialog_entered(const String &p_value); - void _add_type_dialog_activated(int p_index); void _add_default_type_items(); void _item_add_cbk(int p_data_type, Control *p_control); @@ -337,6 +369,11 @@ class ThemeTypeEditor : public MarginContainer { void _unpin_leading_stylebox(); void _update_stylebox_from_leading(); + void _type_variation_changed(const String p_value); + void _add_type_variation_cbk(); + + void _add_type_dialog_selected(const String p_type_name); + protected: void _notification(int p_what); diff --git a/editor/plugins/theme_editor_preview.cpp b/editor/plugins/theme_editor_preview.cpp index 0b02150444..5ea46771ba 100644 --- a/editor/plugins/theme_editor_preview.cpp +++ b/editor/plugins/theme_editor_preview.cpp @@ -123,7 +123,7 @@ void ThemeEditorPreview::_gui_input_picker_overlay(const Ref<InputEvent> &p_even if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (hovered_control) { - StringName theme_type = hovered_control->get_theme_custom_type(); + StringName theme_type = hovered_control->get_theme_type_variation(); if (theme_type == StringName()) { theme_type = hovered_control->get_class_name(); } diff --git a/editor/plugins/version_control_editor_plugin.cpp b/editor/plugins/version_control_editor_plugin.cpp index 75a944e910..10679ad6f2 100644 --- a/editor/plugins/version_control_editor_plugin.cpp +++ b/editor/plugins/version_control_editor_plugin.cpp @@ -476,6 +476,7 @@ VersionControlEditorPlugin::VersionControlEditorPlugin() { version_control_dock = memnew(PanelContainer); version_control_dock->set_v_size_flags(Control::SIZE_EXPAND_FILL); + version_control_dock->set_custom_minimum_size(Size2(0, 300) * EDSCALE); version_control_dock->hide(); diff_vbc = memnew(VBoxContainer); diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp index 16d36ad053..85ad03c9bc 100644 --- a/editor/plugins/visual_shader_editor_plugin.cpp +++ b/editor/plugins/visual_shader_editor_plugin.cpp @@ -110,6 +110,7 @@ void VisualShaderGraphPlugin::_bind_methods() { ClassDB::bind_method("set_uniform_name", &VisualShaderGraphPlugin::set_uniform_name); ClassDB::bind_method("set_expression", &VisualShaderGraphPlugin::set_expression); ClassDB::bind_method("update_curve", &VisualShaderGraphPlugin::update_curve); + ClassDB::bind_method("update_curve_xyz", &VisualShaderGraphPlugin::update_curve_xyz); ClassDB::bind_method("update_constant", &VisualShaderGraphPlugin::update_constant); } @@ -211,9 +212,19 @@ void VisualShaderGraphPlugin::set_uniform_name(VisualShader::Type p_type, int p_ } void VisualShaderGraphPlugin::update_curve(int p_node_id) { - if (links.has(p_node_id) && links[p_node_id].curve_editor) { + if (links.has(p_node_id) && links[p_node_id].curve_editors[0]) { if (((VisualShaderNodeCurveTexture *)links[p_node_id].visual_node)->get_texture().is_valid()) { - links[p_node_id].curve_editor->set_curve(((VisualShaderNodeCurveTexture *)links[p_node_id].visual_node)->get_texture()->get_curve()); + links[p_node_id].curve_editors[0]->set_curve(((VisualShaderNodeCurveTexture *)links[p_node_id].visual_node)->get_texture()->get_curve()); + } + } +} + +void VisualShaderGraphPlugin::update_curve_xyz(int p_node_id) { + if (links.has(p_node_id) && links[p_node_id].curve_editors[0] && links[p_node_id].curve_editors[1] && links[p_node_id].curve_editors[2]) { + if (((VisualShaderNodeCurveXYZTexture *)links[p_node_id].visual_node)->get_texture().is_valid()) { + links[p_node_id].curve_editors[0]->set_curve(((VisualShaderNodeCurveXYZTexture *)links[p_node_id].visual_node)->get_texture()->get_curve_x()); + links[p_node_id].curve_editors[1]->set_curve(((VisualShaderNodeCurveXYZTexture *)links[p_node_id].visual_node)->get_texture()->get_curve_y()); + links[p_node_id].curve_editors[2]->set_curve(((VisualShaderNodeCurveXYZTexture *)links[p_node_id].visual_node)->get_texture()->get_curve_z()); } } } @@ -265,8 +276,8 @@ void VisualShaderGraphPlugin::register_expression_edit(int p_node_id, CodeEdit * links[p_node_id].expression_edit = p_expression_edit; } -void VisualShaderGraphPlugin::register_curve_editor(int p_node_id, CurveEditor *p_curve_editor) { - links[p_node_id].curve_editor = p_curve_editor; +void VisualShaderGraphPlugin::register_curve_editor(int p_node_id, int p_index, CurveEditor *p_curve_editor) { + links[p_node_id].curve_editors[p_index] = p_curve_editor; } void VisualShaderGraphPlugin::update_uniform_refs() { @@ -312,7 +323,7 @@ void VisualShaderGraphPlugin::make_dirty(bool p_enabled) { } void VisualShaderGraphPlugin::register_link(VisualShader::Type p_type, int p_id, VisualShaderNode *p_visual_node, GraphNode *p_graph_node) { - links.insert(p_id, { p_type, p_visual_node, p_graph_node, p_visual_node->get_output_port_for_preview() != -1, -1, Map<int, InputPort>(), Map<int, Port>(), nullptr, nullptr, nullptr, nullptr, nullptr }); + links.insert(p_id, { p_type, p_visual_node, p_graph_node, p_visual_node->get_output_port_for_preview() != -1, -1, Map<int, InputPort>(), Map<int, Port>(), nullptr, nullptr, nullptr, nullptr, { nullptr, nullptr, nullptr } }); } void VisualShaderGraphPlugin::register_output_port(int p_node_id, int p_port, TextureButton *p_button) { @@ -472,6 +483,18 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) { custom_editor = hbox; } + Ref<VisualShaderNodeCurveXYZTexture> curve_xyz = vsnode; + if (curve_xyz.is_valid()) { + if (curve_xyz->get_texture().is_valid() && !curve_xyz->get_texture()->is_connected("changed", callable_mp(VisualShaderEditor::get_singleton()->get_graph_plugin(), &VisualShaderGraphPlugin::update_curve_xyz))) { + curve_xyz->get_texture()->connect("changed", callable_mp(VisualShaderEditor::get_singleton()->get_graph_plugin(), &VisualShaderGraphPlugin::update_curve_xyz), varray(p_id)); + } + + HBoxContainer *hbox = memnew(HBoxContainer); + custom_editor->set_h_size_flags(Control::SIZE_EXPAND_FILL); + hbox->add_child(custom_editor); + custom_editor = hbox; + } + Ref<VisualShaderNodeFloatConstant> float_const = vsnode; if (float_const.is_valid()) { HBoxContainer *hbox = memnew(HBoxContainer); @@ -495,19 +518,12 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) { port_offset++; node->add_child(custom_editor); - if (curve.is_valid()) { + bool is_curve = curve.is_valid() || curve_xyz.is_valid(); + + if (is_curve) { VisualShaderEditor::get_singleton()->graph->add_child(node); VisualShaderEditor::get_singleton()->_update_created_node(node); - CurveEditor *curve_editor = memnew(CurveEditor); - node->add_child(curve_editor); - register_curve_editor(p_id, curve_editor); - curve_editor->set_custom_minimum_size(Size2(300, 0)); - curve_editor->set_h_size_flags(Control::SIZE_EXPAND_FILL); - if (curve->get_texture().is_valid()) { - curve_editor->set_curve(curve->get_texture()->get_curve()); - } - TextureButton *preview = memnew(TextureButton); preview->set_toggle_mode(true); preview->set_normal_texture(VisualShaderEditor::get_singleton()->get_theme_icon("GuiVisibilityHidden", "EditorIcons")); @@ -519,12 +535,59 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) { preview->connect("pressed", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_preview_select_port), varray(p_id, 0), CONNECT_DEFERRED); custom_editor->add_child(preview); + if (vsnode->get_output_port_for_preview() >= 0) { + show_port_preview(p_type, p_id, vsnode->get_output_port_for_preview()); + } + } + + if (curve.is_valid()) { + CurveEditor *curve_editor = memnew(CurveEditor); + node->add_child(curve_editor); + register_curve_editor(p_id, 0, curve_editor); + curve_editor->set_custom_minimum_size(Size2(300, 0)); + curve_editor->set_h_size_flags(Control::SIZE_EXPAND_FILL); + if (curve->get_texture().is_valid()) { + curve_editor->set_curve(curve->get_texture()->get_curve()); + } + } + + if (curve_xyz.is_valid()) { + CurveEditor *curve_editor_x = memnew(CurveEditor); + node->add_child(curve_editor_x); + register_curve_editor(p_id, 0, curve_editor_x); + curve_editor_x->set_custom_minimum_size(Size2(300, 0)); + curve_editor_x->set_h_size_flags(Control::SIZE_EXPAND_FILL); + if (curve_xyz->get_texture().is_valid()) { + curve_editor_x->set_curve(curve_xyz->get_texture()->get_curve_x()); + } + + CurveEditor *curve_editor_y = memnew(CurveEditor); + node->add_child(curve_editor_y); + register_curve_editor(p_id, 1, curve_editor_y); + curve_editor_y->set_custom_minimum_size(Size2(300, 0)); + curve_editor_y->set_h_size_flags(Control::SIZE_EXPAND_FILL); + if (curve_xyz->get_texture().is_valid()) { + curve_editor_y->set_curve(curve_xyz->get_texture()->get_curve_y()); + } + + CurveEditor *curve_editor_z = memnew(CurveEditor); + node->add_child(curve_editor_z); + register_curve_editor(p_id, 2, curve_editor_z); + curve_editor_z->set_custom_minimum_size(Size2(300, 0)); + curve_editor_z->set_h_size_flags(Control::SIZE_EXPAND_FILL); + if (curve_xyz->get_texture().is_valid()) { + curve_editor_z->set_curve(curve_xyz->get_texture()->get_curve_z()); + } + } + + if (is_curve) { VisualShaderNode::PortType port_left = vsnode->get_input_port_type(0); VisualShaderNode::PortType port_right = vsnode->get_output_port_type(0); node->set_slot(0, true, port_left, type_color[port_left], true, port_right, type_color[port_right]); VisualShaderEditor::get_singleton()->call_deferred("_set_node_size", (int)p_type, p_id, size); } + if (vsnode->is_use_prop_slots()) { return; } @@ -888,6 +951,7 @@ void VisualShaderGraphPlugin::remove_node(VisualShader::Type p_type, int p_id) { void VisualShaderGraphPlugin::connect_nodes(VisualShader::Type p_type, int p_from_node, int p_from_port, int p_to_node, int p_to_port) { if (visual_shader->get_shader_type() == p_type) { VisualShaderEditor::get_singleton()->graph->connect_node(itos(p_from_node), p_from_port, itos(p_to_node), p_to_port); + connections.push_back({ p_from_node, p_from_port, p_to_node, p_to_port }); if (links[p_to_node].input_ports.has(p_to_port) && links[p_to_node].input_ports[p_to_port].default_input_button != nullptr) { links[p_to_node].input_ports[p_to_port].default_input_button->hide(); } @@ -897,6 +961,12 @@ void VisualShaderGraphPlugin::connect_nodes(VisualShader::Type p_type, int p_fro void VisualShaderGraphPlugin::disconnect_nodes(VisualShader::Type p_type, int p_from_node, int p_from_port, int p_to_node, int p_to_port) { if (visual_shader->get_shader_type() == p_type) { VisualShaderEditor::get_singleton()->graph->disconnect_node(itos(p_from_node), p_from_port, itos(p_to_node), p_to_port); + for (List<VisualShader::Connection>::Element *E = connections.front(); E; E = E->next()) { + if (E->get().from_node == p_from_node && E->get().from_port == p_from_port && E->get().to_node == p_to_node && E->get().to_port == p_to_port) { + connections.erase(E); + break; + } + } if (links[p_to_node].input_ports.has(p_to_port) && links[p_to_node].input_ports[p_to_port].default_input_button != nullptr && links[p_to_node].visual_node->get_input_port_default_value(p_to_port).get_type() != Variant::NIL) { links[p_to_node].input_ports[p_to_port].default_input_button->show(); set_input_port_default_value(p_type, p_to_node, p_to_port, links[p_to_node].visual_node->get_input_port_default_value(p_to_port)); @@ -2204,6 +2274,8 @@ void VisualShaderEditor::_setup_node(VisualShaderNode *p_node, int p_op_idx) { void VisualShaderEditor::_add_node(int p_idx, int p_op_idx, String p_resource_path, int p_node_idx) { ERR_FAIL_INDEX(p_idx, add_options.size()); + VisualShader::Type type = get_current_shader_type(); + Ref<VisualShaderNode> vsnode; bool is_custom = add_options[p_idx].is_custom; @@ -2230,6 +2302,29 @@ void VisualShaderEditor::_add_node(int p_idx, int p_op_idx, String p_resource_pa } } + VisualShaderNodeUniformRef *uniform_ref = Object::cast_to<VisualShaderNodeUniformRef>(vsn); + + if (uniform_ref && to_node != -1 && to_slot != -1) { + VisualShaderNode::PortType input_port_type = visual_shader->get_node(type, to_node)->get_input_port_type(to_slot); + bool success = false; + + for (int i = 0; i < uniform_ref->get_uniforms_count(); i++) { + if (uniform_ref->get_port_type_by_index(i) == input_port_type) { + uniform_ref->set_uniform_name(uniform_ref->get_uniform_name_by_index(i)); + success = true; + break; + } + } + if (!success) { + for (int i = 0; i < uniform_ref->get_uniforms_count(); i++) { + if (visual_shader->is_port_types_compatible(uniform_ref->get_port_type_by_index(i), input_port_type)) { + uniform_ref->set_uniform_name(uniform_ref->get_uniform_name_by_index(i)); + break; + } + } + } + } + vsnode = Ref<VisualShaderNode>(vsn); } else { ERR_FAIL_COND(add_options[p_idx].script.is_null()); @@ -2250,8 +2345,6 @@ void VisualShaderEditor::_add_node(int p_idx, int p_op_idx, String p_resource_pa } saved_node_pos_dirty = false; - VisualShader::Type type = get_current_shader_type(); - int id_to_use = visual_shader->get_valid_node_id(type); if (p_resource_path.is_empty()) { @@ -2380,6 +2473,11 @@ void VisualShaderEditor::_add_node(int p_idx, int p_op_idx, String p_resource_pa graph_plugin->call_deferred("update_curve", id_to_use); } + VisualShaderNodeCurveXYZTexture *curve_xyz = Object::cast_to<VisualShaderNodeCurveXYZTexture>(vsnode.ptr()); + if (curve_xyz) { + graph_plugin->call_deferred("update_curve_xyz", id_to_use); + } + if (p_resource_path.is_empty()) { undo_redo->commit_action(); } else { @@ -2388,7 +2486,7 @@ void VisualShaderEditor::_add_node(int p_idx, int p_op_idx, String p_resource_pa VisualShaderNodeTexture *texture2d = Object::cast_to<VisualShaderNodeTexture>(vsnode.ptr()); VisualShaderNodeTexture3D *texture3d = Object::cast_to<VisualShaderNodeTexture3D>(vsnode.ptr()); - if (texture2d || texture3d || curve) { + if (texture2d || texture3d || curve || curve_xyz) { undo_redo->add_do_method(vsnode.ptr(), "set_texture", ResourceLoader::load(p_resource_path)); return; } @@ -3583,6 +3681,10 @@ void VisualShaderEditor::drop_data_fw(const Point2 &p_point, const Variant &p_da saved_node_pos = p_point + Vector2(0, i * 250 * EDSCALE); saved_node_pos_dirty = true; _add_node(curve_node_option_idx, -1, arr[i], i); + } else if (type == "CurveXYZTexture") { + saved_node_pos = p_point + Vector2(0, i * 250 * EDSCALE); + saved_node_pos_dirty = true; + _add_node(curve_xyz_node_option_idx, -1, arr[i], i); } else if (ClassDB::get_parent_class(type) == "Texture2D") { saved_node_pos = p_point + Vector2(0, i * 250 * EDSCALE); saved_node_pos_dirty = true; @@ -3855,7 +3957,7 @@ VisualShaderEditor::VisualShaderEditor() { error_label = memnew(Label); error_panel->add_child(error_label); - error_label->set_autowrap(true); + error_label->set_autowrap_mode(Label::AUTOWRAP_WORD_SMART); /////////////////////////////////////// // POPUP MENU @@ -3941,7 +4043,7 @@ VisualShaderEditor::VisualShaderEditor() { add_child(members_dialog); alert = memnew(AcceptDialog); - alert->get_label()->set_autowrap(true); + alert->get_label()->set_autowrap_mode(Label::AUTOWRAP_WORD); alert->get_label()->set_align(Label::ALIGN_CENTER); alert->get_label()->set_valign(Label::VALIGN_CENTER); alert->get_label()->set_custom_minimum_size(Size2(400, 60) * EDSCALE); @@ -4304,6 +4406,8 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("CubeMap", "Textures", "Functions", "VisualShaderNodeCubemap", TTR("Perform the cubic texture lookup."), -1, -1)); curve_node_option_idx = add_options.size(); add_options.push_back(AddOption("CurveTexture", "Textures", "Functions", "VisualShaderNodeCurveTexture", TTR("Perform the curve texture lookup."), -1, -1)); + curve_xyz_node_option_idx = add_options.size(); + add_options.push_back(AddOption("CurveXYZTexture", "Textures", "Functions", "VisualShaderNodeCurveXYZTexture", TTR("Perform the three components curve texture lookup."), -1, -1)); texture2d_node_option_idx = add_options.size(); add_options.push_back(AddOption("Texture2D", "Textures", "Functions", "VisualShaderNodeTexture", TTR("Perform the 2D texture lookup."), -1, -1)); texture2d_array_node_option_idx = add_options.size(); @@ -4864,7 +4968,7 @@ void EditorInspectorShaderModePlugin::parse_begin(Object *p_object) { //do none } -bool EditorInspectorShaderModePlugin::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) { +bool EditorInspectorShaderModePlugin::parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide) { if (p_path == "mode" && p_object->is_class("VisualShader") && p_type == Variant::INT) { EditorPropertyShaderMode *editor = memnew(EditorPropertyShaderMode); Vector<String> options = p_hint_text.split(","); diff --git a/editor/plugins/visual_shader_editor_plugin.h b/editor/plugins/visual_shader_editor_plugin.h index 4c7489a694..f53726edb9 100644 --- a/editor/plugins/visual_shader_editor_plugin.h +++ b/editor/plugins/visual_shader_editor_plugin.h @@ -75,7 +75,7 @@ private: LineEdit *uniform_name = nullptr; OptionButton *const_op = nullptr; CodeEdit *expression_edit = nullptr; - CurveEditor *curve_editor = nullptr; + CurveEditor *curve_editors[3] = { nullptr, nullptr, nullptr }; }; Ref<VisualShader> visual_shader; @@ -97,7 +97,7 @@ public: void register_default_input_button(int p_node_id, int p_port_id, Button *p_button); void register_constant_option_btn(int p_node_id, OptionButton *p_button); void register_expression_edit(int p_node_id, CodeEdit *p_expression_edit); - void register_curve_editor(int p_node_id, CurveEditor *p_curve_editor); + void register_curve_editor(int p_node_id, int p_index, CurveEditor *p_curve_editor); void clear_links(); void set_shader_type(VisualShader::Type p_type); bool is_preview_visible(int p_id) const; @@ -117,6 +117,7 @@ public: void update_uniform_refs(); void set_uniform_name(VisualShader::Type p_type, int p_node_id, const String &p_name); void update_curve(int p_node_id); + void update_curve_xyz(int p_node_id); void update_constant(VisualShader::Type p_type, int p_node_id); void set_expression(VisualShader::Type p_type, int p_node_id, const String &p_expression); int get_constant_index(float p_constant) const; @@ -289,6 +290,7 @@ class VisualShaderEditor : public VBoxContainer { int texture3d_node_option_idx; int custom_node_option_idx; int curve_node_option_idx; + int curve_xyz_node_option_idx; List<String> keyword_list; List<VisualShaderNodeUniformRef> uniform_refs; @@ -505,7 +507,7 @@ class EditorInspectorShaderModePlugin : public EditorInspectorPlugin { public: virtual bool can_handle(Object *p_object) override; virtual void parse_begin(Object *p_object) override; - virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide = false) override; + virtual bool parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide = false) override; virtual void parse_end() override; }; diff --git a/editor/plugins/voxel_gi_editor_plugin.cpp b/editor/plugins/voxel_gi_editor_plugin.cpp index d30cc7ad17..162379a49d 100644 --- a/editor/plugins/voxel_gi_editor_plugin.cpp +++ b/editor/plugins/voxel_gi_editor_plugin.cpp @@ -69,10 +69,7 @@ void VoxelGIEditorPlugin::_notification(int p_what) { const Vector3i size = voxel_gi->get_estimated_cell_size(); String text = vformat(String::utf8("%d × %d × %d"), size.x, size.y, size.z); - int data_size = 4; - if (GLOBAL_GET("rendering/quality/voxel_gi/anisotropic")) { - data_size += 4; - } + const int data_size = 4; const double size_mb = size.x * size.y * size.z * data_size / (1024.0 * 1024.0); text += " - " + vformat(TTR("VRAM Size: %s MB"), String::num(size_mb, 2)); diff --git a/editor/project_export.cpp b/editor/project_export.cpp index 75736a0723..b639a74132 100644 --- a/editor/project_export.cpp +++ b/editor/project_export.cpp @@ -64,6 +64,7 @@ void ProjectExportDialog::_notification(int p_what) { duplicate_preset->set_icon(presets->get_theme_icon("Duplicate", "EditorIcons")); delete_preset->set_icon(presets->get_theme_icon("Remove", "EditorIcons")); connect("confirmed", callable_mp(this, &ProjectExportDialog::_export_pck_zip)); + _update_export_all(); } break; } } @@ -182,10 +183,12 @@ void ProjectExportDialog::_update_export_all() { } } + export_all_button->set_disabled(!can_export); + if (can_export) { - export_all_button->set_disabled(false); + export_all_button->set_tooltip(TTR("Export the project for all the presets defined.")); } else { - export_all_button->set_disabled(true); + export_all_button->set_tooltip(TTR("All presets must have an export path defined for Export All to work.")); } } @@ -433,6 +436,7 @@ void ProjectExportDialog::_export_path_changed(const StringName &p_property, con current->set_export_path(p_value); _update_presets(); + _update_export_all(); } void ProjectExportDialog::_enc_filters_changed(const String &p_filters) { @@ -589,6 +593,10 @@ void ProjectExportDialog::_delete_preset_confirm() { get_ok_button()->set_disabled(true); EditorExport::get_singleton()->remove_export_preset(idx); _update_presets(); + + // The Export All button might become enabled (if all other presets have an export path defined), + // or it could be disabled (if there are no presets anymore). + _update_export_all(); } Variant ProjectExportDialog::get_drag_data_fw(const Point2 &p_point, Control *p_from) { @@ -1005,8 +1013,11 @@ ProjectExportDialog::ProjectExportDialog() { preset_vb->set_h_size_flags(Control::SIZE_EXPAND_FILL); hbox->add_child(preset_vb); + Label *l = memnew(Label(TTR("Presets"))); + l->set_theme_type_variation("HeaderSmall"); + HBoxContainer *preset_hb = memnew(HBoxContainer); - preset_hb->add_child(memnew(Label(TTR("Presets")))); + preset_hb->add_child(l); preset_hb->add_spacer(); preset_vb->add_child(preset_hb); @@ -1199,8 +1210,8 @@ ProjectExportDialog::ProjectExportDialog() { updating = false; get_cancel_button()->set_text(TTR("Close")); - get_ok_button()->set_text(TTR("Export PCK/Zip")); - export_button = add_button(TTR("Export Project"), !DisplayServer::get_singleton()->get_swap_cancel_ok(), "export"); + get_ok_button()->set_text(TTR("Export PCK/ZIP...")); + export_button = add_button(TTR("Export Project..."), !DisplayServer::get_singleton()->get_swap_cancel_ok(), "export"); export_button->connect("pressed", callable_mp(this, &ProjectExportDialog::_export_project)); // Disable initially before we select a valid preset export_button->set_disabled(true); @@ -1209,19 +1220,19 @@ ProjectExportDialog::ProjectExportDialog() { export_all_dialog = memnew(ConfirmationDialog); add_child(export_all_dialog); export_all_dialog->set_title("Export All"); - export_all_dialog->set_text(TTR("Export mode?")); + export_all_dialog->set_text(TTR("Choose an export mode:")); export_all_dialog->get_ok_button()->hide(); export_all_dialog->add_button(TTR("Debug"), true, "debug"); export_all_dialog->add_button(TTR("Release"), true, "release"); export_all_dialog->connect("custom_action", callable_mp(this, &ProjectExportDialog::_export_all_dialog_action)); - export_all_button = add_button(TTR("Export All"), !DisplayServer::get_singleton()->get_swap_cancel_ok(), "export"); + export_all_button = add_button(TTR("Export All..."), !DisplayServer::get_singleton()->get_swap_cancel_ok(), "export"); export_all_button->connect("pressed", callable_mp(this, &ProjectExportDialog::_export_all_dialog)); export_all_button->set_disabled(true); export_pck_zip = memnew(EditorFileDialog); export_pck_zip->add_filter("*.zip ; " + TTR("ZIP File")); - export_pck_zip->add_filter("*.pck ; " + TTR("Godot Game Pack")); + export_pck_zip->add_filter("*.pck ; " + TTR("Godot Project Pack")); export_pck_zip->set_access(EditorFileDialog::ACCESS_FILESYSTEM); export_pck_zip->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE); add_child(export_pck_zip); @@ -1282,8 +1293,6 @@ ProjectExportDialog::ProjectExportDialog() { default_filename = "UnnamedProject"; } } - - _update_export_all(); } ProjectExportDialog::~ProjectExportDialog() { diff --git a/editor/property_editor.cpp b/editor/property_editor.cpp index 7414c2d8e6..ab710a1c21 100644 --- a/editor/property_editor.cpp +++ b/editor/property_editor.cpp @@ -975,7 +975,7 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant:: } for (int i = 0; i < conversions.size(); i++) { String what = conversions[i]->converts_to(); - menu->add_item(vformat(TTR("Convert To %s"), what), CONVERT_BASE_ID + i); + menu->add_item(vformat(TTR("Convert to %s"), what), CONVERT_BASE_ID + i); } } diff --git a/editor/rename_dialog.cpp b/editor/rename_dialog.cpp index 0f15d4b119..87fbbbcfb8 100644 --- a/editor/rename_dialog.cpp +++ b/editor/rename_dialog.cpp @@ -35,12 +35,18 @@ #include "editor_scale.h" #include "editor_settings.h" #include "editor_themes.h" -#include "modules/regex/regex.h" #include "plugins/script_editor_plugin.h" #include "scene/gui/control.h" #include "scene/gui/label.h" #include "scene/gui/tab_container.h" +#include "modules/modules_enabled.gen.h" +#ifdef MODULE_REGEX_ENABLED +#include "modules/regex/regex.h" +#else +#error "Can't build editor rename dialog without RegEx module." +#endif + RenameDialog::RenameDialog(SceneTreeEditor *p_scene_tree_editor, UndoRedo *p_undo_redo) { scene_tree_editor = p_scene_tree_editor; undo_redo = p_undo_redo; diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index 2114ca41d3..166b82d744 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -359,7 +359,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { break; } - if (reset_create_dialog) { + if (reset_create_dialog && !p_confirm_override) { create_dialog->set_base_type("Node"); reset_create_dialog = false; } @@ -1134,12 +1134,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { } } - editor_data->get_undo_redo().create_action(TTR("New Scene Root")); - editor_data->get_undo_redo().add_do_method(editor, "set_edited_scene", new_node); - editor_data->get_undo_redo().add_do_method(scene_tree, "update_tree"); - editor_data->get_undo_redo().add_do_reference(new_node); - editor_data->get_undo_redo().add_undo_method(editor, "set_edited_scene", (Object *)nullptr); - editor_data->get_undo_redo().commit_action(); + add_root_node(new_node); editor->edit_node(new_node); editor_selection->clear(); @@ -1162,6 +1157,15 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { } } +void SceneTreeDock::add_root_node(Node *p_node) { + editor_data->get_undo_redo().create_action(TTR("New Scene Root")); + editor_data->get_undo_redo().add_do_method(editor, "set_edited_scene", p_node); + editor_data->get_undo_redo().add_do_method(scene_tree, "update_tree"); + editor_data->get_undo_redo().add_do_reference(p_node); + editor_data->get_undo_redo().add_undo_method(editor, "set_edited_scene", (Object *)nullptr); + editor_data->get_undo_redo().commit_action(); +} + void SceneTreeDock::_node_collapsed(Object *p_obj) { TreeItem *ti = Object::cast_to<TreeItem>(p_obj); if (!ti) { @@ -1202,14 +1206,13 @@ void SceneTreeDock::_notification(int p_what) { filter->set_right_icon(get_theme_icon("Search", "EditorIcons")); filter->set_clear_button_enabled(true); - EditorNode::get_singleton()->get_editor_selection()->connect("selection_changed", callable_mp(this, &SceneTreeDock::_selection_changed)); - scene_tree->get_scene_tree()->connect("item_collapsed", callable_mp(this, &SceneTreeDock::_node_collapsed)); - // create_root_dialog HBoxContainer *top_row = memnew(HBoxContainer); top_row->set_name("NodeShortcutsTopRow"); top_row->set_h_size_flags(SIZE_EXPAND_FILL); - top_row->add_child(memnew(Label(TTR("Create Root Node:")))); + Label *l = memnew(Label(TTR("Create Root Node:"))); + l->set_theme_type_variation("HeaderSmall"); + top_row->add_child(l); top_row->add_spacer(); Button *node_shortcuts_toggle = memnew(Button); @@ -1409,9 +1412,102 @@ void SceneTreeDock::fill_path_renames(Node *p_node, Node *p_new_parent, List<Pai _fill_path_renames(base_path, new_base_path, p_node, p_renames); } +bool SceneTreeDock::_update_node_path(const NodePath &p_root_path, NodePath &r_node_path, List<Pair<NodePath, NodePath>> *p_renames) { + NodePath root_path_new = p_root_path; + for (List<Pair<NodePath, NodePath>>::Element *F = p_renames->front(); F; F = F->next()) { + if (p_root_path == F->get().first) { + root_path_new = F->get().second; + break; + } + } + + // Goes through all paths to check if it's matching. + for (List<Pair<NodePath, NodePath>>::Element *F = p_renames->front(); F; F = F->next()) { + NodePath rel_path_old = p_root_path.rel_path_to(F->get().first); + + // If old path detected, then it needs to be replaced with the new one. + if (r_node_path == rel_path_old) { + NodePath rel_path_new = F->get().second; + + // If not empty, get new relative path. + if (!rel_path_new.is_empty()) { + rel_path_new = root_path_new.rel_path_to(rel_path_new); + } + + r_node_path = rel_path_new; + return true; + } + + // Update the node itself if it has a valid node path and has not been deleted. + if (p_root_path == F->get().first && r_node_path != NodePath() && F->get().second != NodePath()) { + NodePath abs_path = NodePath(String(root_path_new).plus_file(r_node_path)).simplified(); + NodePath rel_path_new = F->get().second.rel_path_to(abs_path); + + r_node_path = rel_path_new; + return true; + } + } + + return false; +} + +bool SceneTreeDock::_check_node_path_recursive(const NodePath &p_root_path, Variant &r_variant, List<Pair<NodePath, NodePath>> *p_renames) { + switch (r_variant.get_type()) { + case Variant::NODE_PATH: { + NodePath node_path = r_variant; + if (_update_node_path(p_root_path, node_path, p_renames)) { + r_variant = node_path; + return true; + } + } break; + + case Variant::ARRAY: { + Array a = r_variant; + bool updated = false; + for (int i = 0; i < a.size(); i++) { + Variant value = a[i]; + if (_check_node_path_recursive(p_root_path, value, p_renames)) { + if (!updated) { + a = a.duplicate(); // Need to duplicate for undo-redo to work. + updated = true; + } + a[i] = value; + } + } + if (updated) { + r_variant = a; + return true; + } + } break; + + case Variant::DICTIONARY: { + Dictionary d = r_variant; + bool updated = false; + for (int i = 0; i < d.size(); i++) { + Variant value = d.get_value_at_index(i); + if (_check_node_path_recursive(p_root_path, value, p_renames)) { + if (!updated) { + d = d.duplicate(); // Need to duplicate for undo-redo to work. + updated = true; + } + d[d.get_key_at_index(i)] = value; + } + } + if (updated) { + r_variant = d; + return true; + } + } break; + + default: { + } + } + + return false; +} + void SceneTreeDock::perform_node_renames(Node *p_base, List<Pair<NodePath, NodePath>> *p_renames, Map<Ref<Animation>, Set<int>> *r_rem_anims) { Map<Ref<Animation>, Set<int>> rem_anims; - if (!r_rem_anims) { r_rem_anims = &rem_anims; } @@ -1424,60 +1520,22 @@ void SceneTreeDock::perform_node_renames(Node *p_base, List<Pair<NodePath, NodeP return; } - // Renaming node paths used in script instances - if (p_base->get_script_instance()) { - ScriptInstance *si = p_base->get_script_instance(); - - if (si) { - List<PropertyInfo> properties; - si->get_property_list(&properties); - NodePath root_path = p_base->get_path(); - - for (List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) { - String propertyname = E->get().name; - Variant p = p_base->get(propertyname); - if (p.get_type() == Variant::NODE_PATH) { - NodePath root_path_new = root_path; - for (List<Pair<NodePath, NodePath>>::Element *F = p_renames->front(); F; F = F->next()) { - if (root_path == F->get().first) { - root_path_new = F->get().second; - break; - } - } + // Renaming node paths used in node properties. + List<PropertyInfo> properties; + p_base->get_property_list(&properties); + NodePath base_root_path = p_base->get_path(); - // Goes through all paths to check if its matching - for (List<Pair<NodePath, NodePath>>::Element *F = p_renames->front(); F; F = F->next()) { - NodePath rel_path_old = root_path.rel_path_to(F->get().first); - - // if old path detected, then it needs to be replaced with the new one - if (p == rel_path_old) { - NodePath rel_path_new = F->get().second; - - // if not empty, get new relative path - if (!rel_path_new.is_empty()) { - rel_path_new = root_path_new.rel_path_to(F->get().second); - } - - editor_data->get_undo_redo().add_do_property(p_base, propertyname, rel_path_new); - editor_data->get_undo_redo().add_undo_property(p_base, propertyname, rel_path_old); - - p_base->set(propertyname, rel_path_new); - break; - } - - // update the node itself if it has a valid node path and has not been deleted - if (root_path == F->get().first && p != NodePath() && F->get().second != NodePath()) { - NodePath abs_path = NodePath(String(root_path).plus_file(p)).simplified(); - NodePath rel_path_new = F->get().second.rel_path_to(abs_path); - - editor_data->get_undo_redo().add_do_property(p_base, propertyname, rel_path_new); - editor_data->get_undo_redo().add_undo_property(p_base, propertyname, p); - - p_base->set(propertyname, rel_path_new); - } - } - } - } + for (List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) { + if (!(E->get().usage & (PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR))) { + continue; + } + String propertyname = E->get().name; + Variant old_variant = p_base->get(propertyname); + Variant updated_variant = old_variant; + if (_check_node_path_recursive(base_root_path, updated_variant, p_renames)) { + editor_data->get_undo_redo().add_do_property(p_base, propertyname, updated_variant); + editor_data->get_undo_redo().add_undo_property(p_base, propertyname, old_variant); + p_base->set(propertyname, updated_variant); } } @@ -3157,6 +3215,9 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel scene_tree->connect("nodes_dragged", callable_mp(this, &SceneTreeDock::_nodes_drag_begin)); scene_tree->get_scene_tree()->connect("item_double_clicked", callable_mp(this, &SceneTreeDock::_focus_node)); + scene_tree->get_scene_tree()->connect("item_collapsed", callable_mp(this, &SceneTreeDock::_node_collapsed)); + + editor_selection->connect("selection_changed", callable_mp(this, &SceneTreeDock::_selection_changed)); scene_tree->set_undo_redo(&editor_data->get_undo_redo()); scene_tree->set_editor_selection(editor_selection); diff --git a/editor/scene_tree_dock.h b/editor/scene_tree_dock.h index a313337540..08d992d465 100644 --- a/editor/scene_tree_dock.h +++ b/editor/scene_tree_dock.h @@ -247,6 +247,9 @@ class SceneTreeDock : public VBoxContainer { static SceneTreeDock *singleton; static void _update_configuration_warning(); + static bool _update_node_path(const NodePath &p_root_path, NodePath &r_node_path, List<Pair<NodePath, NodePath>> *p_renames); + static bool _check_node_path_recursive(const NodePath &p_root_path, Variant &r_variant, List<Pair<NodePath, NodePath>> *p_renames); + protected: void _notification(int p_what); static void _bind_methods(); @@ -258,6 +261,7 @@ public: void _focus_node(); void import_subscene(); + void add_root_node(Node *p_node); void set_edited_scene(Node *p_scene); void instantiate(const String &p_file); void instantiate_scenes(const Vector<String> &p_files, Node *p_parent = nullptr); diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp index 3aa04e4dc3..5958a09169 100644 --- a/editor/scene_tree_editor.cpp +++ b/editor/scene_tree_editor.cpp @@ -526,6 +526,10 @@ void SceneTreeEditor::_node_removed(Node *p_node) { } void SceneTreeEditor::_node_renamed(Node *p_node) { + if (!get_scene_node()->is_ancestor_of(p_node)) { + return; + } + emit_signal("node_renamed"); if (!tree_dirty) { @@ -659,7 +663,14 @@ void SceneTreeEditor::_cell_multi_selected(Object *p_object, int p_cell, bool p_ } else { editor_selection->remove_node(n); } - emit_signal("node_changed"); + + // Selection changed to be single node, so emit "selected" (for single node) rather than "changed" (for multiple nodes) + if (editor_selection->get_selected_nodes().size() == 1) { + selected = editor_selection->get_selected_node_list()[0]; + emit_signal("node_selected"); + } else { + emit_signal("node_changed"); + } } void SceneTreeEditor::_notification(int p_what) { @@ -1165,6 +1176,7 @@ SceneTreeEditor::SceneTreeEditor(bool p_label, bool p_can_rename, bool p_can_ope if (p_label) { Label *label = memnew(Label); + label->set_theme_type_variation("HeaderSmall"); label->set_position(Point2(10, 0)); label->set_text(TTR("Scene Tree (Nodes):")); diff --git a/editor/script_create_dialog.cpp b/editor/script_create_dialog.cpp index 01743bccab..b5028096e0 100644 --- a/editor/script_create_dialog.cpp +++ b/editor/script_create_dialog.cpp @@ -40,38 +40,35 @@ #include "editor/editor_scale.h" #include "editor_file_system.h" -void ScriptCreateDialog::_theme_changed() { - for (int i = 0; i < ScriptServer::get_language_count(); i++) { - String lang = ScriptServer::get_language(i)->get_type(); - Ref<Texture2D> lang_icon = gc->get_theme_icon(lang, "EditorIcons"); - if (lang_icon.is_valid()) { - language_menu->set_item_icon(i, lang_icon); - } - } - - String last_lang = EditorSettings::get_singleton()->get_project_metadata("script_setup", "last_selected_language", ""); - if (!last_lang.is_empty()) { - for (int i = 0; i < language_menu->get_item_count(); i++) { - if (language_menu->get_item_text(i) == last_lang) { - language_menu->select(i); - current_language = i; - break; +void ScriptCreateDialog::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + for (int i = 0; i < ScriptServer::get_language_count(); i++) { + String lang = ScriptServer::get_language(i)->get_type(); + Ref<Texture2D> lang_icon = get_theme_icon(lang, "EditorIcons"); + if (lang_icon.is_valid()) { + language_menu->set_item_icon(i, lang_icon); + } } - } - } else { - language_menu->select(default_language); - } - path_button->set_icon(gc->get_theme_icon("Folder", "EditorIcons")); - parent_browse_button->set_icon(gc->get_theme_icon("Folder", "EditorIcons")); - parent_search_button->set_icon(gc->get_theme_icon("ClassList", "EditorIcons")); - status_panel->add_theme_style_override("panel", gc->get_theme_stylebox("bg", "Tree")); -} + String last_lang = EditorSettings::get_singleton()->get_project_metadata("script_setup", "last_selected_language", ""); + if (!last_lang.is_empty()) { + for (int i = 0; i < language_menu->get_item_count(); i++) { + if (language_menu->get_item_text(i) == last_lang) { + language_menu->select(i); + current_language = i; + break; + } + } + } else { + language_menu->select(default_language); + } -void ScriptCreateDialog::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - _theme_changed(); + path_button->set_icon(get_theme_icon("Folder", "EditorIcons")); + parent_browse_button->set_icon(get_theme_icon("Folder", "EditorIcons")); + parent_search_button->set_icon(get_theme_icon("ClassList", "EditorIcons")); + status_panel->add_theme_style_override("panel", get_theme_stylebox("bg", "Tree")); } break; } } @@ -451,7 +448,7 @@ void ScriptCreateDialog::_lang_changed(int l) { override_info += ", "; } } - template_menu->set_item_icon(extended.id, gc->get_theme_icon("Override", "EditorIcons")); + template_menu->set_item_icon(extended.id, get_theme_icon("Override", "EditorIcons")); template_menu->get_popup()->set_item_tooltip(extended.id, override_info.as_string()); } // Reselect last selected template @@ -609,18 +606,18 @@ void ScriptCreateDialog::_path_submitted(const String &p_path) { void ScriptCreateDialog::_msg_script_valid(bool valid, const String &p_msg) { error_label->set_text("- " + p_msg); if (valid) { - error_label->add_theme_color_override("font_color", gc->get_theme_color("success_color", "Editor")); + error_label->add_theme_color_override("font_color", get_theme_color("success_color", "Editor")); } else { - error_label->add_theme_color_override("font_color", gc->get_theme_color("error_color", "Editor")); + error_label->add_theme_color_override("font_color", get_theme_color("error_color", "Editor")); } } void ScriptCreateDialog::_msg_path_valid(bool valid, const String &p_msg) { path_error_label->set_text("- " + p_msg); if (valid) { - path_error_label->add_theme_color_override("font_color", gc->get_theme_color("success_color", "Editor")); + path_error_label->add_theme_color_override("font_color", get_theme_color("success_color", "Editor")); } else { - path_error_label->add_theme_color_override("font_color", gc->get_theme_color("error_color", "Editor")); + path_error_label->add_theme_color_override("font_color", get_theme_color("error_color", "Editor")); } } @@ -748,15 +745,11 @@ void ScriptCreateDialog::_bind_methods() { } ScriptCreateDialog::ScriptCreateDialog() { - /* DIALOG */ - /* Main Controls */ - gc = memnew(GridContainer); + GridContainer *gc = memnew(GridContainer); gc->set_columns(2); - gc->connect("theme_changed", callable_mp(this, &ScriptCreateDialog::_theme_changed)); - /* Error Messages Field */ VBoxContainer *vb = memnew(VBoxContainer); @@ -771,7 +764,7 @@ ScriptCreateDialog::ScriptCreateDialog() { builtin_warning_label->set_text( TTR("Note: Built-in scripts have some limitations and can't be edited using an external editor.")); vb->add_child(builtin_warning_label); - builtin_warning_label->set_autowrap(true); + builtin_warning_label->set_autowrap_mode(Label::AUTOWRAP_WORD_SMART); builtin_warning_label->hide(); script_name_warning_label = memnew(Label); @@ -779,11 +772,12 @@ ScriptCreateDialog::ScriptCreateDialog() { TTR("Warning: Having the script name be the same as a built-in type is usually not desired.")); vb->add_child(script_name_warning_label); script_name_warning_label->add_theme_color_override("font_color", Color(1, 0.85, 0.4)); - script_name_warning_label->set_autowrap(true); + script_name_warning_label->set_autowrap_mode(Label::AUTOWRAP_WORD_SMART); script_name_warning_label->hide(); status_panel = memnew(PanelContainer); status_panel->set_h_size_flags(Control::SIZE_FILL); + status_panel->set_v_size_flags(Control::SIZE_EXPAND_FILL); status_panel->add_child(vb); /* Spacing */ @@ -795,10 +789,7 @@ ScriptCreateDialog::ScriptCreateDialog() { vb->add_child(gc); vb->add_child(spacing); vb->add_child(status_panel); - HBoxContainer *hb = memnew(HBoxContainer); - hb->add_child(vb); - - add_child(hb); + add_child(vb); /* Language */ @@ -827,14 +818,13 @@ ScriptCreateDialog::ScriptCreateDialog() { base_type = "Object"; - hb = memnew(HBoxContainer); + HBoxContainer *hb = memnew(HBoxContainer); hb->set_h_size_flags(Control::SIZE_EXPAND_FILL); parent_name = memnew(LineEdit); parent_name->connect("text_changed", callable_mp(this, &ScriptCreateDialog::_parent_name_changed)); parent_name->set_h_size_flags(Control::SIZE_EXPAND_FILL); hb->add_child(parent_name); parent_search_button = memnew(Button); - parent_search_button->set_flat(true); parent_search_button->connect("pressed", callable_mp(this, &ScriptCreateDialog::_browse_class_in_tree)); hb->add_child(parent_search_button); parent_browse_button = memnew(Button); @@ -894,7 +884,7 @@ ScriptCreateDialog::ScriptCreateDialog() { add_child(file_browse); get_ok_button()->set_text(TTR("Create")); alert = memnew(AcceptDialog); - alert->get_label()->set_autowrap(true); + alert->get_label()->set_autowrap_mode(Label::AUTOWRAP_WORD_SMART); alert->get_label()->set_align(Label::ALIGN_CENTER); alert->get_label()->set_valign(Label::VALIGN_CENTER); alert->get_label()->set_custom_minimum_size(Size2(325, 60) * EDSCALE); diff --git a/editor/script_create_dialog.h b/editor/script_create_dialog.h index a020be0478..7c2ef1e150 100644 --- a/editor/script_create_dialog.h +++ b/editor/script_create_dialog.h @@ -45,7 +45,6 @@ class CreateDialog; class ScriptCreateDialog : public ConfirmationDialog { GDCLASS(ScriptCreateDialog, ConfirmationDialog); - GridContainer *gc; LineEdit *class_name; Label *error_label; Label *path_error_label; @@ -127,7 +126,6 @@ class ScriptCreateDialog : public ConfirmationDialog { void _update_dialog(); protected: - void _theme_changed(); void _notification(int p_what); static void _bind_methods(); diff --git a/editor/translations/af.po b/editor/translations/af.po index 40669c01fb..bb7e7ca553 100644 --- a/editor/translations/af.po +++ b/editor/translations/af.po @@ -420,10 +420,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "" @@ -472,7 +468,8 @@ msgid "Anim Move Keys" msgstr "Anim Skuif Sleutels" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" msgstr "" #: editor/animation_track_editor.cpp @@ -2557,7 +2554,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11989,10 +11986,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" diff --git a/editor/translations/ar.po b/editor/translations/ar.po index ceeda7a037..6d8db6f47b 100644 --- a/editor/translations/ar.po +++ b/editor/translations/ar.po @@ -51,12 +51,13 @@ # Kareem Abduljaleel <karemjaleel34@gmail.com>, 2021. # ILG - Game <moegypt277@gmail.com>, 2021. # Hatim Jamal <hatimjamal8@gmail.com>, 2021. +# HASSAN GAMER - حسن جيمر <gamerhassan55@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-05-07 02:12+0000\n" -"Last-Translator: ILG - Game <moegypt277@gmail.com>\n" +"PO-Revision-Date: 2021-07-09 14:32+0000\n" +"Last-Translator: HASSAN GAMER - حسن جيمر <gamerhassan55@gmail.com>\n" "Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/" "godot/ar/>\n" "Language: ar\n" @@ -65,7 +66,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.8-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -88,7 +89,7 @@ msgstr "مدخلات خاطئة %i (لم يتم تمريره) في التعبي #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "لا يمكن إستخدامه نفسه لأن الحالة فارغة (لم يُمرر)" +msgstr "لا يمكن استخدام self لأن النموذج فارغ (لم يتم ادخاله)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -455,10 +456,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "مسارات الحركة يمكنها فقط أن تشير إلى عُقد مشغّل الحركة." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "مشغل الحركة لا يمكنه أن يحرك نفسه, فقط الاعبين الأخرين." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "لا يمكن إضافة مقطع جديد بدون جذر" @@ -503,8 +500,9 @@ msgid "Anim Move Keys" msgstr "مفتاح حركة التحريك" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "الحافظة (Clipboard) فارغة" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "الحافظة فارغة!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -1156,7 +1154,7 @@ msgstr "شكراً من مجتمع غودوت!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "انقر للنسخ" #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -2531,7 +2529,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "هل تريد حفظ التغييرات للمشاهد التالية قبل الخروج؟" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "هل تود حفظ التغييرات التي اجريت على المشاهد الحالية قبل فتح نافذة ادارة " "المشروع؟" @@ -11996,10 +11994,6 @@ msgid "Can't copy the function node." msgstr "لا يمكن نسخ الوظيفة البرمجية للعُقدة." #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "الحافظة فارغة!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "لصق عُقد البرمجة البصرية VisualScript" @@ -13198,6 +13192,12 @@ msgstr "يمكن تعيين المتغيرات فقط في الذروة ." msgid "Constants cannot be modified." msgstr "لا يمكن تعديل الثوابت." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "مشغل الحركة لا يمكنه أن يحرك نفسه, فقط الاعبين الأخرين." + +#~ msgid "Clipboard is empty" +#~ msgstr "الحافظة (Clipboard) فارغة" + #~ msgid "No" #~ msgstr "لا" diff --git a/editor/translations/az.po b/editor/translations/az.po index 32efc852f8..054bc9263d 100644 --- a/editor/translations/az.po +++ b/editor/translations/az.po @@ -433,11 +433,6 @@ msgstr "" "Animasiya parçaları yalnız AnimationPlayer düyünlərini işarə edə bilər." #: editor/animation_track_editor.cpp -#, fuzzy -msgid "An animation player can't animate itself, only other players." -msgstr "Animasiya pleyeri özünü canlandıra bilməz, yalnız digər pleyerlər." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Kök olmadan yeni iz əlavə etmək mümkün deyil" @@ -483,8 +478,9 @@ msgid "Anim Move Keys" msgstr "Animasya Köçürmə Açarları" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Panel(Clipboard) boşdur" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" #: editor/animation_track_editor.cpp #, fuzzy @@ -2480,7 +2476,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11552,10 +11548,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" @@ -12576,3 +12568,10 @@ msgstr "" #: servers/visual/shader_language.cpp msgid "Constants cannot be modified." msgstr "" + +#, fuzzy +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "Animasiya pleyeri özünü canlandıra bilməz, yalnız digər pleyerlər." + +#~ msgid "Clipboard is empty" +#~ msgstr "Panel(Clipboard) boşdur" diff --git a/editor/translations/bg.po b/editor/translations/bg.po index 65a77ffd74..7bf3d40805 100644 --- a/editor/translations/bg.po +++ b/editor/translations/bg.po @@ -415,10 +415,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "" @@ -463,7 +459,8 @@ msgid "Anim Move Keys" msgstr "" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" msgstr "" #: editor/animation_track_editor.cpp @@ -2424,7 +2421,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11603,10 +11600,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "Поставяне на възлите с VisualScript" diff --git a/editor/translations/bn.po b/editor/translations/bn.po index 999d6f59d5..70a66820fb 100644 --- a/editor/translations/bn.po +++ b/editor/translations/bn.po @@ -415,10 +415,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "অ্যানিমেশন ট্র্যাকগুলি কেবল অ্যানিমেশনপ্লেয়ার নোডগুলিতে নির্দেশ করতে পারে।" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "একটি অ্যানিমেশন প্লেয়ার নিজেই অ্যানিমেট করতে পারে না, কেবল অন্য প্লেয়ার।" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "মূল ছাড়া নতুন ট্র্যাক যুক্ত করা সম্ভব নয়" @@ -463,8 +459,10 @@ msgid "Anim Move Keys" msgstr "অ্যানিমেশনে (Anim) চাবি/কী-সমুহ সরান" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "ক্লীপবোর্ড খালি" +#: modules/visual_script/visual_script_editor.cpp +#, fuzzy +msgid "Clipboard is empty!" +msgstr "রিসোর্সের ক্লীপবোর্ড খালি!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -2609,7 +2607,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "বন্ধ করার পূর্বে পরিবর্তনসমূহ (সিন) সংরক্ষণ করবেন?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "প্রজেক্ট ম্যানেজার ওপেন করার পূর্বে পরিবর্তনসমূহ (সিন) সংরক্ষণ করবেন?" #: editor/editor_node.cpp @@ -12737,11 +12735,6 @@ msgstr "'..' তে পরিচালনা করা সম্ভব নয়" #: modules/visual_script/visual_script_editor.cpp #, fuzzy -msgid "Clipboard is empty!" -msgstr "রিসোর্সের ক্লীপবোর্ড খালি!" - -#: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Paste VisualScript Nodes" msgstr "নোড-সমূহ প্রতিলেপন/পেস্ট করুন" @@ -13863,6 +13856,12 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "একটি অ্যানিমেশন প্লেয়ার নিজেই অ্যানিমেট করতে পারে না, কেবল অন্য প্লেয়ার।" + +#~ msgid "Clipboard is empty" +#~ msgstr "ক্লীপবোর্ড খালি" + #, fuzzy #~ msgid "No" #~ msgstr "নোড" diff --git a/editor/translations/br.po b/editor/translations/br.po index 21e33b7372..9d1e52e009 100644 --- a/editor/translations/br.po +++ b/editor/translations/br.po @@ -414,12 +414,6 @@ msgstr "" "Roudennoù Fiñvskeudenn a c'hell poentañ nemetken da skoulmoù AnimationPlayer." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" -"Ul lennerezh fiñvskeudenn ne c'hell ket em lakaat da fiñval, nemet " -"lennerezhioù all." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Dibosupl ouzhpenn ur roudenn nevez hep ur gwrizienn" @@ -464,8 +458,9 @@ msgid "Anim Move Keys" msgstr "Fiñval Alc'hwezioù Fiñvskeudenn" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Goullo ar gwask-paper" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -2425,7 +2420,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11497,10 +11492,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" @@ -12521,3 +12512,11 @@ msgstr "" #: servers/visual/shader_language.cpp msgid "Constants cannot be modified." msgstr "" + +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "Ul lennerezh fiñvskeudenn ne c'hell ket em lakaat da fiñval, nemet " +#~ "lennerezhioù all." + +#~ msgid "Clipboard is empty" +#~ msgstr "Goullo ar gwask-paper" diff --git a/editor/translations/ca.po b/editor/translations/ca.po index 26e9ac5a45..1032b7cdeb 100644 --- a/editor/translations/ca.po +++ b/editor/translations/ca.po @@ -15,12 +15,13 @@ # Carles Pastor Badosa <cpbadosa@gmail.com>, 2021. # Roberto Pérez <djleizar@gmail.com>, 2021. # Joel Garcia Cascalló <jocsencat@gmail.com>, 2021. +# DFC <damiafluixacanals28@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-05-14 11:19+0000\n" -"Last-Translator: Joel Garcia Cascalló <jocsencat@gmail.com>\n" +"PO-Revision-Date: 2021-06-29 12:48+0000\n" +"Last-Translator: DFC <damiafluixacanals28@gmail.com>\n" "Language-Team: Catalan <https://hosted.weblate.org/projects/godot-engine/" "godot/ca/>\n" "Language: ca\n" @@ -28,7 +29,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.7.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -420,12 +421,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Les pistes d'Animació només poden apuntar a nodes AnimationPlayer." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" -"Un reproductor d'Animacions no pot animar-se a si mateix, només altres " -"reproductors." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "No es pot afegir una nova pista sense cap arrel" @@ -471,8 +466,9 @@ msgid "Anim Move Keys" msgstr "Mou les Claus" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "El porta-retalls és buit" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "El porta-retalls és buit!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -1129,7 +1125,7 @@ msgstr "Gràcies de la part de la Comunitat del Godot!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "Fes click per a copiar." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -2331,6 +2327,8 @@ msgid "" "An error occurred while trying to save the editor layout.\n" "Make sure the editor's user data path is writable." msgstr "" +"S'ha produit un error al desar el diseny de l'editor.\n" +"Assegura't de que el directori de dades d'usuari de l'editor és editable." #: editor/editor_node.cpp msgid "" @@ -2338,6 +2336,9 @@ msgid "" "To restore the Default layout to its base settings, use the Delete Layout " "option and delete the Default layout." msgstr "" +"S'ha anulat el diseny per defecte de l'editor.\n" +"Per a restaurar el Diseny per defecte a la seva configuració base, usa la " +"opció d'Esborrar el Diseny i esborra el Diseny per defecte." #: editor/editor_node.cpp msgid "Layout name not found!" @@ -2401,7 +2402,7 @@ msgstr "No s'ha definit cap escena per executar." #: editor/editor_node.cpp msgid "Save scene before running..." -msgstr "" +msgstr "Desar l'escena abans de executar-la..." #: editor/editor_node.cpp msgid "Could not start subprocess!" @@ -2519,7 +2520,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Voleu Desar els canvis en les escenes següents abans de Sortir?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "Desar els canvis a la(les) següent(s) escenes abans d'obrir el Gestor de " "Projectes?" @@ -3022,7 +3023,7 @@ msgstr "Quant a" #: editor/editor_node.cpp msgid "Support Godot Development" -msgstr "" +msgstr "Contribueix a el Desenvolupament de Godot" #: editor/editor_node.cpp msgid "Play the project." @@ -3726,6 +3727,8 @@ msgstr "Estat: No s'ha pogut importar. Corregiu el fitxer i torneu a importar." msgid "" "Importing has been disabled for this file, so it can't be opened for editing." msgstr "" +"La importació s'ha desactivat per a aquest fitxer, per tant aquest no pot " +"ser obert per a editar." #: editor/filesystem_dock.cpp msgid "Cannot move/rename resources root." @@ -3772,6 +3775,12 @@ msgid "" "\n" "Do you wish to overwrite them?" msgstr "" +"Els fitxers o directoris següents entren en conflicte amb els elements de la " +"ubicació de destí '%s':\n" +"\n" +"%s\n" +"\n" +"Vols reemplaçar-los?" #: editor/filesystem_dock.cpp msgid "Renaming file:" @@ -4136,7 +4145,7 @@ msgstr "Carrega Valors predeterminats" #: editor/import_dock.cpp msgid "Keep File (No Import)" -msgstr "" +msgstr "Mantenir Fitxer (No Importar)" #: editor/import_dock.cpp msgid "%d Files" @@ -12340,10 +12349,6 @@ msgid "Can't copy the function node." msgstr "No es pot copiar el node de funció." #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "El porta-retalls és buit!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "Enganxa els Nodes de VisualScript" @@ -13553,6 +13558,14 @@ msgstr "" msgid "Constants cannot be modified." msgstr "Les constants no es poden modificar." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "Un reproductor d'Animacions no pot animar-se a si mateix, només altres " +#~ "reproductors." + +#~ msgid "Clipboard is empty" +#~ msgstr "El porta-retalls és buit" + #~ msgid "No" #~ msgstr "No" diff --git a/editor/translations/cs.po b/editor/translations/cs.po index 8f1e930115..3aaf91d758 100644 --- a/editor/translations/cs.po +++ b/editor/translations/cs.po @@ -30,8 +30,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-05-21 11:33+0000\n" -"Last-Translator: swifterik <blaha.j502@gmail.com>\n" +"PO-Revision-Date: 2021-06-25 02:57+0000\n" +"Last-Translator: Vojtěch Šamla <auzkok@seznam.cz>\n" "Language-Team: Czech <https://hosted.weblate.org/projects/godot-engine/godot/" "cs/>\n" "Language: cs\n" @@ -39,7 +39,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.7.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -431,10 +431,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Stopa animace může odkazovat pouze na uzly AnimationPlayer." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "Přehrávač animace nemůže animovat sám sebe, pouze ostatní přehrávače." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Není možné přidat novou stopu bez kořenového uzlu" @@ -479,8 +475,9 @@ msgid "Anim Move Keys" msgstr "Animace: přesunout klíče" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Schránka je prázdná" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "Schránka je prázdná!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -2515,7 +2512,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Uložit změny následujících scén před ukončením?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "Uložit změny následujících scén před otevřením Správce projektu?" #: editor/editor_node.cpp @@ -5224,11 +5221,11 @@ msgstr "" "čtvercové oblasti [0.0, 1.0]." #: editor/plugins/baked_lightmap_editor_plugin.cpp -#, fuzzy msgid "" "Godot editor was built without ray tracing support, lightmaps can't be baked." msgstr "" -"Godot byl sestaven bez podpory ray tracingu, světelné mapy nelze zapéct." +"Editor Godot byl sestaven bez podpory ray tracingu, světelné mapy nelze " +"zapéct." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Bake Lightmaps" @@ -11945,10 +11942,6 @@ msgid "Can't copy the function node." msgstr "Nelze zkopírovat uzel funkce." #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "Schránka je prázdná!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "Vložit VisualScript uzly" @@ -13119,6 +13112,13 @@ msgstr "Odlišnosti mohou být přiřazeny pouze ve vertex funkci." msgid "Constants cannot be modified." msgstr "Konstanty není možné upravovat." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "Přehrávač animace nemůže animovat sám sebe, pouze ostatní přehrávače." + +#~ msgid "Clipboard is empty" +#~ msgstr "Schránka je prázdná" + #~ msgid "" #~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." #~ msgstr "Uzel InterpolatedCamera je zastaralý a bude odstraněn v Godot 4.0." diff --git a/editor/translations/da.po b/editor/translations/da.po index 77cd37e20b..9e09250fbc 100644 --- a/editor/translations/da.po +++ b/editor/translations/da.po @@ -434,11 +434,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Animationsspor kan kun pege på AnimationPlayer noder." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" -"En animationsafspiller kan ikke animerer sig selv, kun andre afspillere." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Det er ikke muligt at tilføje et nyt spor uden en rod" @@ -487,8 +482,9 @@ msgid "Anim Move Keys" msgstr "Anim Flyt Nøgle" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Udklipsholder er tom" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -2600,7 +2596,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Gem ændringer i følgende scene(r) før du afslutter?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "Gem ændringer i følgende scene(r), før du åbner Projekt Manager?" #: editor/editor_node.cpp @@ -12267,10 +12263,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "Indsæt VisualScript Nodes" @@ -13392,6 +13384,13 @@ msgstr "" msgid "Constants cannot be modified." msgstr "Konstanter kan ikke ændres." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "En animationsafspiller kan ikke animerer sig selv, kun andre afspillere." + +#~ msgid "Clipboard is empty" +#~ msgstr "Udklipsholder er tom" + #~ msgid "No" #~ msgstr "Nej" diff --git a/editor/translations/de.po b/editor/translations/de.po index 89ffa6e87c..bbf72f815b 100644 --- a/editor/translations/de.po +++ b/editor/translations/de.po @@ -69,12 +69,14 @@ # El Captian <elcaptian@posteo.me>, 2021. # Ron Eric Hackländer <mail@roneric.net>, 2021. # Stephan Kerbl <stephankerbl@gmail.com>, 2021. +# Philipp Wabnitz <philipp.wabnitz@s2011.tu-chemnitz.de>, 2021. +# jmih03 <joerni@mail.de>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-06-07 23:43+0000\n" -"Last-Translator: Linux User <no-ads@mail.de>\n" +"PO-Revision-Date: 2021-07-13 06:13+0000\n" +"Last-Translator: jmih03 <joerni@mail.de>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot/de/>\n" "Language: de\n" @@ -82,7 +84,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.7.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -473,11 +475,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Animationsspuren können nur auf AnimationPlayer-Nodes zeigen." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" -"Ein AnimationPlayer kann sich nicht selbst animieren, nur andere Objekte." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Ohne eine Wurzel kann keine neue Spur hinzugefügt werden" @@ -524,8 +521,9 @@ msgid "Anim Move Keys" msgstr "Schlüsselbilder bewegen" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Zwischenablage ist leer" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "Zwischenablage ist leer!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -1189,7 +1187,7 @@ msgstr "Die Godot-Gemeinschaft bedankt sich!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "Zum kopieren klicken." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -2579,7 +2577,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Änderungen in den folgenden Szenen vor dem Schließen speichern?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "Änderungen in den folgenden Szenen vor dem Öffnen der Projektverwaltung " "speichern?" @@ -7153,7 +7151,7 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" -msgstr "Testhilfsprogramm" +msgstr "Debugger" #: editor/plugins/script_editor_plugin.cpp msgid "Search Results" @@ -7417,7 +7415,7 @@ msgstr "IK abspielen" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orthogonal" -msgstr "Orthogonal" +msgstr "Senkrecht" #: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective" @@ -7661,7 +7659,7 @@ msgid "" "To zoom further, change the camera's clipping planes (View -> Settings...)" msgstr "" "Um weiter zoomen zu können müssen die Kameraausschnittebenen geändert werden " -"(Anzeige -> Einstellungen… )" +"(Ansicht -> Einstellungen… )" #: editor/plugins/spatial_editor_plugin.cpp msgid "" @@ -10353,7 +10351,7 @@ msgstr "Ereignis hinzufügen" #: editor/project_settings_editor.cpp msgid "Button" -msgstr "Knopf" +msgstr "Button" #: editor/project_settings_editor.cpp msgid "Left Button." @@ -12108,10 +12106,6 @@ msgid "Can't copy the function node." msgstr "Das Function-Node kann nicht kopiert werden." #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "Zwischenablage ist leer!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "VisualScript-Nodes einfügen" @@ -12330,6 +12324,8 @@ msgid "" "Either Debug Keystore, Debug User AND Debug Password settings must be " "configured OR none of them." msgstr "" +"Die drei Einstellungen Debug Keystore, Debug User und Debug Password müssen " +"entweder alle angegeben, oder alle nicht angegeben sein." #: platform/android/export/export.cpp msgid "Debug keystore not configured in the Editor Settings nor in the preset." @@ -12342,6 +12338,8 @@ msgid "" "Either Release Keystore, Release User AND Release Password settings must be " "configured OR none of them." msgstr "" +"Die drei Einstellungen Release Keystore, Release User und Release Password " +"müssen entweder alle angegeben, oder alle nicht angegeben sein." #: platform/android/export/export.cpp msgid "Release keystore incorrectly configured in the export preset." @@ -13342,6 +13340,13 @@ msgstr "Varyings können nur in Vertex-Funktion zugewiesen werden." msgid "Constants cannot be modified." msgstr "Konstanten können nicht verändert werden." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "Ein AnimationPlayer kann sich nicht selbst animieren, nur andere Objekte." + +#~ msgid "Clipboard is empty" +#~ msgstr "Zwischenablage ist leer" + #~ msgid "" #~ "Godot editor was built without ray tracing support; lightmaps can't be " #~ "baked.\n" diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot index 603b07a6d5..a0f4654639 100644 --- a/editor/translations/editor.pot +++ b/editor/translations/editor.pot @@ -396,10 +396,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "" @@ -444,7 +440,8 @@ msgid "Anim Move Keys" msgstr "" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" msgstr "" #: editor/animation_track_editor.cpp @@ -2403,7 +2400,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11475,10 +11472,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" diff --git a/editor/translations/el.po b/editor/translations/el.po index d85918f2b2..035a82f99f 100644 --- a/editor/translations/el.po +++ b/editor/translations/el.po @@ -12,12 +12,13 @@ # lawfulRobot <czavantias@gmail.com>, 2020, 2021. # Michalis <michalisntovas@yahoo.gr>, 2021. # leriaz <leriaz@live.com>, 2021. +# Shadofer <shadowrlrs@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-05-30 04:15+0000\n" -"Last-Translator: lawfulRobot <czavantias@gmail.com>\n" +"PO-Revision-Date: 2021-07-09 14:32+0000\n" +"Last-Translator: Shadofer <shadowrlrs@gmail.com>\n" "Language-Team: Greek <https://hosted.weblate.org/projects/godot-engine/godot/" "el/>\n" "Language: el\n" @@ -25,7 +26,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.8-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -50,8 +51,8 @@ msgstr "Άκυρη είσοδος %i (δεν πέρασε) στην έκφρασ #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" msgstr "" -"Το self δεν μπορεί να χρησιμοποιηθεί επειδή το στιγμιότυπο είναι null (δεν " -"πέρασε)" +"το self δεν μπορεί να χρησιμοποιηθεί επειδή το αντικείμενο είναι null (δέν " +"έχει περαστεί)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -421,10 +422,6 @@ msgstr "" "Τα κομμάτια κίνησης μπορούν να δείχνουν μόνο σε κόμβους AnimationPlayer." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "Ένα AnimationPlayer δεν μπορεί να κινήσει τον εαυτό του." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Αδύνατη η προσθήκη κομματιού χωρίς ρίζα" @@ -469,8 +466,9 @@ msgid "Anim Move Keys" msgstr "Μετακίνηση Κλειδιών Κίνησης" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Το πρόχειρο είναι άδειο" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "Το πρόχειρο είναι άδειο!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -1131,7 +1129,7 @@ msgstr "Ευχαριστίες από την κοινότητα της Godot!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "Πατήστε για αντιγραφή." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -1634,17 +1632,16 @@ msgstr "" "Ενεργοποιήστε το 'Εισαγωγή ETC2' ή 'Εισαγωγή PVRTC' στις Ρυθμίσεις Έργου." #: editor/editor_export.cpp -#, fuzzy msgid "" "Target platform requires 'PVRTC' texture compression for the driver fallback " "to GLES2.\n" "Enable 'Import Pvrtc' in Project Settings, or disable 'Driver Fallback " "Enabled'." msgstr "" -"Η πλατφόρμα προορισμού απαιτεί «ETC» συμπίεση υφών για εναλλαγή οδηγού στο " +"Η πλατφόρμα προορισμού απαιτεί συμπίεση υφών 'PVRTC' για εναλλαγή οδηγού στο " "GLES2.\n" -"Ενεργοποιήστε το «Import Etc» στις Ρυθμίσεις Έργου, ή απενεργοποιήστε το " -"«Driver Fallback Enabled»." +"Ενεργοποιήστε το 'Εισαγωγή PVRTC' στις Ρυθμίσεις Έργου, ή απενεργοποιήστε το " +"'Ενεργοποίηση εναλλαγής οδηγού'." #: editor/editor_export.cpp platform/android/export/export.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp @@ -2523,7 +2520,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Αποθήκευση αλλαγών στις ακόλουθες σκηνές πριν την έξοδο;" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "Αποθήκευση αλλαγών στις ακόλουθες σκηνές πριν το άνοιγμα του Διαχειριστή " "Έργων;" @@ -5101,9 +5098,8 @@ msgid "Got:" msgstr "Δοσμένο:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Failed SHA-256 hash check" -msgstr "Η δοκιμή κατακερματισμού sha256 απέτυχε" +msgstr "Ο έλεγχος κατακερματισμού sha256 απέτυχε" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5259,26 +5255,31 @@ msgstr "" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Failed determining lightmap size. Maximum lightmap size too small?" msgstr "" +"Αποτυχία προσδιορισμού του μεγέθους lighτmap. Το μέγιστο μέγεθος lightmap " +"ίσως είναι πολύ μικρό." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" "Some mesh is invalid. Make sure the UV2 channel values are contained within " "the [0.0,1.0] square region." msgstr "" +"Μέρος του πλέγματος δεν είναι έγκυρο. Σιγουρευτείτε πως οι τιμές του " +"καναλιού UV2 περιλαμβάνονται στην τετραγωνική περιοχή [0.0,1.0]." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" "Godot editor was built without ray tracing support, lightmaps can't be baked." msgstr "" +"Ο Godot Editor φτιάχτηκε χωρίς υποστήριξη ray-tracing, τα lightmaps δέν " +"μπορούν να δημιουργηθούν." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Bake Lightmaps" msgstr "Προετοιμασία Lightmaps" #: editor/plugins/baked_lightmap_editor_plugin.cpp -#, fuzzy msgid "Select lightmap bake file:" -msgstr "Επιλογή Αρχείου Προτύπων" +msgstr "Επιλογή Αρχείου Προτύπων:" #: editor/plugins/camera_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5347,26 +5348,23 @@ msgstr "Δημιουργία Οριζοντίων και Καθέτων Οδηγ #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Set CanvasItem \"%s\" Pivot Offset to (%d, %d)" -msgstr "" +msgstr "Θέσε τον άξονα περιστροφής του CanvasItem \"%s\" σε (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Rotate %d CanvasItems" -msgstr "Περιστροφή CanvasItem" +msgstr "Περιστροφή %d CanvasItems" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Rotate CanvasItem \"%s\" to %d degrees" -msgstr "Περιστροφή CanvasItem" +msgstr "Περιστροφή του CanvasItem \"%s\" %d μοίρες" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move CanvasItem \"%s\" Anchor" -msgstr "Μετακίνηση CanvasItem" +msgstr "Μετακίνηση άγκυρας του CanvasItem \"%s\"" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Scale Node2D \"%s\" to (%s, %s)" -msgstr "" +msgstr "Αλλαγή μεγέθους scaling Node2D \"%s\" σε (%s, %s)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Resize Control \"%s\" to (%d, %d)" @@ -12080,10 +12078,6 @@ msgid "Can't copy the function node." msgstr "Αδύνατη η αντιγραφή του κόμβου συνάρτησης." #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "Το πρόχειρο είναι άδειο!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "Επικόλληση κόμβων VisualScript" @@ -13294,6 +13288,12 @@ msgstr "Τα «varying» μπορούν να ανατεθούν μόνο στη msgid "Constants cannot be modified." msgstr "Οι σταθερές δεν μπορούν να τροποποιηθούν." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "Ένα AnimationPlayer δεν μπορεί να κινήσει τον εαυτό του." + +#~ msgid "Clipboard is empty" +#~ msgstr "Το πρόχειρο είναι άδειο" + #~ msgid "" #~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." #~ msgstr "" diff --git a/editor/translations/eo.po b/editor/translations/eo.po index 21d94bda5e..0523742303 100644 --- a/editor/translations/eo.po +++ b/editor/translations/eo.po @@ -13,18 +13,19 @@ # Jakub Fabijan <animatorzPolski@gmail.com>, 2021. # mourning20s <mourning20s@protonmail.com>, 2021. # Manuel González <mgoopazo@gmail.com>, 2021. +# Wang Tseryui <2251439097@qq.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2021-06-02 09:04+0000\n" -"Last-Translator: mourning20s <mourning20s@protonmail.com>\n" +"PO-Revision-Date: 2021-07-13 06:13+0000\n" +"Last-Translator: Wang Tseryui <2251439097@qq.com>\n" "Language-Team: Esperanto <https://hosted.weblate.org/projects/godot-engine/" "godot/eo/>\n" "Language: eo\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.7.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -394,9 +395,8 @@ msgid "Rearrange Tracks" msgstr "Rearanĝi trakojn" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Transform tracks only apply to Spatial-based nodes." -msgstr "Transformaj trakoj nur aplikas al Spatial-ajn nodojn." +msgstr "Transformaj trakoj validas nur aplikas al Spatial-bazitaj nodoj." #: editor/animation_track_editor.cpp msgid "" @@ -415,10 +415,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Animaciaj trakoj nur eblas indiki al AnimationPlayer-aj nodoj." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "Animado legilo ne volas animi si mem, nur aliajn ludantojn." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Ne eblas aldoni novan trakon sen radiko" @@ -463,8 +459,9 @@ msgid "Anim Move Keys" msgstr "Animado Movi Ŝlosilojn" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Tondujo estas malplena" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -1121,7 +1118,7 @@ msgstr "Dankon de la komunumo de Godot!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "Alklaku por kopii." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -2510,7 +2507,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Konservi ŝanĝojn al la jena(j) sceno(j) antaŭ foriri?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "Konservi ŝanĝojn al la jena(j) sceno(j) antaŭ malfermi projektan mastrumilon?" @@ -11803,10 +11800,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" @@ -12837,6 +12830,12 @@ msgstr "" msgid "Constants cannot be modified." msgstr "Konstantoj ne povas esti modifitaj." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "Animado legilo ne volas animi si mem, nur aliajn ludantojn." + +#~ msgid "Clipboard is empty" +#~ msgstr "Tondujo estas malplena" + #~ msgid "No" #~ msgstr "Ne" diff --git a/editor/translations/es.po b/editor/translations/es.po index 660e17420d..5953536c60 100644 --- a/editor/translations/es.po +++ b/editor/translations/es.po @@ -64,12 +64,16 @@ # Juan camilo <jugarciago01@gmail.com>, 2021. # Manuel González <mgoopazo@gmail.com>, 2021. # softonicblip <blazeawardspace@gmail.com>, 2021. +# Ib Quezada <ib@ibquezada.com>, 2021. +# hiking <joaquinfc@protonmail.com>, 2021. +# pabloggomez <pgg2733@gmail.com>, 2021. +# Erick Figueroa <querecuto@hotmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-06-03 22:23+0000\n" -"Last-Translator: softonicblip <blazeawardspace@gmail.com>\n" +"PO-Revision-Date: 2021-07-05 21:41+0000\n" +"Last-Translator: Erick Figueroa <querecuto@hotmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot/es/>\n" "Language: es\n" @@ -77,7 +81,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.8-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -103,8 +107,7 @@ msgstr "Entrada inválida %i (no aprobada) en la expresión" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "" -"No se puede utilizar «self» porque la instancia es nula (no transmitida)" +msgstr "\"self\" no puede ser usado porque la instancia es nula (detenido)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -164,7 +167,7 @@ msgstr "Balanceado" #: editor/animation_bezier_editor.cpp msgid "Mirror" -msgstr "Mirror" +msgstr "Reflejar" #: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp msgid "Time:" @@ -472,12 +475,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Las pistas de Animación solo pueden apuntar a nodos AnimationPlayer." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" -"Un reproductor de animación no puede animarse a sí mismo, solo a otros " -"reproductores." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "No es posible agregar una nueva pista sin una raíz" @@ -525,8 +522,9 @@ msgid "Anim Move Keys" msgstr "Mover Claves de Animación" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "El portapapeles está vacío" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "¡El portapapeles está vacío!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -869,7 +867,7 @@ msgstr "Eliminar" #: editor/connections_dialog.cpp msgid "Add Extra Call Argument:" -msgstr "Añadir argumento extra de llamada:" +msgstr "Añadir argumento de llamada extra:" #: editor/connections_dialog.cpp msgid "Extra Call Arguments:" @@ -1188,7 +1186,7 @@ msgstr "¡Muchas gracias de parte de la comunidad de Godot!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "Clic para copiar." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -1384,7 +1382,7 @@ msgstr "Silenciar" #: editor/editor_audio_buses.cpp msgid "Bypass" -msgstr "Bypass" +msgstr "Omitir" #: editor/editor_audio_buses.cpp msgid "Bus options" @@ -2086,7 +2084,7 @@ msgstr "Propiedades de Temas" #: editor/editor_help.cpp msgid "Enumerations" -msgstr "Enumerados" +msgstr "Enumeraciones" #: editor/editor_help.cpp msgid "Constants" @@ -2578,7 +2576,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "¿Guardar los cambios en las siguientes escenas antes de salir?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "¿Guardar los cambios en las siguientes escenas antes de abrir el " "Administrador de Proyectos?" @@ -4200,7 +4198,7 @@ msgstr "Importar como:" #: editor/import_dock.cpp msgid "Preset" -msgstr "Preset" +msgstr "Preajuste" #: editor/import_dock.cpp msgid "Reimport" @@ -4929,8 +4927,8 @@ msgstr "Eliminar el nodo o transición seleccionado/a." #: editor/plugins/animation_state_machine_editor.cpp msgid "Toggle autoplay this animation on start, restart or seek to zero." msgstr "" -"Act./Desact. reproducción automática de esta animación al comenzar, " -"reiniciar o hacer seek hasta el cero." +"Alternar reproducción automática de esta animación al comenzar, reiniciar o " +"poner a cero." #: editor/plugins/animation_state_machine_editor.cpp msgid "Set the end animation. This is useful for sub-transitions." @@ -5331,7 +5329,7 @@ msgstr "" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Bake Lightmaps" -msgstr "Bake Lightmaps" +msgstr "Calcular Lightmaps" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Select lightmap bake file:" @@ -6021,15 +6019,15 @@ msgstr "Flat 1" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease In" -msgstr "Ease In" +msgstr "Entrada Suave" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease Out" -msgstr "Ease Out" +msgstr "Salida Suave" #: editor/plugins/curve_editor_plugin.cpp msgid "Smoothstep" -msgstr "Smoothstep" +msgstr "Suavizado" #: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve Point" @@ -6081,7 +6079,7 @@ msgstr "Clic derecho para añadir punto" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" -msgstr "Bake GI Probe" +msgstr "Calcular GI Probe" #: editor/plugins/gradient_editor_plugin.cpp msgid "Gradient Edited" @@ -7112,7 +7110,7 @@ msgstr "Salir de Aquí" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Break" -msgstr "Break" +msgstr "Detener" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp #: editor/script_editor_debugger.cpp @@ -7243,7 +7241,7 @@ msgstr "Marcadores" #: editor/plugins/script_text_editor.cpp msgid "Breakpoints" -msgstr "Breakpoints" +msgstr "Puntos de interrupción" #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp @@ -8034,7 +8032,7 @@ msgstr "Velocidad:" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Loop" -msgstr "Loop" +msgstr "Bucle" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Animation Frames:" @@ -10546,7 +10544,7 @@ msgstr "Idiomas:" #: editor/project_settings_editor.cpp msgid "AutoLoad" -msgstr "AutoLoad" +msgstr "AutoCarga" #: editor/project_settings_editor.cpp msgid "Plugins" @@ -10558,7 +10556,7 @@ msgstr "Valores de Importación por Defecto" #: editor/property_editor.cpp msgid "Preset..." -msgstr "Preset..." +msgstr "Preajuste..." #: editor/property_editor.cpp msgid "Zero" @@ -10566,11 +10564,11 @@ msgstr "Cero" #: editor/property_editor.cpp msgid "Easing In-Out" -msgstr "Easing In-Out" +msgstr "Entrada-Salida Suave" #: editor/property_editor.cpp msgid "Easing Out-In" -msgstr "Easing Out-In" +msgstr "Salida-Entrada Suave" #: editor/property_editor.cpp msgid "File..." @@ -11335,7 +11333,7 @@ msgstr "Fuente C++:" #: editor/script_editor_debugger.cpp msgid "Stack Trace" -msgstr "Stack Trace" +msgstr "Rastreo de Pila" #: editor/script_editor_debugger.cpp msgid "Errors" @@ -11371,7 +11369,7 @@ msgstr "Fotogramas Apilados" #: editor/script_editor_debugger.cpp msgid "Profiler" -msgstr "Profiler" +msgstr "Perfilador" #: editor/script_editor_debugger.cpp msgid "Network Profiler" @@ -11467,7 +11465,7 @@ msgstr "Atajos" #: editor/settings_config_dialog.cpp msgid "Binding" -msgstr "Binding" +msgstr "Vinculación" #: editor/spatial_editor_gizmos.cpp msgid "Change Light Radius" @@ -11804,7 +11802,7 @@ msgstr "Fin del reporte de la pila de excepciones" #: modules/recast/navigation_mesh_editor_plugin.cpp msgid "Bake NavMesh" -msgstr "Bake NavMesh" +msgstr "Calcular NavMesh" #: modules/recast/navigation_mesh_editor_plugin.cpp msgid "Clear the navigation mesh." @@ -12106,10 +12104,6 @@ msgid "Can't copy the function node." msgstr "No se puede copiar el nodo de función." #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "¡El portapapeles está vacío!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "Pegar nodos de VisualScript" @@ -12328,6 +12322,8 @@ msgid "" "Either Debug Keystore, Debug User AND Debug Password settings must be " "configured OR none of them." msgstr "" +"Deben configurarse los ajustes de Depuración de Claves, Depuración de " +"Usuarios Y Depuración de Contraseñas O ninguno de ellos." #: platform/android/export/export.cpp msgid "Debug keystore not configured in the Editor Settings nor in the preset." @@ -12339,6 +12335,8 @@ msgid "" "Either Release Keystore, Release User AND Release Password settings must be " "configured OR none of them." msgstr "" +"Deben configurarse los ajustes de Liberación del Almacén de Claves, " +"Liberación del Usuario Y Liberación de la Contraseña O ninguno de ellos." #: platform/android/export/export.cpp msgid "Release keystore incorrectly configured in the export preset." @@ -13334,6 +13332,14 @@ msgstr "Solo se pueden asignar variaciones en funciones de vértice." msgid "Constants cannot be modified." msgstr "Las constantes no pueden modificarse." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "Un reproductor de animación no puede animarse a sí mismo, solo a otros " +#~ "reproductores." + +#~ msgid "Clipboard is empty" +#~ msgstr "El portapapeles está vacío" + #~ msgid "" #~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." #~ msgstr "" diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po index 3c3174f6c8..d1fe06a565 100644 --- a/editor/translations/es_AR.po +++ b/editor/translations/es_AR.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-05-29 13:49+0000\n" +"PO-Revision-Date: 2021-06-20 13:35+0000\n" "Last-Translator: Lisandro Lorea <lisandrolorea@gmail.com>\n" "Language-Team: Spanish (Argentina) <https://hosted.weblate.org/projects/" "godot-engine/godot/es_AR/>\n" @@ -30,7 +30,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.7\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -424,12 +424,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Las pistas de Animación solo pueden apuntar a nodos AnimationPlayer." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" -"Un reproductor de animación no puede animarse a sí mismo, solo a otros " -"reproductores." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "No es posible agregar una nueva pista sin una raíz" @@ -476,8 +470,9 @@ msgid "Anim Move Keys" msgstr "Mover Claves de Anim" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "El portapapeles está vacío" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "El portapapeles está vacío!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -1138,7 +1133,7 @@ msgstr "Gracias de parte de la comunidad Godot!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "Click para copiar." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -2528,7 +2523,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Guardar cambios a la(s) siguiente(s) escena(s) antes de salir?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "Guardar cambios a la(s) siguiente(s) escena(s) antes de abrir el Gestor de " "Proyectos?" @@ -12043,10 +12038,6 @@ msgid "Can't copy the function node." msgstr "No se puede copiar el nodo de función." #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "El portapapeles está vacío!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "Pegar Nodos de VisualScript" @@ -12265,6 +12256,8 @@ msgid "" "Either Debug Keystore, Debug User AND Debug Password settings must be " "configured OR none of them." msgstr "" +"Deben estar configurados o bien Debug Keystore, Debug User Y Debug Password " +"o bien ninguno de ellos." #: platform/android/export/export.cpp msgid "Debug keystore not configured in the Editor Settings nor in the preset." @@ -12276,6 +12269,8 @@ msgid "" "Either Release Keystore, Release User AND Release Password settings must be " "configured OR none of them." msgstr "" +"Deben estar configurados o bien Release Keystore, Release User y Release " +"Passoword o bien ninguno de ellos." #: platform/android/export/export.cpp msgid "Release keystore incorrectly configured in the export preset." @@ -13259,6 +13254,14 @@ msgstr "Solo se pueden asignar variaciones en funciones de vértice." msgid "Constants cannot be modified." msgstr "Las constantes no pueden modificarse." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "Un reproductor de animación no puede animarse a sí mismo, solo a otros " +#~ "reproductores." + +#~ msgid "Clipboard is empty" +#~ msgstr "El portapapeles está vacío" + #~ msgid "" #~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." #~ msgstr "InterpolatedCamera ha sido deprecado y será eliminado en Godot 4.0." diff --git a/editor/translations/et.po b/editor/translations/et.po index d81e10e9d7..05a414f5a9 100644 --- a/editor/translations/et.po +++ b/editor/translations/et.po @@ -409,10 +409,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Animatsiooni rajad võivad osutada ainult AnimationPlayer sõlmedele." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "AnimationPlayer ei saa animeerida iseennast, ainult teisi mängijaid." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Ei saa lisada uut rada ilma tüveta" @@ -457,8 +453,9 @@ msgid "Anim Move Keys" msgstr "" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Lõikelaud on tühi" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -2450,7 +2447,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11548,10 +11545,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" @@ -12574,6 +12567,13 @@ msgstr "" msgid "Constants cannot be modified." msgstr "Konstante ei saa muuta." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "AnimationPlayer ei saa animeerida iseennast, ainult teisi mängijaid." + +#~ msgid "Clipboard is empty" +#~ msgstr "Lõikelaud on tühi" + #~ msgid "Error trying to save layout!" #~ msgstr "Viga paigutuse salvestamisel!" diff --git a/editor/translations/eu.po b/editor/translations/eu.po index e21c8ce5ba..87c91de10e 100644 --- a/editor/translations/eu.po +++ b/editor/translations/eu.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2021-06-14 12:34+0000\n" +"PO-Revision-Date: 2021-06-20 13:35+0000\n" "Last-Translator: Erik Zubiria <erik@ezsd.net>\n" "Language-Team: Basque <https://hosted.weblate.org/projects/godot-engine/" "godot/eu/>\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.7\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -259,93 +259,93 @@ msgstr "Interpolazio mota" #: editor/animation_track_editor.cpp msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" -msgstr "" +msgstr "Loop Modu Bildua (bukaera interpolatu looparen hasierarekin)" #: editor/animation_track_editor.cpp msgid "Remove this track." -msgstr "" +msgstr "Pista hau ezabatu." #: editor/animation_track_editor.cpp msgid "Time (s): " -msgstr "" +msgstr "Denbora (s): " #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" -msgstr "" +msgstr "Pista Akt./Desakt." #: editor/animation_track_editor.cpp msgid "Continuous" -msgstr "" +msgstr "Etengabea" #: editor/animation_track_editor.cpp msgid "Discrete" -msgstr "" +msgstr "Diskretua" #: editor/animation_track_editor.cpp msgid "Trigger" -msgstr "" +msgstr "Kakoa" #: editor/animation_track_editor.cpp msgid "Capture" -msgstr "" +msgstr "Kaptura" #: editor/animation_track_editor.cpp msgid "Nearest" -msgstr "" +msgstr "Gertukoena" #: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp #: editor/property_editor.cpp msgid "Linear" -msgstr "" +msgstr "Lineal" #: editor/animation_track_editor.cpp msgid "Cubic" -msgstr "" +msgstr "Kubiko" #: editor/animation_track_editor.cpp msgid "Clamp Loop Interp" -msgstr "" +msgstr "Loop Ebakitzailearen Interp" #: editor/animation_track_editor.cpp msgid "Wrap Loop Interp" -msgstr "" +msgstr "Loop Inguratzailearen Interp" #: editor/animation_track_editor.cpp #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key" -msgstr "" +msgstr "Sartu Giltza" #: editor/animation_track_editor.cpp msgid "Duplicate Key(s)" -msgstr "" +msgstr "Bikoiztu Giltza(k)" #: editor/animation_track_editor.cpp msgid "Delete Key(s)" -msgstr "" +msgstr "Ezabatu Giltza(k)" #: editor/animation_track_editor.cpp msgid "Change Animation Update Mode" -msgstr "" +msgstr "Animazioaren Eguneraketa Modua Aldatu" #: editor/animation_track_editor.cpp msgid "Change Animation Interpolation Mode" -msgstr "" +msgstr "Animazioaren Interpolazio Modua Aldatu" #: editor/animation_track_editor.cpp msgid "Change Animation Loop Mode" -msgstr "" +msgstr "Animazioaren Loop Modua Aldatu" #: editor/animation_track_editor.cpp msgid "Remove Anim Track" -msgstr "" +msgstr "Ezabatu Animazio Pista" #: editor/animation_track_editor.cpp msgid "Create NEW track for %s and insert key?" -msgstr "" +msgstr "%s-rentzat pista berria sortu eta giltza sartu?" #: editor/animation_track_editor.cpp msgid "Create %d NEW tracks and insert keys?" -msgstr "" +msgstr "%d pista berri sortu eta giltzak sartu?" #: editor/animation_track_editor.cpp editor/create_dialog.cpp #: editor/editor_audio_buses.cpp editor/editor_feature_profile.cpp @@ -357,39 +357,41 @@ msgstr "" #: editor/script_create_dialog.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Create" -msgstr "" +msgstr "Sortu" #: editor/animation_track_editor.cpp msgid "Anim Insert" -msgstr "" +msgstr "Animazioa Sartu" #: editor/animation_track_editor.cpp msgid "AnimationPlayer can't animate itself, only other players." -msgstr "" +msgstr "AnimationPlayer bat ezin da norbera animatu, soilik beste playerrak." #: editor/animation_track_editor.cpp msgid "Anim Create & Insert" -msgstr "" +msgstr "Animazioa Sortu eta Txertatu" #: editor/animation_track_editor.cpp msgid "Anim Insert Track & Key" -msgstr "" +msgstr "Pista eta Animazio Giltza Sartu" #: editor/animation_track_editor.cpp msgid "Anim Insert Key" -msgstr "" +msgstr "Animazio Giltza Sartu" #: editor/animation_track_editor.cpp msgid "Change Animation Step" -msgstr "" +msgstr "Animazioaren Urratsa Aldatu" #: editor/animation_track_editor.cpp msgid "Rearrange Tracks" -msgstr "" +msgstr "Pistak Berrantolatu" #: editor/animation_track_editor.cpp msgid "Transform tracks only apply to Spatial-based nodes." msgstr "" +"Transformazio pistak Spatial-en oinarritutako nodoetan bakarrik aplikatzen " +"dira." #: editor/animation_track_editor.cpp msgid "" @@ -398,38 +400,38 @@ msgid "" "-AudioStreamPlayer2D\n" "-AudioStreamPlayer3D" msgstr "" +"Audio pistek era hontako nodoak bakarrik apunta ditzakete:\n" +"-AudioStreamPlayer\n" +"-AudioStreamPlayer2D\n" +"-AudioStreamPlayer3D" #: editor/animation_track_editor.cpp msgid "Animation tracks can only point to AnimationPlayer nodes." -msgstr "" - -#: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" +msgstr "Animazio pistek AnimationPlayer nodoak bakarrik apunta ditzakete." #: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" -msgstr "" +msgstr "Ez da posiblea pista berri bat gehitzea sustrairik gabe" #: editor/animation_track_editor.cpp msgid "Invalid track for Bezier (no suitable sub-properties)" -msgstr "" +msgstr "Bezier-entzat pista baliogabea (ez dago azpipropietate egokirik)" #: editor/animation_track_editor.cpp msgid "Add Bezier Track" -msgstr "" +msgstr "Gehitu Bezier Pista" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a key." -msgstr "" +msgstr "Pistaren bidea baliogabea da, beraz ezin da giltzarik gehitu." #: editor/animation_track_editor.cpp msgid "Track is not of type Spatial, can't insert key" -msgstr "" +msgstr "Pista ez da Spatial erakoa, ezin da giltza txertatu" #: editor/animation_track_editor.cpp msgid "Add Transform Track Key" -msgstr "" +msgstr "Gehitu Pistaren Transformazio Giltza" #: editor/animation_track_editor.cpp msgid "Add Track Key" @@ -452,7 +454,8 @@ msgid "Anim Move Keys" msgstr "" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" msgstr "" #: editor/animation_track_editor.cpp @@ -2421,7 +2424,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11516,10 +11519,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" @@ -12541,3 +12540,7 @@ msgstr "" #: servers/visual/shader_language.cpp msgid "Constants cannot be modified." msgstr "" + +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "Animazio irakurgailua ezin da norbera animatu, bakarrik beste batzuk." diff --git a/editor/translations/fa.po b/editor/translations/fa.po index ba8c4f9302..ddccfeaebe 100644 --- a/editor/translations/fa.po +++ b/editor/translations/fa.po @@ -20,12 +20,13 @@ # Ahmad Maftoun <CarCedo.Pro@gmail.com>, 2020. # ItzMiad44909858f5774b6d <maidggg@gmail.com>, 2020. # YASAN <yasandev@gmail.com>, 2021. +# duniyal ras <duniyalr@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-03-16 10:40+0000\n" -"Last-Translator: YASAN <yasandev@gmail.com>\n" +"PO-Revision-Date: 2021-07-13 06:13+0000\n" +"Last-Translator: duniyal ras <duniyalr@gmail.com>\n" "Language-Team: Persian <https://hosted.weblate.org/projects/godot-engine/" "godot/fa/>\n" "Language: fa\n" @@ -33,7 +34,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.5.2-dev\n" +"X-Generator: Weblate 4.7.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -425,10 +426,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "آهنگ های انیمیشن فقط می توانند به گره های انیمش پلیر اشاره کنند." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "یک مجری انیمیشن نمی تواند خود را محرک کند، فقط سایر مجریان." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "بدون ریشه اضافه کردن مسیر امکان پذیر نیست" @@ -473,8 +470,9 @@ msgid "Anim Move Keys" msgstr "کلیدها را در انیمیشن جابجا کن" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "حافظه پنهان خالی است" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "حافظه پنهان خالی است!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -1047,7 +1045,6 @@ msgid "" msgstr "آیا پروندههای انتخاب شده از طرح حذف شوند؟ (غیر قابل بازیابی)" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "The files being removed are required by other resources in order for them to " "work.\n" @@ -1056,7 +1053,8 @@ msgid "" msgstr "" "پروندههایی که میخواهید حذف شوند برای منابع دیگر مورد نیاز هستند تا کار " "کنند.\n" -"آیا در هر صورت حذف شوند؟(بدون برگشت)" +"آیا در هر صورت حذف شوند؟(بدون برگشت)\n" +"شما میتوانید فایل های حذف شده را در سطل زباله سیستم عامل خود بیابید ." #: editor/dependency_editor.cpp msgid "Cannot remove:" @@ -1128,7 +1126,7 @@ msgstr "با تشکر از سوی جامعهی Godot!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "برای کپی کردن کلیک کنید." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -1351,9 +1349,8 @@ msgid "Add Audio Bus" msgstr "افزودن کانل صوتی" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Master bus can't be deleted!" -msgstr "استاد اتوبوس قابل حذف نیست!" +msgstr "گذرگاه اصلی قابل حذف نیست!" #: editor/editor_audio_buses.cpp msgid "Delete Audio Bus" @@ -1470,9 +1467,8 @@ msgid "Rename Autoload" msgstr "بارگذاری خودکار را تغییر نام بده" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Toggle AutoLoad Globals" -msgstr "تغییر حالت اتماتیک لود عمومی" +msgstr "تغییر متغیر های عمومی مربوط به لود خودکار" #: editor/editor_autoload_settings.cpp msgid "Move Autoload" @@ -2459,7 +2455,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -12111,10 +12107,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "حافظه پنهان خالی است!" - -#: modules/visual_script/visual_script_editor.cpp #, fuzzy msgid "Paste VisualScript Nodes" msgstr "مسیر به سمت گره:" @@ -13242,6 +13234,12 @@ msgstr "" msgid "Constants cannot be modified." msgstr "ثوابت قابل تغییر نیستند." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "یک مجری انیمیشن نمی تواند خود را محرک کند، فقط سایر مجریان." + +#~ msgid "Clipboard is empty" +#~ msgstr "حافظه پنهان خالی است" + #~ msgid "No" #~ msgstr "نه" diff --git a/editor/translations/fi.po b/editor/translations/fi.po index 4b7aad362e..834d1894e3 100644 --- a/editor/translations/fi.po +++ b/editor/translations/fi.po @@ -16,7 +16,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-05-19 20:16+0000\n" +"PO-Revision-Date: 2021-06-20 13:35+0000\n" "Last-Translator: Tapani Niemi <tapani.niemi@kapsi.fi>\n" "Language-Team: Finnish <https://hosted.weblate.org/projects/godot-engine/" "godot/fi/>\n" @@ -25,7 +25,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.7\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -416,10 +416,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Animaatioraidat voivat osoittaa vain AnimationPlayer solmuihin." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "Animaatiotoistin ei voi animoida itseään, ainoastaan muita toistimia." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Uutta raitaa ei voida lisätä ilman juurta" @@ -464,8 +460,9 @@ msgid "Anim Move Keys" msgstr "Animaatio: siirrä avaimia" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Leikepöytä on tyhjä" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "Leikepöytä on tyhjä!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -1120,7 +1117,7 @@ msgstr "Kiitos Godot-yhteisöltä!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "Napsauta kopioidaksesi." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -2505,7 +2502,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Tallenetaanko muutokset seuraaviin skeneihin ennen sulkemista?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "Tallennetaanko muutokset seuraaviin skeneihin ennen Projektienhallinnan " "avaamista?" @@ -11987,10 +11984,6 @@ msgid "Can't copy the function node." msgstr "Ei voida kopioida funktiosolmua." #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "Leikepöytä on tyhjä!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "Liitä VisualScript solmut" @@ -12204,6 +12197,8 @@ msgid "" "Either Debug Keystore, Debug User AND Debug Password settings must be " "configured OR none of them." msgstr "" +"Joko Debug Keystore, Debug User JA Debug Password asetukset on kaikki " +"konfiguroitava TAI ei mitään niistä." #: platform/android/export/export.cpp msgid "Debug keystore not configured in the Editor Settings nor in the preset." @@ -12215,6 +12210,8 @@ msgid "" "Either Release Keystore, Release User AND Release Password settings must be " "configured OR none of them." msgstr "" +"Joko Release Keystore, Release User JA Release Password asetukset on kaikki " +"konfiguroitava TAI ei mitään niistä." #: platform/android/export/export.cpp msgid "Release keystore incorrectly configured in the export preset." @@ -13183,6 +13180,13 @@ msgstr "Varying tyypin voi sijoittaa vain vertex-funktiossa." msgid "Constants cannot be modified." msgstr "Vakioita ei voi muokata." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "Animaatiotoistin ei voi animoida itseään, ainoastaan muita toistimia." + +#~ msgid "Clipboard is empty" +#~ msgstr "Leikepöytä on tyhjä" + #~ msgid "" #~ "Godot editor was built without ray tracing support; lightmaps can't be " #~ "baked.\n" diff --git a/editor/translations/fil.po b/editor/translations/fil.po index 54df144dd9..892968821b 100644 --- a/editor/translations/fil.po +++ b/editor/translations/fil.po @@ -410,10 +410,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "" @@ -458,8 +454,9 @@ msgid "Anim Move Keys" msgstr "" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Walang laman ang Clipboard" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -2418,7 +2415,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11508,10 +11505,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" @@ -12533,5 +12526,8 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Clipboard is empty" +#~ msgstr "Walang laman ang Clipboard" + #~ msgid "No" #~ msgstr "Hindi" diff --git a/editor/translations/fr.po b/editor/translations/fr.po index 577c44aff0..6fad70a7c2 100644 --- a/editor/translations/fr.po +++ b/editor/translations/fr.po @@ -73,19 +73,20 @@ # Kevin Bouancheau <kevin.bouancheau@gmail.com>, 2020. # LaurentOngaro <laurent@gameamea.com>, 2020. # Julien Humbert <julroy67@gmail.com>, 2020. -# Nathan <bonnemainsnathan@gmail.com>, 2020. +# Nathan <bonnemainsnathan@gmail.com>, 2020, 2021. # Léo Vincent <l009.vincent@gmail.com>, 2020. # Joseph Boudou <joseph.boudou@matabio.net>, 2020. # Vincent Foulon <vincent.foulon80@gmail.com>, 2020. # TechnoPorg <jonah.janzen@gmail.com>, 2021. # ASTRALE <jules.cercy@etu.univ-lyon1.fr>, 2021. # Julien Vanelian <julienvanelian@hotmail.com>, 2021. +# Clément Topy <topy72.mine@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-04-30 23:03+0000\n" -"Last-Translator: Julien Vanelian <julienvanelian@hotmail.com>\n" +"PO-Revision-Date: 2021-07-01 14:33+0000\n" +"Last-Translator: Clément Topy <topy72.mine@gmail.com>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot/fr/>\n" "Language: fr\n" @@ -93,7 +94,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.8-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -487,12 +488,6 @@ msgstr "" "Les pistes d’animation ne peuvent pointer que sur des nœuds AnimationPlayer." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" -"Un lecteur d’animation ne peut s’animer lui-même, seulement les autres " -"lecteurs." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Impossible d’ajouter une nouvelle piste sans racine" @@ -539,8 +534,9 @@ msgid "Anim Move Keys" msgstr "Déplacer les clés d’animation" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Le presse-papiers est vide" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "Le presse-papiers est vide !" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -1203,7 +1199,7 @@ msgstr "La communauté Godot vous dit merci !" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "Cliquez pour copier." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -1403,7 +1399,7 @@ msgstr "Contourner" #: editor/editor_audio_buses.cpp msgid "Bus options" -msgstr "Options de tranport" +msgstr "Options de bus" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp #: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -2596,7 +2592,7 @@ msgstr "" "quitter ?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "Enregistrer les modifications sur la (les) scène(s) suivante(s) avant " "d'ouvrir le gestionnaire de projet ?" @@ -3260,7 +3256,7 @@ msgstr "Ré-enregistrer" #: editor/editor_node.cpp msgid "New Inherited" -msgstr "Nouveau hérité" +msgstr "Nouvelle scène héritée" #: editor/editor_node.cpp msgid "Load Errors" @@ -12145,10 +12141,6 @@ msgid "Can't copy the function node." msgstr "Impossible de copier le nœud de fonction." #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "Le presse-papiers est vide !" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "Coller les nœuds VisualScript" @@ -12370,6 +12362,8 @@ msgid "" "Either Debug Keystore, Debug User AND Debug Password settings must be " "configured OR none of them." msgstr "" +"Il faut configurer soit les paramètres Debug Keystore, Debug User ET Debug " +"Password, soit aucun d'entre eux." #: platform/android/export/export.cpp msgid "Debug keystore not configured in the Editor Settings nor in the preset." @@ -12382,6 +12376,8 @@ msgid "" "Either Release Keystore, Release User AND Release Password settings must be " "configured OR none of them." msgstr "" +"Il faut configurer soit les paramètres Release Keystore, Release User ET " +"Release Password, soit aucun d'entre eux." #: platform/android/export/export.cpp msgid "Release keystore incorrectly configured in the export preset." @@ -13387,6 +13383,14 @@ msgstr "Les variations ne peuvent être affectées que dans la fonction vertex." msgid "Constants cannot be modified." msgstr "Les constantes ne peuvent être modifiées." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "Un lecteur d’animation ne peut s’animer lui-même, seulement les autres " +#~ "lecteurs." + +#~ msgid "Clipboard is empty" +#~ msgstr "Le presse-papiers est vide" + #~ msgid "" #~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." #~ msgstr "InterpolatedCamera a été déprécié et sera supprimé dans Godot 4.0." diff --git a/editor/translations/ga.po b/editor/translations/ga.po index e3b1137cee..8168c1a440 100644 --- a/editor/translations/ga.po +++ b/editor/translations/ga.po @@ -402,10 +402,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "" @@ -450,7 +446,8 @@ msgid "Anim Move Keys" msgstr "" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" msgstr "" #: editor/animation_track_editor.cpp @@ -2413,7 +2410,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11501,10 +11498,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" diff --git a/editor/translations/gl.po b/editor/translations/gl.po index f6905f4bef..016a3ab589 100644 --- a/editor/translations/gl.po +++ b/editor/translations/gl.po @@ -408,12 +408,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "As pistas de animación só poden apuntar a nodos AnimationPlayer." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" -"Un reproductor de animacións non pode animarse a si mesmo, só a outros " -"reproductores." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Non é posible engadir unha nova pista sen unha raíz" @@ -459,8 +453,9 @@ msgid "Anim Move Keys" msgstr "Mover Claves de Animación" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "O portapapeis está baleiro" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "O portapapeis está baleiro!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -2502,7 +2497,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Gardar os cambios nas seguintes escenas antes de saír?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "Gardar os cambios nas seguintes escenas antes de abrir o Administrador de " "Proxectos?" @@ -11796,10 +11791,6 @@ msgid "Can't copy the function node." msgstr "Non se pode copiar o nodo función." #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "O portapapeis está baleiro!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "Pegar Nodos VisualScript" @@ -12896,3 +12887,11 @@ msgstr "" #: servers/visual/shader_language.cpp msgid "Constants cannot be modified." msgstr "" + +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "Un reproductor de animacións non pode animarse a si mesmo, só a outros " +#~ "reproductores." + +#~ msgid "Clipboard is empty" +#~ msgstr "O portapapeis está baleiro" diff --git a/editor/translations/he.po b/editor/translations/he.po index f0e3fa4383..5dc30a6cc2 100644 --- a/editor/translations/he.po +++ b/editor/translations/he.po @@ -426,10 +426,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "רצועות הנפשה יכולות להצביע רק על איברי AnimationPlayer." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "נגן הנפשה אינו יכול להנפיש את עצמו, רק שחקנים אחרים." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "אי אפשר להוסיף רצועה חדשה בלי שורש" @@ -478,8 +474,9 @@ msgid "Anim Move Keys" msgstr "מפתחות הזזת אנימצייה" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "לוח העתקה ריק" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "לוח העתקה ריק!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -2508,7 +2505,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "לשמור את השינויים לסצנות הבאות לפני היציאה?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "לשמור את הסצנות הבאות לפני פתיחת מנהל המיזמים?" #: editor/editor_node.cpp @@ -12023,10 +12020,6 @@ msgid "Can't copy the function node." msgstr "לא ניתן להעתיק את פונקצית המפרק." #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "לוח העתקה ריק!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "הדבקת מפרקי VisualScript" @@ -13165,6 +13158,12 @@ msgstr "ניתן להקצות שינויים רק בפונקצית vertex." msgid "Constants cannot be modified." msgstr "אי אפשר לשנות קבועים." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "נגן הנפשה אינו יכול להנפיש את עצמו, רק שחקנים אחרים." + +#~ msgid "Clipboard is empty" +#~ msgstr "לוח העתקה ריק" + #~ msgid "No" #~ msgstr "לא" diff --git a/editor/translations/hi.po b/editor/translations/hi.po index a70f058a65..db1dcd67e6 100644 --- a/editor/translations/hi.po +++ b/editor/translations/hi.po @@ -417,10 +417,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "एनिमेशन ट्रैक केवल एनिमेशनप्लेयर नोड्स को इंगित कर सकते हैं।" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "एक एनीमेशन खिलाड़ी खुद को चेतन नहीं कर सकता, केवल अन्य खिलाड़ी।" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "रूट के बिना नया ट्रैक जोड़ना संभव नहीं" @@ -465,8 +461,9 @@ msgid "Anim Move Keys" msgstr "ऐनिमेटेड मूव कीज़" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "क्लिपबोर्ड खाली है" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -2487,7 +2484,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "छोड़ने से पहले निम्नलिखित दृश्य (ओं) में परिवर्तन सहेजें?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "परियोजना प्रबंधक खोलने से पहले निम्नलिखित दृश्य (ओं) में परिवर्तन सहेजें?" #: editor/editor_node.cpp @@ -11775,10 +11772,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" @@ -12819,6 +12812,12 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "एक एनीमेशन खिलाड़ी खुद को चेतन नहीं कर सकता, केवल अन्य खिलाड़ी।" + +#~ msgid "Clipboard is empty" +#~ msgstr "क्लिपबोर्ड खाली है" + #~ msgid "No" #~ msgstr "नहीं" diff --git a/editor/translations/hr.po b/editor/translations/hr.po index f49ba47c29..d737bb04b7 100644 --- a/editor/translations/hr.po +++ b/editor/translations/hr.po @@ -405,10 +405,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "Animator ne može animirati sebe, samo druge objekte." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Nije moguće dodati novu stazu bez korijena" @@ -453,8 +449,9 @@ msgid "Anim Move Keys" msgstr "" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Međuspremnik je prazan" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -2425,7 +2422,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11527,10 +11524,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" @@ -12553,6 +12546,12 @@ msgstr "Varijacije se mogu dodijeliti samo u vertex funkciji." msgid "Constants cannot be modified." msgstr "Konstante se ne mogu mijenjati." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "Animator ne može animirati sebe, samo druge objekte." + +#~ msgid "Clipboard is empty" +#~ msgstr "Međuspremnik je prazan" + #, fuzzy #~ msgid "Pack File" #~ msgstr "Otvori datoteku" diff --git a/editor/translations/hu.po b/editor/translations/hu.po index eda808eef4..85933dc05d 100644 --- a/editor/translations/hu.po +++ b/editor/translations/hu.po @@ -424,12 +424,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Animáció sávok csak AnimationPlayer node-ra mutathatnak." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" -"Egy AnimationPlayer nem tudja önmagát animálni, csak más AnimationPlayer " -"node-okat." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Új sáv hozzáadása nem lehetséges gyökér nélkül" @@ -474,8 +468,9 @@ msgid "Anim Move Keys" msgstr "Animáció - Kulcsok Mozgatása" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "A vágólap üres" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -2523,7 +2518,7 @@ msgstr "" "Elmenti a következő jelenet(ek)en végzett változtatásokat kilépés előtt?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "Elmenti a következő Scene(ek)en végzett változtatásokat a Projektkezelő " "megnyitása előtt?" @@ -11713,10 +11708,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" @@ -12744,6 +12735,14 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "Egy AnimationPlayer nem tudja önmagát animálni, csak más AnimationPlayer " +#~ "node-okat." + +#~ msgid "Clipboard is empty" +#~ msgstr "A vágólap üres" + #~ msgid "No" #~ msgstr "Nem" diff --git a/editor/translations/id.po b/editor/translations/id.po index 08bfa5969d..e1029fc231 100644 --- a/editor/translations/id.po +++ b/editor/translations/id.po @@ -31,12 +31,13 @@ # Hanz <hanzhaxors@gmail.com>, 2021. # Reza Almanda <rezaalmanda27@gmail.com>, 2021. # Naufal Adriansyah <naufaladrn90@gmail.com>, 2021. +# undisputedgoose <diablodvorak@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-04-05 14:28+0000\n" -"Last-Translator: Naufal Adriansyah <naufaladrn90@gmail.com>\n" +"PO-Revision-Date: 2021-07-05 14:32+0000\n" +"Last-Translator: undisputedgoose <diablodvorak@gmail.com>\n" "Language-Team: Indonesian <https://hosted.weblate.org/projects/godot-engine/" "godot/id/>\n" "Language: id\n" @@ -44,7 +45,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.6-dev\n" +"X-Generator: Weblate 4.8-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -69,7 +70,7 @@ msgstr "Masukkan tidak sah %i (tidak diberikan) dalam ekspresi" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "self tidak dapat digunakan karena instance adalah null" +msgstr "self tidak dapat digunakan karena instansi adalah null" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -77,7 +78,7 @@ msgstr "operan salah untuk operator %s, %s dan %s." #: core/math/expression.cpp msgid "Invalid index of type %s for base type %s" -msgstr "Tipe indeks %s tidak valid untuk tipe dasar %s" +msgstr "Index tidak valid dari tipe %s untuk tipe dasar %s" #: core/math/expression.cpp msgid "Invalid named index '%s' for base type %s" @@ -149,7 +150,7 @@ msgstr "Duplikat Key Terpilih" #: editor/animation_bezier_editor.cpp msgid "Delete Selected Key(s)" -msgstr "Hapus Key Terpilih" +msgstr "Hapus Kunci Terpilih" #: editor/animation_bezier_editor.cpp msgid "Add Bezier Point" @@ -161,7 +162,7 @@ msgstr "Pindah Titik-titik Bezier" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Duplicate Keys" -msgstr "Tombol Duplikat Anim" +msgstr "Kunci Duplikat Anim" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Delete Keys" @@ -341,7 +342,7 @@ msgstr "Interpolasi perulangan warp" #: editor/animation_track_editor.cpp #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key" -msgstr "Masukkan Key" +msgstr "Masukkan Kunci" #: editor/animation_track_editor.cpp msgid "Duplicate Key(s)" @@ -437,11 +438,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Track animasi hanya bisa menunjuk ke node AnimationPlayer." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" -"Pemutar animasi tidak bisa menganimasikan diri sendiri, hanya pemutar lain." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Tidak memungkinkan untuk menambah track baru tanpa akar" @@ -487,8 +483,9 @@ msgid "Anim Move Keys" msgstr "Pindahkan Kunci Anim" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Papan klip kosong" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "Papan klip kosong!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -544,7 +541,7 @@ msgstr "Susun Track-track dengan node atau tampilkan sebagai daftar biasa." #: editor/animation_track_editor.cpp msgid "Snap:" -msgstr "Pengancingan:" +msgstr "Snap:" #: editor/animation_track_editor.cpp msgid "Animation step value." @@ -676,7 +673,7 @@ msgstr "Pilih Trek untuk Disalin" #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp #: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" -msgstr "Kopy" +msgstr "Salin" #: editor/animation_track_editor.cpp msgid "Select All/None" @@ -769,7 +766,7 @@ msgstr "Perkecil Pandangan" #: editor/code_editor.cpp msgid "Reset Zoom" -msgstr "Kebalikan Semula Pandangan" +msgstr "Kembalikan Semula Pandangan" #: editor/code_editor.cpp msgid "Warnings" @@ -1128,7 +1125,7 @@ msgstr "Memiliki" #: editor/dependency_editor.cpp msgid "Resources Without Explicit Ownership:" -msgstr "Resource Tanpa Kepemilikan yang Jelas:" +msgstr "Sumber Tanpa Kepemilikan yang Jelas:" #: editor/dictionary_property_edit.cpp msgid "Change Dictionary Key" @@ -1144,7 +1141,7 @@ msgstr "Terimakasih dari komunitas Godot!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "Klik untuk salin." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -1373,7 +1370,7 @@ msgstr "Master Bus tidak dapat dihapus!" #: editor/editor_audio_buses.cpp msgid "Delete Audio Bus" -msgstr "Hapus Bus Audio" +msgstr "Hapus Audio Bus" #: editor/editor_audio_buses.cpp msgid "Duplicate Audio Bus" @@ -1507,7 +1504,7 @@ msgstr "Mengatur kembali Autoload-autoload" #: editor/editor_autoload_settings.cpp msgid "Can't add autoload:" -msgstr "Tidak dapat menambahkan autoload:" +msgstr "Tidak dapat menambahkan autoload" #: editor/editor_autoload_settings.cpp msgid "Add AutoLoad" @@ -2526,7 +2523,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Simpan perubahan skena saat ini sebelum keluar?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "Simpan perubahan skena saat ini sebelum membuka Manajer Proyek?" #: editor/editor_node.cpp @@ -2565,7 +2562,6 @@ msgid "Unable to load addon script from path: '%s'." msgstr "Tidak bisa memuat script addon dari lokasi: '%s'." #: editor/editor_node.cpp -#, fuzzy msgid "" "Unable to load addon script from path: '%s'. This might be due to a code " "error in that script.\n" @@ -3016,7 +3012,7 @@ msgstr "Tentang" #: editor/editor_node.cpp msgid "Support Godot Development" -msgstr "" +msgstr "Dukung pengembangan Godot" #: editor/editor_node.cpp msgid "Play the project." @@ -7534,31 +7530,31 @@ msgstr "Tidak tersedia ketika menggunakan perender GLES2." #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Left" -msgstr "TampilanBebas Kiri" +msgstr "Tampilan Bebas Kiri" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Right" -msgstr "TampilanBebas Kanan" +msgstr "Tampilan Bebas Kanan" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Forward" -msgstr "TampilanBebas Maju" +msgstr "Tampilan Bebas Maju" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Backwards" -msgstr "TampilanBebas Mundur" +msgstr "Tampilan Bebas Mundur" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Up" -msgstr "TampilanBebas Atas" +msgstr "Tampilan Bebas Atas" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Down" -msgstr "TampilanBebas Bawah" +msgstr "Tampilan Bebas Bawah" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Speed Modifier" -msgstr "Pengubah Kecepatan TampilanBebas" +msgstr "Pengubah Kecepatan Tampilan Bebas" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Slow Modifier" @@ -7569,9 +7565,12 @@ msgid "View Rotation Locked" msgstr "Rotasi Tampilan Terkunci" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "" "To zoom further, change the camera's clipping planes (View -> Settings...)" msgstr "" +"Untuk memperbesar lebih jauh, ganti kamera clipping planes (Tinjau -> " +"Setelan...)" #: editor/plugins/spatial_editor_plugin.cpp msgid "" @@ -7657,11 +7656,11 @@ msgstr "Beralih Tampilan Ortogonal/Perspektif" #: editor/plugins/spatial_editor_plugin.cpp msgid "Insert Animation Key" -msgstr "Sisipkan Kunci Animasi" +msgstr "Masukkan Kunci Animasi" #: editor/plugins/spatial_editor_plugin.cpp msgid "Focus Origin" -msgstr "Asal Fokus" +msgstr "Fokus asal" #: editor/plugins/spatial_editor_plugin.cpp msgid "Focus Selection" @@ -7669,7 +7668,7 @@ msgstr "Pemilihan Fokus" #: editor/plugins/spatial_editor_plugin.cpp msgid "Toggle Freelook" -msgstr "Jungkitkan Mode Tampilan Bebas" +msgstr "Aktifkan Mode Tampilan Bebas" #: editor/plugins/spatial_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7678,7 +7677,7 @@ msgstr "Transformasi" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Object to Floor" -msgstr "Kancingkan Objek ke Lantai" +msgstr "Tempelkan Objek ke Lantai" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Dialog..." @@ -12008,10 +12007,6 @@ msgid "Can't copy the function node." msgstr "Tidak dapat menyalin node fungsi." #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "Papan klip kosong!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "Rekatkan Node VisualScript" @@ -13210,6 +13205,14 @@ msgstr "Variasi hanya bisa ditetapkan dalam fungsi vertex." msgid "Constants cannot be modified." msgstr "Konstanta tidak dapat dimodifikasi." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "Pemutar animasi tidak bisa menganimasikan diri sendiri, hanya pemutar " +#~ "lain." + +#~ msgid "Clipboard is empty" +#~ msgstr "Papan klip kosong" + #~ msgid "No" #~ msgstr "Tidak" diff --git a/editor/translations/is.po b/editor/translations/is.po index 72472c2215..fc1423d841 100644 --- a/editor/translations/is.po +++ b/editor/translations/is.po @@ -426,10 +426,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "" @@ -478,7 +474,8 @@ msgid "Anim Move Keys" msgstr "Færa lykla af Anim" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" msgstr "" #: editor/animation_track_editor.cpp @@ -2449,7 +2446,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "Vista breytingar á neðangreindum senu(m) áður en Verkefna Stjóri er opnaður?" @@ -11628,10 +11625,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" diff --git a/editor/translations/it.po b/editor/translations/it.po index 3d0509ba15..60c362c63a 100644 --- a/editor/translations/it.po +++ b/editor/translations/it.po @@ -464,10 +464,6 @@ msgstr "" "Le tracce di animazioni possono puntare solo a nodi di tipo AnimationPlayer." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "Un AnimationPlayer non può animare se stesso, solo altri riproduttori." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Non è possibile aggiungere una nuova traccia senza un nodo radice" @@ -515,8 +511,9 @@ msgid "Anim Move Keys" msgstr "Sposta delle chiavi d'animazione" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Gli appunti sono vuoti" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "Gli appunti sono vuoti!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -2578,7 +2575,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Salvare le modifiche alle scene seguenti prima di uscire?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "Salvare le modifiche alle scene seguenti prima di aprire il gestore di " "progetti?" @@ -12146,10 +12143,6 @@ msgid "Can't copy the function node." msgstr "Non è possibile copiare il nodo della funzione." #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "Gli appunti sono vuoti!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "Incolla Nodi VisualScript" @@ -13371,6 +13364,13 @@ msgstr "" msgid "Constants cannot be modified." msgstr "Le constanti non possono essere modificate." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "Un AnimationPlayer non può animare se stesso, solo altri riproduttori." + +#~ msgid "Clipboard is empty" +#~ msgstr "Gli appunti sono vuoti" + #~ msgid "" #~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." #~ msgstr "" diff --git a/editor/translations/ja.po b/editor/translations/ja.po index 85768d721a..1fd770fe13 100644 --- a/editor/translations/ja.po +++ b/editor/translations/ja.po @@ -439,12 +439,6 @@ msgstr "" "アニメーショントラックはアニメーションプレイヤーノードのみ指定できます。" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" -"アニメーションプレーヤーは他のプレーヤーだけにアニメーションを適用することは" -"できません。" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "root が無ければ新規トラックは追加できません" @@ -489,8 +483,9 @@ msgid "Anim Move Keys" msgstr "アニメーションキーの移動" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "クリップボードが空です" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "クリップボードは空です!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -2530,7 +2525,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "終了する前に、以下のシーンへの変更を保存しますか?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "プロジェクトマネージャーを開く前に、以下のシーンへの変更を保存しますか?" @@ -11994,10 +11989,6 @@ msgid "Can't copy the function node." msgstr "ファンクションノードをコピーできません。" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "クリップボードは空です!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "VisualScriptノードを貼り付け" @@ -13182,6 +13173,14 @@ msgstr "Varying変数は頂点関数にのみ割り当てることができま msgid "Constants cannot be modified." msgstr "定数は変更できません。" +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "アニメーションプレーヤーは他のプレーヤーだけにアニメーションを適用すること" +#~ "はできません。" + +#~ msgid "Clipboard is empty" +#~ msgstr "クリップボードが空です" + #~ msgid "" #~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." #~ msgstr "InterpolatedCamera は廃止予定であり、Godot 4.0で除去されます。" diff --git a/editor/translations/ka.po b/editor/translations/ka.po index ce5c6dc032..587624651a 100644 --- a/editor/translations/ka.po +++ b/editor/translations/ka.po @@ -436,10 +436,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "შეუძლებელია დაამატო ახალი ჩანაწერი ფესვის გარეშე" @@ -491,9 +487,9 @@ msgid "Anim Move Keys" msgstr "ანიმაციის გასაღებების გადაადგილება" #: editor/animation_track_editor.cpp -#, fuzzy -msgid "Clipboard is empty" -msgstr "ბუფერი ცარიელია" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -2529,7 +2525,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11863,10 +11859,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" @@ -12909,6 +12901,10 @@ msgid "Constants cannot be modified." msgstr "" #, fuzzy +#~ msgid "Clipboard is empty" +#~ msgstr "ბუფერი ცარიელია" + +#, fuzzy #~ msgid "Add initial export..." #~ msgstr "საყვარლები:" diff --git a/editor/translations/km.po b/editor/translations/km.po index ee77bab308..fe396cf590 100644 --- a/editor/translations/km.po +++ b/editor/translations/km.po @@ -402,10 +402,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "" @@ -450,7 +446,8 @@ msgid "Anim Move Keys" msgstr "" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" msgstr "" #: editor/animation_track_editor.cpp @@ -2409,7 +2406,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11481,10 +11478,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" diff --git a/editor/translations/ko.po b/editor/translations/ko.po index f2f3ac1562..ec9fed24ca 100644 --- a/editor/translations/ko.po +++ b/editor/translations/ko.po @@ -27,8 +27,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-06-11 14:49+0000\n" -"Last-Translator: Postive_ Cloud <postive12@gmail.com>\n" +"PO-Revision-Date: 2021-06-20 13:35+0000\n" +"Last-Translator: Myeongjin Lee <aranet100@gmail.com>\n" "Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/" "godot/ko/>\n" "Language: ko\n" @@ -36,7 +36,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.7\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -429,12 +429,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "애니메이션 트랙은 오직 AnimationPlayer 노드만 가리킬 수 있습니다." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" -"애니메이션 플레이어는 자신이 아닌 다른 플레이어에만 애니메이션을 부여할 수 있" -"습니다." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "루트 없이 새 트랙을 추가할 수 없음" @@ -479,8 +473,9 @@ msgid "Anim Move Keys" msgstr "애니메이션 키 이동" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "클립보드가 비었음" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "클립보드가 비었습니다!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -1134,7 +1129,7 @@ msgstr "Godot 커뮤니티에서 감사드립니다!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "클릭하여 복사합니다." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -2510,7 +2505,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "끄기 전에 해당 씬의 변경 사항을 저장할까요?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "프로젝트 매니저를 열기 전에 해당 씬의 변경 사항을 저장할까요?" #: editor/editor_node.cpp @@ -11908,10 +11903,6 @@ msgid "Can't copy the function node." msgstr "함수 노드를 복사할 수 없습니다." #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "클립보드가 비었습니다!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "비주얼 스크립트 노드 붙여넣기" @@ -12124,6 +12115,8 @@ msgid "" "Either Debug Keystore, Debug User AND Debug Password settings must be " "configured OR none of them." msgstr "" +"Debug Keystore, Debug User 및 Debug Password 설정을 구성하거나 그 중 어느 것" +"도 없어야 합니다." #: platform/android/export/export.cpp msgid "Debug keystore not configured in the Editor Settings nor in the preset." @@ -12134,6 +12127,8 @@ msgid "" "Either Release Keystore, Release User AND Release Password settings must be " "configured OR none of them." msgstr "" +"Release Keystore, Release User 및 Release Password 설정을 구성하거나 그 중 어" +"느 것도 없어야 합니다." #: platform/android/export/export.cpp msgid "Release keystore incorrectly configured in the export preset." @@ -13067,6 +13062,14 @@ msgstr "Varying은 꼭짓점 함수에만 지정할 수 있습니다." msgid "Constants cannot be modified." msgstr "상수는 수정할 수 없습니다." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "애니메이션 플레이어는 자신이 아닌 다른 플레이어에만 애니메이션을 부여할 " +#~ "수 있습니다." + +#~ msgid "Clipboard is empty" +#~ msgstr "클립보드가 비었음" + #~ msgid "" #~ "Godot editor was built without ray tracing support; lightmaps can't be " #~ "baked.\n" diff --git a/editor/translations/lt.po b/editor/translations/lt.po index d4520d2d76..6df1f44cfb 100644 --- a/editor/translations/lt.po +++ b/editor/translations/lt.po @@ -418,10 +418,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Animacijos įrašai gali nurodyti į AnimacijosGrotuvo mazgus." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "Animacijos grotuvas negali animuoti savęs, tik kitus grotuvus." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Nėra galimybės pridėti naują įrašą be root" @@ -467,7 +463,8 @@ msgid "Anim Move Keys" msgstr "" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" msgstr "" #: editor/animation_track_editor.cpp @@ -2481,7 +2478,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11833,10 +11830,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" @@ -12880,6 +12873,9 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "Animacijos grotuvas negali animuoti savęs, tik kitus grotuvus." + #, fuzzy #~ msgid "Add initial export..." #~ msgstr "Mėgstamiausi:" diff --git a/editor/translations/lv.po b/editor/translations/lv.po index 360b8bcb8f..8c8a0011c7 100644 --- a/editor/translations/lv.po +++ b/editor/translations/lv.po @@ -413,10 +413,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Animācijas celiņi var norādīt tikai uz AnimationPlayer mezgliem." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "Animācijas atskaņotājs nevar animēt pats sevi, tikai citi spēlētāji." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Nevar izveidot jaunu celiņu bez saknes" @@ -461,8 +457,9 @@ msgid "Anim Move Keys" msgstr "Anim Pārvietot Atslēgas" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Starpliktuve ir tukša" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -2455,7 +2452,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11641,10 +11638,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" @@ -12677,6 +12670,13 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "Animācijas atskaņotājs nevar animēt pats sevi, tikai citi spēlētāji." + +#~ msgid "Clipboard is empty" +#~ msgstr "Starpliktuve ir tukša" + #~ msgid "Add initial export..." #~ msgstr "Pievienot sākuma eksportu..." diff --git a/editor/translations/mi.po b/editor/translations/mi.po index 17b666c0e6..36a93be0ee 100644 --- a/editor/translations/mi.po +++ b/editor/translations/mi.po @@ -394,10 +394,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "" @@ -442,7 +438,8 @@ msgid "Anim Move Keys" msgstr "" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" msgstr "" #: editor/animation_track_editor.cpp @@ -2401,7 +2398,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11473,10 +11470,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" diff --git a/editor/translations/mk.po b/editor/translations/mk.po index 0443bd589e..7e5aa06f3c 100644 --- a/editor/translations/mk.po +++ b/editor/translations/mk.po @@ -401,10 +401,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "" @@ -449,7 +445,8 @@ msgid "Anim Move Keys" msgstr "" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" msgstr "" #: editor/animation_track_editor.cpp @@ -2408,7 +2405,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11480,10 +11477,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" diff --git a/editor/translations/ml.po b/editor/translations/ml.po index a25540d2cd..3919011ade 100644 --- a/editor/translations/ml.po +++ b/editor/translations/ml.po @@ -404,10 +404,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "" @@ -452,7 +448,8 @@ msgid "Anim Move Keys" msgstr "" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" msgstr "" #: editor/animation_track_editor.cpp @@ -2413,7 +2410,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11490,10 +11487,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" diff --git a/editor/translations/mr.po b/editor/translations/mr.po index 7e6f8f5cc5..4d81595cb1 100644 --- a/editor/translations/mr.po +++ b/editor/translations/mr.po @@ -401,10 +401,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "" @@ -449,7 +445,8 @@ msgid "Anim Move Keys" msgstr "" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" msgstr "" #: editor/animation_track_editor.cpp @@ -2408,7 +2405,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11481,10 +11478,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" diff --git a/editor/translations/ms.po b/editor/translations/ms.po index 82a4443b24..6226d644a3 100644 --- a/editor/translations/ms.po +++ b/editor/translations/ms.po @@ -413,11 +413,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Trek animasi hanya dapat ditujukan kepada nod AnimationPlayer." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" -"Pemain animasi tidak boleh animasikan dirinya sendiri, hanya pemain lain." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Tidak boleh menambah trek baru tanpa satu akar" @@ -462,8 +457,9 @@ msgid "Anim Move Keys" msgstr "Kunci Gerak Anim" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Papan klip kosong" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -2514,7 +2510,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Simpan perubahan pada adegan berikut sebelum keluar?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "Simpan perubahan adegan berikut sebelum membuka Pengurus Projek?" #: editor/editor_node.cpp @@ -11864,10 +11860,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" @@ -12889,6 +12881,13 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "Pemain animasi tidak boleh animasikan dirinya sendiri, hanya pemain lain." + +#~ msgid "Clipboard is empty" +#~ msgstr "Papan klip kosong" + #~ msgid "No" #~ msgstr "Tidak" diff --git a/editor/translations/nb.po b/editor/translations/nb.po index f040c4ca0e..042ee8d26f 100644 --- a/editor/translations/nb.po +++ b/editor/translations/nb.po @@ -422,11 +422,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Animasjonsspor kan kun peke på AnimationPlayer-noder." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" -"En animansjonsavspiller kan ikke animere seg selv, kun andre avspillere." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Ikke mulig å legge til et nytt spor uten en rot" @@ -471,8 +466,9 @@ msgid "Anim Move Keys" msgstr "Anim Flytt Nøkler" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Utklippstavlen er tom" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "Utklippsbordet er tomt!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -2600,7 +2596,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Lagre endring til følgende scene(r) før avslutting?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "Lagre endringer til følgende scene(r) før åpning av Prosjekt-Manager?" #: editor/editor_node.cpp @@ -12364,10 +12360,6 @@ msgid "Can't copy the function node." msgstr "Kan ikke kopiere funksjonsnoden." #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "Utklippsbordet er tomt!" - -#: modules/visual_script/visual_script_editor.cpp #, fuzzy msgid "Paste VisualScript Nodes" msgstr "Lim inn Noder" @@ -13420,6 +13412,13 @@ msgstr "" msgid "Constants cannot be modified." msgstr "Konstanter kan ikke endres." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "En animansjonsavspiller kan ikke animere seg selv, kun andre avspillere." + +#~ msgid "Clipboard is empty" +#~ msgstr "Utklippstavlen er tom" + #~ msgid "No" #~ msgstr "Nei" diff --git a/editor/translations/nl.po b/editor/translations/nl.po index 616c3ae69a..2410cd5ad0 100644 --- a/editor/translations/nl.po +++ b/editor/translations/nl.po @@ -451,10 +451,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Animatiesporen kunnen alleen verwijzen naar AnimatiePlayer-knopen." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "Een animatiespeler kan zichzelf niet animeren, alleen andere spelers." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Niet mogelijk om een nieuwe track toe te voegen zonder een root" @@ -499,8 +495,9 @@ msgid "Anim Move Keys" msgstr "Anim Verplaats Keys" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Klembord is leeg" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "Plakbord is leeg!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -2550,7 +2547,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Wijzigen aan de volgende scène(s) opslaan voor het afsluiten?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "Wijzigen aan de volgende scène(s) opslaan voor het openen van Projectbeheer?" @@ -12047,10 +12044,6 @@ msgid "Can't copy the function node." msgstr "Kan het functieknoop niet kopiëren." #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "Plakbord is leeg!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "Plak VisualScipt knoopen" @@ -13237,6 +13230,13 @@ msgstr "Varyings kunnen alleen worden toegewezenin vertex functies." msgid "Constants cannot be modified." msgstr "Constanten kunnen niet worden aangepast." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "Een animatiespeler kan zichzelf niet animeren, alleen andere spelers." + +#~ msgid "Clipboard is empty" +#~ msgstr "Klembord is leeg" + #~ msgid "No" #~ msgstr "Nee" diff --git a/editor/translations/or.po b/editor/translations/or.po index 58214daf10..87528cdac5 100644 --- a/editor/translations/or.po +++ b/editor/translations/or.po @@ -400,10 +400,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "" @@ -448,7 +444,8 @@ msgid "Anim Move Keys" msgstr "" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" msgstr "" #: editor/animation_track_editor.cpp @@ -2407,7 +2404,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11479,10 +11476,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" diff --git a/editor/translations/pl.po b/editor/translations/pl.po index 9ae69c3d75..3c51593e02 100644 --- a/editor/translations/pl.po +++ b/editor/translations/pl.po @@ -17,7 +17,7 @@ # Maksymilian Świąć <maksymilian.swiac@gmail.com>, 2017-2018. # Mietek Szcześniak <ravaging@go2.pl>, 2016. # NeverK <neverkoxu@gmail.com>, 2018, 2019, 2020. -# Rafal Brozio <rafal.brozio@gmail.com>, 2016, 2019, 2020. +# Rafal Brozio <rafal.brozio@gmail.com>, 2016, 2019, 2020, 2021. # Rafał Ziemniak <synaptykq@gmail.com>, 2017. # RM <synaptykq@gmail.com>, 2018, 2020. # Sebastian Krzyszkowiak <dos@dosowisko.net>, 2017. @@ -52,8 +52,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-05-19 20:16+0000\n" -"Last-Translator: Tomek <kobewi4e@gmail.com>\n" +"PO-Revision-Date: 2021-07-05 14:32+0000\n" +"Last-Translator: Rafal Brozio <rafal.brozio@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/" "godot/pl/>\n" "Language: pl\n" @@ -62,7 +62,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.8-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -86,7 +86,7 @@ msgstr "Niewłaściwe dane %i (nie przekazane) w wyrażeniu" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" msgstr "" -"self nie może być użyte, ponieważ instancja jest nullem (nie przekazano)" +"self nie może zostać użyte, ponieważ instancja jest nullem (nie przekazana)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -454,11 +454,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Ścieżki animacji mogą wskazywać tylko na węzły AnimationPlayer." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" -"AnimationPlayer nie może animować sam siebie, tylko inne węzły tego typu." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Nie da się dodać nowej ścieżki bez korzenia" @@ -503,8 +498,9 @@ msgid "Anim Move Keys" msgstr "Przemieść klucze animacji" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Schowek jest pusty" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "Schowek jest pusty!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -1159,7 +1155,7 @@ msgstr "Podziękowania od społeczności Godota!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "Kliknij, by skopiować." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -2538,7 +2534,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Czy zapisać zmiany w aktualnej scenie/scenach przed wyjściem?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "Zapisać zmiany w następujących scenach przed otwarciem menedżera projektów?" @@ -4700,7 +4696,7 @@ msgstr "Otwórz w inspektorze" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Display list of animations in player." -msgstr "Wyświetl listę animacji w odtwarzaczu." +msgstr "Pokaż listę animacji w odtwarzaczu." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Autoplay on Load" @@ -12019,10 +12015,6 @@ msgid "Can't copy the function node." msgstr "Nie można skopiować węzła funkcji." #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "Schowek jest pusty!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "Wklej węzeł VisualScript" @@ -12236,6 +12228,8 @@ msgid "" "Either Debug Keystore, Debug User AND Debug Password settings must be " "configured OR none of them." msgstr "" +"Albo ustawienia Debug Keystore, Debug User ORAZ Debug Password muszą być " +"skonfigurowane, ALBO żadne z nich." #: platform/android/export/export.cpp msgid "Debug keystore not configured in the Editor Settings nor in the preset." @@ -12248,6 +12242,8 @@ msgid "" "Either Release Keystore, Release User AND Release Password settings must be " "configured OR none of them." msgstr "" +"Albo ustawienia Release Keystore, Release User ORAZ Release Password muszą " +"być skonfigurowane, ALBO żadne z nich." #: platform/android/export/export.cpp msgid "Release keystore incorrectly configured in the export preset." @@ -13219,6 +13215,13 @@ msgstr "Varying może być przypisane tylko w funkcji wierzchołków." msgid "Constants cannot be modified." msgstr "Stałe nie mogą być modyfikowane." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "AnimationPlayer nie może animować sam siebie, tylko inne węzły tego typu." + +#~ msgid "Clipboard is empty" +#~ msgstr "Schowek jest pusty" + #~ msgid "" #~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." #~ msgstr "" diff --git a/editor/translations/pr.po b/editor/translations/pr.po index e308deb01b..675c9cf506 100644 --- a/editor/translations/pr.po +++ b/editor/translations/pr.po @@ -427,10 +427,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "" @@ -476,7 +472,8 @@ msgid "Anim Move Keys" msgstr "" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" msgstr "" #: editor/animation_track_editor.cpp @@ -2487,7 +2484,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11907,10 +11904,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp #, fuzzy msgid "Paste VisualScript Nodes" msgstr "Paste yer Node" diff --git a/editor/translations/pt.po b/editor/translations/pt.po index d2db134026..17b1861821 100644 --- a/editor/translations/pt.po +++ b/editor/translations/pt.po @@ -18,12 +18,13 @@ # Manuela Silva <mmsrs@sky.com>, 2020. # Murilo Gama <murilovsky2030@gmail.com>, 2020. # Ricardo Subtil <ricasubtil@gmail.com>, 2020. +# André Silva <andre.olivais@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-05-18 14:51+0000\n" -"Last-Translator: João Lopes <linux-man@hotmail.com>\n" +"PO-Revision-Date: 2021-07-03 10:33+0000\n" +"Last-Translator: André Silva <andre.olivais@gmail.com>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/godot-engine/" "godot/pt/>\n" "Language: pt\n" @@ -31,7 +32,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.8-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -424,12 +425,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Pistas de Animação só podem apontar a nós AnimationPlayer." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" -"Um reprodutor de animação não se pode animar a ele próprio, apenas a outros " -"reprodutores." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Não é possível adicionar nova pista sem uma raiz" @@ -474,8 +469,9 @@ msgid "Anim Move Keys" msgstr "Anim Mover Chaves" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Área de Transferência está vazia" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "Área de Transferência está vazia!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -1132,7 +1128,7 @@ msgstr "Agradecimentos da Comunidade Godot!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "Clique para copiar." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -2516,7 +2512,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Guardar alterações da(s) seguinte(s) cena(s) antes de sair?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "Guardar alterações da(s) seguinte(s) cena(s) antes de abrir o Gestor de " "Projeto?" @@ -11985,10 +11981,6 @@ msgid "Can't copy the function node." msgstr "Não consigo copiar o nó função." #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "Área de Transferência está vazia!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "Colar Nós VisualScript" @@ -13181,6 +13173,14 @@ msgstr "Variações só podem ser atribuídas na função vértice." msgid "Constants cannot be modified." msgstr "Constantes não podem ser modificadas." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "Um reprodutor de animação não se pode animar a ele próprio, apenas a " +#~ "outros reprodutores." + +#~ msgid "Clipboard is empty" +#~ msgstr "Área de Transferência está vazia" + #~ msgid "" #~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." #~ msgstr "InterpolatedCamerda foi descontinuada e será removida no Godot 4.0." diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po index 1fae91fc0d..e79dd0fa19 100644 --- a/editor/translations/pt_BR.po +++ b/editor/translations/pt_BR.po @@ -117,12 +117,13 @@ # Arthur Phillip D. Silva <artphil.dev@gmail.com>, 2021. # Gustavo HM 102 <gustavohm102@gmail.com>, 2021. # Douglas Leão <djlsplays@gmail.com>, 2021. +# PauloFRs <paulofr1@hotmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: 2016-05-30\n" -"PO-Revision-Date: 2021-06-12 01:23+0000\n" -"Last-Translator: Douglas Leão <djlsplays@gmail.com>\n" +"PO-Revision-Date: 2021-06-29 08:04+0000\n" +"Last-Translator: PauloFRs <paulofr1@hotmail.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_BR/>\n" "Language: pt_BR\n" @@ -130,7 +131,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.7.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -153,7 +154,7 @@ msgstr "Entrada inválida %i (não passada) na expressão" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "self não pode ser usado porque a instância é nula (não passada)" +msgstr "self não pode ser usado porque sua instância é null (não passado)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -521,11 +522,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Faixas de animação só podem apontar para nós AnimationPlayer." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" -"Um tocador de animação não pode animar a si mesmo, apenas outros tocadores." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Não é possível adicionar uma nova trilha sem uma raiz" @@ -571,8 +567,9 @@ msgid "Anim Move Keys" msgstr "Mover Chaves da Anim" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Área de transferência vazia" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "Área de transferência vazia!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -1230,7 +1227,7 @@ msgstr "Agradecimentos da comunidade Godot!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "Clique para copiar." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -1911,7 +1908,7 @@ msgstr "Gerenciar perfis de recurso do editor" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" -msgstr "Selecione a Pasta Atual" +msgstr "Selecionar a Pasta Atual" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "File Exists, Overwrite?" @@ -2612,7 +2609,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Salvar alterações na(s) seguinte(s) cena(s) antes de sair?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "Salvar alterações na(s) seguinte(s) cena(s) antes de abrir o Gerenciador de " "Projetos?" @@ -12106,10 +12103,6 @@ msgid "Can't copy the function node." msgstr "Não é possível copiar o nó de função." #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "Área de transferência vazia!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "Colar Nodes VisualScript" @@ -12328,6 +12321,8 @@ msgid "" "Either Debug Keystore, Debug User AND Debug Password settings must be " "configured OR none of them." msgstr "" +"As configurações Debug Keystore, Debug User E Debug Password devem ser " +"configuradas OU nenhuma delas." #: platform/android/export/export.cpp msgid "Debug keystore not configured in the Editor Settings nor in the preset." @@ -12340,6 +12335,8 @@ msgid "" "Either Release Keystore, Release User AND Release Password settings must be " "configured OR none of them." msgstr "" +"As configurações de Release Keystore, Release User AND Release Password " +"devem ser definidas OU nenhuma delas." #: platform/android/export/export.cpp msgid "Release keystore incorrectly configured in the export preset." @@ -13310,6 +13307,14 @@ msgstr "Variáveis só podem ser atribuídas na função de vértice." msgid "Constants cannot be modified." msgstr "Constantes não podem serem modificadas." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "Um tocador de animação não pode animar a si mesmo, apenas outros " +#~ "tocadores." + +#~ msgid "Clipboard is empty" +#~ msgstr "Área de transferência vazia" + #~ msgid "" #~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." #~ msgstr "IntepolatedCamera foi depreciada e será removida no Godot 4.0." diff --git a/editor/translations/ro.po b/editor/translations/ro.po index ec89b47e96..7ac06fc1b1 100644 --- a/editor/translations/ro.po +++ b/editor/translations/ro.po @@ -420,12 +420,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Pistele de animație pot direcționa numai nodurilor AnimațieJucător." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" -"Un player de animatie nu se poate anima insusi, doar alti playeri de " -"animatie." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Nu este posibil să fie adăugată o nouă pistă fără a avea o rădăcină" @@ -470,8 +464,9 @@ msgid "Anim Move Keys" msgstr "Anim Mutați Cheie" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Clip-board de resurse gol" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -2520,7 +2515,7 @@ msgstr "" "Salvezi modificările făcute în urmatoarea(le) scenă(e) înainte să închizi?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "Salvezi modificările făcute în urmatoarea(le) scenă(e) înainte să deschizi " "Managerul de Proiect?" @@ -12046,10 +12041,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" @@ -13088,6 +13079,14 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "Un player de animatie nu se poate anima insusi, doar alti playeri de " +#~ "animatie." + +#~ msgid "Clipboard is empty" +#~ msgstr "Clip-board de resurse gol" + #~ msgid "No" #~ msgstr "Nu" diff --git a/editor/translations/ru.po b/editor/translations/ru.po index fe4b510539..4b56d21383 100644 --- a/editor/translations/ru.po +++ b/editor/translations/ru.po @@ -95,12 +95,14 @@ # nec-trou <darya.bilyalova@gmail.com>, 2021. # IindinAndEdresia <kapitan_pol@inbox.ru>, 2021. # Bualma Show <appleaidar6@gmail.com>, 2021. +# enderlorde <madel.laboratories@gmail.com>, 2021. +# Олег Довгер <oleg.a.dovger@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-06-07 23:43+0000\n" -"Last-Translator: Bualma Show <appleaidar6@gmail.com>\n" +"PO-Revision-Date: 2021-07-13 06:13+0000\n" +"Last-Translator: Danil Alexeev <danil@alexeev.xyz>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot/ru/>\n" "Language: ru\n" @@ -109,12 +111,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.7.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Invalid type argument to convert(), use TYPE_* constants." -msgstr "Неверный параметр типа для convert(), используйте константы TYPE_*." +msgstr "" +"Недопустимый аргумент type для convert(), используйте константы TYPE_*." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." @@ -501,10 +504,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Дорожки анимации могут указывать только на узлы типа AnimationPlayer." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "Проигрыватель анимации не может анимировать сам себя, только других." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Нельзя добавить новую дорожку без корневого узла" @@ -549,8 +548,9 @@ msgid "Anim Move Keys" msgstr "Переместить ключи" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Буфер обмена пуст" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "Буфер обмена пуст!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -1207,7 +1207,7 @@ msgstr "Спасибо от сообщества Godot!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "Нажмите, чтобы скопировать." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -2591,7 +2591,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Сохранить изменения в следующей сцене(ы) перед выходом?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "Сохранить изменения в следующей сцене(ы) перед открытием менеджера проектов?" @@ -3154,7 +3154,7 @@ msgstr "Инспектор" #: editor/editor_node.cpp msgid "Expand Bottom Panel" -msgstr "Расширить боковую панель" +msgstr "Развернуть нижнюю панель" #: editor/editor_node.cpp msgid "Output" @@ -5813,7 +5813,7 @@ msgstr "Кадрировать выбранное" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Preview Canvas Scale" -msgstr "Предпросмотр Canvas Scale" +msgstr "Предпросмотр масштаба холста" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Translation mask for inserting keys." @@ -8437,7 +8437,7 @@ msgstr "Приоритет" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Z Index" -msgstr "Положение по оси Z" +msgstr "Z-индекс" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Region Mode" @@ -12070,10 +12070,6 @@ msgid "Can't copy the function node." msgstr "Не удаётся копировать узел функции." #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "Буфер обмена пуст!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "Вставить узлы VisualScript" @@ -12287,6 +12283,8 @@ msgid "" "Either Debug Keystore, Debug User AND Debug Password settings must be " "configured OR none of them." msgstr "" +"ЛИБО должны быть заданы настройки Debug Keystore, Debug User И Debug " +"Password, ЛИБО ни одна из них." #: platform/android/export/export.cpp msgid "Debug keystore not configured in the Editor Settings nor in the preset." @@ -12299,6 +12297,8 @@ msgid "" "Either Release Keystore, Release User AND Release Password settings must be " "configured OR none of them." msgstr "" +"ЛИБО должны быть заданы настройки Release Keystore, Release User И Release " +"Password, ЛИБО ни одна из них." #: platform/android/export/export.cpp msgid "Release keystore incorrectly configured in the export preset." @@ -13262,6 +13262,13 @@ msgstr "Изменения могут быть назначены только msgid "Constants cannot be modified." msgstr "Константы не могут быть изменены." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "Проигрыватель анимации не может анимировать сам себя, только других." + +#~ msgid "Clipboard is empty" +#~ msgstr "Буфер обмена пуст" + #~ msgid "" #~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." #~ msgstr "InterpolatedCamera устарела и будет удалена в Godot 4.0." diff --git a/editor/translations/si.po b/editor/translations/si.po index 89c1b2ffc8..a5586af274 100644 --- a/editor/translations/si.po +++ b/editor/translations/si.po @@ -418,10 +418,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "AnimationPlayer පුරුක් සදහා පමණක් සජීවීකරණ ලුහුබදින්නන් එක් කළ හැක." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "" @@ -470,7 +466,8 @@ msgid "Anim Move Keys" msgstr "" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" msgstr "" #: editor/animation_track_editor.cpp @@ -2433,7 +2430,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11573,10 +11570,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" diff --git a/editor/translations/sk.po b/editor/translations/sk.po index 5d5b9cba9b..d97e1321ef 100644 --- a/editor/translations/sk.po +++ b/editor/translations/sk.po @@ -11,12 +11,13 @@ # Richard Urban <redasuio1@gmail.com>, 2020. # Anonymous <noreply@weblate.org>, 2020. # Mario-projects-dev <m.vitek.mv@gmail.com>, 2021. +# Eliška Fichnová <eliska@fichna.sk>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-04-11 22:02+0000\n" -"Last-Translator: Mario-projects-dev <m.vitek.mv@gmail.com>\n" +"PO-Revision-Date: 2021-07-07 15:34+0000\n" +"Last-Translator: Eliška Fichnová <eliska@fichna.sk>\n" "Language-Team: Slovak <https://hosted.weblate.org/projects/godot-engine/" "godot/sk/>\n" "Language: sk\n" @@ -24,7 +25,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.6-dev\n" +"X-Generator: Weblate 4.8-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -414,10 +415,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Track-y Animácií môžu ukazovať iba na node-y AnimationPlayer." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "Animation player sa nemôže naanimovať sám, iba ostatné player-y." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Není možné pridať nový track bez root-u" @@ -462,8 +459,9 @@ msgid "Anim Move Keys" msgstr "Pohybové kľúče Animácie" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Schránka je prázdna" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -1116,7 +1114,7 @@ msgstr "Vďaka z Godot komunity!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "Klikni na skopírovanie." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -1610,13 +1608,12 @@ msgstr "" "Etc' v Nastaveniach Projektu." #: editor/editor_export.cpp -#, fuzzy msgid "" "Target platform requires 'ETC2' or 'PVRTC' texture compression for GLES3. " "Enable 'Import Etc 2' or 'Import Pvrtc' in Project Settings." msgstr "" -"Target platforma potrebuje 'ETC2' kompresor textúr pre GLES3. Povoliť'Import " -"Etc 2' v Nastaveniach Projektu." +"Cieľová platforma potrebuje 'ETC2' alebo 'PVRTC' kompresor textúr pre GLES3. " +"Povoľte 'Import Etc 2' alebo 'Import Pvrtc' v Nastaveniach Projektu." #: editor/editor_export.cpp #, fuzzy @@ -2309,6 +2306,8 @@ msgid "" "An error occurred while trying to save the editor layout.\n" "Make sure the editor's user data path is writable." msgstr "" +"Nastala chyba pri pokuse o uloženie rozloženia editoru.\n" +"Uistite sa, že cesta uživateľských dát editoru je zapisovateľná." #: editor/editor_node.cpp msgid "" @@ -2316,15 +2315,17 @@ msgid "" "To restore the Default layout to its base settings, use the Delete Layout " "option and delete the Default layout." msgstr "" +"Prednastavené rozloženie editoru prepísané.\n" +"Na obnovenie Prednastaveného rozloženia na základné nastavenia, použite " +"možnosť Vymazať Rozloženie a vymažte Prednastavené rozloženie." #: editor/editor_node.cpp msgid "Layout name not found!" msgstr "Meno Layout-u sa nenašlo!" #: editor/editor_node.cpp -#, fuzzy msgid "Restored the Default layout to its base settings." -msgstr "Obnovené predvolené rozloženie na základné nastavenia." +msgstr "Predvolené rozloženie bolo obnovené na základné nastavenia." #: editor/editor_node.cpp msgid "" @@ -2381,7 +2382,7 @@ msgstr "Nieje definovaná žiadna scéna na spustenie." #: editor/editor_node.cpp msgid "Save scene before running..." -msgstr "" +msgstr "Uložiť scénu pred spustením..." #: editor/editor_node.cpp msgid "Could not start subprocess!" @@ -2496,7 +2497,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Uložiť zmeny do nasledujúcich scén pred ukončením?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "Uložiť zmeny nasledujúcich scén pred otvorením Manažéra Projektov?" #: editor/editor_node.cpp @@ -2525,24 +2526,22 @@ msgstr "" "Addon plugin nie je možné povoliť pri: '% s' analýze konfigurácie zlyhalo." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to find script field for addon plugin at: '%s'." -msgstr "" -"Nepodarilo sa nájsť script field pre addon plugin v: 'res://addons/%s'." +msgstr "Nepodarilo sa nájsť pole skriptu pre addon plugin v: '%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." msgstr "Nepodarilo sa načítať addon script z cesty: '%s'." #: editor/editor_node.cpp -#, fuzzy msgid "" "Unable to load addon script from path: '%s'. This might be due to a code " "error in that script.\n" "Disabling the addon at '%s' to prevent further errors." msgstr "" -"Nepodarilo sa nájsť addon script z cesty: '%s' Vyzerá to tak že by mohol byť " -"problém v kóde, prosím skontrolujte syntax." +"Nebolo možné načítať addon skript z cesty: '%s'. Toto môže byť spôsobené " +"chybou kódu v skripte.\n" +"Deaktivujem addon z '%s', aby sa predišlo ďalším chybám." #: editor/editor_node.cpp msgid "" @@ -2985,7 +2984,7 @@ msgstr "O nás" #: editor/editor_node.cpp msgid "Support Godot Development" -msgstr "" +msgstr "Podporte vývoj Godot" #: editor/editor_node.cpp msgid "Play the project." @@ -3127,21 +3126,22 @@ msgid "Open & Run a Script" msgstr "Otvoriť a vykonať skript" #: editor/editor_node.cpp -#, fuzzy msgid "" "The following files are newer on disk.\n" "What action should be taken?" -msgstr "Nasledovné súbory sa nepodarilo extrahovať z balíka:" +msgstr "" +"Nasledujúce súbory majú novšiu verziu na disku.\n" +"Aká akcia sa má vykonať?" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Reload" -msgstr "" +msgstr "Znovu načítať" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Resave" -msgstr "" +msgstr "Znovu uložiť" #: editor/editor_node.cpp msgid "New Inherited" @@ -3670,6 +3670,8 @@ msgstr "" msgid "" "Importing has been disabled for this file, so it can't be opened for editing." msgstr "" +"Importovanie bolo zablokované pre tento súbor, čiže nemôže byť otvorený pre " +"úpravy." #: editor/filesystem_dock.cpp msgid "Cannot move/rename resources root." @@ -3716,6 +3718,12 @@ msgid "" "\n" "Do you wish to overwrite them?" msgstr "" +"Nasledujúce súbory alebo zložky sú v konflikte s položkami v cieľovom " +"umiestnení '%s':\n" +"\n" +"%s\n" +"\n" +"Prajete si ich prepísať?" #: editor/filesystem_dock.cpp msgid "Renaming file:" @@ -3796,9 +3804,8 @@ msgid "Duplicate..." msgstr "Duplikovať..." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Move to Trash" -msgstr "Presunúť AutoLoad-y" +msgstr "Presunúť do odpadkov" #: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Rename..." @@ -3909,19 +3916,16 @@ msgid "Searching..." msgstr "Vyhľadávam..." #: editor/find_in_files.cpp -#, fuzzy msgid "%d match in %d file." -msgstr "%d zhody." +msgstr "%d zhoda v %d súbore." #: editor/find_in_files.cpp -#, fuzzy msgid "%d matches in %d file." -msgstr "%d zhody." +msgstr "%d zhôd v % súbore." #: editor/find_in_files.cpp -#, fuzzy msgid "%d matches in %d files." -msgstr "%d zhody." +msgstr "%d zhôd v %d súboroch." #: editor/groups_editor.cpp msgid "Add to Group" @@ -4058,23 +4062,20 @@ msgid "Saving..." msgstr "Ukladám..." #: editor/import_defaults_editor.cpp -#, fuzzy msgid "Select Importer" -msgstr "Vybrať Režim" +msgstr "Vybrať Importér" #: editor/import_defaults_editor.cpp -#, fuzzy msgid "Importer:" -msgstr "Import" +msgstr "Importér:" #: editor/import_defaults_editor.cpp -#, fuzzy msgid "Reset to Defaults" -msgstr "Načítať predvolené" +msgstr "Obnoviť na východzie" #: editor/import_dock.cpp msgid "Keep File (No Import)" -msgstr "" +msgstr "Ponechať súbor (bez importu)" #: editor/import_dock.cpp msgid "%d Files" @@ -5040,9 +5041,8 @@ msgid "Got:" msgstr "Má:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Failed SHA-256 hash check" -msgstr "Zlyhalo sha256 hash check" +msgstr "Zlyhalo overenie SHA-256 hashu" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -11938,10 +11938,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp #, fuzzy msgid "Paste VisualScript Nodes" msgstr "Vložiť" @@ -13001,6 +12997,12 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "Animation player sa nemôže naanimovať sám, iba ostatné player-y." + +#~ msgid "Clipboard is empty" +#~ msgstr "Schránka je prázdna" + #~ msgid "No" #~ msgstr "Nie" diff --git a/editor/translations/sl.po b/editor/translations/sl.po index 2ac453123c..07bd33c389 100644 --- a/editor/translations/sl.po +++ b/editor/translations/sl.po @@ -440,10 +440,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "" @@ -493,7 +489,8 @@ msgid "Anim Move Keys" msgstr "Animacija Premakni ključ" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" msgstr "" #: editor/animation_track_editor.cpp @@ -2606,7 +2603,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Shranim spremembe na sledečih scenah pred zaprtjem?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "Shranim spremembe na sledečih scenah pred odpiranjem Upravljalnika Projekta?" @@ -12321,10 +12318,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" diff --git a/editor/translations/sq.po b/editor/translations/sq.po index 4409a6f48a..49a42b5553 100644 --- a/editor/translations/sq.po +++ b/editor/translations/sq.po @@ -407,10 +407,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "" @@ -455,8 +451,9 @@ msgid "Anim Move Keys" msgstr "" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Clipboard-i është bosh" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -2548,7 +2545,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Ruaj ndryshimet nga skenat e mëposhtme përpara se të dalësh?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "Ruaj ndryshimet ne skenat e mëposhtme para se të hapësh Menaxherin e " "Projekteve?" @@ -11927,10 +11924,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" @@ -12962,6 +12955,9 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Clipboard is empty" +#~ msgstr "Clipboard-i është bosh" + #~ msgid "No" #~ msgstr "Jo" diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po index 3ba1c674a3..53fb04b3e4 100644 --- a/editor/translations/sr_Cyrl.po +++ b/editor/translations/sr_Cyrl.po @@ -457,11 +457,6 @@ msgstr "Анимационе траке могу само усмеравати #: editor/animation_track_editor.cpp #, fuzzy -msgid "An animation player can't animate itself, only other players." -msgstr "Анимациони плејер не може анимирати самог себе, само друге плејере." - -#: editor/animation_track_editor.cpp -#, fuzzy msgid "Not possible to add a new track without a root" msgstr "Није могуже додати нову траку без корена" @@ -515,9 +510,9 @@ msgid "Anim Move Keys" msgstr "Помери кључеве" #: editor/animation_track_editor.cpp -#, fuzzy -msgid "Clipboard is empty" -msgstr "Нема ресурса за копирање!" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" #: editor/animation_track_editor.cpp #, fuzzy @@ -2727,7 +2722,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Сачувај промене тренутне сцене/а пре излазка?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "Сачувај промене тренутне сцене/а пре отварање менаџера пројекта?" #: editor/editor_node.cpp @@ -13503,10 +13498,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" @@ -14817,6 +14808,14 @@ msgstr "Варијације могу само бити одређене у фу msgid "Constants cannot be modified." msgstr "Константе није могуће мењати." +#, fuzzy +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "Анимациони плејер не може анимирати самог себе, само друге плејере." + +#, fuzzy +#~ msgid "Clipboard is empty" +#~ msgstr "Нема ресурса за копирање!" + #~ msgid "No" #~ msgstr "Не" diff --git a/editor/translations/sr_Latn.po b/editor/translations/sr_Latn.po index fcab84a2bf..0a90379b41 100644 --- a/editor/translations/sr_Latn.po +++ b/editor/translations/sr_Latn.po @@ -422,10 +422,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "" @@ -473,7 +469,8 @@ msgid "Anim Move Keys" msgstr "Animacija Pomjeri Ključeve" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" msgstr "" #: editor/animation_track_editor.cpp @@ -2446,7 +2443,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11665,10 +11662,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" diff --git a/editor/translations/sv.po b/editor/translations/sv.po index c5cad10f66..0c5db25a9a 100644 --- a/editor/translations/sv.po +++ b/editor/translations/sv.po @@ -22,12 +22,13 @@ # Shaggy <anton_christoffersson@hotmail.com>, 2020. # Marcus Toftedahl <marcus.toftedahl@his.se>, 2020. # Alex25820 <Alexander_sjogren@hotmail.se>, 2021. +# Leon <joel.lundborg@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-05-03 21:29+0000\n" -"Last-Translator: Alex25820 <Alexander_sjogren@hotmail.se>\n" +"PO-Revision-Date: 2021-07-13 06:13+0000\n" +"Last-Translator: Leon <joel.lundborg@gmail.com>\n" "Language-Team: Swedish <https://hosted.weblate.org/projects/godot-engine/" "godot/sv/>\n" "Language: sv\n" @@ -35,7 +36,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.7.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -426,11 +427,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Animationsspår kan bara peka på AnimationsSpelar noder." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" -"En animationsspelare kan inte animera sig själv, utan bara andra spelare." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Det är inte möjligt att lägga till ett nytt spår utan en rot-nod" @@ -475,8 +471,9 @@ msgid "Anim Move Keys" msgstr "Anim Flytta Nycklar" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Urklipp är tomt" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -1134,7 +1131,7 @@ msgstr "Tack från Godot-gemenskapen!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "Klicka för att kopiera." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -1667,14 +1664,12 @@ msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." msgstr "Den inbäddade PCK får inte vara större än 4 GiB på 32 bitars exporter." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "3D Editor" -msgstr "Öppna Skript-Redigerare" +msgstr "Öppna 3D-redigeraren" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Script Editor" -msgstr "Öppna Skript-Redigerare" +msgstr "Öppna Skript-Redigeraren" #: editor/editor_feature_profile.cpp msgid "Asset Library" @@ -1699,18 +1694,16 @@ msgid "Import Dock" msgstr "Importera" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Erase profile '%s'? (no undo)" -msgstr "Ersätt Alla" +msgstr "Rensa profil ‘%s’? (Du kan inte ångra den här åtgärden )" #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" msgstr "Profilen måste ha ett giltigt filnamn och får inte innehålla '.'" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Profile with this name already exists." -msgstr "En fil eller mapp med detta namn finns redan." +msgstr "En profil med detta namn finns redan." #: editor/editor_feature_profile.cpp msgid "(Editor Disabled, Properties Disabled)" @@ -1768,9 +1761,8 @@ msgid "Unset" msgstr "" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Current Profile:" -msgstr "Nuvarande Version:" +msgstr "Nuvarande Profil:" #: editor/editor_feature_profile.cpp msgid "Make Current" @@ -1792,9 +1784,8 @@ msgid "Export" msgstr "Exportera" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Available Profiles:" -msgstr "Tillgängliga Noder:" +msgstr "Tillgängliga Profiler:" #: editor/editor_feature_profile.cpp #, fuzzy @@ -2561,7 +2552,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Spara ändringar av följande scen(er) innan du avslutar?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "Spara ändringar av följande scen(er) innan du öppnar Projekthanteraren?" @@ -12074,10 +12065,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" @@ -13142,6 +13129,13 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "En animationsspelare kan inte animera sig själv, utan bara andra spelare." + +#~ msgid "Clipboard is empty" +#~ msgstr "Urklipp är tomt" + #~ msgid "No" #~ msgstr "Nej" diff --git a/editor/translations/ta.po b/editor/translations/ta.po index c630966603..0c9022b097 100644 --- a/editor/translations/ta.po +++ b/editor/translations/ta.po @@ -421,10 +421,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "" @@ -472,7 +468,8 @@ msgid "Anim Move Keys" msgstr "" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" msgstr "" #: editor/animation_track_editor.cpp @@ -2437,7 +2434,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11576,10 +11573,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" diff --git a/editor/translations/te.po b/editor/translations/te.po index f1d857b911..8274d5520f 100644 --- a/editor/translations/te.po +++ b/editor/translations/te.po @@ -403,10 +403,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "" @@ -451,7 +447,8 @@ msgid "Anim Move Keys" msgstr "" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" msgstr "" #: editor/animation_track_editor.cpp @@ -2410,7 +2407,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11483,10 +11480,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" diff --git a/editor/translations/th.po b/editor/translations/th.po index 0edcf900b9..e9c2a80a49 100644 --- a/editor/translations/th.po +++ b/editor/translations/th.po @@ -427,10 +427,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "แทร็กอนิเมชั่นสามารถติดไว้บนโหนด AnimationPlayer เท่านั้น" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "แทร็กอนิเมชั่นไม่สามารถเล่นตัวมันเองได้ แต่สามารถเล่นตัวเล่นอื่นได้" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "ไม่สามารถที่จะเพิ่มแทร็กใหม่โดยที่ไม่มีรูท" @@ -475,8 +471,9 @@ msgid "Anim Move Keys" msgstr "ย้ายคีย์แอนิเมชัน" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "คลิปบอร์ดว่างเปล่า" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "คลิปบอร์ดว่างเปล่า!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -2483,7 +2480,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "บันทึกฉากต่อไปนี้ก่อนปิดโปรแกรมหรือไม่?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "บันทึกฉากต่อไปนี้ก่อนกลับสู่ตัวจัดการโปรเจกต์หรือไม่?" #: editor/editor_node.cpp @@ -11801,10 +11798,6 @@ msgid "Can't copy the function node." msgstr "คัดลอกโหนดฟังก์ชันไม่ได้" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "คลิปบอร์ดว่างเปล่า!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "วางโหนด VisualScript" @@ -12913,6 +12906,12 @@ msgstr "Varyings สามารถกำหนดในังก์ชันเ msgid "Constants cannot be modified." msgstr "ค่าคงที่ไม่สามารถแก้ไขได้" +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "แทร็กอนิเมชั่นไม่สามารถเล่นตัวมันเองได้ แต่สามารถเล่นตัวเล่นอื่นได้" + +#~ msgid "Clipboard is empty" +#~ msgstr "คลิปบอร์ดว่างเปล่า" + #~ msgid "" #~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." #~ msgstr "InterpolatedCamera เลิกใช้งานแล้วและจะถูกลบออกใน Godot 4.0" diff --git a/editor/translations/tr.po b/editor/translations/tr.po index 5892850caf..578d7b48d0 100644 --- a/editor/translations/tr.po +++ b/editor/translations/tr.po @@ -60,12 +60,13 @@ # Jafar Tarverdiyev <cefertarverdiyevv@gmail.com>, 2021. # ali aydın <alimxaydin@gmail.com>, 2021. # Cannur Daşkıran <canndask@gmail.com>, 2021. +# kahveciderin <kahveciderin@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-05-29 13:49+0000\n" -"Last-Translator: ali aydın <alimxaydin@gmail.com>\n" +"PO-Revision-Date: 2021-07-13 06:13+0000\n" +"Last-Translator: kahveciderin <kahveciderin@gmail.com>\n" "Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/" "godot/tr/>\n" "Language: tr\n" @@ -73,7 +74,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.7.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -464,12 +465,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Animasyon izleri sadece AnimasyonOynatıcı düğümlerini işaret edebilir." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" -"Bir animasyon oynatıcı kendisini oynamataz, sadece diğer oynatıcılar " -"yapaibilir." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Bir kök olmadan yeni bir iz eklemek mümkün değildir" @@ -514,8 +509,9 @@ msgid "Anim Move Keys" msgstr "Animasyon Anahtarları Taşı" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Pano boş" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "Pano boş!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -1173,7 +1169,7 @@ msgstr "Godot topluluğundan teşekkürler!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "Kopyalamak için tıklayın." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -2554,7 +2550,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Çıkmadan önce değişiklikler aşağıdaki sahne(ler)e kaydedilsin mi?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "Proje Yöneticisi açılmadan önce değişiklikler aşağıdaki sahneye(lere) " "kaydedilsin mi?" @@ -12023,10 +12019,6 @@ msgid "Can't copy the function node." msgstr "Fonksiyon düğümü kopyalanamıyor." #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "Pano boş!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "GörselBetik Düğümleri Yapıştır" @@ -12238,6 +12230,8 @@ msgid "" "Either Debug Keystore, Debug User AND Debug Password settings must be " "configured OR none of them." msgstr "" +"Hata Ayıklama Anahtar Deposu, Hata Ayıklama Kullanıcısı VE Hata Ayıklama " +"Şifresi konfigüre edilmelidir VEYA hiçbiri konfigüre edilmemelidir." #: platform/android/export/export.cpp msgid "Debug keystore not configured in the Editor Settings nor in the preset." @@ -12250,6 +12244,8 @@ msgid "" "Either Release Keystore, Release User AND Release Password settings must be " "configured OR none of them." msgstr "" +"Yayınlama Anahtar Deposu, Yayınlama Kullanıcısı be Yayınlama Şifresi " +"ayarları konfigüre edilmeli VEYA hiçbiri konfigüre edilmemelidir." #: platform/android/export/export.cpp msgid "Release keystore incorrectly configured in the export preset." @@ -13215,6 +13211,14 @@ msgstr "varyings yalnızca vertex işlevinde atanabilir." msgid "Constants cannot be modified." msgstr "Sabit değerler değiştirilemez." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "Bir animasyon oynatıcı kendisini oynamataz, sadece diğer oynatıcılar " +#~ "yapaibilir." + +#~ msgid "Clipboard is empty" +#~ msgstr "Pano boş" + #~ msgid "" #~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." #~ msgstr "" diff --git a/editor/translations/tt.po b/editor/translations/tt.po index c0d7e79447..3e63f2369d 100644 --- a/editor/translations/tt.po +++ b/editor/translations/tt.po @@ -403,10 +403,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "" @@ -451,7 +447,8 @@ msgid "Anim Move Keys" msgstr "" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" msgstr "" #: editor/animation_track_editor.cpp @@ -2410,7 +2407,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11482,10 +11479,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" diff --git a/editor/translations/tzm.po b/editor/translations/tzm.po index 629220c426..0b0ce7d01e 100644 --- a/editor/translations/tzm.po +++ b/editor/translations/tzm.po @@ -401,10 +401,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "" @@ -449,7 +445,8 @@ msgid "Anim Move Keys" msgstr "" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" msgstr "" #: editor/animation_track_editor.cpp @@ -2408,7 +2405,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11480,10 +11477,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" diff --git a/editor/translations/uk.po b/editor/translations/uk.po index 67f369bb15..50508c5df3 100644 --- a/editor/translations/uk.po +++ b/editor/translations/uk.po @@ -20,7 +20,7 @@ msgid "" msgstr "" "Project-Id-Version: Ukrainian (Godot Engine)\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-05-18 14:51+0000\n" +"PO-Revision-Date: 2021-06-20 13:35+0000\n" "Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/" "godot/uk/>\n" @@ -30,7 +30,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.7\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -424,12 +424,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Доріжки анімації можуть вказувати лише на взули AnimationPlayer." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" -"Відтворювач анімації не може відтворювати сам себе, лише інші відтворювачі " -"анімації." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Не можна додавати нові доріжки без кореневого запису" @@ -476,8 +470,9 @@ msgid "Anim Move Keys" msgstr "Перемістити ключі анімації" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Буфер обміну порожній" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "Буфер обміну порожній!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -1137,7 +1132,7 @@ msgstr "Спасибі від спільноти Godot!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "Клацніть, щоб скопіювати." #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -2521,7 +2516,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Зберегти зміни в наступній(их) сцені(ах) перед тим, як вийти?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" "Зберегти зміни в наступній(их) сцені(ах) перед відкриттям менеджера проєктів?" @@ -12025,10 +12020,6 @@ msgid "Can't copy the function node." msgstr "Неможливо скопіювати вузол функції." #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "Буфер обміну порожній!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "Вставити вузли (Візуального скриптингу) VisualScript" @@ -12244,6 +12235,8 @@ msgid "" "Either Debug Keystore, Debug User AND Debug Password settings must be " "configured OR none of them." msgstr "" +"Має бути налаштовано діагностику сховища ключів, діагностику користувача АБО " +"діагностику пароля АБО не налаштовано діагностику жодного з цих компонентів." #: platform/android/export/export.cpp msgid "Debug keystore not configured in the Editor Settings nor in the preset." @@ -12256,6 +12249,8 @@ msgid "" "Either Release Keystore, Release User AND Release Password settings must be " "configured OR none of them." msgstr "" +"Має бути налаштовано параметри сховища ключів випуску, користувача випуску і " +"пароля випуску або не налаштовано жоден з цих параметрів." #: platform/android/export/export.cpp msgid "Release keystore incorrectly configured in the export preset." @@ -13244,6 +13239,14 @@ msgstr "Змінні величини можна пов'язувати лише msgid "Constants cannot be modified." msgstr "Сталі не можна змінювати." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "Відтворювач анімації не може відтворювати сам себе, лише інші " +#~ "відтворювачі анімації." + +#~ msgid "Clipboard is empty" +#~ msgstr "Буфер обміну порожній" + #~ msgid "" #~ "Godot editor was built without ray tracing support; lightmaps can't be " #~ "baked.\n" diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po index 3af1eac2ef..0a213a2bdf 100644 --- a/editor/translations/ur_PK.po +++ b/editor/translations/ur_PK.po @@ -410,10 +410,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "" @@ -458,7 +454,8 @@ msgid "Anim Move Keys" msgstr "" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" msgstr "" #: editor/animation_track_editor.cpp @@ -2456,7 +2453,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "" #: editor/editor_node.cpp @@ -11780,10 +11777,6 @@ msgid "Can't copy the function node." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "" diff --git a/editor/translations/vi.po b/editor/translations/vi.po index 8a34f898b8..0104d05502 100644 --- a/editor/translations/vi.po +++ b/editor/translations/vi.po @@ -424,11 +424,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "Các bản hoạt ảnh chỉ có thể trỏ tới các nút AnimationPlayer." #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" -"Animation player không tự tạo hoạt ảnh được, phải thông qua các player khác." - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "Không thể thêm track mới mà không có root" @@ -473,8 +468,9 @@ msgid "Anim Move Keys" msgstr "Di chuyển các khoá hoạt cảnh" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "Clipboard rỗng" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "Clipboard trống!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -2499,7 +2495,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "Lưu thay đổi trong các scene sau trước khi thoát?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "Lưu thay đổi trong các cảnh sau trước khi mở Quản lí Dự án?" #: editor/editor_node.cpp @@ -11888,10 +11884,6 @@ msgid "Can't copy the function node." msgstr "Không thể sao chép nút chức năng." #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "Clipboard trống!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "Dán các nút VisualScript" @@ -13004,6 +12996,14 @@ msgstr "" msgid "Constants cannot be modified." msgstr "Không thể chỉnh sửa hằng số." +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "" +#~ "Animation player không tự tạo hoạt ảnh được, phải thông qua các player " +#~ "khác." + +#~ msgid "Clipboard is empty" +#~ msgstr "Clipboard rỗng" + #~ msgid "No" #~ msgstr "Không" diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po index 53259bcc6f..4393cb4e08 100644 --- a/editor/translations/zh_CN.po +++ b/editor/translations/zh_CN.po @@ -83,7 +83,7 @@ msgid "" msgstr "" "Project-Id-Version: Chinese (Simplified) (Godot Engine)\n" "POT-Creation-Date: 2018-01-20 12:15+0200\n" -"PO-Revision-Date: 2021-05-29 13:49+0000\n" +"PO-Revision-Date: 2021-07-13 06:13+0000\n" "Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hans/>\n" @@ -92,7 +92,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.7.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -260,7 +260,7 @@ msgstr "修改动画长度" #: editor/animation_track_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation Loop" -msgstr "修改循环" +msgstr "修改动画循环" #: editor/animation_track_editor.cpp msgid "Property Track" @@ -288,11 +288,11 @@ msgstr "动画播放轨道" #: editor/animation_track_editor.cpp msgid "Animation length (frames)" -msgstr "动画时长(帧)" +msgstr "动画长度(帧)" #: editor/animation_track_editor.cpp msgid "Animation length (seconds)" -msgstr "动画时长(秒)" +msgstr "动画长度(秒)" #: editor/animation_track_editor.cpp msgid "Add Track" @@ -317,15 +317,15 @@ msgstr "动画剪辑:" #: editor/animation_track_editor.cpp msgid "Change Track Path" -msgstr "改变轨道路径" +msgstr "修改轨道路径" #: editor/animation_track_editor.cpp msgid "Toggle this track on/off." -msgstr "切换当前轨道开关。" +msgstr "切换该轨道的开关。" #: editor/animation_track_editor.cpp msgid "Update Mode (How this property is set)" -msgstr "更新模式(属性设置方法)" +msgstr "更新模式(设置属性的方式)" #: editor/animation_track_editor.cpp msgid "Interpolation Mode" @@ -337,7 +337,7 @@ msgstr "无缝循环模式(使用循环开始插值循环结束)" #: editor/animation_track_editor.cpp msgid "Remove this track." -msgstr "移除当前轨道。" +msgstr "移除该轨道。" #: editor/animation_track_editor.cpp msgid "Time (s): " @@ -378,11 +378,11 @@ msgstr "三次方" #: editor/animation_track_editor.cpp msgid "Clamp Loop Interp" -msgstr "切断循环插值器" +msgstr "切断循环插值" #: editor/animation_track_editor.cpp msgid "Wrap Loop Interp" -msgstr "环绕间隔" +msgstr "环绕循环插值" #: editor/animation_track_editor.cpp #: editor/plugins/canvas_item_editor_plugin.cpp @@ -391,11 +391,11 @@ msgstr "插入关键帧" #: editor/animation_track_editor.cpp msgid "Duplicate Key(s)" -msgstr "复制帧" +msgstr "复制关键帧" #: editor/animation_track_editor.cpp msgid "Delete Key(s)" -msgstr "删除帧" +msgstr "删除关键帧" #: editor/animation_track_editor.cpp msgid "Change Animation Update Mode" @@ -411,7 +411,7 @@ msgstr "更改动画循环模式" #: editor/animation_track_editor.cpp msgid "Remove Anim Track" -msgstr "移除轨道" +msgstr "移除动画轨道" #: editor/animation_track_editor.cpp msgid "Create NEW track for %s and insert key?" @@ -447,11 +447,11 @@ msgstr "创建并插入动画" #: editor/animation_track_editor.cpp msgid "Anim Insert Track & Key" -msgstr "插入轨道和关键帧" +msgstr "插入动画轨道和关键帧" #: editor/animation_track_editor.cpp msgid "Anim Insert Key" -msgstr "插入关键帧" +msgstr "插入动画关键帧" #: editor/animation_track_editor.cpp msgid "Change Animation Step" @@ -463,7 +463,7 @@ msgstr "重新排列轨道" #: editor/animation_track_editor.cpp msgid "Transform tracks only apply to Spatial-based nodes." -msgstr "变换轨迹仅应用到基于 Spatial 节点。" +msgstr "变换轨道仅应用于基于 Spatial 的节点。" #: editor/animation_track_editor.cpp msgid "" @@ -472,18 +472,14 @@ msgid "" "-AudioStreamPlayer2D\n" "-AudioStreamPlayer3D" msgstr "" -"音轨只能指向以下类型的节点:\n" +"音频轨道只能指向以下类型的节点:\n" "-AudioStreamPlayer\n" "-AudioStreamPlayer2D\n" "-AudioStreamPlayer3D" #: editor/animation_track_editor.cpp msgid "Animation tracks can only point to AnimationPlayer nodes." -msgstr "动画轨迹只能指向 AnimationPlayer 节点。" - -#: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "动画播放器不能动画化自己,只能动画化其他播放器。" +msgstr "动画轨道只能指向 AnimationPlayer 节点。" #: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" @@ -530,8 +526,9 @@ msgid "Anim Move Keys" msgstr "移动动画关键帧" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "剪贴板是空的" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "剪贴板是空的!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -1179,7 +1176,7 @@ msgstr "Godot 社区感谢你!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "点击复制。" #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -2535,7 +2532,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "退出前要保存以下场景更改吗?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "打开项目管理器前要保存下列场景更改吗?" #: editor/editor_node.cpp @@ -9783,10 +9780,10 @@ msgid "" "Incompatible with older hardware\n" "Not recommended for web games" msgstr "" -"视觉质量更高\n" +"视觉质量较高\n" "所有功能可用\n" -"与旧硬件不兼容\n" -"不推荐用于网络游戏" +"不兼容较老的硬件\n" +"不推荐用于网页游戏" #: editor/project_manager.cpp msgid "OpenGL ES 2.0" @@ -9802,7 +9799,7 @@ msgstr "" "视觉质量较低\n" "某些功能不可用\n" "可用于大多数硬件\n" -"推荐用于网络游戏" +"推荐用于网页游戏" #: editor/project_manager.cpp msgid "Renderer can be changed later, but scenes may need to be adjusted." @@ -9878,7 +9875,7 @@ msgid "" "the \"Application\" category." msgstr "" "无法运行项目:未定义主场景。 \n" -"请编辑项目并在 “项目设置” 中 “Application” 类别下设置主场景。" +"请编辑项目并在 “项目设置” 的 “Application” 类别下设置主场景。" #: editor/project_manager.cpp msgid "" @@ -9943,7 +9940,7 @@ msgstr "项目" #: editor/project_manager.cpp msgid "Loading, please wait..." -msgstr "正在加载,请稍候..." +msgstr "正在加载,请稍候……" #: editor/project_manager.cpp msgid "Last Modified" @@ -9971,7 +9968,7 @@ msgstr "模板" #: editor/project_manager.cpp msgid "Restart Now" -msgstr "立即重新启动" +msgstr "立即重启" #: editor/project_manager.cpp msgid "Can't run project" @@ -9982,7 +9979,7 @@ msgid "" "You currently don't have any projects.\n" "Would you like to explore official example projects in the Asset Library?" msgstr "" -"目前没有任何项目。 \n" +"目前没有任何项目。\n" "是否查看素材库中的官方示例项目?" #: editor/project_manager.cpp @@ -9996,11 +9993,11 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Key " -msgstr "键 " +msgstr "按键 " #: editor/project_settings_editor.cpp msgid "Joy Button" -msgstr "手柄按钮" +msgstr "手柄按键" #: editor/project_settings_editor.cpp msgid "Joy Axis" @@ -10014,11 +10011,11 @@ msgstr "鼠标按键" msgid "" "Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or " "'\"'" -msgstr "无效的操作名称。操作名不能为空,也不能包含 “/”, “:”, “=”, “\\” 或 “\"”" +msgstr "无效的动作名称。动作名不能为空,也不能包含 “/”, “:”, “=”, “\\” 或 “\"”" #: editor/project_settings_editor.cpp msgid "An action with the name '%s' already exists." -msgstr "名为 “%s” 的操作已存在。" +msgstr "名为“%s”的动作已存在。" #: editor/project_settings_editor.cpp msgid "Rename Input Action Event" @@ -10042,11 +10039,11 @@ msgstr "设备" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." -msgstr "按下一个键..." +msgstr "请按键……" #: editor/project_settings_editor.cpp msgid "Mouse Button Index:" -msgstr "鼠标按键:" +msgstr "鼠标按键索引:" #: editor/project_settings_editor.cpp msgid "Left Button" @@ -10070,11 +10067,11 @@ msgstr "滚轮向下" #: editor/project_settings_editor.cpp msgid "Wheel Left Button" -msgstr "滚轮左键" +msgstr "滚轮向左" #: editor/project_settings_editor.cpp msgid "Wheel Right Button" -msgstr "滚轮右键" +msgstr "滚轮向右" #: editor/project_settings_editor.cpp msgid "X Button 1" @@ -10086,7 +10083,7 @@ msgstr "X 按键 2" #: editor/project_settings_editor.cpp msgid "Joypad Axis Index:" -msgstr "手柄摇杆序号:" +msgstr "手柄摇杆索引:" #: editor/project_settings_editor.cpp msgid "Axis" @@ -10094,15 +10091,15 @@ msgstr "轴" #: editor/project_settings_editor.cpp msgid "Joypad Button Index:" -msgstr "手柄按钮:" +msgstr "手柄按钮索引:" #: editor/project_settings_editor.cpp msgid "Erase Input Action" -msgstr "移除输入事件" +msgstr "移除输入动作" #: editor/project_settings_editor.cpp msgid "Erase Input Action Event" -msgstr "移除输入事件" +msgstr "移除输入动作事件" #: editor/project_settings_editor.cpp msgid "Add Event" @@ -10122,7 +10119,7 @@ msgstr "右键。" #: editor/project_settings_editor.cpp msgid "Middle Button." -msgstr "中键(滚轮)。" +msgstr "中键。" #: editor/project_settings_editor.cpp msgid "Wheel Up." @@ -10138,15 +10135,15 @@ msgstr "添加全局属性" #: editor/project_settings_editor.cpp msgid "Select a setting item first!" -msgstr "请先选择一个设置项目 !" +msgstr "请先选择一个设置项!" #: editor/project_settings_editor.cpp msgid "No property '%s' exists." -msgstr "不存在属性 “%s”。" +msgstr "不存在属性“%s”。" #: editor/project_settings_editor.cpp msgid "Setting '%s' is internal, and it can't be deleted." -msgstr "“%s” 是内部设定,无法删除。" +msgstr "“%s”是内部设定,无法删除。" #: editor/project_settings_editor.cpp msgid "Delete Item" @@ -10157,7 +10154,7 @@ msgid "" "Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or " "'\"'." msgstr "" -"无效的操作名称。名称不能为空,也不能包含 “/”, “:”, “=”, “\\” 或者 “\"”。" +"无效的动作名称。动作不能为空,也不能包含 “/”, “:”, “=”, “\\” 或者 “\"”。" #: editor/project_settings_editor.cpp msgid "Add Input Action" @@ -10173,7 +10170,7 @@ msgstr "保存设置成功。" #: editor/project_settings_editor.cpp msgid "Moved Input Action Event" -msgstr "输入动作事件" +msgstr "移动输入动作事件" #: editor/project_settings_editor.cpp msgid "Override for Feature" @@ -10209,11 +10206,11 @@ msgstr "移除资源重定向选项" #: editor/project_settings_editor.cpp msgid "Changed Locale Filter" -msgstr "修改区域设置筛选模式" +msgstr "修改区域设置筛选" #: editor/project_settings_editor.cpp msgid "Changed Locale Filter Mode" -msgstr "更改了区域设置筛选模式" +msgstr "修改区域设置筛选模式" #: editor/project_settings_editor.cpp msgid "Project Settings (project.godot)" @@ -10237,7 +10234,7 @@ msgstr "键位映射" #: editor/project_settings_editor.cpp msgid "Action:" -msgstr "动作:" +msgstr "动作:" #: editor/project_settings_editor.cpp msgid "Action" @@ -10253,7 +10250,7 @@ msgstr "设备:" #: editor/project_settings_editor.cpp msgid "Index:" -msgstr "序号:" +msgstr "索引:" #: editor/project_settings_editor.cpp msgid "Localization" @@ -10277,7 +10274,7 @@ msgstr "资源:" #: editor/project_settings_editor.cpp msgid "Remaps by Locale:" -msgstr "依照区域重定向:" +msgstr "按区域重定向:" #: editor/project_settings_editor.cpp msgid "Locale" @@ -10329,7 +10326,7 @@ msgstr "缓入缓出" #: editor/property_editor.cpp msgid "Easing Out-In" -msgstr "反缓入缓出" +msgstr "缓出缓入" #: editor/property_editor.cpp msgid "File..." @@ -11832,10 +11829,6 @@ msgid "Can't copy the function node." msgstr "无法复制函数节点。" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "剪贴板是空的!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "粘贴 VisualScript 节点" @@ -12043,7 +12036,7 @@ msgstr "未在项目中安装 Android 构建模板。从项目菜单安装它。 msgid "" "Either Debug Keystore, Debug User AND Debug Password settings must be " "configured OR none of them." -msgstr "" +msgstr "Debug Keystore、Debug User、Debug Password 必须全部填写或者全部留空。" #: platform/android/export/export.cpp msgid "Debug keystore not configured in the Editor Settings nor in the preset." @@ -12054,6 +12047,7 @@ msgid "" "Either Release Keystore, Release User AND Release Password settings must be " "configured OR none of them." msgstr "" +"Release Keystore、Release User、Release Password 必须全部填写或者全部留空。" #: platform/android/export/export.cpp msgid "Release keystore incorrectly configured in the export preset." @@ -12946,6 +12940,12 @@ msgstr "变量只能在顶点函数中指定。" msgid "Constants cannot be modified." msgstr "不允许修改常量。" +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "动画播放器不能动画化自己,只能动画化其他播放器。" + +#~ msgid "Clipboard is empty" +#~ msgstr "剪贴板是空的" + #~ msgid "" #~ "Godot editor was built without ray tracing support; lightmaps can't be " #~ "baked.\n" diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po index eee6eb62b7..28a69ee289 100644 --- a/editor/translations/zh_HK.po +++ b/editor/translations/zh_HK.po @@ -435,10 +435,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "沒有ROOT以新增新動畫軌跡" @@ -486,8 +482,9 @@ msgid "Anim Move Keys" msgstr "移動動畫幀" #: editor/animation_track_editor.cpp +#: modules/visual_script/visual_script_editor.cpp #, fuzzy -msgid "Clipboard is empty" +msgid "Clipboard is empty!" msgstr "路徑為空" #: editor/animation_track_editor.cpp @@ -2575,7 +2572,7 @@ msgstr "離開前要先儲存以下 scene 的任何更改嗎?" #: editor/editor_node.cpp #, fuzzy -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "開啟 Project Manager 前要先儲存以下 scene 的任何更改嗎?" #: editor/editor_node.cpp @@ -12291,11 +12288,6 @@ msgstr "" #: modules/visual_script/visual_script_editor.cpp #, fuzzy -msgid "Clipboard is empty!" -msgstr "路徑為空" - -#: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Paste VisualScript Nodes" msgstr "貼上" @@ -13352,6 +13344,10 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#, fuzzy +#~ msgid "Clipboard is empty" +#~ msgstr "路徑為空" + #~ msgid "No" #~ msgstr "否" diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po index 7aee72ee43..f65d628d63 100644 --- a/editor/translations/zh_TW.po +++ b/editor/translations/zh_TW.po @@ -25,12 +25,13 @@ # BinotaLIU <binota@protonmail.ch>, 2020. # BinotaLIU <me@binota.org>, 2020, 2021. # MintSoda <lionlxh@qq.com>, 2020. +# meowmeowmeowcat <meowmeowcat1211@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-05-24 21:36+0000\n" -"Last-Translator: Kisaragi Hiu <mail@kisaragi-hiu.com>\n" +"PO-Revision-Date: 2021-07-13 06:13+0000\n" +"Last-Translator: meowmeowmeowcat <meowmeowcat1211@gmail.com>\n" "Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hant/>\n" "Language: zh_TW\n" @@ -38,7 +39,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.7.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -428,10 +429,6 @@ msgid "Animation tracks can only point to AnimationPlayer nodes." msgstr "動畫軌僅可指向 AnimationPlayer 節點。" #: editor/animation_track_editor.cpp -msgid "An animation player can't animate itself, only other players." -msgstr "動畫 Player 無法播放自己,僅可播放其他 Player。" - -#: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" msgstr "沒有根節點時無法新增軌道" @@ -476,8 +473,9 @@ msgid "Anim Move Keys" msgstr "移動動畫關鍵畫格" #: editor/animation_track_editor.cpp -msgid "Clipboard is empty" -msgstr "剪貼板為空" +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "剪貼簿為空!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -1125,7 +1123,7 @@ msgstr "Godot 社群感謝你!" #: editor/editor_about.cpp editor/editor_node.cpp editor/project_manager.cpp msgid "Click to copy." -msgstr "" +msgstr "按一下以複製。" #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -2483,7 +2481,7 @@ msgid "Save changes to the following scene(s) before quitting?" msgstr "退出前要先保存下列場景嗎?" #: editor/editor_node.cpp -msgid "Save changes the following scene(s) before opening Project Manager?" +msgid "Save changes to the following scene(s) before opening Project Manager?" msgstr "開啟專案管理員前要先保存以下場景嗎?" #: editor/editor_node.cpp @@ -11778,10 +11776,6 @@ msgid "Can't copy the function node." msgstr "無法複製函式節點。" #: modules/visual_script/visual_script_editor.cpp -msgid "Clipboard is empty!" -msgstr "剪貼簿為空!" - -#: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" msgstr "貼上視覺腳本 (VisualScript) 節點" @@ -12897,6 +12891,12 @@ msgstr "Varying 變數只可在頂點函式中指派。" msgid "Constants cannot be modified." msgstr "不可修改常數。" +#~ msgid "An animation player can't animate itself, only other players." +#~ msgstr "動畫 Player 無法播放自己,僅可播放其他 Player。" + +#~ msgid "Clipboard is empty" +#~ msgstr "剪貼板為空" + #~ msgid "" #~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." #~ msgstr "InterpolatedCamera 已停止維護,且將於 Godot 4.0 中移除。" |