diff options
Diffstat (limited to 'editor')
124 files changed, 4872 insertions, 3055 deletions
diff --git a/editor/action_map_editor.cpp b/editor/action_map_editor.cpp new file mode 100644 index 0000000000..55640ca590 --- /dev/null +++ b/editor/action_map_editor.cpp @@ -0,0 +1,1167 @@ +/*************************************************************************/ +/* action_map_editor.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 "action_map_editor.h" +#include "core/input/input_map.h" +#include "core/os/keyboard.h" +#include "editor/editor_scale.h" +#include "scene/gui/center_container.h" + +///////////////////////////////////////// + +// Maps to 2*axis if value is neg, or + 1 if value is pos. +static const char *_joy_axis_descriptions[JOY_AXIS_MAX * 2] = { + TTRC("Left Stick Left, Joystick 0 Left"), + TTRC("Left Stick Right, Joystick 0 Right"), + TTRC("Left Stick Up, Joystick 0 Up"), + TTRC("Left Stick Down, Joystick 0 Down"), + TTRC("Right Stick Left, Joystick 1 Left"), + TTRC("Right Stick Right, Joystick 1 Right"), + TTRC("Right Stick Up, Joystick 1 Up"), + TTRC("Right Stick Down, Joystick 1 Down"), + TTRC("Joystick 2 Left"), + TTRC("Left Trigger, Sony L2, Xbox LT, Joystick 2 Right"), + TTRC("Joystick 2 Up"), + TTRC("Right Trigger, Sony R2, Xbox RT, Joystick 2 Down"), + TTRC("Joystick 3 Left"), + TTRC("Joystick 3 Right"), + TTRC("Joystick 3 Up"), + TTRC("Joystick 3 Down"), + TTRC("Joystick 4 Left"), + TTRC("Joystick 4 Right"), + TTRC("Joystick 4 Up"), + TTRC("Joystick 4 Down"), +}; + +String InputEventConfigurationDialog::get_event_text(const Ref<InputEvent> &p_event) { + ERR_FAIL_COND_V_MSG(p_event.is_null(), String(), "Provided event is not a valid instance of InputEvent"); + + // Joypad motion events will display slighlty differently than what the event->as_text() provides. See #43660. + Ref<InputEventJoypadMotion> jpmotion = p_event; + if (jpmotion.is_valid()) { + String desc = TTR("Unknown Joypad Axis"); + if (jpmotion->get_axis() < JOY_AXIS_MAX) { + desc = RTR(_joy_axis_descriptions[2 * jpmotion->get_axis() + (jpmotion->get_axis_value() < 0 ? 0 : 1)]); + } + + return vformat("Joypad Axis %s %s (%s)", itos(jpmotion->get_axis()), jpmotion->get_axis_value() < 0 ? "-" : "+", desc); + } else { + return p_event->as_text(); + } +} + +void InputEventConfigurationDialog::_set_event(const Ref<InputEvent> &p_event) { + if (p_event.is_valid()) { + event = p_event; + + // Update Label + event_as_text->set_text(get_event_text(event)); + + Ref<InputEventKey> k = p_event; + Ref<InputEventMouseButton> mb = p_event; + Ref<InputEventJoypadButton> joyb = p_event; + Ref<InputEventJoypadMotion> joym = p_event; + Ref<InputEventWithModifiers> mod = p_event; + + // Update option values and visibility + bool show_mods = false; + bool show_device = false; + bool show_phys_key = false; + + if (mod.is_valid()) { + show_mods = true; + mod_checkboxes[MOD_ALT]->set_pressed(mod->get_alt()); + mod_checkboxes[MOD_SHIFT]->set_pressed(mod->get_shift()); + mod_checkboxes[MOD_COMMAND]->set_pressed(mod->get_command()); + mod_checkboxes[MOD_CONTROL]->set_pressed(mod->get_control()); + mod_checkboxes[MOD_META]->set_pressed(mod->get_metakey()); + + store_command_checkbox->set_pressed(mod->is_storing_command()); + } + + if (k.is_valid()) { + show_phys_key = true; + physical_key_checkbox->set_pressed(k->get_physical_keycode() != 0 && k->get_keycode() == 0); + + } else if (joyb.is_valid() || joym.is_valid() || mb.is_valid()) { + show_device = true; + _set_current_device(event->get_device()); + } + + mod_container->set_visible(show_mods); + device_container->set_visible(show_device); + physical_key_checkbox->set_visible(show_phys_key); + additional_options_container->show(); + + // Update selected item in input list for keys, joybuttons and joyaxis only (since the mouse cannot be "listened" for). + if (k.is_valid() || joyb.is_valid() || joym.is_valid()) { + TreeItem *category = input_list_tree->get_root()->get_children(); + while (category) { + TreeItem *input_item = category->get_children(); + + // has_type this should be always true, unless the tree structure has been misconfigured. + bool has_type = input_item->get_parent()->has_meta("__type"); + int input_type = input_item->get_parent()->get_meta("__type"); + if (!has_type) { + return; + } + + // If event type matches input types of this category. + if ((k.is_valid() && input_type == INPUT_KEY) || (joyb.is_valid() && input_type == INPUT_JOY_BUTTON) || (joym.is_valid() && input_type == INPUT_JOY_MOTION)) { + // Loop through all items of this category until one matches. + while (input_item) { + bool key_match = k.is_valid() && (Variant(k->get_keycode()) == input_item->get_meta("__keycode") || Variant(k->get_physical_keycode()) == input_item->get_meta("__keycode")); + bool joyb_match = joyb.is_valid() && Variant(joyb->get_button_index()) == input_item->get_meta("__index"); + bool joym_match = joym.is_valid() && Variant(joym->get_axis()) == input_item->get_meta("__axis") && joym->get_axis_value() == (float)input_item->get_meta("__value"); + if (key_match || joyb_match || joym_match) { + category->set_collapsed(false); + input_item->select(0); + input_list_tree->ensure_cursor_is_visible(); + return; + } + input_item = input_item->get_next(); + } + } + + category->set_collapsed(true); // Event not in this category, so collapse; + category = category->get_next(); + } + } + } else { + // Event is not valid, reset dialog + event = p_event; + Vector<String> strings; + + // Reset message, promp for input according to which input types are allowed. + String text = TTR("Perform an Input (%s)."); + + if (allowed_input_types & INPUT_KEY) { + strings.append(TTR("Key")); + } + // We don't check for INPUT_MOUSE_BUTTON since it is ignored in the "Listen Window Input" method. + + if (allowed_input_types & INPUT_JOY_BUTTON) { + strings.append(TTR("Joypad Button")); + } + if (allowed_input_types & INPUT_JOY_MOTION) { + strings.append(TTR("Joypad Axis")); + } + + if (strings.size() == 0) { + text = TTR("Input Event dialog has been misconfigured: No input types are allowed."); + event_as_text->set_text(text); + } else { + String insert_text = String(", ").join(strings); + event_as_text->set_text(vformat(text, insert_text)); + } + + additional_options_container->hide(); + input_list_tree->deselect_all(); + _update_input_list(); + } +} + +void InputEventConfigurationDialog::_tab_selected(int p_tab) { + Callable signal_method = callable_mp(this, &InputEventConfigurationDialog::_listen_window_input); + if (p_tab == 0) { + // Start Listening. + if (!is_connected("window_input", signal_method)) { + connect("window_input", signal_method); + } + } else { + // Stop Listening. + if (is_connected("window_input", signal_method)) { + disconnect("window_input", signal_method); + } + input_list_tree->call_deferred("ensure_cursor_is_visible"); + if (input_list_tree->get_selected() == nullptr) { + // If nothing selected, scroll to top. + input_list_tree->scroll_to_item(input_list_tree->get_root()); + } + } +} + +void InputEventConfigurationDialog::_listen_window_input(const Ref<InputEvent> &p_event) { + // Ignore if echo or not pressed + if (p_event->is_echo() || !p_event->is_pressed()) { + return; + } + + // Ignore mouse + Ref<InputEventMouse> m = p_event; + if (m.is_valid()) { + return; + } + + // Check what the type is and if it is allowed. + Ref<InputEventKey> k = p_event; + Ref<InputEventJoypadButton> joyb = p_event; + Ref<InputEventJoypadMotion> joym = p_event; + + int type = k.is_valid() ? INPUT_KEY : joyb.is_valid() ? INPUT_JOY_BUTTON : + joym.is_valid() ? INPUT_JOY_MOTION : + 0; + + if (!(allowed_input_types & type)) { + return; + } + + if (joym.is_valid()) { + float axis_value = joym->get_axis_value(); + if (ABS(axis_value) < 0.9) { + // Ignore motion below 0.9 magnitude to avoid accidental touches + return; + } else { + // Always make the value 1 or -1 for display consistency + joym->set_axis_value(SGN(axis_value)); + } + } + + if (k.is_valid()) { + k->set_pressed(false); // to avoid serialisation of 'pressed' property - doesn't matter for actions anyway. + // Maintain physical keycode option state + if (physical_key_checkbox->is_pressed()) { + k->set_physical_keycode(k->get_keycode()); + k->set_keycode(0); + } else { + k->set_keycode(k->get_physical_keycode()); + k->set_physical_keycode(0); + } + } + + Ref<InputEventWithModifiers> mod = p_event; + if (mod.is_valid()) { + // Maintain store command option state + mod->set_store_command(store_command_checkbox->is_pressed()); + + mod->set_window_id(0); + } + + _set_event(p_event); + set_input_as_handled(); +} + +void InputEventConfigurationDialog::_search_term_updated(const String &) { + _update_input_list(); +} + +void InputEventConfigurationDialog::_update_input_list() { + input_list_tree->clear(); + + TreeItem *root = input_list_tree->create_item(); + String search_term = input_list_search->get_text(); + + bool collapse = input_list_search->get_text().is_empty(); + + if (allowed_input_types & INPUT_KEY) { + TreeItem *kb_root = input_list_tree->create_item(root); + kb_root->set_text(0, TTR("Keyboard Keys")); + kb_root->set_icon(0, icon_cache.keyboard); + kb_root->set_collapsed(collapse); + kb_root->set_meta("__type", INPUT_KEY); + + for (int i = 0; i < keycode_get_count(); i++) { + String name = keycode_get_name_by_index(i); + + if (!search_term.is_empty() && name.findn(search_term) == -1) { + continue; + } + + TreeItem *item = input_list_tree->create_item(kb_root); + item->set_text(0, name); + item->set_meta("__keycode", keycode_get_value_by_index(i)); + } + } + + if (allowed_input_types & INPUT_MOUSE_BUTTON) { + TreeItem *mouse_root = input_list_tree->create_item(root); + mouse_root->set_text(0, TTR("Mouse Buttons")); + mouse_root->set_icon(0, icon_cache.mouse); + mouse_root->set_collapsed(collapse); + mouse_root->set_meta("__type", INPUT_MOUSE_BUTTON); + + int mouse_buttons[9] = { BUTTON_LEFT, BUTTON_RIGHT, BUTTON_MIDDLE, BUTTON_WHEEL_UP, BUTTON_WHEEL_DOWN, BUTTON_WHEEL_LEFT, BUTTON_WHEEL_RIGHT, BUTTON_XBUTTON1, BUTTON_XBUTTON2 }; + for (int i = 0; i < 9; i++) { + Ref<InputEventMouseButton> mb; + mb.instance(); + mb->set_button_index(mouse_buttons[i]); + String desc = get_event_text(mb); + + if (!search_term.is_empty() && desc.findn(search_term) == -1) { + continue; + } + + TreeItem *item = input_list_tree->create_item(mouse_root); + item->set_text(0, desc); + item->set_meta("__index", mouse_buttons[i]); + } + } + + if (allowed_input_types & INPUT_JOY_BUTTON) { + TreeItem *joyb_root = input_list_tree->create_item(root); + joyb_root->set_text(0, TTR("Joypad Buttons")); + joyb_root->set_icon(0, icon_cache.joypad_button); + joyb_root->set_collapsed(collapse); + joyb_root->set_meta("__type", INPUT_JOY_BUTTON); + + for (int i = 0; i < JOY_BUTTON_MAX; i++) { + Ref<InputEventJoypadButton> joyb; + joyb.instance(); + joyb->set_button_index(i); + String desc = get_event_text(joyb); + + if (!search_term.is_empty() && desc.findn(search_term) == -1) { + continue; + } + + TreeItem *item = input_list_tree->create_item(joyb_root); + item->set_text(0, desc); + item->set_meta("__index", i); + } + } + + if (allowed_input_types & INPUT_JOY_MOTION) { + TreeItem *joya_root = input_list_tree->create_item(root); + joya_root->set_text(0, TTR("Joypad Axes")); + joya_root->set_icon(0, icon_cache.joypad_axis); + joya_root->set_collapsed(collapse); + joya_root->set_meta("__type", INPUT_JOY_MOTION); + + for (int i = 0; i < JOY_AXIS_MAX * 2; i++) { + int axis = i / 2; + int direction = (i & 1) ? 1 : -1; + Ref<InputEventJoypadMotion> joym; + joym.instance(); + joym->set_axis(axis); + joym->set_axis_value(direction); + String desc = get_event_text(joym); + + if (!search_term.is_empty() && desc.findn(search_term) == -1) { + continue; + } + + TreeItem *item = input_list_tree->create_item(joya_root); + item->set_text(0, desc); + item->set_meta("__axis", i >> 1); + item->set_meta("__value", (i & 1) ? 1 : -1); + } + } +} + +void InputEventConfigurationDialog::_mod_toggled(bool p_checked, int p_index) { + Ref<InputEventWithModifiers> ie = event; + + // Not event with modifiers + if (ie.is_null()) { + return; + } + + if (p_index == 0) { + ie->set_alt(p_checked); + } else if (p_index == 1) { + ie->set_shift(p_checked); + } else if (p_index == 2) { + ie->set_command(p_checked); + } else if (p_index == 3) { + ie->set_control(p_checked); + } else if (p_index == 4) { + ie->set_metakey(p_checked); + } + + _set_event(ie); +} + +void InputEventConfigurationDialog::_store_command_toggled(bool p_checked) { + Ref<InputEventWithModifiers> ie = event; + if (ie.is_valid()) { + ie->set_store_command(p_checked); + _set_event(ie); + } + + if (p_checked) { + // If storing Command, show it's checkbox and hide Control (Win/Lin) or Meta (Mac) +#ifdef APPLE_STYLE_KEYS + mod_checkboxes[MOD_META]->hide(); + + mod_checkboxes[MOD_COMMAND]->show(); + mod_checkboxes[MOD_COMMAND]->set_text("Meta (Command)"); +#else + mod_checkboxes[MOD_CONTROL]->hide(); + + mod_checkboxes[MOD_COMMAND]->show(); + mod_checkboxes[MOD_COMMAND]->set_text("Control (Command)"); +#endif + } else { + // If not, hide Command, show Control and Meta. + mod_checkboxes[MOD_COMMAND]->hide(); + mod_checkboxes[MOD_CONTROL]->show(); + mod_checkboxes[MOD_META]->show(); + } +} + +void InputEventConfigurationDialog::_physical_keycode_toggled(bool p_checked) { + Ref<InputEventKey> k = event; + + if (k.is_null()) { + return; + } + + if (p_checked) { + k->set_physical_keycode(k->get_keycode()); + k->set_keycode(0); + } else { + k->set_keycode(k->get_physical_keycode()); + k->set_physical_keycode(0); + } + + _set_event(k); +} + +void InputEventConfigurationDialog::_input_list_item_selected() { + TreeItem *selected = input_list_tree->get_selected(); + + // Invalid tree selection - type only exists on the "category" items, which are not a valid selection. + if (selected->has_meta("__type")) { + return; + } + + int input_type = selected->get_parent()->get_meta("__type"); + + switch (input_type) { + case InputEventConfigurationDialog::INPUT_KEY: { + int kc = selected->get_meta("__keycode"); + Ref<InputEventKey> k; + k.instance(); + + if (physical_key_checkbox->is_pressed()) { + k->set_physical_keycode(kc); + k->set_keycode(0); + } else { + k->set_physical_keycode(0); + k->set_keycode(kc); + } + + // Maintain modifier state from checkboxes + k->set_alt(mod_checkboxes[MOD_ALT]->is_pressed()); + k->set_shift(mod_checkboxes[MOD_SHIFT]->is_pressed()); + k->set_command(mod_checkboxes[MOD_COMMAND]->is_pressed()); + k->set_control(mod_checkboxes[MOD_CONTROL]->is_pressed()); + k->set_metakey(mod_checkboxes[MOD_META]->is_pressed()); + k->set_store_command(store_command_checkbox->is_pressed()); + + _set_event(k); + } break; + case InputEventConfigurationDialog::INPUT_MOUSE_BUTTON: { + int idx = selected->get_meta("__index"); + Ref<InputEventMouseButton> mb; + mb.instance(); + mb->set_button_index(idx); + // Maintain modifier state from checkboxes + mb->set_alt(mod_checkboxes[MOD_ALT]->is_pressed()); + mb->set_shift(mod_checkboxes[MOD_SHIFT]->is_pressed()); + mb->set_command(mod_checkboxes[MOD_COMMAND]->is_pressed()); + mb->set_control(mod_checkboxes[MOD_CONTROL]->is_pressed()); + mb->set_metakey(mod_checkboxes[MOD_META]->is_pressed()); + mb->set_store_command(store_command_checkbox->is_pressed()); + + _set_event(mb); + } break; + case InputEventConfigurationDialog::INPUT_JOY_BUTTON: { + int idx = selected->get_meta("__index"); + Ref<InputEventJoypadButton> jb = InputEventJoypadButton::create_reference(idx); + _set_event(jb); + } break; + case InputEventConfigurationDialog::INPUT_JOY_MOTION: { + int axis = selected->get_meta("__axis"); + int value = selected->get_meta("__value"); + + Ref<InputEventJoypadMotion> jm; + jm.instance(); + jm->set_axis(axis); + jm->set_axis_value(value); + _set_event(jm); + } break; + default: + break; + } +} + +void InputEventConfigurationDialog::_set_current_device(int i_device) { + device_id_option->select(i_device + 1); +} + +int InputEventConfigurationDialog::_get_current_device() const { + return device_id_option->get_selected() - 1; +} + +String InputEventConfigurationDialog::_get_device_string(int i_device) const { + if (i_device == InputMap::ALL_DEVICES) { + return TTR("All Devices"); + } + return TTR("Device") + " " + itos(i_device); +} + +void InputEventConfigurationDialog::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + input_list_search->set_right_icon(input_list_search->get_theme_icon("Search", "EditorIcons")); + + physical_key_checkbox->set_icon(get_theme_icon("KeyboardPhysical", "EditorIcons")); + + icon_cache.keyboard = get_theme_icon("Keyboard", "EditorIcons"); + icon_cache.mouse = get_theme_icon("Mouse", "EditorIcons"); + icon_cache.joypad_button = get_theme_icon("JoyButton", "EditorIcons"); + icon_cache.joypad_axis = get_theme_icon("JoyAxis", "EditorIcons"); + + _update_input_list(); + } break; + default: + break; + } +} + +void InputEventConfigurationDialog::popup_and_configure(const Ref<InputEvent> &p_event) { + if (p_event.is_valid()) { + _set_event(p_event); + } else { + // Clear Event + _set_event(p_event); + + // Clear Checkbox Values + for (int i = 0; i < MOD_MAX; i++) { + mod_checkboxes[i]->set_pressed(false); + } + physical_key_checkbox->set_pressed(false); + store_command_checkbox->set_pressed(true); + _set_current_device(0); + + // Switch to "Listen" tab + tab_container->set_current_tab(0); + } + + popup_centered(); +} + +Ref<InputEvent> InputEventConfigurationDialog::get_event() const { + return event; +} + +void InputEventConfigurationDialog::set_allowed_input_types(int p_type_masks) { + allowed_input_types = p_type_masks; +} + +InputEventConfigurationDialog::InputEventConfigurationDialog() { + allowed_input_types = INPUT_KEY | INPUT_MOUSE_BUTTON | INPUT_JOY_BUTTON | INPUT_JOY_MOTION; + + set_title("Event Configuration"); + set_min_size(Size2i(550 * EDSCALE, 0)); // Min width + + VBoxContainer *main_vbox = memnew(VBoxContainer); + add_child(main_vbox); + + tab_container = memnew(TabContainer); + tab_container->set_tab_align(TabContainer::TabAlign::ALIGN_LEFT); + tab_container->set_use_hidden_tabs_for_min_size(true); + tab_container->set_v_size_flags(Control::SIZE_EXPAND_FILL); + tab_container->connect("tab_selected", callable_mp(this, &InputEventConfigurationDialog::_tab_selected)); + main_vbox->add_child(tab_container); + + CenterContainer *cc = memnew(CenterContainer); + cc->set_name("Listen for Input"); + event_as_text = memnew(Label); + event_as_text->set_align(Label::ALIGN_CENTER); + cc->add_child(event_as_text); + tab_container->add_child(cc); + + // List of all input options to manually select from. + + VBoxContainer *manual_vbox = memnew(VBoxContainer); + manual_vbox->set_name("Manual Selection"); + manual_vbox->set_v_size_flags(Control::SIZE_EXPAND_FILL); + tab_container->add_child(manual_vbox); + + input_list_search = memnew(LineEdit); + input_list_search->set_h_size_flags(Control::SIZE_EXPAND_FILL); + input_list_search->set_placeholder(TTR("Filter Inputs")); + input_list_search->set_clear_button_enabled(true); + input_list_search->connect("text_changed", callable_mp(this, &InputEventConfigurationDialog::_search_term_updated)); + manual_vbox->add_child(input_list_search); + + input_list_tree = memnew(Tree); + input_list_tree->set_custom_minimum_size(Size2(0, 100 * EDSCALE)); // Min height for tree + input_list_tree->connect("item_selected", callable_mp(this, &InputEventConfigurationDialog::_input_list_item_selected)); + input_list_tree->set_v_size_flags(Control::SIZE_EXPAND_FILL); + manual_vbox->add_child(input_list_tree); + + input_list_tree->set_hide_root(true); + input_list_tree->set_columns(1); + + _update_input_list(); + + // Additional Options + additional_options_container = memnew(VBoxContainer); + additional_options_container->hide(); + + Label *opts_label = memnew(Label); + opts_label->set_text("Additional Options"); + additional_options_container->add_child(opts_label); + + // Device Selection + device_container = memnew(HBoxContainer); + device_container->set_h_size_flags(Control::SIZE_EXPAND_FILL); + + Label *device_label = memnew(Label); + device_label->set_text("Device:"); + device_container->add_child(device_label); + + device_id_option = memnew(OptionButton); + device_id_option->set_h_size_flags(Control::SIZE_EXPAND_FILL); + device_container->add_child(device_id_option); + + for (int i = -1; i < 8; i++) { + device_id_option->add_item(_get_device_string(i)); + } + _set_current_device(0); + device_container->hide(); + additional_options_container->add_child(device_container); + + // Modifier Selection + mod_container = memnew(HBoxContainer); + for (int i = 0; i < MOD_MAX; i++) { + String name = mods[i]; + mod_checkboxes[i] = memnew(CheckBox); + mod_checkboxes[i]->connect("toggled", callable_mp(this, &InputEventConfigurationDialog::_mod_toggled), varray(i)); + mod_checkboxes[i]->set_text(name); + mod_container->add_child(mod_checkboxes[i]); + } + + mod_container->add_child(memnew(VSeparator)); + + store_command_checkbox = memnew(CheckBox); + store_command_checkbox->connect("toggled", callable_mp(this, &InputEventConfigurationDialog::_store_command_toggled)); + store_command_checkbox->set_pressed(true); + store_command_checkbox->set_text(TTR("Store Command")); +#ifdef APPLE_STYLE_KEYS + store_command_checkbox->set_tooltip(TTR("Toggles between serializing 'command' and 'meta'. Used for compatibility with Windows/Linux style keyboard.")); +#else + store_command_checkbox->set_tooltip(TTR("Toggles between serializing 'command' and 'control'. Used for compatibility with Apple Style keyboards.")); +#endif + mod_container->add_child(store_command_checkbox); + + mod_container->hide(); + additional_options_container->add_child(mod_container); + + // Physical Key Checkbox + + physical_key_checkbox = memnew(CheckBox); + physical_key_checkbox->set_text(TTR("Use Physical Keycode")); + physical_key_checkbox->set_tooltip(TTR("Stores the physical position of the key on the keyboard rather than the keys value. Used for compatibility with non-latin layouts.")); + physical_key_checkbox->connect("toggled", callable_mp(this, &InputEventConfigurationDialog::_physical_keycode_toggled)); + physical_key_checkbox->hide(); + additional_options_container->add_child(physical_key_checkbox); + + main_vbox->add_child(additional_options_container); + + // Default to first tab + tab_container->set_current_tab(0); +} + +///////////////////////////////////////// + +static bool _is_action_name_valid(const String &p_name) { + const char32_t *cstr = p_name.get_data(); + for (int i = 0; cstr[i]; i++) { + if (cstr[i] == '/' || cstr[i] == ':' || cstr[i] == '"' || + cstr[i] == '=' || cstr[i] == '\\' || cstr[i] < 32) { + return false; + } + } + return true; +} + +void ActionMapEditor::_event_config_confirmed() { + Ref<InputEvent> ev = event_config_dialog->get_event(); + + Dictionary new_action = current_action.duplicate(); + Array events = new_action["events"]; + + if (current_action_event_index == -1) { + // Add new event + events.push_back(ev); + } else { + // Edit existing event + events[current_action_event_index] = ev; + } + + new_action["events"] = events; + emit_signal("action_edited", current_action_name, new_action); +} + +void ActionMapEditor::_add_action_pressed() { + _add_action(add_edit->get_text()); +} + +void ActionMapEditor::_add_action(const String &p_name) { + if (!allow_editing_actions) { + return; + } + + if (p_name == "" || !_is_action_name_valid(p_name)) { + show_message(TTR("Invalid action name. it cannot be.is_empty()() nor contain '/', ':', '=', '\\' or '\"'")); + return; + } + + add_edit->clear(); + emit_signal("action_added", p_name); +} + +void ActionMapEditor::_action_edited() { + if (!allow_editing_actions) { + return; + } + + TreeItem *ti = action_tree->get_edited(); + if (!ti) { + return; + } + + if (action_tree->get_selected_column() == 0) { + // Name Edited + String new_name = ti->get_text(0); + String old_name = ti->get_meta("__name"); + + if (new_name == old_name) { + return; + } + + if (new_name == "" || !_is_action_name_valid(new_name)) { + ti->set_text(0, old_name); + show_message(TTR("Invalid action name. it cannot be.is_empty()() nor contain '/', ':', '=', '\\' or '\"'")); + return; + } + + emit_signal("action_renamed", old_name, new_name); + } else if (action_tree->get_selected_column() == 1) { + // Deadzone Edited + String name = ti->get_meta("__name"); + Dictionary old_action = ti->get_meta("__action"); + Dictionary new_action = old_action.duplicate(); + new_action["deadzone"] = ti->get_range(1); + + // Call deferred so that input can finish propagating through tree, allowing re-making of tree to occur. + call_deferred("emit_signal", "action_edited", name, new_action); + } +} + +void ActionMapEditor::_tree_button_pressed(Object *p_item, int p_column, int p_id) { + ItemButton option = (ItemButton)p_id; + + TreeItem *item = Object::cast_to<TreeItem>(p_item); + if (!item) { + return; + } + + switch (option) { + case ActionMapEditor::BUTTON_ADD_EVENT: { + current_action = item->get_meta("__action"); + current_action_name = item->get_meta("__name"); + current_action_event_index = -1; + + event_config_dialog->popup_and_configure(); + + } break; + case ActionMapEditor::BUTTON_EDIT_EVENT: { + // Action and Action name is located on the parent of the event. + current_action = item->get_parent()->get_meta("__action"); + current_action_name = item->get_parent()->get_meta("__name"); + + current_action_event_index = item->get_meta("__index"); + + Ref<InputEvent> ie = item->get_meta("__event"); + if (ie.is_valid()) { + event_config_dialog->popup_and_configure(ie); + } + + } break; + case ActionMapEditor::BUTTON_REMOVE_ACTION: { + if (!allow_editing_actions) { + break; + } + + // Send removed action name + String name = item->get_meta("__name"); + emit_signal("action_removed", name); + } break; + case ActionMapEditor::BUTTON_REMOVE_EVENT: { + // Remove event and send updated action + Dictionary action = item->get_parent()->get_meta("__action"); + String action_name = item->get_parent()->get_meta("__name"); + + int event_index = item->get_meta("__index"); + + Array events = action["events"]; + events.remove(event_index); + action["events"] = events; + + emit_signal("action_edited", action_name, action); + } break; + default: + break; + } +} + +void ActionMapEditor::_tree_item_activated() { + TreeItem *item = action_tree->get_selected(); + + if (!item || !item->has_meta("__event")) { + return; + } + + _tree_button_pressed(item, 2, BUTTON_EDIT_EVENT); +} + +void ActionMapEditor::set_show_uneditable(bool p_show) { + show_uneditable = p_show; + show_uneditable_actions_checkbox->set_pressed(p_show); + + // Prevent unnecessary updates of action list when cache is.is_empty()(). + if (!actions_cache.is_empty()) { + update_action_list(); + } +} + +void ActionMapEditor::_search_term_updated(const String &) { + update_action_list(); +} + +Variant ActionMapEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from) { + TreeItem *selected = action_tree->get_selected(); + if (!selected) { + return Variant(); + } + + String name = selected->get_text(0); + Label *label = memnew(Label(name)); + label->set_modulate(Color(1, 1, 1, 1.0f)); + action_tree->set_drag_preview(label); + + Dictionary drag_data; + + if (selected->has_meta("__action")) { + drag_data["input_type"] = "action"; + } + + if (selected->has_meta("__event")) { + drag_data["input_type"] = "event"; + } + + action_tree->set_drop_mode_flags(Tree::DROP_MODE_INBETWEEN); + + return drag_data; +} + +bool ActionMapEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const { + Dictionary d = p_data; + if (!d.has("input_type")) { + return false; + } + + TreeItem *selected = action_tree->get_selected(); + TreeItem *item = action_tree->get_item_at_position(p_point); + if (!selected || !item || item == selected) { + return false; + } + + // Don't allow moving an action in-between events. + if (d["input_type"] == "action" && item->has_meta("__event")) { + return false; + } + + // Don't allow moving an event to a different action. + if (d["input_type"] == "event" && item->get_parent() != selected->get_parent()) { + return false; + } + + return true; +} + +void ActionMapEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) { + if (!can_drop_data_fw(p_point, p_data, p_from)) { + return; + } + + TreeItem *selected = action_tree->get_selected(); + TreeItem *target = action_tree->get_item_at_position(p_point); + bool drop_above = action_tree->get_drop_section_at_position(p_point) == -1; + + if (!target) { + return; + } + + Dictionary d = p_data; + if (d["input_type"] == "action") { + // Change action order. + String relative_to = target->get_meta("__name"); + String action_name = selected->get_meta("__name"); + emit_signal("action_reordered", action_name, relative_to, drop_above); + + } else if (d["input_type"] == "event") { + // Change event order + int current_index = selected->get_meta("__index"); + int target_index = target->get_meta("__index"); + + // Construct new events array. + Dictionary new_action = selected->get_parent()->get_meta("__action"); + + Array events = new_action["events"]; + Array new_events; + + // The following method was used to perform the array changes since `remove` followed by `insert` was not working properly at time of writing. + // Loop thought existing events + for (int i = 0; i < events.size(); i++) { + // If you come across the current index, just skip it, as it has been moved. + if (i == current_index) { + continue; + } else if (i == target_index) { + // We are at the target index. If drop above, add selected event there first, then target, so moved event goes on top. + if (drop_above) { + new_events.push_back(events[current_index]); + new_events.push_back(events[target_index]); + } else { + new_events.push_back(events[target_index]); + new_events.push_back(events[current_index]); + } + } else { + new_events.push_back(events[i]); + } + } + + new_action["events"] = new_events; + emit_signal("action_edited", selected->get_parent()->get_meta("__name"), new_action); + } +} + +void ActionMapEditor::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + action_list_search->set_right_icon(get_theme_icon("Search", "EditorIcons")); + } break; + default: + break; + } +} + +void ActionMapEditor::_bind_methods() { + ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &ActionMapEditor::get_drag_data_fw); + ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &ActionMapEditor::can_drop_data_fw); + ClassDB::bind_method(D_METHOD("drop_data_fw"), &ActionMapEditor::drop_data_fw); + + ADD_SIGNAL(MethodInfo("action_added", PropertyInfo(Variant::STRING, "name"))); + ADD_SIGNAL(MethodInfo("action_edited", PropertyInfo(Variant::STRING, "name"), PropertyInfo(Variant::DICTIONARY, "new_action"))); + ADD_SIGNAL(MethodInfo("action_removed", PropertyInfo(Variant::STRING, "name"))); + ADD_SIGNAL(MethodInfo("action_renamed", PropertyInfo(Variant::STRING, "old_name"), PropertyInfo(Variant::STRING, "new_name"))); + ADD_SIGNAL(MethodInfo("action_reordered", PropertyInfo(Variant::STRING, "action_name"), PropertyInfo(Variant::STRING, "relative_to"), PropertyInfo(Variant::BOOL, "before"))); +} + +LineEdit *ActionMapEditor::get_search_box() const { + return action_list_search; +} + +InputEventConfigurationDialog *ActionMapEditor::get_configuration_dialog() { + return event_config_dialog; +} + +void ActionMapEditor::update_action_list(const Vector<ActionInfo> &p_action_infos) { + if (!p_action_infos.is_empty()) { + actions_cache = p_action_infos; + } + + action_tree->clear(); + TreeItem *root = action_tree->create_item(); + + int uneditable_count = 0; + + for (int i = 0; i < actions_cache.size(); i++) { + ActionInfo action_info = actions_cache[i]; + + if (!action_info.editable) { + uneditable_count++; + } + + String search_term = action_list_search->get_text(); + if (!search_term.is_empty() && action_info.name.findn(search_term) == -1) { + continue; + } + + if (!action_info.editable && !show_uneditable) { + continue; + } + + const Array events = action_info.action["events"]; + const Variant deadzone = action_info.action["deadzone"]; + + // Update Tree... + + TreeItem *action_item = action_tree->create_item(root); + action_item->set_meta("__action", action_info.action); + action_item->set_meta("__name", action_info.name); + + // First Column - Action Name + action_item->set_text(0, action_info.name); + action_item->set_editable(0, action_info.editable); + action_item->set_icon(0, action_info.icon); + + // Second Column - Deadzone + action_item->set_editable(1, true); + action_item->set_cell_mode(1, TreeItem::CELL_MODE_RANGE); + action_item->set_range_config(1, 0.0, 1.0, 0.01); + action_item->set_range(1, deadzone); + + // Third column - buttons + action_item->add_button(2, action_tree->get_theme_icon("Add", "EditorIcons"), BUTTON_ADD_EVENT, false, TTR("Add Event")); + action_item->add_button(2, action_tree->get_theme_icon("Remove", "EditorIcons"), BUTTON_REMOVE_ACTION, !action_info.editable, action_info.editable ? "Remove Action" : "Cannot Remove Action"); + + action_item->set_custom_bg_color(0, action_tree->get_theme_color("prop_subsection", "Editor")); + action_item->set_custom_bg_color(1, action_tree->get_theme_color("prop_subsection", "Editor")); + + for (int evnt_idx = 0; evnt_idx < events.size(); evnt_idx++) { + Ref<InputEvent> event = events[evnt_idx]; + if (event.is_null()) { + continue; + } + + TreeItem *event_item = action_tree->create_item(action_item); + + // First Column - Text + event_item->set_text(0, event_config_dialog->get_event_text(event)); // Need to us the special description for JoypadMotion here, so don't use as_text() directly. + event_item->set_meta("__event", event); + event_item->set_meta("__index", evnt_idx); + + // Third Column - Buttons + event_item->add_button(2, action_tree->get_theme_icon("Edit", "EditorIcons"), BUTTON_EDIT_EVENT, false, TTR("Edit Event")); + event_item->add_button(2, action_tree->get_theme_icon("Remove", "EditorIcons"), BUTTON_REMOVE_EVENT, false, TTR("Remove Event")); + event_item->set_button_color(2, 0, Color(1, 1, 1, 0.75)); + event_item->set_button_color(2, 1, Color(1, 1, 1, 0.75)); + } + } +} + +void ActionMapEditor::show_message(const String &p_message) { + message->set_text(p_message); + message->popup_centered(Size2(300, 100) * EDSCALE); +} + +void ActionMapEditor::set_allow_editing_actions(bool p_allow) { + allow_editing_actions = p_allow; + add_hbox->set_visible(p_allow); +} + +void ActionMapEditor::set_toggle_editable_label(const String &p_label) { + show_uneditable_actions_checkbox->set_text(p_label); +} + +void ActionMapEditor::use_external_search_box(LineEdit *p_searchbox) { + memdelete(action_list_search); + action_list_search = p_searchbox; + action_list_search->connect("text_changed", callable_mp(this, &ActionMapEditor::_search_term_updated)); +} + +ActionMapEditor::ActionMapEditor() { + allow_editing_actions = true; + show_uneditable = true; + + // Main Vbox Container + VBoxContainer *main_vbox = memnew(VBoxContainer); + main_vbox->set_anchors_and_offsets_preset(PRESET_WIDE); + add_child(main_vbox); + + HBoxContainer *top_hbox = memnew(HBoxContainer); + main_vbox->add_child(top_hbox); + + action_list_search = memnew(LineEdit); + action_list_search->set_h_size_flags(Control::SIZE_EXPAND_FILL); + action_list_search->set_placeholder(TTR("Filter Actions")); + action_list_search->set_clear_button_enabled(true); + action_list_search->connect("text_changed", callable_mp(this, &ActionMapEditor::_search_term_updated)); + top_hbox->add_child(action_list_search); + + show_uneditable_actions_checkbox = memnew(CheckBox); + show_uneditable_actions_checkbox->set_pressed(false); + show_uneditable_actions_checkbox->set_text(TTR("Show Uneditable Actions")); + show_uneditable_actions_checkbox->connect("toggled", callable_mp(this, &ActionMapEditor::set_show_uneditable)); + top_hbox->add_child(show_uneditable_actions_checkbox); + + // Adding Action line edit + button + add_hbox = memnew(HBoxContainer); + add_hbox->set_h_size_flags(Control::SIZE_EXPAND_FILL); + + add_edit = memnew(LineEdit); + add_edit->set_h_size_flags(Control::SIZE_EXPAND_FILL); + add_edit->set_placeholder(TTR("Add New Action")); + add_edit->set_clear_button_enabled(true); + add_edit->connect("text_entered", callable_mp(this, &ActionMapEditor::_add_action)); + add_hbox->add_child(add_edit); + + Button *add_button = memnew(Button); + add_button->set_text("Add"); + add_button->connect("pressed", callable_mp(this, &ActionMapEditor::_add_action_pressed)); + add_hbox->add_child(add_button); + + main_vbox->add_child(add_hbox); + + // Action Editor Tree + action_tree = memnew(Tree); + action_tree->set_v_size_flags(Control::SIZE_EXPAND_FILL); + action_tree->set_columns(3); + 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_title(1, TTR("Deadzone")); + action_tree->set_column_expand(1, false); + action_tree->set_column_min_width(1, 80 * EDSCALE); + action_tree->set_column_expand(2, false); + action_tree->set_column_min_width(2, 50 * EDSCALE); + action_tree->connect("item_edited", callable_mp(this, &ActionMapEditor::_action_edited)); + action_tree->connect("item_activated", callable_mp(this, &ActionMapEditor::_tree_item_activated)); + action_tree->connect("button_pressed", callable_mp(this, &ActionMapEditor::_tree_button_pressed)); + main_vbox->add_child(action_tree); + + action_tree->set_drag_forwarding(this); + + // Adding event dialog + event_config_dialog = memnew(InputEventConfigurationDialog); + event_config_dialog->connect("confirmed", callable_mp(this, &ActionMapEditor::_event_config_confirmed)); + add_child(event_config_dialog); + + message = memnew(AcceptDialog); + add_child(message); +} diff --git a/editor/action_map_editor.h b/editor/action_map_editor.h new file mode 100644 index 0000000000..f1f7bffef4 --- /dev/null +++ b/editor/action_map_editor.h @@ -0,0 +1,203 @@ +/*************************************************************************/ +/* action_map_editor.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 ACTION_MAP_EDITOR_H +#define ACTION_MAP_EDITOR_H + +#include "editor/editor_data.h" + +// Confirmation Dialog used when configuring an input event. +// Separate from ActionMapEditor for code cleanliness and separation of responsibilities. +class InputEventConfigurationDialog : public ConfirmationDialog { + GDCLASS(InputEventConfigurationDialog, ConfirmationDialog); + +public: + enum InputType { + INPUT_KEY = 1, + INPUT_MOUSE_BUTTON = 2, + INPUT_JOY_BUTTON = 4, + INPUT_JOY_MOTION = 8 + }; + +private: + struct IconCache { + Ref<Texture2D> keyboard; + Ref<Texture2D> mouse; + Ref<Texture2D> joypad_button; + Ref<Texture2D> joypad_axis; + } icon_cache; + + Ref<InputEvent> event = Ref<InputEvent>(); + + TabContainer *tab_container; + + // Listening for input + Label *event_as_text; + + // List of All Key/Mouse/Joypad input options. + int allowed_input_types; + Tree *input_list_tree; + LineEdit *input_list_search; + + // Additional Options, shown depending on event selected + VBoxContainer *additional_options_container; + + HBoxContainer *device_container; + OptionButton *device_id_option; + + HBoxContainer *mod_container; // Contains the subcontainer and the store command checkbox. + + enum ModCheckbox { + MOD_ALT, + MOD_SHIFT, + MOD_COMMAND, + MOD_CONTROL, + MOD_META, + MOD_MAX + }; + String mods[MOD_MAX] = { "Alt", "Shift", "Command", "Control", "Meta" }; + + CheckBox *mod_checkboxes[MOD_MAX]; + CheckBox *store_command_checkbox; + + CheckBox *physical_key_checkbox; + + void _set_event(const Ref<InputEvent> &p_event); + + void _tab_selected(int p_tab); + void _listen_window_input(const Ref<InputEvent> &p_event); + + void _search_term_updated(const String &p_term); + void _update_input_list(); + void _input_list_item_selected(); + + void _mod_toggled(bool p_checked, int p_index); + void _store_command_toggled(bool p_checked); + void _physical_keycode_toggled(bool p_checked); + + void _set_current_device(int i_device); + int _get_current_device() const; + String _get_device_string(int i_device) const; + +protected: + void _notification(int p_what); + +public: + // Pass an existing event to configure it. Alternatively, pass no event to start with a blank configuration. + void popup_and_configure(const Ref<InputEvent> &p_event = Ref<InputEvent>()); + Ref<InputEvent> get_event() const; + String get_event_text(const Ref<InputEvent> &p_event); + + void set_allowed_input_types(int p_type_masks); + + InputEventConfigurationDialog(); +}; + +class ActionMapEditor : public Control { + GDCLASS(ActionMapEditor, Control); + +public: + struct ActionInfo { + String name = String(); + Dictionary action = Dictionary(); + + Ref<Texture2D> icon = Ref<Texture2D>(); + bool editable = true; + }; + +private: + enum ItemButton { + BUTTON_ADD_EVENT, + BUTTON_EDIT_EVENT, + BUTTON_REMOVE_ACTION, + BUTTON_REMOVE_EVENT, + }; + + Vector<ActionInfo> actions_cache; + Tree *action_tree; + + // Storing which action/event is currently being edited in the InputEventConfigurationDialog. + + Dictionary current_action = Dictionary(); + String current_action_name = String(); + int current_action_event_index = -1; + + // Popups + + InputEventConfigurationDialog *event_config_dialog; + AcceptDialog *message; + + // Filtering and Adding actions + + bool show_uneditable; + CheckBox *show_uneditable_actions_checkbox; + LineEdit *action_list_search; + + bool allow_editing_actions; + HBoxContainer *add_hbox; + LineEdit *add_edit; + + void _event_config_confirmed(); + + void _add_action_pressed(); + void _add_action(const String &p_name); + void _action_edited(); + + void _tree_button_pressed(Object *p_item, int p_column, int p_id); + void _tree_item_activated(); + void _search_term_updated(const String &p_search_term); + + Variant get_drag_data_fw(const Point2 &p_point, Control *p_from); + 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); + +protected: + void _notification(int p_what); + static void _bind_methods(); + +public: + LineEdit *get_search_box() const; + InputEventConfigurationDialog *get_configuration_dialog(); + + // Dictionary represents an Action with "events" (Array) and "deadzone" (float) items. Pass with no param to update list from cached action map. + void update_action_list(const Vector<ActionInfo> &p_action_infos = Vector<ActionInfo>()); + void show_message(const String &p_message); + + void set_show_uneditable(bool p_show); + void set_allow_editing_actions(bool p_allow); + + void set_toggle_editable_label(const String &p_label); + + void use_external_search_box(LineEdit *p_searchbox); + + ActionMapEditor(); +}; + +#endif diff --git a/editor/audio_stream_preview.cpp b/editor/audio_stream_preview.cpp index 8be8735f3e..539657afd7 100644 --- a/editor/audio_stream_preview.cpp +++ b/editor/audio_stream_preview.cpp @@ -155,7 +155,7 @@ void AudioStreamPreviewGenerator::_preview_thread(void *p_preview) { preview->playback->stop(); - preview->generating = false; + preview->generating.clear(); } Ref<AudioStreamPreview> AudioStreamPreviewGenerator::generate_preview(const Ref<AudioStream> &p_stream) { @@ -172,7 +172,7 @@ Ref<AudioStreamPreview> AudioStreamPreviewGenerator::generate_preview(const Ref< Preview *preview = &previews[p_stream->get_instance_id()]; preview->base_stream = p_stream; preview->playback = preview->base_stream->instance_playback(); - preview->generating = true; + preview->generating.set(); preview->id = p_stream->get_instance_id(); float len_s = preview->base_stream->get_length(); @@ -217,7 +217,7 @@ void AudioStreamPreviewGenerator::_notification(int p_what) { if (p_what == NOTIFICATION_PROCESS) { List<ObjectID> to_erase; for (Map<ObjectID, Preview>::Element *E = previews.front(); E; E = E->next()) { - if (!E->get().generating) { + if (!E->get().generating.is_set()) { if (E->get().thread) { E->get().thread->wait_to_finish(); memdelete(E->get().thread); diff --git a/editor/audio_stream_preview.h b/editor/audio_stream_preview.h index 21c9ea203e..accc7275c0 100644 --- a/editor/audio_stream_preview.h +++ b/editor/audio_stream_preview.h @@ -32,6 +32,7 @@ #define AUDIO_STREAM_PREVIEW_H #include "core/os/thread.h" +#include "core/templates/safe_refcount.h" #include "scene/main/node.h" #include "servers/audio/audio_stream.h" @@ -60,9 +61,20 @@ class AudioStreamPreviewGenerator : public Node { Ref<AudioStreamPreview> preview; Ref<AudioStream> base_stream; Ref<AudioStreamPlayback> playback; - volatile bool generating = false; + SafeFlag generating; ObjectID id; Thread *thread = nullptr; + + // Needed for the bookkeeping of the Map + Preview &operator=(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; + return *this; + } }; Map<ObjectID, Preview> previews; diff --git a/editor/create_dialog.cpp b/editor/create_dialog.cpp index 3a63100012..a9ed1bc2b9 100644 --- a/editor/create_dialog.cpp +++ b/editor/create_dialog.cpp @@ -236,7 +236,10 @@ void CreateDialog::_configure_search_option_item(TreeItem *r_item, const String bool can_instance = (p_cpp_type && ClassDB::can_instance(p_type)) || !p_cpp_type; if (!can_instance) { r_item->set_custom_color(0, search_options->get_theme_color("disabled_font_color", "Editor")); + r_item->set_icon(0, EditorNode::get_singleton()->get_class_icon(p_type, "NodeDisabled")); r_item->set_selectable(0, false); + } else { + r_item->set_icon(0, EditorNode::get_singleton()->get_class_icon(p_type, icon_fallback)); } if (search_box->get_text() != "") { @@ -253,7 +256,6 @@ void CreateDialog::_configure_search_option_item(TreeItem *r_item, const String const String &description = DTR(EditorHelp::get_doc_data()->class_list[p_type].brief_description); r_item->set_tooltip(0, description); - r_item->set_icon(0, EditorNode::get_singleton()->get_class_icon(p_type, icon_fallback)); if (!p_cpp_type && !script_type) { Ref<Texture2D> icon = EditorNode::get_editor_data().get_custom_types()[custom_type_parents[p_type]][custom_type_indices[p_type]].icon; diff --git a/editor/dependency_editor.cpp b/editor/dependency_editor.cpp index 2780b74469..25e155aafe 100644 --- a/editor/dependency_editor.cpp +++ b/editor/dependency_editor.cpp @@ -480,8 +480,8 @@ void DependencyRemoveDialog::ok_pressed() { if (files_to_delete[i] == String(ProjectSettings::get_singleton()->get("application/boot_splash/image"))) { ProjectSettings::get_singleton()->set("application/boot_splash/image", ""); } - if (files_to_delete[i] == String(ProjectSettings::get_singleton()->get("rendering/environment/default_environment"))) { - ProjectSettings::get_singleton()->set("rendering/environment/default_environment", ""); + if (files_to_delete[i] == String(ProjectSettings::get_singleton()->get("rendering/environment/defaults/default_environment"))) { + ProjectSettings::get_singleton()->set("rendering/environment/defaults/default_environment", ""); } if (files_to_delete[i] == String(ProjectSettings::get_singleton()->get("display/mouse_cursor/custom_image"))) { ProjectSettings::get_singleton()->set("display/mouse_cursor/custom_image", ""); @@ -492,8 +492,8 @@ void DependencyRemoveDialog::ok_pressed() { if (files_to_delete[i] == String(ProjectSettings::get_singleton()->get("gui/theme/custom_font"))) { ProjectSettings::get_singleton()->set("gui/theme/custom_font", ""); } - if (files_to_delete[i] == String(ProjectSettings::get_singleton()->get("audio/default_bus_layout"))) { - ProjectSettings::get_singleton()->set("audio/default_bus_layout", ""); + if (files_to_delete[i] == String(ProjectSettings::get_singleton()->get("audio/buses/default_bus_layout"))) { + ProjectSettings::get_singleton()->set("audio/buses/default_bus_layout", ""); } String path = OS::get_singleton()->get_resource_dir() + files_to_delete[i].replace_first("res://", "/"); diff --git a/editor/editor_audio_buses.cpp b/editor/editor_audio_buses.cpp index 69a13957e6..9a826ab106 100644 --- a/editor/editor_audio_buses.cpp +++ b/editor/editor_audio_buses.cpp @@ -1191,7 +1191,7 @@ void EditorAudioBuses::_load_layout() { } void EditorAudioBuses::_load_default_layout() { - String layout_path = ProjectSettings::get_singleton()->get("audio/default_bus_layout"); + String layout_path = ProjectSettings::get_singleton()->get("audio/buses/default_bus_layout"); Ref<AudioBusLayout> state = ResourceLoader::load(layout_path, "", ResourceFormatLoader::CACHE_MODE_IGNORE); if (state.is_null()) { @@ -1257,7 +1257,7 @@ EditorAudioBuses::EditorAudioBuses() { add_child(top_hb); file = memnew(Label); - String layout_path = ProjectSettings::get_singleton()->get("audio/default_bus_layout"); + String layout_path = ProjectSettings::get_singleton()->get("audio/buses/default_bus_layout"); file->set_text(String(TTR("Layout")) + ": " + layout_path.get_file()); file->set_clip_text(true); file->set_h_size_flags(SIZE_EXPAND_FILL); @@ -1313,7 +1313,7 @@ EditorAudioBuses::EditorAudioBuses() { set_v_size_flags(SIZE_EXPAND_FILL); - edited_path = ProjectSettings::get_singleton()->get("audio/default_bus_layout"); + edited_path = ProjectSettings::get_singleton()->get("audio/buses/default_bus_layout"); file_dialog = memnew(EditorFileDialog); List<String> ext; diff --git a/editor/editor_export.cpp b/editor/editor_export.cpp index 24256b843e..949306de42 100644 --- a/editor/editor_export.cpp +++ b/editor/editor_export.cpp @@ -1403,9 +1403,9 @@ void EditorExport::add_export_preset(const Ref<EditorExportPreset> &p_preset, in } String EditorExportPlatform::test_etc2() const { - String driver = ProjectSettings::get_singleton()->get("rendering/quality/driver/driver_name"); - bool etc_supported = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc"); - bool etc2_supported = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc2"); + String driver = ProjectSettings::get_singleton()->get("rendering/driver/driver_name"); + bool etc_supported = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_etc"); + bool etc2_supported = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_etc2"); if (driver == "GLES2" && !etc_supported) { return TTR("Target platform requires 'ETC' texture compression for GLES2. Enable 'Import Etc' in Project Settings."); @@ -1417,9 +1417,9 @@ String EditorExportPlatform::test_etc2() const { } String EditorExportPlatform::test_etc2_or_pvrtc() const { - String driver = ProjectSettings::get_singleton()->get("rendering/quality/driver/driver_name"); - bool etc2_supported = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc2"); - bool pvrtc_supported = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_pvrtc"); + String driver = ProjectSettings::get_singleton()->get("rendering/driver/driver_name"); + bool etc2_supported = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_etc2"); + bool pvrtc_supported = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_pvrtc"); if (driver == "GLES2" && !pvrtc_supported) { return TTR("Target platform requires 'PVRTC' texture compression for GLES2. Enable 'Import Pvrtc' in Project Settings."); @@ -1902,7 +1902,7 @@ void EditorExportTextSceneToBinaryPlugin::_export_file(const String &p_path, con return; } - bool convert = GLOBAL_GET("editor/convert_text_resources_to_binary_on_export"); + bool convert = GLOBAL_GET("editor/export/convert_text_resources_to_binary"); if (!convert) { return; } @@ -1922,5 +1922,5 @@ void EditorExportTextSceneToBinaryPlugin::_export_file(const String &p_path, con } EditorExportTextSceneToBinaryPlugin::EditorExportTextSceneToBinaryPlugin() { - GLOBAL_DEF("editor/convert_text_resources_to_binary_on_export", false); + GLOBAL_DEF("editor/export/convert_text_resources_to_binary", false); } diff --git a/editor/editor_file_dialog.cpp b/editor/editor_file_dialog.cpp index 01aad0c41b..6d694358bf 100644 --- a/editor/editor_file_dialog.cpp +++ b/editor/editor_file_dialog.cpp @@ -1150,7 +1150,6 @@ void EditorFileDialog::_update_drives() { void EditorFileDialog::_favorite_selected(int p_idx) { dir_access->change_dir(favorites->get_item_metadata(p_idx)); - file->set_text(""); update_dir(); invalidate(); _push_history(); diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp index 4b68de26e7..3c6649a66a 100644 --- a/editor/editor_file_system.cpp +++ b/editor/editor_file_system.cpp @@ -1413,11 +1413,11 @@ void EditorFileSystem::_scan_script_classes(EditorFileSystemDirectory *p_dir) { } void EditorFileSystem::update_script_classes() { - if (!update_script_classes_queued) { + if (!update_script_classes_queued.is_set()) { return; } - update_script_classes_queued = false; + update_script_classes_queued.clear(); ScriptServer::global_classes_clear(); if (get_filesystem()) { _scan_script_classes(get_filesystem()); @@ -1436,11 +1436,11 @@ void EditorFileSystem::update_script_classes() { } void EditorFileSystem::_queue_update_script_classes() { - if (update_script_classes_queued) { + if (update_script_classes_queued.is_set()) { return; } - update_script_classes_queued = true; + update_script_classes_queued.set(); call_deferred("update_script_classes"); } @@ -2067,7 +2067,7 @@ void EditorFileSystem::_update_extensions() { EditorFileSystem::EditorFileSystem() { ResourceLoader::import = _resource_import; - reimport_on_missing_imported_files = GLOBAL_DEF("editor/reimport_missing_imported_files", true); + reimport_on_missing_imported_files = GLOBAL_DEF("editor/import/reimport_missing_imported_files", true); singleton = this; filesystem = memnew(EditorFileSystemDirectory); //like, empty @@ -2091,7 +2091,7 @@ EditorFileSystem::EditorFileSystem() { memdelete(da); scan_total = 0; - update_script_classes_queued = false; + update_script_classes_queued.clear(); first_scan = true; scan_changes_pending = false; revalidate_import_files = false; diff --git a/editor/editor_file_system.h b/editor/editor_file_system.h index fa0b89e667..dec2330256 100644 --- a/editor/editor_file_system.h +++ b/editor/editor_file_system.h @@ -34,6 +34,7 @@ #include "core/os/dir_access.h" #include "core/os/thread.h" #include "core/os/thread_safe.h" +#include "core/templates/safe_refcount.h" #include "core/templates/set.h" #include "scene/main/node.h" class FileAccess; @@ -220,7 +221,7 @@ class EditorFileSystem : public Node { }; void _scan_script_classes(EditorFileSystemDirectory *p_dir); - volatile bool update_script_classes_queued; + SafeFlag update_script_classes_queued; void _queue_update_script_classes(); String _get_global_script_class(const String &p_type, const String &p_path, String *r_extends, String *r_icon_path) const; diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp index a7f808f63a..74b874b54e 100644 --- a/editor/editor_inspector.cpp +++ b/editor/editor_inspector.cpp @@ -1689,7 +1689,7 @@ void EditorInspector::update_tree() { bool valid = true; //if no properties in category, skip while (N) { - if (N->get().usage & PROPERTY_USAGE_EDITOR) { + if (N->get().usage & PROPERTY_USAGE_EDITOR && (!restrict_to_basic || (N->get().usage & PROPERTY_USAGE_EDITOR_BASIC_SETTING))) { break; } if (N->get().usage & PROPERTY_USAGE_CATEGORY) { @@ -1757,10 +1757,14 @@ void EditorInspector::update_tree() { continue; - } else if (!(p.usage & PROPERTY_USAGE_EDITOR) || _is_property_disabled_by_feature_profile(p.name)) { + } else if (!(p.usage & PROPERTY_USAGE_EDITOR) || _is_property_disabled_by_feature_profile(p.name) || (restrict_to_basic && !(p.usage & PROPERTY_USAGE_EDITOR_BASIC_SETTING))) { continue; } + if (p.name == "script") { + category_vbox = nullptr; // script should go into its own category + } + if (p.usage & PROPERTY_USAGE_HIGH_END_GFX && RS::get_singleton()->is_low_end()) { continue; //do not show this property in low end gfx } @@ -2620,6 +2624,11 @@ void EditorInspector::_update_script_class_properties(const Object &p_object, Li r_list.erase(bottom); } +void EditorInspector::set_restrict_to_basic_settings(bool p_restrict) { + restrict_to_basic = p_restrict; + update_tree(); +} + void EditorInspector::_bind_methods() { ClassDB::bind_method("_edit_request_change", &EditorInspector::_edit_request_change); diff --git a/editor/editor_inspector.h b/editor/editor_inspector.h index b98801975f..18250780be 100644 --- a/editor/editor_inspector.h +++ b/editor/editor_inspector.h @@ -313,6 +313,8 @@ class EditorInspector : public ScrollContainer { String property_prefix; //used for sectioned inspector String object_class; + bool restrict_to_basic = false; + void _edit_set(const String &p_name, const Variant &p_value, bool p_refresh_all, const String &p_changed_field); void _property_changed(const String &p_path, const Variant &p_value, const String &p_name = "", bool p_changing = false); @@ -400,6 +402,8 @@ public: void set_use_deletable_properties(bool p_enabled); + void set_restrict_to_basic_settings(bool p_restrict); + EditorInspector(); }; diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 57fa552845..4cf85a8caf 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -431,70 +431,70 @@ void EditorNode::_unhandled_input(const Ref<InputEvent> &p_event) { } void EditorNode::_update_from_settings() { - int current_filter = GLOBAL_GET("rendering/canvas_textures/default_texture_filter"); + int current_filter = GLOBAL_GET("rendering/textures/canvas_textures/default_texture_filter"); if (current_filter != scene_root->get_default_canvas_item_texture_filter()) { Viewport::DefaultCanvasItemTextureFilter tf = (Viewport::DefaultCanvasItemTextureFilter)current_filter; scene_root->set_default_canvas_item_texture_filter(tf); } - int current_repeat = GLOBAL_GET("rendering/canvas_textures/default_texture_repeat"); + int current_repeat = GLOBAL_GET("rendering/textures/canvas_textures/default_texture_repeat"); if (current_repeat != scene_root->get_default_canvas_item_texture_repeat()) { Viewport::DefaultCanvasItemTextureRepeat tr = (Viewport::DefaultCanvasItemTextureRepeat)current_repeat; scene_root->set_default_canvas_item_texture_repeat(tr); } - RS::DOFBokehShape dof_shape = RS::DOFBokehShape(int(GLOBAL_GET("rendering/quality/depth_of_field/depth_of_field_bokeh_shape"))); + RS::DOFBokehShape dof_shape = RS::DOFBokehShape(int(GLOBAL_GET("rendering/camera/depth_of_field/depth_of_field_bokeh_shape"))); RS::get_singleton()->camera_effects_set_dof_blur_bokeh_shape(dof_shape); - RS::DOFBlurQuality dof_quality = RS::DOFBlurQuality(int(GLOBAL_GET("rendering/quality/depth_of_field/depth_of_field_bokeh_quality"))); - bool dof_jitter = GLOBAL_GET("rendering/quality/depth_of_field/depth_of_field_use_jitter"); + RS::DOFBlurQuality dof_quality = RS::DOFBlurQuality(int(GLOBAL_GET("rendering/camera/depth_of_field/depth_of_field_bokeh_quality"))); + bool dof_jitter = GLOBAL_GET("rendering/camera/depth_of_field/depth_of_field_use_jitter"); RS::get_singleton()->camera_effects_set_dof_blur_quality(dof_quality, dof_jitter); - RS::get_singleton()->environment_set_ssao_quality(RS::EnvironmentSSAOQuality(int(GLOBAL_GET("rendering/quality/ssao/quality"))), GLOBAL_GET("rendering/quality/ssao/half_size"), GLOBAL_GET("rendering/quality/ssao/adaptive_target"), GLOBAL_GET("rendering/quality/ssao/blur_passes"), GLOBAL_GET("rendering/quality/ssao/fadeout_from"), GLOBAL_GET("rendering/quality/ssao/fadeout_to")); - RS::get_singleton()->screen_space_roughness_limiter_set_active(GLOBAL_GET("rendering/quality/screen_filters/screen_space_roughness_limiter_enabled"), GLOBAL_GET("rendering/quality/screen_filters/screen_space_roughness_limiter_amount"), GLOBAL_GET("rendering/quality/screen_filters/screen_space_roughness_limiter_limit")); - bool glow_bicubic = int(GLOBAL_GET("rendering/quality/glow/upscale_mode")) > 0; + RS::get_singleton()->environment_set_ssao_quality(RS::EnvironmentSSAOQuality(int(GLOBAL_GET("rendering/environment/ssao/quality"))), GLOBAL_GET("rendering/environment/ssao/half_size"), GLOBAL_GET("rendering/environment/ssao/adaptive_target"), GLOBAL_GET("rendering/environment/ssao/blur_passes"), GLOBAL_GET("rendering/environment/ssao/fadeout_from"), GLOBAL_GET("rendering/environment/ssao/fadeout_to")); + RS::get_singleton()->screen_space_roughness_limiter_set_active(GLOBAL_GET("rendering/anti_aliasing/screen_space_roughness_limiter/enabled"), GLOBAL_GET("rendering/anti_aliasing/screen_space_roughness_limiter/amount"), GLOBAL_GET("rendering/anti_aliasing/screen_space_roughness_limiter/limit")); + bool glow_bicubic = int(GLOBAL_GET("rendering/environment/glow/upscale_mode")) > 0; RS::get_singleton()->environment_glow_set_use_bicubic_upscale(glow_bicubic); - bool glow_high_quality = GLOBAL_GET("rendering/quality/glow/use_high_quality"); + bool glow_high_quality = GLOBAL_GET("rendering/environment/glow/use_high_quality"); RS::get_singleton()->environment_glow_set_use_high_quality(glow_high_quality); - RS::EnvironmentSSRRoughnessQuality ssr_roughness_quality = RS::EnvironmentSSRRoughnessQuality(int(GLOBAL_GET("rendering/quality/screen_space_reflection/roughness_quality"))); + RS::EnvironmentSSRRoughnessQuality ssr_roughness_quality = RS::EnvironmentSSRRoughnessQuality(int(GLOBAL_GET("rendering/environment/screen_space_reflection/roughness_quality"))); RS::get_singleton()->environment_set_ssr_roughness_quality(ssr_roughness_quality); - RS::SubSurfaceScatteringQuality sss_quality = RS::SubSurfaceScatteringQuality(int(GLOBAL_GET("rendering/quality/subsurface_scattering/subsurface_scattering_quality"))); + RS::SubSurfaceScatteringQuality sss_quality = RS::SubSurfaceScatteringQuality(int(GLOBAL_GET("rendering/environment/subsurface_scattering/subsurface_scattering_quality"))); RS::get_singleton()->sub_surface_scattering_set_quality(sss_quality); - float sss_scale = GLOBAL_GET("rendering/quality/subsurface_scattering/subsurface_scattering_scale"); - float sss_depth_scale = GLOBAL_GET("rendering/quality/subsurface_scattering/subsurface_scattering_depth_scale"); + float sss_scale = GLOBAL_GET("rendering/environment/subsurface_scattering/subsurface_scattering_scale"); + float sss_depth_scale = GLOBAL_GET("rendering/environment/subsurface_scattering/subsurface_scattering_depth_scale"); RS::get_singleton()->sub_surface_scattering_set_scale(sss_scale, sss_depth_scale); - uint32_t directional_shadow_size = GLOBAL_GET("rendering/quality/directional_shadow/size"); - uint32_t directional_shadow_16_bits = GLOBAL_GET("rendering/quality/directional_shadow/16_bits"); + uint32_t directional_shadow_size = GLOBAL_GET("rendering/shadows/directional_shadow/size"); + uint32_t directional_shadow_16_bits = GLOBAL_GET("rendering/shadows/directional_shadow/16_bits"); RS::get_singleton()->directional_shadow_atlas_set_size(directional_shadow_size, directional_shadow_16_bits); - RS::ShadowQuality shadows_quality = RS::ShadowQuality(int(GLOBAL_GET("rendering/quality/shadows/soft_shadow_quality"))); + RS::ShadowQuality shadows_quality = RS::ShadowQuality(int(GLOBAL_GET("rendering/shadows/shadows/soft_shadow_quality"))); RS::get_singleton()->shadows_quality_set(shadows_quality); - RS::ShadowQuality directional_shadow_quality = RS::ShadowQuality(int(GLOBAL_GET("rendering/quality/directional_shadow/soft_shadow_quality"))); + RS::ShadowQuality directional_shadow_quality = RS::ShadowQuality(int(GLOBAL_GET("rendering/shadows/directional_shadow/soft_shadow_quality"))); RS::get_singleton()->directional_shadow_quality_set(directional_shadow_quality); - float probe_update_speed = GLOBAL_GET("rendering/lightmapper/probe_capture_update_speed"); + float probe_update_speed = GLOBAL_GET("rendering/lightmapping/probe_capture/update_speed"); RS::get_singleton()->lightmap_set_probe_capture_update_speed(probe_update_speed); - RS::EnvironmentSDFGIFramesToConverge frames_to_converge = RS::EnvironmentSDFGIFramesToConverge(int(GLOBAL_GET("rendering/sdfgi/frames_to_converge"))); + RS::EnvironmentSDFGIFramesToConverge frames_to_converge = RS::EnvironmentSDFGIFramesToConverge(int(GLOBAL_GET("rendering/global_illumination/sdfgi/frames_to_converge"))); RS::get_singleton()->environment_set_sdfgi_frames_to_converge(frames_to_converge); - RS::EnvironmentSDFGIRayCount ray_count = RS::EnvironmentSDFGIRayCount(int(GLOBAL_GET("rendering/sdfgi/probe_ray_count"))); + RS::EnvironmentSDFGIRayCount ray_count = RS::EnvironmentSDFGIRayCount(int(GLOBAL_GET("rendering/global_illumination/sdfgi/probe_ray_count"))); RS::get_singleton()->environment_set_sdfgi_ray_count(ray_count); - RS::GIProbeQuality gi_probe_quality = RS::GIProbeQuality(int(GLOBAL_GET("rendering/quality/gi_probes/quality"))); + RS::GIProbeQuality gi_probe_quality = RS::GIProbeQuality(int(GLOBAL_GET("rendering/global_illumination/gi_probes/quality"))); RS::get_singleton()->gi_probe_set_quality(gi_probe_quality); - RS::get_singleton()->environment_set_volumetric_fog_volume_size(GLOBAL_GET("rendering/volumetric_fog/volume_size"), GLOBAL_GET("rendering/volumetric_fog/volume_depth")); - RS::get_singleton()->environment_set_volumetric_fog_filter_active(bool(GLOBAL_GET("rendering/volumetric_fog/use_filter"))); - RS::get_singleton()->canvas_set_shadow_texture_size(GLOBAL_GET("rendering/quality/2d_shadow_atlas/size")); + RS::get_singleton()->environment_set_volumetric_fog_volume_size(GLOBAL_GET("rendering/environment/volumetric_fog/volume_size"), GLOBAL_GET("rendering/environment/volumetric_fog/volume_depth")); + RS::get_singleton()->environment_set_volumetric_fog_filter_active(bool(GLOBAL_GET("rendering/environment/volumetric_fog/use_filter"))); + RS::get_singleton()->canvas_set_shadow_texture_size(GLOBAL_GET("rendering/2d/shadow_atlas/size")); - bool use_half_res_gi = GLOBAL_DEF("rendering/quality/gi/use_half_resolution", false); + bool use_half_res_gi = GLOBAL_DEF("rendering/global_illumination/gi/use_half_resolution", false); RS::get_singleton()->gi_set_use_half_resolution(use_half_res_gi); - bool snap_2d_transforms = GLOBAL_GET("rendering/quality/2d/snap_2d_transforms_to_pixel"); + bool snap_2d_transforms = GLOBAL_GET("rendering/2d/snap/snap_2d_transforms_to_pixel"); scene_root->set_snap_2d_transforms_to_pixel(snap_2d_transforms); - bool snap_2d_vertices = GLOBAL_GET("rendering/quality/2d/snap_2d_vertices_to_pixel"); + bool snap_2d_vertices = GLOBAL_GET("rendering/2d/snap/snap_2d_vertices_to_pixel"); scene_root->set_snap_2d_vertices_to_pixel(snap_2d_vertices); - Viewport::SDFOversize sdf_oversize = Viewport::SDFOversize(int(GLOBAL_GET("rendering/quality/2d_sdf/oversize"))); + Viewport::SDFOversize sdf_oversize = Viewport::SDFOversize(int(GLOBAL_GET("rendering/2d/sdf/oversize"))); scene_root->set_sdf_oversize(sdf_oversize); - Viewport::SDFScale sdf_scale = Viewport::SDFScale(int(GLOBAL_GET("rendering/quality/2d_sdf/scale"))); + Viewport::SDFScale sdf_scale = Viewport::SDFScale(int(GLOBAL_GET("rendering/2d/sdf/scale"))); scene_root->set_sdf_scale(sdf_scale); - float lod_threshold = GLOBAL_GET("rendering/quality/mesh_lod/threshold_pixels"); + float lod_threshold = GLOBAL_GET("rendering/mesh_lod/lod_change/threshold_pixels"); scene_root->set_lod_threshold(lod_threshold); } @@ -2260,7 +2260,7 @@ void EditorNode::_run(bool p_current, const String &p_custom) { List<String> breakpoints; editor_data.get_editor_breakpoints(&breakpoints); - args = ProjectSettings::get_singleton()->get("editor/main_run_args"); + args = ProjectSettings::get_singleton()->get("editor/run/main_run_args"); skip_breakpoints = EditorDebuggerNode::get_singleton()->is_skip_breakpoints(); EditorDebuggerNode::get_singleton()->start(); @@ -2520,16 +2520,6 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { } break; - case FILE_IMPORT_SUBSCENE: { - if (!editor_data.get_edited_scene_root()) { - show_accept(TTR("This operation can't be done without a selected node."), TTR("OK")); - break; - } - - scene_tree_dock->import_subscene(); - - } break; - case FILE_EXTERNAL_OPEN_SCENE: { if (unsaved_cache && !p_confirmed) { confirmation->get_ok_button()->set_text(TTR("Open")); @@ -2799,7 +2789,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { } break; case SET_VIDEO_DRIVER_SAVE_AND_RESTART: { - ProjectSettings::get_singleton()->set("rendering/quality/driver/driver_name", video_driver_request); + ProjectSettings::get_singleton()->set("rendering/driver/driver_name", video_driver_request); ProjectSettings::get_singleton()->save(); save_all_scenes(); @@ -5565,7 +5555,8 @@ static void _execute_thread(void *p_ud) { eta->exitcode = err; } - eta->done = true; + eta->done.set(); + ; } int EditorNode::execute_and_show_output(const String &p_title, const String &p_path, const List<String> &p_arguments, bool p_close_on_ok, bool p_close_on_errors) { @@ -5579,13 +5570,12 @@ int EditorNode::execute_and_show_output(const String &p_title, const String &p_p eta.path = p_path; eta.args = p_arguments; eta.exitcode = 255; - eta.done = false; int prev_len = 0; eta.execute_output_thread.start(_execute_thread, &eta); - while (!eta.done) { + while (!eta.done.is_set()) { { MutexLock lock(eta.execute_output_mutex); if (prev_len != eta.output.length()) { @@ -5849,7 +5839,7 @@ EditorNode::EditorNode() { register_exporters(); - GLOBAL_DEF("editor/main_run_args", ""); + GLOBAL_DEF("editor/run/main_run_args", ""); ClassDB::set_class_enabled("RootMotionView", true); @@ -6225,8 +6215,8 @@ EditorNode::EditorNode() { pm_export->connect("id_pressed", callable_mp(this, &EditorNode::_menu_option)); p->add_separator(); - p->add_shortcut(ED_SHORTCUT("editor/undo", TTR("Undo"), KEY_MASK_CMD + KEY_Z), EDIT_UNDO, true); - p->add_shortcut(ED_SHORTCUT("editor/redo", TTR("Redo"), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_Z), EDIT_REDO, true); + p->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO, true); + p->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO, true); p->add_separator(); p->add_shortcut(ED_SHORTCUT("editor/reload_saved_scene", TTR("Reload Saved Scene")), EDIT_RELOAD_SAVED_SCENE); @@ -6362,7 +6352,11 @@ EditorNode::EditorNode() { p = help_menu->get_popup(); p->connect("id_pressed", callable_mp(this, &EditorNode::_menu_option)); - p->add_icon_shortcut(gui_base->get_theme_icon("HelpSearch", "EditorIcons"), ED_SHORTCUT("editor/editor_help", TTR("Search")), HELP_SEARCH); +#ifdef OSX_ENABLED + p->add_icon_shortcut(gui_base->get_theme_icon("HelpSearch", "EditorIcons"), ED_SHORTCUT("editor/editor_help", TTR("Search Help"), KEY_MASK_ALT | KEY_SPACE), HELP_SEARCH); +#else + p->add_icon_shortcut(gui_base->get_theme_icon("HelpSearch", "EditorIcons"), ED_SHORTCUT("editor/editor_help", TTR("Search Help"), KEY_F1), HELP_SEARCH); +#endif p->add_separator(); p->add_icon_shortcut(gui_base->get_theme_icon("Instance", "EditorIcons"), ED_SHORTCUT("editor/online_docs", TTR("Online Docs")), HELP_DOCS); p->add_icon_shortcut(gui_base->get_theme_icon("Instance", "EditorIcons"), ED_SHORTCUT("editor/q&a", TTR("Q&A")), HELP_QA); @@ -6467,7 +6461,7 @@ EditorNode::EditorNode() { #warning needs to be reimplemented #endif #if 0 - String video_drivers = ProjectSettings::get_singleton()->get_custom_property_info()["rendering/quality/driver/driver_name"].hint_string; + String video_drivers = ProjectSettings::get_singleton()->get_custom_property_info()["rendering/driver/driver_name"].hint_string; String current_video_driver = OS::get_singleton()->get_video_driver_name(OS::get_singleton()->get_current_video_driver()); video_driver_current = 0; for (int i = 0; i < video_drivers.get_slice_count(","); i++) { @@ -6953,14 +6947,12 @@ EditorNode::EditorNode() { ED_SHORTCUT("editor/editor_3d", TTR("Open 3D Editor"), KEY_MASK_ALT | KEY_2); ED_SHORTCUT("editor/editor_script", TTR("Open Script Editor"), KEY_MASK_ALT | KEY_3); ED_SHORTCUT("editor/editor_assetlib", TTR("Open Asset Library"), KEY_MASK_ALT | KEY_4); - ED_SHORTCUT("editor/editor_help", TTR("Search Help"), KEY_MASK_ALT | KEY_SPACE); #else // Use the Ctrl modifier so F2 can be used to rename nodes in the scene tree dock. ED_SHORTCUT("editor/editor_2d", TTR("Open 2D Editor"), KEY_MASK_CTRL | KEY_F1); ED_SHORTCUT("editor/editor_3d", TTR("Open 3D Editor"), KEY_MASK_CTRL | KEY_F2); ED_SHORTCUT("editor/editor_script", TTR("Open Script Editor"), KEY_MASK_CTRL | KEY_F3); ED_SHORTCUT("editor/editor_assetlib", TTR("Open Asset Library"), KEY_MASK_CTRL | KEY_F4); - ED_SHORTCUT("editor/editor_help", TTR("Search Help"), KEY_F1); #endif ED_SHORTCUT("editor/editor_next", TTR("Open the next Editor")); ED_SHORTCUT("editor/editor_prev", TTR("Open the previous Editor")); diff --git a/editor/editor_node.h b/editor/editor_node.h index 8068ca89ee..91d873d16f 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -31,6 +31,7 @@ #ifndef EDITOR_NODE_H #define EDITOR_NODE_H +#include "core/templates/safe_refcount.h" #include "editor/editor_data.h" #include "editor/editor_export.h" #include "editor/editor_folding.h" @@ -111,7 +112,7 @@ public: Thread execute_output_thread; Mutex execute_output_mutex; int exitcode = 0; - volatile bool done = false; + SafeFlag done; }; private: @@ -128,7 +129,6 @@ private: FILE_SAVE_ALL_SCENES, FILE_SAVE_AND_RUN, FILE_SHOW_IN_FILESYSTEM, - FILE_IMPORT_SUBSCENE, FILE_EXPORT_PROJECT, FILE_EXPORT_MESH_LIBRARY, FILE_INSTALL_ANDROID_SOURCE, @@ -719,8 +719,6 @@ public: void save_resource(const Ref<Resource> &p_resource); void save_resource_as(const Ref<Resource> &p_resource, const String &p_at_path = String()); - void merge_from_scene() { _menu_option_confirm(FILE_IMPORT_SUBSCENE, false); } - void show_about() { _menu_option_confirm(HELP_ABOUT, false); } static bool has_unsaved_changes() { return singleton->unsaved_cache; } diff --git a/editor/editor_properties_array_dict.cpp b/editor/editor_properties_array_dict.cpp index a798344973..de688f2709 100644 --- a/editor/editor_properties_array_dict.cpp +++ b/editor/editor_properties_array_dict.cpp @@ -573,8 +573,7 @@ void EditorPropertyArray::_bind_methods() { EditorPropertyArray::EditorPropertyArray() { object.instance(); - page_idx = 0; - page_len = 10; + page_len = int(EDITOR_GET("interface/inspector/max_array_dictionary_items_per_page")); edit = memnew(Button); edit->set_flat(true); edit->set_h_size_flags(SIZE_EXPAND_FILL); @@ -1069,8 +1068,7 @@ void EditorPropertyDictionary::_bind_methods() { EditorPropertyDictionary::EditorPropertyDictionary() { object.instance(); - page_idx = 0; - page_len = 10; + page_len = int(EDITOR_GET("interface/inspector/max_array_dictionary_items_per_page")); edit = memnew(Button); edit->set_flat(true); edit->set_h_size_flags(SIZE_EXPAND_FILL); diff --git a/editor/editor_properties_array_dict.h b/editor/editor_properties_array_dict.h index 0359f3d9bc..fa5adc788d 100644 --- a/editor/editor_properties_array_dict.h +++ b/editor/editor_properties_array_dict.h @@ -84,8 +84,8 @@ class EditorPropertyArray : public EditorProperty { bool dropping; Ref<EditorPropertyArrayObject> object; - int page_len; - int page_idx; + int page_len = 20; + int page_idx = 0; int changing_type_idx; Button *edit; VBoxContainer *vbox; @@ -129,8 +129,8 @@ class EditorPropertyDictionary : public EditorProperty { bool updating; Ref<EditorPropertyDictionaryObject> object; - int page_len; - int page_idx; + int page_len = 20; + int page_idx = 0; int changing_type_idx; Button *edit; VBoxContainer *vbox; diff --git a/editor/editor_resource_preview.cpp b/editor/editor_resource_preview.cpp index 8056846f52..77288be614 100644 --- a/editor/editor_resource_preview.cpp +++ b/editor/editor_resource_preview.cpp @@ -206,8 +206,8 @@ void EditorResourcePreview::_generate_preview(Ref<ImageTexture> &r_texture, Ref< } void EditorResourcePreview::_thread() { - exited = false; - while (!exit) { + exited.clear(); + while (!exit.is_set()) { preview_sem.wait(); preview_mutex.lock(); @@ -326,7 +326,7 @@ void EditorResourcePreview::_thread() { preview_mutex.unlock(); } } - exited = true; + exited.set(); } void EditorResourcePreview::queue_edited_resource_preview(const Ref<Resource> &p_res, Object *p_receiver, const StringName &p_receiver_func, const Variant &p_userdata) { @@ -430,9 +430,9 @@ void EditorResourcePreview::start() { void EditorResourcePreview::stop() { if (thread.is_started()) { - exit = true; + exit.set(); preview_sem.post(); - while (!exited) { + while (!exited.is_set()) { OS::get_singleton()->delay_usec(10000); RenderingServer::get_singleton()->sync(); //sync pending stuff, as thread may be blocked on visual server } @@ -443,8 +443,6 @@ void EditorResourcePreview::stop() { EditorResourcePreview::EditorResourcePreview() { singleton = this; order = 0; - exit = false; - exited = false; } EditorResourcePreview::~EditorResourcePreview() { diff --git a/editor/editor_resource_preview.h b/editor/editor_resource_preview.h index 99c48967d8..c4e796dcf1 100644 --- a/editor/editor_resource_preview.h +++ b/editor/editor_resource_preview.h @@ -33,6 +33,7 @@ #include "core/os/semaphore.h" #include "core/os/thread.h" +#include "core/templates/safe_refcount.h" #include "scene/main/node.h" #include "scene/resources/texture.h" @@ -71,8 +72,8 @@ class EditorResourcePreview : public Node { Mutex preview_mutex; Semaphore preview_sem; Thread thread; - volatile bool exit; - volatile bool exited; + SafeFlag exit; + SafeFlag exited; struct Item { Ref<Texture2D> preview; diff --git a/editor/editor_sectioned_inspector.cpp b/editor/editor_sectioned_inspector.cpp index fb4821a760..f81c87be9e 100644 --- a/editor/editor_sectioned_inspector.cpp +++ b/editor/editor_sectioned_inspector.cpp @@ -226,7 +226,7 @@ void SectionedInspector::update_category_list() { if (pi.usage & PROPERTY_USAGE_CATEGORY) { continue; - } else if (!(pi.usage & PROPERTY_USAGE_EDITOR)) { + } else if (!(pi.usage & PROPERTY_USAGE_EDITOR) || (restrict_to_basic && !(pi.usage & PROPERTY_USAGE_EDITOR_BASIC_SETTING))) { continue; } @@ -294,6 +294,12 @@ EditorInspector *SectionedInspector::get_inspector() { return inspector; } +void SectionedInspector::set_restrict_to_basic_settings(bool p_restrict) { + restrict_to_basic = p_restrict; + update_category_list(); + inspector->set_restrict_to_basic_settings(p_restrict); +} + SectionedInspector::SectionedInspector() : sections(memnew(Tree)), filter(memnew(SectionedInspectorFilter)), diff --git a/editor/editor_sectioned_inspector.h b/editor/editor_sectioned_inspector.h index 55fb94fecc..1068a4f932 100644 --- a/editor/editor_sectioned_inspector.h +++ b/editor/editor_sectioned_inspector.h @@ -51,6 +51,8 @@ class SectionedInspector : public HSplitContainer { String selected_category; + bool restrict_to_basic = false; + static void _bind_methods(); void _section_selected(); @@ -65,6 +67,7 @@ public: void set_current_section(const String &p_section); String get_current_section() const; + void set_restrict_to_basic_settings(bool p_restrict); void update_category_list(); SectionedInspector(); diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index b6fa2f6d03..ef1f8030fa 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -31,6 +31,7 @@ #include "editor_settings.h" #include "core/config/project_settings.h" +#include "core/input/input_map.h" #include "core/io/certs_compressed.gen.h" #include "core/io/compression.h" #include "core/io/config_file.h" @@ -70,7 +71,7 @@ bool EditorSettings::_set(const StringName &p_name, const Variant &p_value) { bool EditorSettings::_set_only(const StringName &p_name, const Variant &p_value) { _THREAD_SAFE_METHOD_ - if (p_name.operator String() == "shortcuts") { + if (p_name == "shortcuts") { Array arr = p_value; ERR_FAIL_COND_V(arr.size() && arr.size() & 1, true); for (int i = 0; i < arr.size(); i += 2) { @@ -84,6 +85,24 @@ bool EditorSettings::_set_only(const StringName &p_name, const Variant &p_value) } return false; + } else if (p_name == "builtin_action_overrides") { + Array actions_arr = p_value; + for (int i = 0; i < actions_arr.size(); i++) { + Dictionary action_dict = actions_arr[i]; + + String name = action_dict["name"]; + Array events = action_dict["events"]; + + InputMap *im = InputMap::get_singleton(); + im->action_erase_events(name); + + builtin_action_overrides[name].clear(); + for (int ev_idx = 0; ev_idx < events.size(); ev_idx++) { + im->action_add_event(name, events[ev_idx]); + builtin_action_overrides[name].push_back(events[ev_idx]); + } + } + return false; } bool changed = false; @@ -118,11 +137,16 @@ bool EditorSettings::_set_only(const StringName &p_name, const Variant &p_value) bool EditorSettings::_get(const StringName &p_name, Variant &r_ret) const { _THREAD_SAFE_METHOD_ - if (p_name.operator String() == "shortcuts") { + if (p_name == "shortcuts") { Array arr; for (const Map<String, Ref<Shortcut>>::Element *E = shortcuts.front(); E; E = E->next()) { Ref<Shortcut> sc = E->get(); + if (builtin_action_overrides.has(E->key())) { + // This shortcut was auto-generated from built in actions: don't save. + continue; + } + if (optimize_save) { if (!sc->has_meta("original")) { continue; //this came from settings but is not any longer used @@ -139,6 +163,27 @@ bool EditorSettings::_get(const StringName &p_name, Variant &r_ret) const { } r_ret = arr; return true; + } else if (p_name == "builtin_action_overrides") { + Array actions_arr; + for (Map<String, List<Ref<InputEvent>>>::Element *E = builtin_action_overrides.front(); E; E = E->next()) { + List<Ref<InputEvent>> events = E->get(); + + // TODO: skip actions which are the same as the builtin. + Dictionary action_dict; + action_dict["name"] = E->key(); + + Array events_arr; + for (List<Ref<InputEvent>>::Element *I = events.front(); I; I = I->next()) { + events_arr.push_back(I->get()); + } + + action_dict["events"] = events_arr; + + actions_arr.push_back(action_dict); + } + + r_ret = actions_arr; + return true; } const VariantContainer *v = props.getptr(p_name); @@ -220,6 +265,7 @@ void EditorSettings::_get_property_list(List<PropertyInfo> *p_list) const { } p_list->push_back(PropertyInfo(Variant::ARRAY, "shortcuts", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL)); //do not edit + p_list->push_back(PropertyInfo(Variant::ARRAY, "builtin_action_overrides", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL)); } void EditorSettings::_add_property_info_bind(const Dictionary &p_info) { @@ -385,6 +431,10 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { _initial_set("interface/editor/hide_console_window", false); _initial_set("interface/editor/save_each_scene_on_quit", true); // Regression + // Inspector + _initial_set("interface/inspector/max_array_dictionary_items_per_page", 20); + hints["interface/inspector/max_array_dictionary_items_per_page"] = PropertyInfo(Variant::INT, "interface/inspector/max_array_dictionary_items_per_page", PROPERTY_HINT_RANGE, "10,100,1", PROPERTY_USAGE_DEFAULT); + // Theme _initial_set("interface/theme/preset", "Default"); hints["interface/theme/preset"] = PropertyInfo(Variant::STRING, "interface/theme/preset", PROPERTY_HINT_ENUM, "Default,Alien,Arc,Godot 2,Grey,Light,Solarized (Dark),Solarized (Light),Custom", PROPERTY_USAGE_DEFAULT); @@ -1285,7 +1335,7 @@ String EditorSettings::get_script_templates_dir() const { } String EditorSettings::get_project_script_templates_dir() const { - return ProjectSettings::get_singleton()->get("editor/script_templates_search_path"); + return ProjectSettings::get_singleton()->get("editor/script/templates_search_path"); } // Cache directory @@ -1539,12 +1589,39 @@ bool EditorSettings::is_shortcut(const String &p_name, const Ref<InputEvent> &p_ } Ref<Shortcut> EditorSettings::get_shortcut(const String &p_name) const { - const Map<String, Ref<Shortcut>>::Element *E = shortcuts.find(p_name); - if (!E) { - return Ref<Shortcut>(); + const Map<String, Ref<Shortcut>>::Element *SC = shortcuts.find(p_name); + if (SC) { + return SC->get(); } - return E->get(); + // If no shortcut with the provided name is found in the list, check the built-in shortcuts. + // Use the first item in the action list for the shortcut event, since a shortcut can only have 1 linked event. + + Ref<Shortcut> sc; + const Map<String, List<Ref<InputEvent>>>::Element *builtin_override = builtin_action_overrides.find(p_name); + if (builtin_override) { + sc.instance(); + sc->set_shortcut(builtin_override->get().front()->get()); + sc->set_name(InputMap::get_singleton()->get_builtin_display_name(p_name)); + } + + // If there was no override, check the default builtins to see if it has an InputEvent for the provided name. + if (sc.is_null()) { + const OrderedHashMap<String, List<Ref<InputEvent>>>::ConstElement builtin_default = InputMap::get_singleton()->get_builtins().find(p_name); + if (builtin_default) { + sc.instance(); + sc->set_shortcut(builtin_default.get().front()->get()); + sc->set_name(InputMap::get_singleton()->get_builtin_display_name(p_name)); + } + } + + if (sc.is_valid()) { + // Add the shortcut to the list. + shortcuts[p_name] = sc; + return sc; + } + + return Ref<Shortcut>(); } void EditorSettings::get_shortcut_list(List<String> *r_shortcuts) { @@ -1610,6 +1687,66 @@ Ref<Shortcut> ED_SHORTCUT(const String &p_path, const String &p_name, uint32_t p return sc; } +void EditorSettings::set_builtin_action_override(const String &p_name, const Array &p_events) { + List<Ref<InputEvent>> event_list; + + // Override the whole list, since events may have their order changed or be added, removed or edited. + InputMap::get_singleton()->action_erase_events(p_name); + for (int i = 0; i < p_events.size(); i++) { + event_list.push_back(p_events[i]); + InputMap::get_singleton()->action_add_event(p_name, p_events[i]); + } + + // Check if the provided event array is same as built-in. If it is, it does not need to be added to the overrides. + // Note that event order must also be the same. + bool same_as_builtin = true; + OrderedHashMap<String, List<Ref<InputEvent>>>::ConstElement builtin_default = InputMap::get_singleton()->get_builtins().find(p_name); + if (builtin_default) { + List<Ref<InputEvent>> builtin_events = builtin_default.get(); + + if (p_events.size() == builtin_events.size()) { + int event_idx = 0; + + // Check equality of each event. + for (List<Ref<InputEvent>>::Element *E = builtin_events.front(); E; E = E->next()) { + if (!E->get()->shortcut_match(p_events[event_idx])) { + same_as_builtin = false; + break; + } + event_idx++; + } + } else { + same_as_builtin = false; + } + } + + if (same_as_builtin && builtin_action_overrides.has(p_name)) { + builtin_action_overrides.erase(p_name); + } else { + builtin_action_overrides[p_name] = event_list; + } + + // Update the shortcut (if it is used somewhere in the editor) to be the first event of the new list. + if (shortcuts.has(p_name)) { + shortcuts[p_name]->set_shortcut(event_list.front()->get()); + } +} + +const Array EditorSettings::get_builtin_action_overrides(const String &p_name) const { + const Map<String, List<Ref<InputEvent>>>::Element *AO = builtin_action_overrides.find(p_name); + if (AO) { + Array event_array; + + List<Ref<InputEvent>> events_list = AO->get(); + for (List<Ref<InputEvent>>::Element *E = events_list.front(); E; E = E->next()) { + event_array.push_back(E->get()); + } + return event_array; + } + + return Array(); +} + void EditorSettings::notify_changes() { _THREAD_SAFE_METHOD_ @@ -1648,6 +1785,8 @@ void EditorSettings::_bind_methods() { ClassDB::bind_method(D_METHOD("set_recent_dirs", "dirs"), &EditorSettings::set_recent_dirs); ClassDB::bind_method(D_METHOD("get_recent_dirs"), &EditorSettings::get_recent_dirs); + ClassDB::bind_method(D_METHOD("set_builtin_action_override", "name", "actions_list"), &EditorSettings::set_builtin_action_override); + ADD_SIGNAL(MethodInfo("settings_changed")); BIND_CONSTANT(NOTIFICATION_EDITOR_SETTINGS_CHANGED); diff --git a/editor/editor_settings.h b/editor/editor_settings.h index 616a938a86..e5f8527faf 100644 --- a/editor/editor_settings.h +++ b/editor/editor_settings.h @@ -84,7 +84,8 @@ private: int last_order; Ref<Resource> clipboard; - Map<String, Ref<Shortcut>> shortcuts; + mutable Map<String, Ref<Shortcut>> shortcuts; + Map<String, List<Ref<InputEvent>>> builtin_action_overrides; String resource_path; String settings_dir; @@ -186,6 +187,9 @@ public: Ref<Shortcut> get_shortcut(const String &p_name) const; void get_shortcut_list(List<String> *r_shortcuts); + void set_builtin_action_override(const String &p_name, const Array &p_events); + const Array get_builtin_action_overrides(const String &p_name) const; + void notify_changes(); EditorSettings(); diff --git a/editor/editor_sub_scene.cpp b/editor/editor_sub_scene.cpp deleted file mode 100644 index e319fbff52..0000000000 --- a/editor/editor_sub_scene.cpp +++ /dev/null @@ -1,265 +0,0 @@ -/*************************************************************************/ -/* editor_sub_scene.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 "editor_sub_scene.h" - -#include "editor/editor_node.h" -#include "scene/gui/margin_container.h" -#include "scene/resources/packed_scene.h" - -void EditorSubScene::_path_selected(const String &p_path) { - path->set_text(p_path); - _path_changed(p_path); -} - -void EditorSubScene::_path_changed(const String &p_path) { - tree->clear(); - - if (scene) { - memdelete(scene); - scene = nullptr; - } - - if (p_path == "") { - return; - } - - Ref<PackedScene> ps = ResourceLoader::load(p_path, "PackedScene"); - - if (ps.is_null()) { - return; - } - - scene = ps->instance(); - if (!scene) { - return; - } - - _fill_tree(scene, nullptr); -} - -void EditorSubScene::_path_browse() { - file_dialog->popup_file_dialog(); -} - -void EditorSubScene::_notification(int p_what) { - if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - if (is_visible() && scene == nullptr) { - _path_browse(); - } - } -} - -void EditorSubScene::_fill_tree(Node *p_node, TreeItem *p_parent) { - TreeItem *it = tree->create_item(p_parent); - it->set_metadata(0, p_node); - it->set_text(0, p_node->get_name()); - it->set_editable(0, false); - it->set_selectable(0, true); - it->set_icon(0, EditorNode::get_singleton()->get_object_icon(p_node, "Node")); - - for (int i = 0; i < p_node->get_child_count(); i++) { - Node *c = p_node->get_child(i); - if (c->get_owner() != scene) { - continue; - } - _fill_tree(c, it); - } -} - -void EditorSubScene::_selected_changed() { - TreeItem *item = tree->get_selected(); - ERR_FAIL_COND(!item); - Node *n = item->get_metadata(0); - - if (!n || !selection.find(n)) { - selection.clear(); - is_root = false; - } -} - -void EditorSubScene::_item_multi_selected(Object *p_object, int p_cell, bool p_selected) { - if (!is_root) { - TreeItem *item = Object::cast_to<TreeItem>(p_object); - ERR_FAIL_COND(!item); - - Node *n = item->get_metadata(0); - - if (!n) { - return; - } - if (p_selected) { - if (n == scene) { - is_root = true; - selection.clear(); - } - selection.push_back(n); - } else { - List<Node *>::Element *E = selection.find(n); - - if (E) { - selection.erase(E); - } - } - } -} - -void EditorSubScene::_item_activated() { - _ok_pressed(); // From AcceptDialog. -} - -void EditorSubScene::_remove_selection_child(Node *p_node) { - if (p_node->get_child_count() > 0) { - for (int i = 0; i < p_node->get_child_count(); i++) { - Node *c = p_node->get_child(i); - List<Node *>::Element *E = selection.find(c); - if (E) { - selection.move_to_back(E); - selection.pop_back(); - } - if (c->get_child_count() > 0) { - _remove_selection_child(c); - } - } - } -} - -void EditorSubScene::ok_pressed() { - if (selection.size() <= 0) { - return; - } - for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { - Node *c = E->get(); - _remove_selection_child(c); - } - emit_signal("subscene_selected"); - hide(); - clear(); -} - -void EditorSubScene::_reown(Node *p_node, List<Node *> *p_to_reown) { - if (p_node == scene) { - scene->set_filename(""); - p_to_reown->push_back(p_node); - } else if (p_node->get_owner() == scene) { - p_to_reown->push_back(p_node); - } - - for (int i = 0; i < p_node->get_child_count(); i++) { - Node *c = p_node->get_child(i); - _reown(c, p_to_reown); - } -} - -void EditorSubScene::move(Node *p_new_parent, Node *p_new_owner) { - if (!scene) { - return; - } - - if (selection.size() <= 0) { - return; - } - - for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { - Node *selnode = E->get(); - if (!selnode) { - return; - } - List<Node *> to_reown; - _reown(selnode, &to_reown); - if (selnode != scene) { - selnode->get_parent()->remove_child(selnode); - } - - p_new_parent->add_child(selnode); - for (List<Node *>::Element *F = to_reown.front(); F; F = F->next()) { - F->get()->set_owner(p_new_owner); - } - } - if (!is_root) { - memdelete(scene); - } - scene = nullptr; - //return selnode; -} - -void EditorSubScene::clear() { - path->set_text(""); - _path_changed(""); -} - -void EditorSubScene::_bind_methods() { - ADD_SIGNAL(MethodInfo("subscene_selected")); -} - -EditorSubScene::EditorSubScene() { - scene = nullptr; - is_root = false; - - set_title(TTR("Select Node(s) to Import")); - set_hide_on_ok(false); - - VBoxContainer *vb = memnew(VBoxContainer); - add_child(vb); - //set_child_rect(vb); - - HBoxContainer *hb = memnew(HBoxContainer); - path = memnew(LineEdit); - path->connect("text_entered", callable_mp(this, &EditorSubScene::_path_changed)); - hb->add_child(path); - path->set_h_size_flags(Control::SIZE_EXPAND_FILL); - Button *b = memnew(Button); - b->set_text(TTR("Browse")); - hb->add_child(b); - b->connect("pressed", callable_mp(this, &EditorSubScene::_path_browse)); - vb->add_margin_child(TTR("Scene Path:"), hb); - - tree = memnew(Tree); - tree->set_v_size_flags(Control::SIZE_EXPAND_FILL); - vb->add_margin_child(TTR("Import From Node:"), tree, true); - tree->set_select_mode(Tree::SELECT_MULTI); - tree->connect("multi_selected", callable_mp(this, &EditorSubScene::_item_multi_selected)); - //tree->connect("nothing_selected", this, "_deselect_items"); - tree->connect("cell_selected", callable_mp(this, &EditorSubScene::_selected_changed)); - - tree->connect("item_activated", callable_mp(this, &EditorSubScene::_item_activated), make_binds(), CONNECT_DEFERRED); - - file_dialog = memnew(EditorFileDialog); - List<String> extensions; - ResourceLoader::get_recognized_extensions_for_type("PackedScene", &extensions); - - for (List<String>::Element *E = extensions.front(); E; E = E->next()) { - file_dialog->add_filter("*." + E->get()); - } - - file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE); - add_child(file_dialog); - file_dialog->connect("file_selected", callable_mp(this, &EditorSubScene::_path_selected)); -} diff --git a/editor/editor_sub_scene.h b/editor/editor_sub_scene.h deleted file mode 100644 index 428bd5a40e..0000000000 --- a/editor/editor_sub_scene.h +++ /dev/null @@ -1,71 +0,0 @@ -/*************************************************************************/ -/* editor_sub_scene.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 EDITOR_SUB_SCENE_H -#define EDITOR_SUB_SCENE_H - -#include "editor/editor_file_dialog.h" -#include "scene/gui/dialogs.h" -#include "scene/gui/tree.h" - -class EditorSubScene : public ConfirmationDialog { - GDCLASS(EditorSubScene, ConfirmationDialog); - - List<Node *> selection; - LineEdit *path; - Tree *tree; - Node *scene; - bool is_root; - - EditorFileDialog *file_dialog; - - void _fill_tree(Node *p_node, TreeItem *p_parent); - void _selected_changed(); - void _item_multi_selected(Object *p_object, int p_cell, bool p_selected); - void _item_activated(); - void _remove_selection_child(Node *p_node); - void _reown(Node *p_node, List<Node *> *p_to_reown); - - void ok_pressed() override; - -protected: - void _notification(int p_what); - static void _bind_methods(); - void _path_browse(); - void _path_selected(const String &p_path); - void _path_changed(const String &p_path); - -public: - void move(Node *p_new_parent, Node *p_new_owner); - void clear(); - EditorSubScene(); -}; - -#endif // EDITOR_SUB_SCENE_H diff --git a/editor/find_in_files.cpp b/editor/find_in_files.cpp index 27e539d71c..47079a92b7 100644 --- a/editor/find_in_files.cpp +++ b/editor/find_in_files.cpp @@ -463,7 +463,7 @@ void FindInFilesDialog::_notification(int p_what) { for (int i = 0; i < _filters_container->get_child_count(); i++) { _filters_container->get_child(i)->queue_delete(); } - Array exts = ProjectSettings::get_singleton()->get("editor/search_in_file_extensions"); + Array exts = ProjectSettings::get_singleton()->get("editor/script/search_in_file_extensions"); for (int i = 0; i < exts.size(); ++i) { CheckBox *cb = memnew(CheckBox); cb->set_text(exts[i]); diff --git a/editor/icons/NodeDisabled.svg b/editor/icons/NodeDisabled.svg new file mode 100644 index 0000000000..b2d51fc4fb --- /dev/null +++ b/editor/icons/NodeDisabled.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2a6 6 0 0 0 -6 6 6 6 0 0 0 6 6 6 6 0 0 0 6-6 6 6 0 0 0 -6-6zm0 2a4 4 0 0 1 4 4 4 4 0 0 1 -4 4 4 4 0 0 1 -4-4 4 4 0 0 1 4-4z" fill="#999"/></svg> diff --git a/editor/import/resource_importer_layered_texture.cpp b/editor/import/resource_importer_layered_texture.cpp index 3139ef5146..6d2215c379 100644 --- a/editor/import/resource_importer_layered_texture.cpp +++ b/editor/import/resource_importer_layered_texture.cpp @@ -391,8 +391,8 @@ Error ResourceImporterLayeredTexture::import(const String &p_source_file, const bool ok_on_pc = false; bool is_hdr = (image->get_format() >= Image::FORMAT_RF && image->get_format() <= Image::FORMAT_RGBE9995); bool is_ldr = (image->get_format() >= Image::FORMAT_L8 && image->get_format() <= Image::FORMAT_RGB565); - bool can_bptc = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_bptc"); - bool can_s3tc = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_s3tc"); + bool can_bptc = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_bptc"); + bool can_s3tc = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_s3tc"); if (can_bptc) { formats_imported.push_back("bptc"); //needs to be aded anyway @@ -447,13 +447,13 @@ Error ResourceImporterLayeredTexture::import(const String &p_source_file, const ok_on_pc = true; } - if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc2")) { + if (ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_etc2")) { _save_tex(slices, p_save_path + ".etc2." + extension, compress_mode, lossy, Image::COMPRESS_ETC2, csource, used_channels, mipmaps, true); r_platform_variants->push_back("etc2"); formats_imported.push_back("etc2"); } - if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_pvrtc")) { + if (ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_pvrtc")) { _save_tex(slices, p_save_path + ".etc2." + extension, compress_mode, lossy, Image::COMPRESS_ETC2, csource, used_channels, mipmaps, true); r_platform_variants->push_back("pvrtc"); formats_imported.push_back("pvrtc"); @@ -492,7 +492,7 @@ String ResourceImporterLayeredTexture::get_import_settings_string() const { int index = 0; while (compression_formats[index]) { - String setting_path = "rendering/vram_compression/import_" + String(compression_formats[index]); + String setting_path = "rendering/textures/vram_compression/import_" + String(compression_formats[index]); bool test = ProjectSettings::get_singleton()->get(setting_path); if (test) { s += String(compression_formats[index]); @@ -524,7 +524,7 @@ bool ResourceImporterLayeredTexture::are_import_settings_valid(const String &p_p int index = 0; bool valid = true; while (compression_formats[index]) { - String setting_path = "rendering/vram_compression/import_" + String(compression_formats[index]); + String setting_path = "rendering/textures/vram_compression/import_" + String(compression_formats[index]); bool test = ProjectSettings::get_singleton()->get(setting_path); if (test) { if (formats_imported.find(compression_formats[index]) == -1) { diff --git a/editor/import/resource_importer_texture.cpp b/editor/import/resource_importer_texture.cpp index eb16e873e6..de8031af35 100644 --- a/editor/import/resource_importer_texture.cpp +++ b/editor/import/resource_importer_texture.cpp @@ -172,7 +172,7 @@ bool ResourceImporterTexture::get_option_visibility(const String &p_option, cons if (compress_mode < COMPRESS_VRAM_COMPRESSED) { return false; } - if (!ProjectSettings::get_singleton()->get("rendering/vram_compression/import_bptc")) { + if (!ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_bptc")) { return false; } } @@ -473,8 +473,8 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String bool ok_on_pc = false; bool is_hdr = (image->get_format() >= Image::FORMAT_RF && image->get_format() <= Image::FORMAT_RGBE9995); bool is_ldr = (image->get_format() >= Image::FORMAT_L8 && image->get_format() <= Image::FORMAT_RGB565); - bool can_bptc = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_bptc"); - bool can_s3tc = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_s3tc"); + bool can_bptc = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_bptc"); + bool can_s3tc = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_s3tc"); if (can_bptc) { //add to the list anyway @@ -524,19 +524,19 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String ok_on_pc = true; } - if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc2")) { + if (ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_etc2")) { _save_stex(image, p_save_path + ".etc2.stex", compress_mode, lossy, Image::COMPRESS_ETC2, mipmaps, stream, detect_3d, detect_roughness, detect_normal, force_normal, srgb_friendly_pack, true, mipmap_limit, normal_image, roughness_channel); r_platform_variants->push_back("etc2"); formats_imported.push_back("etc2"); } - if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc")) { + if (ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_etc")) { _save_stex(image, p_save_path + ".etc.stex", compress_mode, lossy, Image::COMPRESS_ETC, mipmaps, stream, detect_3d, detect_roughness, detect_normal, force_normal, srgb_friendly_pack, true, mipmap_limit, normal_image, roughness_channel); r_platform_variants->push_back("etc"); formats_imported.push_back("etc"); } - if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_pvrtc")) { + if (ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_pvrtc")) { _save_stex(image, p_save_path + ".pvrtc.stex", compress_mode, lossy, Image::COMPRESS_PVRTC1_4, mipmaps, stream, detect_3d, detect_roughness, detect_normal, force_normal, srgb_friendly_pack, true, mipmap_limit, normal_image, roughness_channel); r_platform_variants->push_back("pvrtc"); formats_imported.push_back("pvrtc"); @@ -574,7 +574,7 @@ String ResourceImporterTexture::get_import_settings_string() const { int index = 0; while (compression_formats[index]) { - String setting_path = "rendering/vram_compression/import_" + String(compression_formats[index]); + String setting_path = "rendering/textures/vram_compression/import_" + String(compression_formats[index]); bool test = ProjectSettings::get_singleton()->get(setting_path); if (test) { s += String(compression_formats[index]); @@ -606,7 +606,7 @@ bool ResourceImporterTexture::are_import_settings_valid(const String &p_path) co int index = 0; bool valid = true; while (compression_formats[index]) { - String setting_path = "rendering/vram_compression/import_" + String(compression_formats[index]); + String setting_path = "rendering/textures/vram_compression/import_" + String(compression_formats[index]); bool test = ProjectSettings::get_singleton()->get(setting_path); if (test) { if (formats_imported.find(compression_formats[index]) == -1) { diff --git a/editor/import/scene_importer_mesh.cpp b/editor/import/scene_importer_mesh.cpp index 78a7cd84f1..46eb4e4fdc 100644 --- a/editor/import/scene_importer_mesh.cpp +++ b/editor/import/scene_importer_mesh.cpp @@ -444,7 +444,7 @@ void EditorSceneImporterMesh::_bind_methods() { ClassDB::bind_method(D_METHOD("set_blend_shape_mode", "mode"), &EditorSceneImporterMesh::set_blend_shape_mode); ClassDB::bind_method(D_METHOD("get_blend_shape_mode"), &EditorSceneImporterMesh::get_blend_shape_mode); - ClassDB::bind_method(D_METHOD("add_surface", "primitive", "arrays", "blend_shapes", "lods", "material"), &EditorSceneImporterMesh::add_surface, DEFVAL(Array()), DEFVAL(Dictionary()), DEFVAL(Ref<Material>()), DEFVAL(String())); + ClassDB::bind_method(D_METHOD("add_surface", "primitive", "arrays", "blend_shapes", "lods", "material", "name"), &EditorSceneImporterMesh::add_surface, DEFVAL(Array()), DEFVAL(Dictionary()), DEFVAL(Ref<Material>()), DEFVAL(String())); ClassDB::bind_method(D_METHOD("get_surface_count"), &EditorSceneImporterMesh::get_surface_count); ClassDB::bind_method(D_METHOD("get_surface_primitive_type", "surface_idx"), &EditorSceneImporterMesh::get_surface_primitive_type); diff --git a/editor/input_map_editor.cpp b/editor/input_map_editor.cpp deleted file mode 100644 index 9a5e7d164c..0000000000 --- a/editor/input_map_editor.cpp +++ /dev/null @@ -1,1033 +0,0 @@ -/*************************************************************************/ -/* input_map_editor.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_map_editor.h" - -#include "core/input/input_map.h" -#include "core/os/keyboard.h" -#include "editor/editor_node.h" -#include "editor/editor_scale.h" - -void InputMapEditor::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - action_add_error->add_theme_color_override("font_color", input_editor->get_theme_color("error_color", "Editor")); - popup_add->add_icon_item(input_editor->get_theme_icon("Keyboard", "EditorIcons"), TTR("Key"), INPUT_KEY); - popup_add->add_icon_item(input_editor->get_theme_icon("KeyboardPhysical", "EditorIcons"), TTR("Physical Key"), INPUT_KEY_PHYSICAL); - popup_add->add_icon_item(input_editor->get_theme_icon("JoyButton", "EditorIcons"), TTR("Joy Button"), INPUT_JOY_BUTTON); - popup_add->add_icon_item(input_editor->get_theme_icon("JoyAxis", "EditorIcons"), TTR("Joy Axis"), INPUT_JOY_MOTION); - popup_add->add_icon_item(input_editor->get_theme_icon("Mouse", "EditorIcons"), TTR("Mouse Button"), INPUT_MOUSE_BUTTON); - _update_actions(); - } break; - case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { - action_add_error->add_theme_color_override("font_color", input_editor->get_theme_color("error_color", "Editor")); - popup_add->set_item_icon(popup_add->get_item_index(INPUT_KEY), input_editor->get_theme_icon("Keyboard", "EditorIcons")); - popup_add->set_item_icon(popup_add->get_item_index(INPUT_KEY_PHYSICAL), input_editor->get_theme_icon("KeyboardPhysical", "EditorIcons")); - popup_add->set_item_icon(popup_add->get_item_index(INPUT_JOY_BUTTON), input_editor->get_theme_icon("JoyButton", "EditorIcons")); - popup_add->set_item_icon(popup_add->get_item_index(INPUT_JOY_MOTION), input_editor->get_theme_icon("JoyAxis", "EditorIcons")); - popup_add->set_item_icon(popup_add->get_item_index(INPUT_MOUSE_BUTTON), input_editor->get_theme_icon("Mouse", "EditorIcons")); - _update_actions(); - } break; - } -} - -static bool _validate_action_name(const String &p_name) { - const char32_t *cstr = p_name.get_data(); - for (int i = 0; cstr[i]; i++) { - if (cstr[i] == '/' || cstr[i] == ':' || cstr[i] == '"' || - cstr[i] == '=' || cstr[i] == '\\' || cstr[i] < 32) { - return false; - } - } - return true; -} - -void InputMapEditor::_action_selected() { - TreeItem *ti = input_editor->get_selected(); - if (!ti || !ti->is_editable(0)) { - return; - } - - add_at = "input/" + ti->get_text(0); - edit_idx = -1; -} - -void InputMapEditor::_action_edited() { - TreeItem *ti = input_editor->get_selected(); - if (!ti) { - return; - } - - if (input_editor->get_selected_column() == 0) { - String new_name = ti->get_text(0); - String old_name = add_at.substr(add_at.find("/") + 1, add_at.length()); - - if (new_name == old_name) { - return; - } - - if (new_name == "" || !_validate_action_name(new_name)) { - ti->set_text(0, old_name); - add_at = "input/" + old_name; - - message->set_text(TTR("Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or '\"'")); - message->popup_centered(Size2(300, 100) * EDSCALE); - return; - } - - String action_prop = "input/" + new_name; - - if (ProjectSettings::get_singleton()->has_setting(action_prop)) { - ti->set_text(0, old_name); - add_at = "input/" + old_name; - - message->set_text(vformat(TTR("An action with the name '%s' already exists."), new_name)); - message->popup_centered(Size2(300, 100) * EDSCALE); - return; - } - - int order = ProjectSettings::get_singleton()->get_order(add_at); - Dictionary action = ProjectSettings::get_singleton()->get(add_at); - - setting = true; - undo_redo->create_action(TTR("Rename Input Action Event")); - undo_redo->add_do_method(ProjectSettings::get_singleton(), "clear", add_at); - undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", action_prop, action); - undo_redo->add_do_method(ProjectSettings::get_singleton(), "set_order", action_prop, order); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "clear", action_prop); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", add_at, action); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", add_at, order); - undo_redo->add_do_method(this, "_update_actions"); - undo_redo->add_undo_method(this, "_update_actions"); - undo_redo->add_do_method(this, "emit_signal", inputmap_changed); - undo_redo->add_undo_method(this, "emit_signal", inputmap_changed); - undo_redo->commit_action(); - setting = false; - - add_at = action_prop; - } else if (input_editor->get_selected_column() == 1) { - String name = "input/" + ti->get_text(0); - Dictionary old_action = ProjectSettings::get_singleton()->get(name); - Dictionary new_action = old_action.duplicate(); - new_action["deadzone"] = ti->get_range(1); - - undo_redo->create_action(TTR("Change Action deadzone")); - undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", name, new_action); - undo_redo->add_do_method(this, "emit_signal", inputmap_changed); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", name, old_action); - undo_redo->add_undo_method(this, "emit_signal", inputmap_changed); - undo_redo->commit_action(); - } -} - -void InputMapEditor::_device_input_add() { - Ref<InputEvent> ie; - String name = add_at; - int idx = edit_idx; - Dictionary old_val = ProjectSettings::get_singleton()->get(name); - Dictionary action = old_val.duplicate(); - Array events = action["events"]; - - switch (add_type) { - case INPUT_MOUSE_BUTTON: { - Ref<InputEventMouseButton> mb; - mb.instance(); - mb->set_button_index(device_index->get_selected() + 1); - mb->set_device(_get_current_device()); - - for (int i = 0; i < events.size(); i++) { - Ref<InputEventMouseButton> aie = events[i]; - if (aie.is_null()) { - continue; - } - if (aie->get_device() == mb->get_device() && aie->get_button_index() == mb->get_button_index()) { - return; - } - } - - ie = mb; - - } break; - case INPUT_JOY_MOTION: { - Ref<InputEventJoypadMotion> jm; - jm.instance(); - jm->set_axis(device_index->get_selected() >> 1); - jm->set_axis_value((device_index->get_selected() & 1) ? 1 : -1); - jm->set_device(_get_current_device()); - - for (int i = 0; i < events.size(); i++) { - Ref<InputEventJoypadMotion> aie = events[i]; - if (aie.is_null()) { - continue; - } - - if (aie->get_device() == jm->get_device() && aie->get_axis() == jm->get_axis() && aie->get_axis_value() == jm->get_axis_value()) { - return; - } - } - - ie = jm; - - } break; - case INPUT_JOY_BUTTON: { - Ref<InputEventJoypadButton> jb; - jb.instance(); - - jb->set_button_index(device_index->get_selected()); - jb->set_device(_get_current_device()); - - for (int i = 0; i < events.size(); i++) { - Ref<InputEventJoypadButton> aie = events[i]; - if (aie.is_null()) { - continue; - } - if (aie->get_device() == jb->get_device() && aie->get_button_index() == jb->get_button_index()) { - return; - } - } - ie = jb; - - } break; - default: { - } - } - - if (idx < 0 || idx >= events.size()) { - events.push_back(ie); - } else { - events[idx] = ie; - } - action["events"] = events; - - undo_redo->create_action(TTR("Add Input Action Event")); - undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", name, action); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", name, old_val); - undo_redo->add_do_method(this, "_update_actions"); - undo_redo->add_undo_method(this, "_update_actions"); - undo_redo->add_do_method(this, "emit_signal", inputmap_changed); - undo_redo->add_undo_method(this, "emit_signal", inputmap_changed); - undo_redo->commit_action(); - - _show_last_added(ie, name); -} - -void InputMapEditor::_set_current_device(int i_device) { - device_id->select(i_device + 1); -} - -int InputMapEditor::_get_current_device() { - return device_id->get_selected() - 1; -} - -String InputMapEditor::_get_device_string(int i_device) { - if (i_device == InputMap::ALL_DEVICES) { - return TTR("All Devices"); - } - return TTR("Device") + " " + itos(i_device); -} - -void InputMapEditor::_press_a_key_confirm() { - if (last_wait_for_key.is_null()) { - return; - } - - Ref<InputEventKey> ie; - ie.instance(); - if (press_a_key_physical) { - ie->set_physical_keycode(last_wait_for_key->get_physical_keycode()); - ie->set_keycode(0); - } else { - ie->set_physical_keycode(0); - ie->set_keycode(last_wait_for_key->get_keycode()); - } - ie->set_shift(last_wait_for_key->get_shift()); - ie->set_alt(last_wait_for_key->get_alt()); - ie->set_control(last_wait_for_key->get_control()); - ie->set_metakey(last_wait_for_key->get_metakey()); - - String name = add_at; - int idx = edit_idx; - - Dictionary old_val = ProjectSettings::get_singleton()->get(name); - Dictionary action = old_val.duplicate(); - Array events = action["events"]; - - for (int i = 0; i < events.size(); i++) { - Ref<InputEventKey> aie = events[i]; - if (aie.is_null()) { - continue; - } - if (!press_a_key_physical) { - if (aie->get_keycode_with_modifiers() == ie->get_keycode_with_modifiers()) { - return; - } - } else { - if (aie->get_physical_keycode_with_modifiers() == ie->get_physical_keycode_with_modifiers()) { - return; - } - } - } - - if (idx < 0 || idx >= events.size()) { - events.push_back(ie); - } else { - events[idx] = ie; - } - action["events"] = events; - - undo_redo->create_action(TTR("Add Input Action Event")); - undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", name, action); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", name, old_val); - undo_redo->add_do_method(this, "_update_actions"); - undo_redo->add_undo_method(this, "_update_actions"); - undo_redo->add_do_method(this, "emit_signal", inputmap_changed); - undo_redo->add_undo_method(this, "emit_signal", inputmap_changed); - undo_redo->commit_action(); - - _show_last_added(ie, name); -} - -void InputMapEditor::_show_last_added(const Ref<InputEvent> &p_event, const String &p_name) { - TreeItem *r = input_editor->get_root(); - - String name = p_name; - name.erase(0, 6); - if (!r) { - return; - } - r = r->get_children(); - if (!r) { - return; - } - bool found = false; - while (r) { - if (r->get_text(0) != name) { - r = r->get_next(); - continue; - } - TreeItem *child = r->get_children(); - while (child) { - Variant input = child->get_meta("__input"); - if (p_event == input) { - r->set_collapsed(false); - child->select(0); - found = true; - break; - } - child = child->get_next(); - } - if (found) { - break; - } - r = r->get_next(); - } - - if (found) { - input_editor->ensure_cursor_is_visible(); - } -} - -// Maps to 2*axis if value is neg, or + 1 if value is pos. -static const char *_joy_axis_descriptions[JOY_AXIS_MAX * 2] = { - TTRC("Left Stick Left, Joystick 0 Left"), - TTRC("Left Stick Right, Joystick 0 Right"), - TTRC("Left Stick Up, Joystick 0 Up"), - TTRC("Left Stick Down, Joystick 0 Down"), - TTRC("Right Stick Left, Joystick 1 Left"), - TTRC("Right Stick Right, Joystick 1 Right"), - TTRC("Right Stick Up, Joystick 1 Up"), - TTRC("Right Stick Down, Joystick 1 Down"), - TTRC("Joystick 2 Left"), - TTRC("Left Trigger, Sony L2, Xbox LT, Joystick 2 Right"), - TTRC("Joystick 2 Up"), - TTRC("Right Trigger, Sony R2, Xbox RT, Joystick 2 Down"), - TTRC("Joystick 3 Left"), - TTRC("Joystick 3 Right"), - TTRC("Joystick 3 Up"), - TTRC("Joystick 3 Down"), - TTRC("Joystick 4 Left"), - TTRC("Joystick 4 Right"), - TTRC("Joystick 4 Up"), - TTRC("Joystick 4 Down"), -}; - -// Separate from `InputEvent::as_text()` since the descriptions need to be different for the input map editor. See #43660. -String InputMapEditor::_get_joypad_motion_event_text(const Ref<InputEventJoypadMotion> &p_event) { - ERR_FAIL_COND_V_MSG(p_event.is_null(), String(), "Provided event is not a valid instance of InputEventJoypadMotion"); - - String desc = TTR("Unknown Joypad Axis"); - if (p_event->get_axis() < JOY_AXIS_MAX) { - desc = RTR(_joy_axis_descriptions[2 * p_event->get_axis() + (p_event->get_axis_value() < 0 ? 0 : 1)]); - } - - return vformat("Joypad Axis %s %s (%s)", itos(p_event->get_axis()), p_event->get_axis_value() < 0 ? "-" : "+", desc); -} - -void InputMapEditor::_wait_for_key(const Ref<InputEvent> &p_event) { - Ref<InputEventKey> k = p_event; - - if (k.is_valid() && k->is_pressed() && k->get_keycode() != 0) { - last_wait_for_key = p_event; - const String str = (press_a_key_physical) ? keycode_get_string(k->get_physical_keycode_with_modifiers()) + TTR(" (Physical)") : keycode_get_string(k->get_keycode_with_modifiers()); - - press_a_key_label->set_text(str); - press_a_key->get_ok_button()->set_disabled(false); - press_a_key->set_input_as_handled(); - } -} - -void InputMapEditor::_edit_item(Ref<InputEvent> p_exiting_event) { - InputType ie_type; - - if ((Ref<InputEventKey>(p_exiting_event)).is_valid()) { - if ((Ref<InputEventKey>(p_exiting_event))->get_keycode() != 0) { - ie_type = INPUT_KEY; - } else { - ie_type = INPUT_KEY_PHYSICAL; - } - } else if ((Ref<InputEventJoypadButton>(p_exiting_event)).is_valid()) { - ie_type = INPUT_JOY_BUTTON; - } else if ((Ref<InputEventMouseButton>(p_exiting_event)).is_valid()) { - ie_type = INPUT_MOUSE_BUTTON; - } else if ((Ref<InputEventJoypadMotion>(p_exiting_event)).is_valid()) { - ie_type = INPUT_JOY_MOTION; - } else { - return; - } - - _add_item(ie_type, p_exiting_event); -} - -void InputMapEditor::_add_item(int p_item, Ref<InputEvent> p_exiting_event) { - add_type = InputType(p_item); - - switch (add_type) { - case INPUT_KEY: { - press_a_key_physical = false; - press_a_key_label->set_text(TTR("Press a Key...")); - press_a_key->get_ok_button()->set_disabled(true); - last_wait_for_key = Ref<InputEvent>(); - press_a_key->popup_centered(Size2(250, 80) * EDSCALE); - //press_a_key->grab_focus(); - - } break; - case INPUT_KEY_PHYSICAL: { - press_a_key_physical = true; - press_a_key_label->set_text(TTR("Press a Key...")); - - last_wait_for_key = Ref<InputEvent>(); - press_a_key->popup_centered(Size2(250, 80) * EDSCALE); - press_a_key->grab_focus(); - - } break; - case INPUT_MOUSE_BUTTON: { - device_index_label->set_text(TTR("Mouse Button Index:")); - device_index->clear(); - device_index->add_item(TTR("Left Button")); - device_index->add_item(TTR("Right Button")); - device_index->add_item(TTR("Middle Button")); - device_index->add_item(TTR("Wheel Up Button")); - device_index->add_item(TTR("Wheel Down Button")); - device_index->add_item(TTR("Wheel Left Button")); - device_index->add_item(TTR("Wheel Right Button")); - device_index->add_item(TTR("X Button 1")); - device_index->add_item(TTR("X Button 2")); - device_input->popup_centered(Size2(350, 95) * EDSCALE); - - Ref<InputEventMouseButton> mb = p_exiting_event; - if (mb.is_valid()) { - device_index->select(mb->get_button_index() - 1); - _set_current_device(mb->get_device()); - device_input->get_ok_button()->set_text(TTR("Change")); - } else { - _set_current_device(0); - device_input->get_ok_button()->set_text(TTR("Add")); - } - - } break; - case INPUT_JOY_MOTION: { - device_index_label->set_text(TTR("Joypad Axis Index:")); - device_index->clear(); - for (int i = 0; i < JOY_AXIS_MAX * 2; i++) { - Ref<InputEventJoypadMotion> jm; - jm.instance(); - jm->set_axis(i / 2); - jm->set_axis_value((i & 1) ? 1 : -1); - device_index->add_item(_get_joypad_motion_event_text(jm)); - } - device_input->popup_centered(Size2(350, 95) * EDSCALE); - - Ref<InputEventJoypadMotion> jm = p_exiting_event; - if (jm.is_valid()) { - device_index->select(jm->get_axis() * 2 + (jm->get_axis_value() > 0 ? 1 : 0)); - _set_current_device(jm->get_device()); - device_input->get_ok_button()->set_text(TTR("Change")); - } else { - _set_current_device(0); - device_input->get_ok_button()->set_text(TTR("Add")); - } - - } break; - case INPUT_JOY_BUTTON: { - device_index_label->set_text(TTR("Joypad Button Index:")); - device_index->clear(); - for (int i = 0; i < JOY_BUTTON_MAX; i++) { - Ref<InputEventJoypadButton> jb; - jb.instance(); - jb->set_button_index(i); - device_index->add_item(jb->as_text()); - } - device_input->popup_centered(Size2(350, 95) * EDSCALE); - - Ref<InputEventJoypadButton> jb = p_exiting_event; - if (jb.is_valid()) { - device_index->select(jb->get_button_index()); - _set_current_device(jb->get_device()); - device_input->get_ok_button()->set_text(TTR("Change")); - } else { - _set_current_device(0); - device_input->get_ok_button()->set_text(TTR("Add")); - } - - } break; - default: { - } - } -} - -void InputMapEditor::_action_activated() { - TreeItem *ti = input_editor->get_selected(); - - if (!ti || ti->get_parent() == input_editor->get_root()) { - return; - } - - String name = "input/" + ti->get_parent()->get_text(0); - Dictionary action = ProjectSettings::get_singleton()->get(name); - Array events = action["events"]; - int idx = ti->get_metadata(0); - - ERR_FAIL_INDEX(idx, events.size()); - Ref<InputEvent> event = events[idx]; - if (event.is_null()) { - return; - } - - add_at = name; - edit_idx = idx; - _edit_item(event); -} - -void InputMapEditor::_action_button_pressed(Object *p_obj, int p_column, int p_id) { - TreeItem *ti = Object::cast_to<TreeItem>(p_obj); - - ERR_FAIL_COND(!ti); - - if (p_id == 1) { - // Add action event - Point2 ofs = input_editor->get_global_position(); - Rect2 ir = input_editor->get_item_rect(ti); - ir.position.y -= input_editor->get_scroll().y; - ofs += ir.position + ir.size; - ofs.x -= 100; - popup_add->set_position(ofs); - popup_add->popup(); - add_at = "input/" + ti->get_text(0); - edit_idx = -1; - - } else if (p_id == 2) { - // Remove - - if (ti->get_parent() == input_editor->get_root()) { - // Remove action - String name = "input/" + ti->get_text(0); - Dictionary old_val = ProjectSettings::get_singleton()->get(name); - int order = ProjectSettings::get_singleton()->get_order(name); - - undo_redo->create_action(TTR("Erase Input Action")); - undo_redo->add_do_method(ProjectSettings::get_singleton(), "clear", name); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", name, old_val); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", name, order); - undo_redo->add_do_method(this, "_update_actions"); - undo_redo->add_undo_method(this, "_update_actions"); - undo_redo->add_do_method(this, "emit_signal", inputmap_changed); - undo_redo->add_undo_method(this, "emit_signal", inputmap_changed); - undo_redo->commit_action(); - - } else { - // Remove action event - String name = "input/" + ti->get_parent()->get_text(0); - Dictionary old_val = ProjectSettings::get_singleton()->get(name); - Dictionary action = old_val.duplicate(); - int idx = ti->get_metadata(0); - - Array events = action["events"]; - ERR_FAIL_INDEX(idx, events.size()); - events.remove(idx); - action["events"] = events; - - undo_redo->create_action(TTR("Erase Input Action Event")); - undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", name, action); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", name, old_val); - undo_redo->add_do_method(this, "_update_actions"); - undo_redo->add_undo_method(this, "_update_actions"); - undo_redo->add_do_method(this, "emit_signal", inputmap_changed); - undo_redo->add_undo_method(this, "emit_signal", inputmap_changed); - undo_redo->commit_action(); - } - } else if (p_id == 3) { - // Edit - - if (ti->get_parent() == input_editor->get_root()) { - // Edit action name - ti->set_as_cursor(0); - input_editor->edit_selected(); - - } else { - // Edit action event - String name = "input/" + ti->get_parent()->get_text(0); - int idx = ti->get_metadata(0); - Dictionary action = ProjectSettings::get_singleton()->get(name); - - Array events = action["events"]; - ERR_FAIL_INDEX(idx, events.size()); - - Ref<InputEvent> event = events[idx]; - - if (event.is_null()) { - return; - } - - ti->set_as_cursor(0); - add_at = name; - edit_idx = idx; - _edit_item(event); - } - } -} - -void InputMapEditor::_update_actions() { - if (setting) { - return; - } - - Map<String, bool> collapsed; - - if (input_editor->get_root() && input_editor->get_root()->get_children()) { - for (TreeItem *item = input_editor->get_root()->get_children(); item; item = item->get_next()) { - collapsed[item->get_text(0)] = item->is_collapsed(); - } - } - - input_editor->clear(); - TreeItem *root = input_editor->create_item(); - input_editor->set_hide_root(true); - - List<PropertyInfo> props; - ProjectSettings::get_singleton()->get_property_list(&props); - for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) { - const String property_name = E->get().name; - - if (!property_name.begins_with("input/")) { - continue; - } - - const String name = property_name.get_slice("/", 1); - - TreeItem *item = input_editor->create_item(root); - item->set_text(0, name); - item->set_custom_bg_color(0, input_editor->get_theme_color("prop_subsection", "Editor")); - if (collapsed.has(name)) { - item->set_collapsed(collapsed[name]); - } - - item->set_editable(1, true); - item->set_cell_mode(1, TreeItem::CELL_MODE_RANGE); - item->set_range_config(1, 0.0, 1.0, 0.01); - - item->set_custom_bg_color(1, input_editor->get_theme_color("prop_subsection", "Editor")); - - const bool is_builtin_input = ProjectSettings::get_singleton()->get_input_presets().find(property_name) != nullptr; - const String tooltip_remove = is_builtin_input ? TTR("Built-in actions can't be removed as they're used for UI navigation.") : TTR("Remove"); - item->add_button(2, input_editor->get_theme_icon("Add", "EditorIcons"), 1, false, TTR("Add Event")); - item->add_button(2, input_editor->get_theme_icon("Remove", "EditorIcons"), 2, false, tooltip_remove); - - if (is_builtin_input) { - item->set_button_disabled(2, 1, true); - } else { - item->set_editable(0, true); - } - - Dictionary action = ProjectSettings::get_singleton()->get(property_name); - Array events = action["events"]; - item->set_range(1, action["deadzone"]); - - for (int i = 0; i < events.size(); i++) { - Ref<InputEvent> event = events[i]; - if (event.is_null()) { - continue; - } - - TreeItem *action2 = input_editor->create_item(item); - - Ref<InputEventKey> k = event; - if (k.is_valid()) { - if (k->get_keycode() != 0) { - action2->set_text(0, keycode_get_string(k->get_keycode_with_modifiers())); - action2->set_icon(0, input_editor->get_theme_icon("Keyboard", "EditorIcons")); - } else { - action2->set_text(0, keycode_get_string(k->get_physical_keycode_with_modifiers()) + TTR(" (Physical)")); - action2->set_icon(0, input_editor->get_theme_icon("KeyboardPhysical", "EditorIcons")); - } - } - - Ref<InputEventJoypadButton> jb = event; - if (jb.is_valid()) { - action2->set_text(0, jb->as_text()); - action2->set_icon(0, input_editor->get_theme_icon("JoyButton", "EditorIcons")); - } - - Ref<InputEventMouseButton> mb = event; - if (mb.is_valid()) { - String str = _get_device_string(mb->get_device()) + ", "; - switch (mb->get_button_index()) { - case BUTTON_LEFT: - str += TTR("Left Button"); - break; - case BUTTON_RIGHT: - str += TTR("Right Button"); - break; - case BUTTON_MIDDLE: - str += TTR("Middle Button"); - break; - case BUTTON_WHEEL_UP: - str += TTR("Wheel Up"); - break; - case BUTTON_WHEEL_DOWN: - str += TTR("Wheel Down"); - break; - default: - str += vformat(TTR("%d Button"), mb->get_button_index()); - } - - action2->set_text(0, str); - action2->set_icon(0, input_editor->get_theme_icon("Mouse", "EditorIcons")); - } - - Ref<InputEventJoypadMotion> jm = event; - if (jm.is_valid()) { - device_index->add_item(_get_joypad_motion_event_text(jm)); - action2->set_text(0, jm->as_text()); - action2->set_icon(0, input_editor->get_theme_icon("JoyAxis", "EditorIcons")); - } - action2->set_metadata(0, i); - action2->set_meta("__input", event); - - action2->add_button(2, input_editor->get_theme_icon("Edit", "EditorIcons"), 3, false, TTR("Edit")); - action2->add_button(2, input_editor->get_theme_icon("Remove", "EditorIcons"), 2, false, TTR("Remove")); - // Fade out the individual event buttons slightly to make the - // Add/Remove buttons stand out more. - action2->set_button_color(2, 0, Color(1, 1, 1, 0.75)); - action2->set_button_color(2, 1, Color(1, 1, 1, 0.75)); - } - } - - _action_check(action_name->get_text()); -} - -void InputMapEditor::_action_check(String p_action) { - if (p_action == "") { - action_add->set_disabled(true); - } else { - if (!_validate_action_name(p_action)) { - action_add_error->set_text(TTR("Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or '\"'.")); - action_add_error->show(); - action_add->set_disabled(true); - return; - } - if (ProjectSettings::get_singleton()->has_setting("input/" + p_action)) { - action_add_error->set_text(vformat(TTR("An action with the name '%s' already exists."), p_action)); - action_add_error->show(); - action_add->set_disabled(true); - return; - } - - action_add->set_disabled(false); - } - - action_add_error->hide(); -} - -void InputMapEditor::_action_adds(String) { - if (!action_add->is_disabled()) { - _action_add(); - } -} - -void InputMapEditor::_action_add() { - Dictionary action; - action["events"] = Array(); - action["deadzone"] = 0.5f; - String name = "input/" + action_name->get_text(); - undo_redo->create_action(TTR("Add Input Action")); - undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", name, action); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "clear", name); - undo_redo->add_do_method(this, "_update_actions"); - undo_redo->add_undo_method(this, "_update_actions"); - undo_redo->add_do_method(this, "emit_signal", inputmap_changed); - undo_redo->add_undo_method(this, "emit_signal", inputmap_changed); - undo_redo->commit_action(); - - TreeItem *r = input_editor->get_root(); - - if (!r) { - return; - } - r = r->get_children(); - if (!r) { - return; - } - while (r->get_next()) { - r = r->get_next(); - } - - r->select(0); - input_editor->ensure_cursor_is_visible(); - action_add_error->hide(); - action_name->clear(); -} - -Variant InputMapEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from) { - TreeItem *selected = input_editor->get_selected(); - if (!selected || selected->get_parent() != input_editor->get_root()) { - return Variant(); - } - - String name = selected->get_text(0); - VBoxContainer *vb = memnew(VBoxContainer); - HBoxContainer *hb = memnew(HBoxContainer); - Label *label = memnew(Label(name)); - hb->set_modulate(Color(1, 1, 1, 1.0f)); - hb->add_child(label); - vb->add_child(hb); - input_editor->set_drag_preview(vb); - - Dictionary drag_data; - drag_data["type"] = "nodes"; - - input_editor->set_drop_mode_flags(Tree::DROP_MODE_INBETWEEN); - - return drag_data; -} - -bool InputMapEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const { - Dictionary d = p_data; - if (!d.has("type") || d["type"] != "nodes") { - return false; - } - - TreeItem *selected = input_editor->get_selected(); - TreeItem *item = input_editor->get_item_at_position(p_point); - if (!selected || !item || item == selected || item->get_parent() == selected) { - return false; - } - - return true; -} - -void InputMapEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) { - if (!can_drop_data_fw(p_point, p_data, p_from)) { - return; - } - - TreeItem *selected = input_editor->get_selected(); - TreeItem *item = input_editor->get_item_at_position(p_point); - if (!item) { - return; - } - TreeItem *target = item->get_parent() == input_editor->get_root() ? item : item->get_parent(); - - String selected_name = "input/" + selected->get_text(0); - int old_order = ProjectSettings::get_singleton()->get_order(selected_name); - String target_name = "input/" + target->get_text(0); - int target_order = ProjectSettings::get_singleton()->get_order(target_name); - - int order = old_order; - bool is_below = target_order > old_order; - TreeItem *iterator = is_below ? selected->get_next() : selected->get_prev(); - - undo_redo->create_action(TTR("Moved Input Action Event")); - while (iterator != target) { - String iterator_name = "input/" + iterator->get_text(0); - int iterator_order = ProjectSettings::get_singleton()->get_order(iterator_name); - undo_redo->add_do_method(ProjectSettings::get_singleton(), "set_order", iterator_name, order); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", iterator_name, iterator_order); - order = iterator_order; - iterator = is_below ? iterator->get_next() : iterator->get_prev(); - } - - undo_redo->add_do_method(ProjectSettings::get_singleton(), "set_order", target_name, order); - undo_redo->add_do_method(ProjectSettings::get_singleton(), "set_order", selected_name, target_order); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", target_name, target_order); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", selected_name, old_order); - - undo_redo->add_do_method(this, "_update_actions"); - undo_redo->add_undo_method(this, "_update_actions"); - undo_redo->add_do_method(this, "emit_signal", inputmap_changed); - undo_redo->add_undo_method(this, "emit_signal", inputmap_changed); - undo_redo->commit_action(); -} - -void InputMapEditor::_bind_methods() { - ClassDB::bind_method(D_METHOD("_update_actions"), &InputMapEditor::_update_actions); - - ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &InputMapEditor::get_drag_data_fw); - ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &InputMapEditor::can_drop_data_fw); - ClassDB::bind_method(D_METHOD("drop_data_fw"), &InputMapEditor::drop_data_fw); - - ADD_SIGNAL(MethodInfo("inputmap_changed")); -} - -InputMapEditor::InputMapEditor() { - undo_redo = EditorNode::get_undo_redo(); - press_a_key_physical = false; - inputmap_changed = "inputmap_changed"; - - VBoxContainer *vbc = memnew(VBoxContainer); - vbc->set_anchor_and_offset(SIDE_TOP, Control::ANCHOR_BEGIN, 0); - vbc->set_anchor_and_offset(SIDE_BOTTOM, Control::ANCHOR_END, 0); - vbc->set_anchor_and_offset(SIDE_LEFT, Control::ANCHOR_BEGIN, 0); - vbc->set_anchor_and_offset(SIDE_RIGHT, Control::ANCHOR_END, 0); - add_child(vbc); - - HBoxContainer *hbc = memnew(HBoxContainer); - vbc->add_child(hbc); - - Label *l = memnew(Label); - l->set_text(TTR("Action:")); - hbc->add_child(l); - - action_name = memnew(LineEdit); - action_name->set_h_size_flags(Control::SIZE_EXPAND_FILL); - action_name->connect("text_entered", callable_mp(this, &InputMapEditor::_action_adds)); - action_name->connect("text_changed", callable_mp(this, &InputMapEditor::_action_check)); - hbc->add_child(action_name); - - action_add_error = memnew(Label); - action_add_error->hide(); - hbc->add_child(action_add_error); - - Button *add = memnew(Button); - add->set_text(TTR("Add")); - add->set_disabled(true); - add->connect("pressed", callable_mp(this, &InputMapEditor::_action_add)); - hbc->add_child(add); - action_add = add; - - input_editor = memnew(Tree); - input_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL); - input_editor->set_columns(3); - input_editor->set_column_titles_visible(true); - input_editor->set_column_title(0, TTR("Action")); - input_editor->set_column_title(1, TTR("Deadzone")); - input_editor->set_column_expand(1, false); - input_editor->set_column_min_width(1, 80 * EDSCALE); - input_editor->set_column_expand(2, false); - input_editor->set_column_min_width(2, 50 * EDSCALE); - input_editor->connect("item_edited", callable_mp(this, &InputMapEditor::_action_edited)); - input_editor->connect("item_activated", callable_mp(this, &InputMapEditor::_action_activated)); - input_editor->connect("cell_selected", callable_mp(this, &InputMapEditor::_action_selected)); - input_editor->connect("button_pressed", callable_mp(this, &InputMapEditor::_action_button_pressed)); -#ifndef _MSC_VER -#warning need to make drag data forwarding to non controls happen -#endif - //input_editor->set_drag_forwarding(this); - vbc->add_child(input_editor); - - // Popups - - popup_add = memnew(PopupMenu); - popup_add->connect("id_pressed", callable_mp(this, &InputMapEditor::_add_item), make_binds(Ref<InputEvent>())); - add_child(popup_add); - - press_a_key = memnew(ConfirmationDialog); - press_a_key->get_ok_button()->set_disabled(true); - //press_a_key->set_focus_mode(Control::FOCUS_ALL); - press_a_key->connect("window_input", callable_mp(this, &InputMapEditor::_wait_for_key)); - press_a_key->connect("confirmed", callable_mp(this, &InputMapEditor::_press_a_key_confirm)); - add_child(press_a_key); - - l = memnew(Label); - l->set_text(TTR("Press a Key...")); - l->set_anchors_and_offsets_preset(Control::PRESET_WIDE); - l->set_align(Label::ALIGN_CENTER); - l->set_offset(SIDE_TOP, 20); - l->set_anchor_and_offset(SIDE_BOTTOM, Control::ANCHOR_BEGIN, 30); - press_a_key->add_child(l); - press_a_key_label = l; - - device_input = memnew(ConfirmationDialog); - device_input->get_ok_button()->set_text(TTR("Add")); - device_input->connect("confirmed", callable_mp(this, &InputMapEditor::_device_input_add)); - add_child(device_input); - - hbc = memnew(HBoxContainer); - device_input->add_child(hbc); - - VBoxContainer *vbc_left = memnew(VBoxContainer); - hbc->add_child(vbc_left); - - l = memnew(Label); - l->set_text(TTR("Device:")); - vbc_left->add_child(l); - - device_id = memnew(OptionButton); - for (int i = -1; i < 8; i++) { - device_id->add_item(_get_device_string(i)); - } - _set_current_device(0); - vbc_left->add_child(device_id); - - VBoxContainer *vbc_right = memnew(VBoxContainer); - vbc_right->set_h_size_flags(Control::SIZE_EXPAND_FILL); - hbc->add_child(vbc_right); - - l = memnew(Label); - l->set_text(TTR("Index:")); - vbc_right->add_child(l); - - device_index_label = l; - device_index = memnew(OptionButton); - device_index->set_clip_text(true); - vbc_right->add_child(device_index); - - message = memnew(AcceptDialog); - add_child(message); -} diff --git a/editor/input_map_editor.h b/editor/input_map_editor.h deleted file mode 100644 index cc6ac1660d..0000000000 --- a/editor/input_map_editor.h +++ /dev/null @@ -1,109 +0,0 @@ -/*************************************************************************/ -/* input_map_editor.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_MAP_EDITOR_H -#define INPUT_MAP_EDITOR_H - -#include "core/object/undo_redo.h" -#include "editor/editor_data.h" - -class InputMapEditor : public Control { - GDCLASS(InputMapEditor, Control); - - enum InputType { - INPUT_KEY, - INPUT_KEY_PHYSICAL, - INPUT_JOY_BUTTON, - INPUT_JOY_MOTION, - INPUT_MOUSE_BUTTON - }; - - Tree *input_editor; - LineEdit *action_name; - Button *action_add; - Label *action_add_error; - - InputType add_type; - String add_at; - int edit_idx; - - PopupMenu *popup_add; - ConfirmationDialog *press_a_key; - bool press_a_key_physical; - Label *press_a_key_label; - ConfirmationDialog *device_input; - OptionButton *device_id; - OptionButton *device_index; - Label *device_index_label; - MenuButton *popup_copy_to_feature; - - Ref<InputEventKey> last_wait_for_key; - - AcceptDialog *message; - UndoRedo *undo_redo; - String inputmap_changed; - bool setting = false; - - void _update_actions(); - void _add_item(int p_item, Ref<InputEvent> p_exiting_event = Ref<InputEvent>()); - void _edit_item(Ref<InputEvent> p_exiting_event); - - void _action_check(String p_action); - void _action_adds(String); - void _action_add(); - void _device_input_add(); - - void _action_selected(); - void _action_edited(); - void _action_activated(); - void _action_button_pressed(Object *p_obj, int p_column, int p_id); - void _wait_for_key(const Ref<InputEvent> &p_event); - void _press_a_key_confirm(); - void _show_last_added(const Ref<InputEvent> &p_event, const String &p_name); - - String _get_joypad_motion_event_text(const Ref<InputEventJoypadMotion> &p_event); - - Variant get_drag_data_fw(const Point2 &p_point, Control *p_from); - 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); - -protected: - int _get_current_device(); - void _set_current_device(int i_device); - String _get_device_string(int i_device); - - void _notification(int p_what); - static void _bind_methods(); - -public: - InputMapEditor(); -}; - -#endif // INPUT_MAP_EDITOR_H diff --git a/editor/localization_editor.cpp b/editor/localization_editor.cpp index 60553143d5..0e68af06f0 100644 --- a/editor/localization_editor.cpp +++ b/editor/localization_editor.cpp @@ -84,7 +84,7 @@ void LocalizationEditor::add_translation(const String &p_translation) { } void LocalizationEditor::_translation_add(const PackedStringArray &p_paths) { - PackedStringArray translations = ProjectSettings::get_singleton()->get("locale/translations"); + PackedStringArray translations = ProjectSettings::get_singleton()->get("internationalization/locale/translations"); for (int i = 0; i < p_paths.size(); i++) { if (!translations.has(p_paths[i])) { // Don't add duplicate translation paths. @@ -93,8 +93,8 @@ void LocalizationEditor::_translation_add(const PackedStringArray &p_paths) { } undo_redo->create_action(vformat(TTR("Add %d Translations"), p_paths.size())); - undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translations", translations); - undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translations", ProjectSettings::get_singleton()->get("locale/translations")); + undo_redo->add_do_property(ProjectSettings::get_singleton(), "internationalization/locale/translations", translations); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), "internationalization/locale/translations", ProjectSettings::get_singleton()->get("internationalization/locale/translations")); undo_redo->add_do_method(this, "update_translations"); undo_redo->add_undo_method(this, "update_translations"); undo_redo->add_do_method(this, "emit_signal", localization_changed); @@ -112,15 +112,15 @@ void LocalizationEditor::_translation_delete(Object *p_item, int p_column, int p int idx = ti->get_metadata(0); - PackedStringArray translations = ProjectSettings::get_singleton()->get("locale/translations"); + PackedStringArray translations = ProjectSettings::get_singleton()->get("internationalization/locale/translations"); ERR_FAIL_INDEX(idx, translations.size()); translations.remove(idx); undo_redo->create_action(TTR("Remove Translation")); - undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translations", translations); - undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translations", ProjectSettings::get_singleton()->get("locale/translations")); + undo_redo->add_do_property(ProjectSettings::get_singleton(), "internationalization/locale/translations", translations); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), "internationalization/locale/translations", ProjectSettings::get_singleton()->get("internationalization/locale/translations")); undo_redo->add_do_method(this, "update_translations"); undo_redo->add_undo_method(this, "update_translations"); undo_redo->add_do_method(this, "emit_signal", localization_changed); @@ -136,8 +136,8 @@ void LocalizationEditor::_translation_res_add(const PackedStringArray &p_paths) Variant prev; Dictionary remaps; - if (ProjectSettings::get_singleton()->has_setting("locale/translation_remaps")) { - remaps = ProjectSettings::get_singleton()->get("locale/translation_remaps"); + if (ProjectSettings::get_singleton()->has_setting("internationalization/locale/translation_remaps")) { + remaps = ProjectSettings::get_singleton()->get("internationalization/locale/translation_remaps"); prev = remaps; } @@ -149,8 +149,8 @@ void LocalizationEditor::_translation_res_add(const PackedStringArray &p_paths) } undo_redo->create_action(vformat(TTR("Translation Resource Remap: Add %d Path(s)"), p_paths.size())); - undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translation_remaps", remaps); - undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translation_remaps", prev); + undo_redo->add_do_property(ProjectSettings::get_singleton(), "internationalization/locale/translation_remaps", remaps); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), "internationalization/locale/translation_remaps", prev); undo_redo->add_do_method(this, "update_translations"); undo_redo->add_undo_method(this, "update_translations"); undo_redo->add_do_method(this, "emit_signal", localization_changed); @@ -163,9 +163,9 @@ void LocalizationEditor::_translation_res_option_file_open() { } void LocalizationEditor::_translation_res_option_add(const PackedStringArray &p_paths) { - ERR_FAIL_COND(!ProjectSettings::get_singleton()->has_setting("locale/translation_remaps")); + ERR_FAIL_COND(!ProjectSettings::get_singleton()->has_setting("internationalization/locale/translation_remaps")); - Dictionary remaps = ProjectSettings::get_singleton()->get("locale/translation_remaps"); + Dictionary remaps = ProjectSettings::get_singleton()->get("internationalization/locale/translation_remaps"); TreeItem *k = translation_remap->get_selected(); ERR_FAIL_COND(!k); @@ -180,8 +180,8 @@ void LocalizationEditor::_translation_res_option_add(const PackedStringArray &p_ remaps[key] = r; undo_redo->create_action(vformat(TTR("Translation Resource Remap: Add %d Remap(s)"), p_paths.size())); - undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translation_remaps", remaps); - undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translation_remaps", ProjectSettings::get_singleton()->get("locale/translation_remaps")); + undo_redo->add_do_property(ProjectSettings::get_singleton(), "internationalization/locale/translation_remaps", remaps); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), "internationalization/locale/translation_remaps", ProjectSettings::get_singleton()->get("internationalization/locale/translation_remaps")); undo_redo->add_do_method(this, "update_translations"); undo_redo->add_undo_method(this, "update_translations"); undo_redo->add_do_method(this, "emit_signal", localization_changed); @@ -202,11 +202,11 @@ void LocalizationEditor::_translation_res_option_changed() { return; } - if (!ProjectSettings::get_singleton()->has_setting("locale/translation_remaps")) { + if (!ProjectSettings::get_singleton()->has_setting("internationalization/locale/translation_remaps")) { return; } - Dictionary remaps = ProjectSettings::get_singleton()->get("locale/translation_remaps"); + Dictionary remaps = ProjectSettings::get_singleton()->get("internationalization/locale/translation_remaps"); TreeItem *k = translation_remap->get_selected(); ERR_FAIL_COND(!k); @@ -234,8 +234,8 @@ void LocalizationEditor::_translation_res_option_changed() { updating_translations = true; undo_redo->create_action(TTR("Change Resource Remap Language")); - undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translation_remaps", remaps); - undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translation_remaps", ProjectSettings::get_singleton()->get("locale/translation_remaps")); + undo_redo->add_do_property(ProjectSettings::get_singleton(), "internationalization/locale/translation_remaps", remaps); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), "internationalization/locale/translation_remaps", ProjectSettings::get_singleton()->get("internationalization/locale/translation_remaps")); undo_redo->add_do_method(this, "update_translations"); undo_redo->add_undo_method(this, "update_translations"); undo_redo->add_do_method(this, "emit_signal", localization_changed); @@ -249,11 +249,11 @@ void LocalizationEditor::_translation_res_delete(Object *p_item, int p_column, i return; } - if (!ProjectSettings::get_singleton()->has_setting("locale/translation_remaps")) { + if (!ProjectSettings::get_singleton()->has_setting("internationalization/locale/translation_remaps")) { return; } - Dictionary remaps = ProjectSettings::get_singleton()->get("locale/translation_remaps"); + Dictionary remaps = ProjectSettings::get_singleton()->get("internationalization/locale/translation_remaps"); TreeItem *k = Object::cast_to<TreeItem>(p_item); @@ -263,8 +263,8 @@ void LocalizationEditor::_translation_res_delete(Object *p_item, int p_column, i remaps.erase(key); undo_redo->create_action(TTR("Remove Resource Remap")); - undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translation_remaps", remaps); - undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translation_remaps", ProjectSettings::get_singleton()->get("locale/translation_remaps")); + undo_redo->add_do_property(ProjectSettings::get_singleton(), "internationalization/locale/translation_remaps", remaps); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), "internationalization/locale/translation_remaps", ProjectSettings::get_singleton()->get("internationalization/locale/translation_remaps")); undo_redo->add_do_method(this, "update_translations"); undo_redo->add_undo_method(this, "update_translations"); undo_redo->add_do_method(this, "emit_signal", localization_changed); @@ -277,11 +277,11 @@ void LocalizationEditor::_translation_res_option_delete(Object *p_item, int p_co return; } - if (!ProjectSettings::get_singleton()->has_setting("locale/translation_remaps")) { + if (!ProjectSettings::get_singleton()->has_setting("internationalization/locale/translation_remaps")) { return; } - Dictionary remaps = ProjectSettings::get_singleton()->get("locale/translation_remaps"); + Dictionary remaps = ProjectSettings::get_singleton()->get("internationalization/locale/translation_remaps"); TreeItem *k = translation_remap->get_selected(); ERR_FAIL_COND(!k); @@ -298,8 +298,8 @@ void LocalizationEditor::_translation_res_option_delete(Object *p_item, int p_co remaps[key] = r; undo_redo->create_action(TTR("Remove Resource Remap Option")); - undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translation_remaps", remaps); - undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translation_remaps", ProjectSettings::get_singleton()->get("locale/translation_remaps")); + undo_redo->add_do_property(ProjectSettings::get_singleton(), "internationalization/locale/translation_remaps", remaps); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), "internationalization/locale/translation_remaps", ProjectSettings::get_singleton()->get("internationalization/locale/translation_remaps")); undo_redo->add_do_method(this, "update_translations"); undo_redo->add_undo_method(this, "update_translations"); undo_redo->add_do_method(this, "emit_signal", localization_changed); @@ -316,8 +316,8 @@ void LocalizationEditor::_translation_filter_option_changed() { Variant prev; Array f_locales_all; - if (ProjectSettings::get_singleton()->has_setting("locale/locale_filter")) { - f_locales_all = ProjectSettings::get_singleton()->get("locale/locale_filter"); + if (ProjectSettings::get_singleton()->has_setting("internationalization/locale/locale_filter")) { + f_locales_all = ProjectSettings::get_singleton()->get("internationalization/locale/locale_filter"); prev = f_locales_all; if (f_locales_all.size() != 2) { @@ -346,8 +346,8 @@ void LocalizationEditor::_translation_filter_option_changed() { f_locales.sort(); undo_redo->create_action(TTR("Changed Locale Filter")); - undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/locale_filter", f_locales_all); - undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/locale_filter", prev); + undo_redo->add_do_property(ProjectSettings::get_singleton(), "internationalization/locale/locale_filter", f_locales_all); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), "internationalization/locale/locale_filter", prev); undo_redo->add_do_method(this, "update_translations"); undo_redo->add_undo_method(this, "update_translations"); undo_redo->add_do_method(this, "emit_signal", localization_changed); @@ -361,8 +361,8 @@ void LocalizationEditor::_translation_filter_mode_changed(int p_mode) { Variant prev; Array f_locales_all; - if (ProjectSettings::get_singleton()->has_setting("locale/locale_filter")) { - f_locales_all = ProjectSettings::get_singleton()->get("locale/locale_filter"); + if (ProjectSettings::get_singleton()->has_setting("internationalization/locale/locale_filter")) { + f_locales_all = ProjectSettings::get_singleton()->get("internationalization/locale/locale_filter"); prev = f_locales_all; if (f_locales_all.size() != 2) { @@ -378,8 +378,8 @@ void LocalizationEditor::_translation_filter_mode_changed(int p_mode) { } undo_redo->create_action(TTR("Changed Locale Filter Mode")); - undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/locale_filter", f_locales_all); - undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/locale_filter", prev); + undo_redo->add_do_property(ProjectSettings::get_singleton(), "internationalization/locale/locale_filter", f_locales_all); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), "internationalization/locale/locale_filter", prev); undo_redo->add_do_method(this, "update_translations"); undo_redo->add_undo_method(this, "update_translations"); undo_redo->add_do_method(this, "emit_signal", localization_changed); @@ -388,7 +388,7 @@ void LocalizationEditor::_translation_filter_mode_changed(int p_mode) { } void LocalizationEditor::_pot_add(const PackedStringArray &p_paths) { - PackedStringArray pot_translations = ProjectSettings::get_singleton()->get("locale/translations_pot_files"); + PackedStringArray pot_translations = ProjectSettings::get_singleton()->get("internationalization/locale/translations_pot_files"); for (int i = 0; i < p_paths.size(); i++) { for (int j = 0; j < pot_translations.size(); j++) { @@ -401,8 +401,8 @@ void LocalizationEditor::_pot_add(const PackedStringArray &p_paths) { } undo_redo->create_action(vformat(TTR("Add %d file(s) for POT generation"), p_paths.size())); - undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translations_pot_files", pot_translations); - undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translations_pot_files", ProjectSettings::get_singleton()->get("locale/translations_pot_files")); + undo_redo->add_do_property(ProjectSettings::get_singleton(), "internationalization/locale/translations_pot_files", pot_translations); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), "internationalization/locale/translations_pot_files", ProjectSettings::get_singleton()->get("internationalization/locale/translations_pot_files")); undo_redo->add_do_method(this, "update_translations"); undo_redo->add_undo_method(this, "update_translations"); undo_redo->add_do_method(this, "emit_signal", localization_changed); @@ -416,15 +416,15 @@ void LocalizationEditor::_pot_delete(Object *p_item, int p_column, int p_button) int idx = ti->get_metadata(0); - PackedStringArray pot_translations = ProjectSettings::get_singleton()->get("locale/translations_pot_files"); + PackedStringArray pot_translations = ProjectSettings::get_singleton()->get("internationalization/locale/translations_pot_files"); ERR_FAIL_INDEX(idx, pot_translations.size()); pot_translations.remove(idx); undo_redo->create_action(TTR("Remove file from POT generation")); - undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translations_pot_files", pot_translations); - undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translations_pot_files", ProjectSettings::get_singleton()->get("locale/translations_pot_files")); + undo_redo->add_do_property(ProjectSettings::get_singleton(), "internationalization/locale/translations_pot_files", pot_translations); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), "internationalization/locale/translations_pot_files", ProjectSettings::get_singleton()->get("internationalization/locale/translations_pot_files")); undo_redo->add_do_method(this, "update_translations"); undo_redo->add_undo_method(this, "update_translations"); undo_redo->add_do_method(this, "emit_signal", localization_changed); @@ -463,8 +463,8 @@ void LocalizationEditor::update_translations() { translation_list->clear(); TreeItem *root = translation_list->create_item(nullptr); translation_list->set_hide_root(true); - if (ProjectSettings::get_singleton()->has_setting("locale/translations")) { - PackedStringArray translations = ProjectSettings::get_singleton()->get("locale/translations"); + if (ProjectSettings::get_singleton()->has_setting("internationalization/locale/translations")) { + PackedStringArray translations = ProjectSettings::get_singleton()->get("internationalization/locale/translations"); for (int i = 0; i < translations.size(); i++) { TreeItem *t = translation_list->create_item(root); t->set_editable(0, false); @@ -482,8 +482,8 @@ void LocalizationEditor::update_translations() { Array l_filter_all; bool is_arr_empty = true; - if (ProjectSettings::get_singleton()->has_setting("locale/locale_filter")) { - l_filter_all = ProjectSettings::get_singleton()->get("locale/locale_filter"); + if (ProjectSettings::get_singleton()->has_setting("internationalization/locale/locale_filter")) { + l_filter_all = ProjectSettings::get_singleton()->get("internationalization/locale/locale_filter"); if (l_filter_all.size() == 2) { translation_locale_filter_mode->select(l_filter_all[0]); @@ -573,8 +573,8 @@ void LocalizationEditor::update_translations() { } } - if (ProjectSettings::get_singleton()->has_setting("locale/translation_remaps")) { - Dictionary remaps = ProjectSettings::get_singleton()->get("locale/translation_remaps"); + if (ProjectSettings::get_singleton()->has_setting("internationalization/locale/translation_remaps")) { + Dictionary remaps = ProjectSettings::get_singleton()->get("internationalization/locale/translation_remaps"); List<Variant> rk; remaps.get_key_list(&rk); Vector<String> keys; @@ -631,8 +631,8 @@ void LocalizationEditor::update_translations() { translation_pot_list->clear(); root = translation_pot_list->create_item(nullptr); translation_pot_list->set_hide_root(true); - if (ProjectSettings::get_singleton()->has_setting("locale/translations_pot_files")) { - PackedStringArray pot_translations = ProjectSettings::get_singleton()->get("locale/translations_pot_files"); + if (ProjectSettings::get_singleton()->has_setting("internationalization/locale/translations_pot_files")) { + PackedStringArray pot_translations = ProjectSettings::get_singleton()->get("internationalization/locale/translations_pot_files"); for (int i = 0; i < pot_translations.size(); i++) { TreeItem *t = translation_pot_list->create_item(root); t->set_editable(0, false); diff --git a/editor/node_3d_editor_gizmos.cpp b/editor/node_3d_editor_gizmos.cpp index bd825d0802..9e2fb01bb8 100644 --- a/editor/node_3d_editor_gizmos.cpp +++ b/editor/node_3d_editor_gizmos.cpp @@ -557,7 +557,7 @@ bool EditorNode3DGizmo::intersect_ray(Camera3D *p_camera, const Point2 &p_point, Transform t = spatial_node->get_global_transform(); Vector3 camera_position = p_camera->get_camera_transform().origin; if (camera_position.distance_squared_to(t.origin) > 0.01) { - t.set_look_at(t.origin, camera_position, Vector3(0, 1, 0)); + t.set_look_at(t.origin, camera_position); } float scale = t.origin.distance_to(p_camera->get_camera_transform().origin); @@ -574,7 +574,7 @@ bool EditorNode3DGizmo::intersect_ray(Camera3D *p_camera, const Point2 &p_point, if (orig_camera_transform.origin.distance_squared_to(t.origin) > 0.01 && ABS(orig_camera_transform.basis.get_axis(Vector3::AXIS_Z).dot(Vector3(0, 1, 0))) < 0.99) { - p_camera->look_at(t.origin, Vector3(0, 1, 0)); + p_camera->look_at(t.origin); } Vector3 c0 = t.xform(Vector3(selectable_icon_size, selectable_icon_size, 0) * scale); diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp index cda88c00f3..7c623505b5 100644 --- a/editor/plugins/animation_player_editor_plugin.cpp +++ b/editor/plugins/animation_player_editor_plugin.cpp @@ -1397,7 +1397,7 @@ void AnimationPlayerEditor::_prepare_onion_layers_2() { // Render every past/future step with the capture shader. RS::get_singleton()->canvas_item_set_material(onion.capture.canvas_item, onion.capture.material->get_rid()); - onion.capture.material->set_shader_param("bkg_color", GLOBAL_GET("rendering/environment/default_clear_color")); + onion.capture.material->set_shader_param("bkg_color", GLOBAL_GET("rendering/environment/defaults/default_clear_color")); onion.capture.material->set_shader_param("differences_only", onion.differences_only); onion.capture.material->set_shader_param("present", onion.differences_only ? RS::get_singleton()->viewport_get_texture(present_rid) : RID()); diff --git a/editor/plugins/asset_library_editor_plugin.cpp b/editor/plugins/asset_library_editor_plugin.cpp index d726cd031e..4d9c5625a3 100644 --- a/editor/plugins/asset_library_editor_plugin.cpp +++ b/editor/plugins/asset_library_editor_plugin.cpp @@ -350,7 +350,7 @@ void EditorAssetLibraryItemDownload::_http_download_completed(int p_status, int if (sha256 != download_sha256) { error_text = TTR("Bad download hash, assuming file has been tampered with.") + "\n"; error_text += TTR("Expected:") + " " + sha256 + "\n" + TTR("Got:") + " " + download_sha256; - status->set_text(TTR("Failed sha256 hash check")); + status->set_text(TTR("Failed SHA-256 hash check")); } } } break; @@ -359,6 +359,8 @@ void EditorAssetLibraryItemDownload::_http_download_completed(int p_status, int if (error_text != String()) { download_error->set_text(TTR("Asset Download Error:") + "\n" + error_text); download_error->popup_centered(); + // Let the user retry the download. + retry->show(); return; } @@ -459,6 +461,9 @@ void EditorAssetLibraryItemDownload::_install() { } void EditorAssetLibraryItemDownload::_make_request() { + // Hide the Retry button if we've just pressed it. + retry->hide(); + download->cancel_request(); download->set_download_file(EditorSettings::get_singleton()->get_cache_dir().plus_file("tmp_asset_" + itos(asset_id)) + ".zip"); @@ -516,6 +521,8 @@ EditorAssetLibraryItemDownload::EditorAssetLibraryItemDownload() { retry = memnew(Button); retry->set_text(TTR("Retry")); retry->connect("pressed", callable_mp(this, &EditorAssetLibraryItemDownload::_make_request)); + // Only show the Retry button in case of a failure. + retry->hide(); hb2->add_child(retry); hb2->add_child(install); diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index d92837b68d..6fa3c923eb 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -629,9 +629,9 @@ void CanvasItemEditor::_get_canvas_items_at_pos(const Point2 &p_pos, Vector<_Sel Node *node = r_items[i].item; // Make sure the selected node is in the current scene, or editable - while (node && node != get_tree()->get_edited_scene_root() && node->get_owner() != scene && !scene->is_editable_instance(node->get_owner())) { - node = node->get_parent(); - }; + if (node && node != get_tree()->get_edited_scene_root()) { + node = scene->get_deepest_editable_node(node); + } CanvasItem *canvas_item = Object::cast_to<CanvasItem>(node); if (!p_allow_locked) { @@ -762,7 +762,7 @@ void CanvasItemEditor::_find_canvas_items_in_rect(const Rect2 &p_rect, Node *p_n CanvasItem *canvas_item = Object::cast_to<CanvasItem>(p_node); Node *scene = editor->get_edited_scene(); - bool editable = p_node == scene || p_node->get_owner() == scene || scene->is_editable_instance(p_node->get_owner()); + bool editable = p_node == scene || p_node->get_owner() == scene || p_node == scene->get_deepest_editable_node(p_node); bool lock_children = p_node->has_meta("_edit_group_") && p_node->get_meta("_edit_group_"); bool locked = _is_node_locked(p_node); @@ -3867,7 +3867,7 @@ bool CanvasItemEditor::_build_bones_list(Node *p_node) { CanvasItem *canvas_item = Object::cast_to<CanvasItem>(p_node); Node *scene = editor->get_edited_scene(); - if (!canvas_item || !canvas_item->is_visible() || (canvas_item != scene && canvas_item->get_owner() != scene && !scene->is_editable_instance(canvas_item->get_owner()))) { + if (!canvas_item || !canvas_item->is_visible() || (canvas_item != scene && canvas_item->get_owner() != scene && canvas_item != scene->get_deepest_editable_node(canvas_item))) { return false; } diff --git a/editor/plugins/editor_preview_plugins.cpp b/editor/plugins/editor_preview_plugins.cpp index 63bb785c5e..eb3c06fba1 100644 --- a/editor/plugins/editor_preview_plugins.cpp +++ b/editor/plugins/editor_preview_plugins.cpp @@ -301,7 +301,7 @@ EditorPackedScenePreviewPlugin::EditorPackedScenePreviewPlugin() { ////////////////////////////////////////////////////////////////// void EditorMaterialPreviewPlugin::_preview_done(const Variant &p_udata) { - preview_done = true; + preview_done.set(); } void EditorMaterialPreviewPlugin::_bind_methods() { @@ -325,10 +325,10 @@ Ref<Texture2D> EditorMaterialPreviewPlugin::generate(const RES &p_from, const Si RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_ONCE); //once used for capture - preview_done = false; + preview_done.clear(); RS::get_singleton()->request_frame_drawn_callback(const_cast<EditorMaterialPreviewPlugin *>(this), "_preview_done", Variant()); - while (!preview_done) { + while (!preview_done.is_set()) { OS::get_singleton()->delay_usec(10); } @@ -677,7 +677,7 @@ EditorAudioStreamPreviewPlugin::EditorAudioStreamPreviewPlugin() { /////////////////////////////////////////////////////////////////////////// void EditorMeshPreviewPlugin::_preview_done(const Variant &p_udata) { - preview_done = true; + preview_done.set(); } void EditorMeshPreviewPlugin::_bind_methods() { @@ -714,10 +714,10 @@ Ref<Texture2D> EditorMeshPreviewPlugin::generate(const RES &p_from, const Size2 RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_ONCE); //once used for capture - preview_done = false; + preview_done.clear(); RS::get_singleton()->request_frame_drawn_callback(const_cast<EditorMeshPreviewPlugin *>(this), "_preview_done", Variant()); - while (!preview_done) { + while (!preview_done.is_set()) { OS::get_singleton()->delay_usec(10); } @@ -792,7 +792,7 @@ EditorMeshPreviewPlugin::~EditorMeshPreviewPlugin() { /////////////////////////////////////////////////////////////////////////// void EditorFontPreviewPlugin::_preview_done(const Variant &p_udata) { - preview_done = true; + preview_done.set(); } void EditorFontPreviewPlugin::_bind_methods() { @@ -883,11 +883,11 @@ Ref<Texture2D> EditorFontPreviewPlugin::generate_from_path(const String &p_path, font->draw_string(canvas_item, pos, sample, HALIGN_LEFT, -1.f, 50, Color(1, 1, 1)); - preview_done = false; + preview_done.clear(); RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_ONCE); //once used for capture RS::get_singleton()->request_frame_drawn_callback(const_cast<EditorFontPreviewPlugin *>(this), "_preview_done", Variant()); - while (!preview_done) { + while (!preview_done.is_set()) { OS::get_singleton()->delay_usec(10); } diff --git a/editor/plugins/editor_preview_plugins.h b/editor/plugins/editor_preview_plugins.h index 57e2911c89..6e8b9a34cf 100644 --- a/editor/plugins/editor_preview_plugins.h +++ b/editor/plugins/editor_preview_plugins.h @@ -33,6 +33,8 @@ #include "editor/editor_resource_preview.h" +#include "core/templates/safe_refcount.h" + void post_process_preview(Ref<Image> p_image); class EditorTexturePreviewPlugin : public EditorResourcePreviewGenerator { @@ -90,7 +92,7 @@ class EditorMaterialPreviewPlugin : public EditorResourcePreviewGenerator { RID light2; RID light_instance2; RID camera; - mutable volatile bool preview_done = false; + mutable SafeFlag preview_done; void _preview_done(const Variant &p_udata); @@ -134,7 +136,7 @@ class EditorMeshPreviewPlugin : public EditorResourcePreviewGenerator { RID light2; RID light_instance2; RID camera; - mutable volatile bool preview_done = false; + mutable SafeFlag preview_done; void _preview_done(const Variant &p_udata); @@ -156,7 +158,7 @@ class EditorFontPreviewPlugin : public EditorResourcePreviewGenerator { RID viewport_texture; RID canvas; RID canvas_item; - mutable volatile bool preview_done = false; + mutable SafeFlag preview_done; void _preview_done(const Variant &p_udata); diff --git a/editor/plugins/gpu_particles_2d_editor_plugin.cpp b/editor/plugins/gpu_particles_2d_editor_plugin.cpp index 1aaa98d02e..b447304a3f 100644 --- a/editor/plugins/gpu_particles_2d_editor_plugin.cpp +++ b/editor/plugins/gpu_particles_2d_editor_plugin.cpp @@ -81,7 +81,7 @@ void GPUParticles2DEditorPlugin::_menu_callback(int p_idx) { cpu_particles->set_name(particles->get_name()); cpu_particles->set_transform(particles->get_transform()); cpu_particles->set_visible(particles->is_visible()); - cpu_particles->set_pause_mode(particles->get_pause_mode()); + cpu_particles->set_process_mode(particles->get_process_mode()); cpu_particles->set_z_index(particles->get_z_index()); UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); diff --git a/editor/plugins/gpu_particles_3d_editor_plugin.cpp b/editor/plugins/gpu_particles_3d_editor_plugin.cpp index 5b840ddbcf..433a5ae51c 100644 --- a/editor/plugins/gpu_particles_3d_editor_plugin.cpp +++ b/editor/plugins/gpu_particles_3d_editor_plugin.cpp @@ -263,7 +263,7 @@ void GPUParticles3DEditor::_menu_option(int p_option) { cpu_particles->set_name(node->get_name()); cpu_particles->set_transform(node->get_transform()); cpu_particles->set_visible(node->is_visible()); - cpu_particles->set_pause_mode(node->get_pause_mode()); + cpu_particles->set_process_mode(node->get_process_mode()); UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); ur->create_action(TTR("Convert to CPUParticles3D")); diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index c591e7f42d..10698330bf 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -48,6 +48,7 @@ #include "scene/3d/mesh_instance_3d.h" #include "scene/3d/physics_body_3d.h" #include "scene/3d/visual_instance_3d.h" +#include "scene/gui/center_container.h" #include "scene/gui/subviewport_container.h" #include "scene/resources/packed_scene.h" #include "scene/resources/surface_tool.h" @@ -534,10 +535,7 @@ ObjectID Node3DEditorViewport::_select_ray(const Point2 &p_pos, bool p_append, b } if (dist < closest_dist) { - item = Object::cast_to<Node>(spat); - while (item->get_owner() && item->get_owner() != edited_scene && !edited_scene->is_editable_instance(item->get_owner())) { - item = item->get_owner(); - } + item = edited_scene->get_deepest_editable_node(Object::cast_to<Node>(spat)); closest = item->get_instance_id(); closest_dist = dist; @@ -696,10 +694,7 @@ void Node3DEditorViewport::_select_region() { continue; } - Node *item = Object::cast_to<Node>(sp); - while (item->get_owner() && item->get_owner() != edited_scene && !edited_scene->is_editable_instance(item->get_owner())) { - item = item->get_owner(); - } + Node *item = edited_scene->get_deepest_editable_node(Object::cast_to<Node>(sp)); // Replace the node by the group if grouped if (item->is_class("Node3D")) { @@ -1027,7 +1022,7 @@ void Node3DEditorViewport::_list_select(Ref<InputEventMouseButton> b) { for (int i = 0; i < selection_results.size(); i++) { Node3D *item = selection_results[i].item; - if (item != scene && item->get_owner() != scene && !scene->is_editable_instance(item->get_owner())) { + if (item != scene && item->get_owner() != scene && item != scene->get_deepest_editable_node(item)) { //invalid result selection_results.remove(i); i--; @@ -2337,12 +2332,12 @@ void Node3DEditorPlugin::edited_scene_changed() { void Node3DEditorViewport::_project_settings_changed() { //update shadow atlas if changed - int shadowmap_size = ProjectSettings::get_singleton()->get("rendering/quality/shadow_atlas/size"); - bool shadowmap_16_bits = ProjectSettings::get_singleton()->get("rendering/quality/shadow_atlas/16_bits"); - int atlas_q0 = ProjectSettings::get_singleton()->get("rendering/quality/shadow_atlas/quadrant_0_subdiv"); - int atlas_q1 = ProjectSettings::get_singleton()->get("rendering/quality/shadow_atlas/quadrant_1_subdiv"); - int atlas_q2 = ProjectSettings::get_singleton()->get("rendering/quality/shadow_atlas/quadrant_2_subdiv"); - int atlas_q3 = ProjectSettings::get_singleton()->get("rendering/quality/shadow_atlas/quadrant_3_subdiv"); + int shadowmap_size = ProjectSettings::get_singleton()->get("rendering/shadows/shadow_atlas/size"); + bool shadowmap_16_bits = ProjectSettings::get_singleton()->get("rendering/shadows/shadow_atlas/16_bits"); + int atlas_q0 = ProjectSettings::get_singleton()->get("rendering/shadows/shadow_atlas/quadrant_0_subdiv"); + int atlas_q1 = ProjectSettings::get_singleton()->get("rendering/shadows/shadow_atlas/quadrant_1_subdiv"); + int atlas_q2 = ProjectSettings::get_singleton()->get("rendering/shadows/shadow_atlas/quadrant_2_subdiv"); + int atlas_q3 = ProjectSettings::get_singleton()->get("rendering/shadows/shadow_atlas/quadrant_3_subdiv"); viewport->set_shadow_atlas_size(shadowmap_size); viewport->set_shadow_atlas_16_bits(shadowmap_16_bits); @@ -2359,11 +2354,11 @@ void Node3DEditorViewport::_project_settings_changed() { // Update MSAA, screen-space AA and debanding if changed - const int msaa_mode = ProjectSettings::get_singleton()->get("rendering/quality/screen_filters/msaa"); + const int msaa_mode = ProjectSettings::get_singleton()->get("rendering/anti_aliasing/quality/msaa"); viewport->set_msaa(Viewport::MSAA(msaa_mode)); - const int ssaa_mode = GLOBAL_GET("rendering/quality/screen_filters/screen_space_aa"); + const int ssaa_mode = GLOBAL_GET("rendering/anti_aliasing/quality/screen_space_aa"); viewport->set_screen_space_aa(Viewport::ScreenSpaceAA(ssaa_mode)); - const bool use_debanding = GLOBAL_GET("rendering/quality/screen_filters/use_debanding"); + const bool use_debanding = GLOBAL_GET("rendering/anti_aliasing/quality/use_debanding"); viewport->set_use_debanding(use_debanding); } @@ -4717,6 +4712,28 @@ Dictionary Node3DEditor::get_state() const { } d["gizmos_status"] = gizmos_status; + { + Dictionary pd; + + pd["sun_rotation"] = sun_rotation; + + pd["environ_sky_color"] = environ_sky_color->get_pick_color(); + pd["environ_ground_color"] = environ_ground_color->get_pick_color(); + pd["environ_energy"] = environ_energy->get_value(); + pd["environ_glow_enabled"] = environ_glow_button->is_pressed(); + pd["environ_tonemap_enabled"] = environ_tonemap_button->is_pressed(); + pd["environ_ao_enabled"] = environ_ao_button->is_pressed(); + pd["environ_gi_enabled"] = environ_gi_button->is_pressed(); + pd["sun_max_distance"] = sun_max_distance->get_value(); + + pd["sun_color"] = sun_color->get_pick_color(); + pd["sun_energy"] = sun_energy->get_value(); + + pd["sun_disabled"] = sun_button->is_pressed(); + pd["environ_disabled"] = environ_button->is_pressed(); + + d["preview_sun_env"] = pd; + } return d; } @@ -4826,6 +4843,38 @@ void Node3DEditor::set_state(const Dictionary &p_state) { } _update_gizmos_menu(); } + + if (d.has("preview_sun_env")) { + sun_environ_updating = true; + Dictionary pd = d["preview_sun_env"]; + sun_rotation = pd["sun_rotation"]; + + environ_sky_color->set_pick_color(pd["environ_sky_color"]); + environ_ground_color->set_pick_color(pd["environ_ground_color"]); + environ_energy->set_value(pd["environ_energy"]); + environ_glow_button->set_pressed(pd["environ_glow_enabled"]); + environ_tonemap_button->set_pressed(pd["environ_tonemap_enabled"]); + environ_ao_button->set_pressed(pd["environ_ao_enabled"]); + environ_gi_button->set_pressed(pd["environ_gi_enabled"]); + sun_max_distance->set_value(pd["sun_max_distance"]); + + sun_color->set_pick_color(pd["sun_color"]); + sun_energy->set_value(pd["sun_energy"]); + + sun_button->set_pressed(pd["sun_disabled"]); + environ_button->set_pressed(pd["environ_disabled"]); + + sun_environ_updating = false; + + _preview_settings_changed(); + _update_preview_environment(); + } else { + _load_default_preview_settings(); + sun_button->set_pressed(false); + environ_button->set_pressed(false); + _preview_settings_changed(); + _update_preview_environment(); + } } void Node3DEditor::edit(Node3D *p_spatial) { @@ -6112,6 +6161,51 @@ void Node3DEditor::_unhandled_key_input(Ref<InputEvent> p_event) { snap_key_enabled = Input::get_singleton()->is_key_pressed(KEY_CONTROL); } +void Node3DEditor::_sun_environ_settings_pressed() { + Vector2 pos = sun_environ_settings->get_screen_position() + sun_environ_settings->get_size(); + sun_environ_popup->set_position(pos - Vector2(sun_environ_popup->get_contents_minimum_size().width / 2, 0)); + sun_environ_popup->popup(); +} + +void Node3DEditor::_add_sun_to_scene() { + sun_environ_popup->hide(); + + 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; + } + 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); + 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() { + sun_environ_popup->hide(); + + 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; + } + ERR_FAIL_COND(!base); + + WorldEnvironment *new_env = memnew(WorldEnvironment); + new_env->set_environment(preview_environment->get_environment()->duplicate(true)); + + undo_redo->create_action("Add Preview Environment to Scene"); + undo_redo->add_do_method(base, "add_child", new_env); + 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); + undo_redo->commit_action(); +} + void Node3DEditor::_notification(int p_what) { if (p_what == NOTIFICATION_READY) { tool_button[Node3DEditor::TOOL_MODE_SELECT]->set_icon(get_theme_icon("ToolSelect", "EditorIcons")); @@ -6140,17 +6234,31 @@ void Node3DEditor::_notification(int p_what) { _refresh_menu_icons(); get_tree()->connect("node_removed", callable_mp(this, &Node3DEditor::_node_removed)); + get_tree()->connect("node_added", callable_mp(this, &Node3DEditor::_node_added)); EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor()->connect("node_changed", callable_mp(this, &Node3DEditor::_refresh_menu_icons)); editor_selection->connect("selection_changed", callable_mp(this, &Node3DEditor::_refresh_menu_icons)); editor->connect("stop_pressed", callable_mp(this, &Node3DEditor::_update_camera_override_button), make_binds(false)); editor->connect("play_pressed", callable_mp(this, &Node3DEditor::_update_camera_override_button), make_binds(true)); + + sun_button->set_icon(get_theme_icon("DirectionalLight3D", "EditorIcons")); + environ_button->set_icon(get_theme_icon("WorldEnvironment", "EditorIcons")); + sun_environ_settings->set_icon(get_theme_icon("GuiTabMenuHl", "EditorIcons")); + + _update_preview_environment(); + sun_title->add_theme_font_override("font", get_theme_font("title_font", "Window")); + environ_title->add_theme_font_override("font", get_theme_font("title_font", "Window")); + + sun_state->set_custom_minimum_size(sun_vb->get_combined_minimum_size()); + environ_state->set_custom_minimum_size(environ_vb->get_combined_minimum_size()); } else if (p_what == NOTIFICATION_ENTER_TREE) { _register_all_gizmos(); _update_gizmos_menu(); _init_indicators(); } else if (p_what == NOTIFICATION_THEME_CHANGED) { _update_gizmos_menu_theme(); + sun_title->add_theme_font_override("font", get_theme_font("title_font", "Window")); + environ_title->add_theme_font_override("font", get_theme_font("title_font", "Window")); } else if (p_what == NOTIFICATION_EXIT_TREE) { _finish_indicators(); } else if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) { @@ -6287,7 +6395,37 @@ void Node3DEditor::_toggle_maximize_view(Object *p_viewport) { } } +void Node3DEditor::_node_added(Node *p_node) { + if (EditorNode::get_singleton()->get_scene_root()->is_a_parent_of(p_node)) { + if (Object::cast_to<WorldEnvironment>(p_node)) { + world_env_count++; + if (world_env_count == 1) { + _update_preview_environment(); + } + } else if (Object::cast_to<DirectionalLight3D>(p_node)) { + directional_light_count++; + if (directional_light_count == 1) { + _update_preview_environment(); + } + } + } +} + void Node3DEditor::_node_removed(Node *p_node) { + if (EditorNode::get_singleton()->get_scene_root()->is_a_parent_of(p_node)) { + if (Object::cast_to<WorldEnvironment>(p_node)) { + world_env_count--; + if (world_env_count == 0) { + _update_preview_environment(); + } + } else if (Object::cast_to<DirectionalLight3D>(p_node)) { + directional_light_count--; + if (directional_light_count == 0) { + _update_preview_environment(); + } + } + } + if (p_node == selected) { selected = nullptr; } @@ -6357,6 +6495,128 @@ void Node3DEditor::clear() { view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_GRID), true); } +void Node3DEditor::_sun_direction_draw() { + sun_direction->draw_rect(Rect2(Vector2(), sun_direction->get_size()), Color(1, 1, 1, 1)); + sun_direction_material->set_shader_param("sun_direction", -preview_sun->get_transform().basis.get_axis(Vector3::AXIS_Z)); + float nrg = sun_energy->get_value(); + sun_direction_material->set_shader_param("sun_color", Vector3(sun_color->get_pick_color().r * nrg, sun_color->get_pick_color().g * nrg, sun_color->get_pick_color().b * nrg)); +} + +void Node3DEditor::_preview_settings_changed() { + if (sun_environ_updating) { + return; + } + + { // preview sun + Transform t; + t.basis = sun_rotation; + preview_sun->set_transform(t); + sun_direction->update(); + preview_sun->set_param(Light3D::PARAM_ENERGY, sun_energy->get_value()); + preview_sun->set_param(Light3D::PARAM_SHADOW_MAX_DISTANCE, sun_max_distance->get_value()); + preview_sun->set_color(sun_color->get_pick_color()); + } + + { //preview env + sky_material->set_sky_energy(environ_energy->get_value()); + Color hz_color = environ_sky_color->get_pick_color().lerp(environ_ground_color->get_pick_color(), 0.5).lerp(Color(1, 1, 1), 0.5); + sky_material->set_sky_top_color(environ_sky_color->get_pick_color()); + sky_material->set_sky_horizon_color(hz_color); + sky_material->set_ground_bottom_color(environ_ground_color->get_pick_color()); + sky_material->set_ground_horizon_color(hz_color); + + environment->set_ssao_enabled(environ_ao_button->is_pressed()); + environment->set_glow_enabled(environ_glow_button->is_pressed()); + environment->set_sdfgi_enabled(environ_gi_button->is_pressed()); + environment->set_tonemapper(environ_tonemap_button->is_pressed() ? Environment::TONE_MAPPER_FILMIC : Environment::TONE_MAPPER_LINEAR); + } +} +void Node3DEditor::_load_default_preview_settings() { + sun_environ_updating = true; + + sun_rotation = Basis(Vector3(0, 1, 0), Math_PI * 3.0 / 4) * Basis(Vector3(1, 0, 0), -Math_PI / 4); + + sun_direction->update(); + environ_sky_color->set_pick_color(Color::hex(0x91b2ceff)); + environ_ground_color->set_pick_color(Color::hex(0x1f1f21ff)); + environ_energy->set_value(1.0); + environ_glow_button->set_pressed(true); + environ_tonemap_button->set_pressed(true); + environ_ao_button->set_pressed(false); + environ_gi_button->set_pressed(false); + sun_max_distance->set_value(250); + + sun_color->set_pick_color(Color(1, 1, 1)); + sun_energy->set_value(1.0); + + sun_environ_updating = false; +} + +void Node3DEditor::_update_preview_environment() { + bool disable_light = directional_light_count > 0 || sun_button->is_pressed(); + + sun_button->set_disabled(directional_light_count > 0); + + if (disable_light) { + if (preview_sun->get_parent()) { + preview_sun->get_parent()->remove_child(preview_sun); + sun_state->show(); + sun_vb->hide(); + } + + if (directional_light_count > 0) { + sun_state->set_text(TTR("Scene contains\nDirectionalLight3D.\nPreview disabled.")); + } else { + sun_state->set_text(TTR("Preview disabled.")); + } + + } else { + if (!preview_sun->get_parent()) { + add_child(preview_sun); + sun_state->hide(); + sun_vb->show(); + } + } + + bool disable_env = world_env_count > 0 || environ_button->is_pressed(); + + environ_button->set_disabled(world_env_count > 0); + + if (disable_env) { + if (preview_environment->get_parent()) { + preview_environment->get_parent()->remove_child(preview_environment); + environ_state->show(); + environ_vb->hide(); + } + if (world_env_count > 0) { + environ_state->set_text(TTR("Scene contains\nWorldEnvironment.\nPreview disabled.")); + } else { + environ_state->set_text(TTR("Preview disabled.")); + } + + } else { + if (!preview_environment->get_parent()) { + add_child(preview_environment); + environ_state->hide(); + environ_vb->show(); + } + } +} + +void Node3DEditor::_sun_direction_input(const Ref<InputEvent> &p_event) { + Ref<InputEventMouseMotion> mm = p_event; + if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_LEFT) { + float x = -mm->get_relative().y * 0.02 * EDSCALE; + float y = mm->get_relative().x * 0.02 * EDSCALE; + + Basis rot = Basis(Vector3(0, 1, 0), y) * Basis(Vector3(1, 0, 0), x); + + sun_rotation = rot * sun_rotation; + sun_rotation.orthonormalize(); + _preview_settings_changed(); + } +} + Node3DEditor::Node3DEditor(EditorNode *p_editor) { gizmo.visible = true; gizmo.scale = 1.0; @@ -6494,6 +6754,32 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { _update_camera_override_button(false); hbc_menu->add_child(memnew(VSeparator)); + sun_button = memnew(Button); + sun_button->set_tooltip(TTR("Toggle preview sunlight.\nIf a DirectionalLight3D node is added to the scene, preview sunlight is disabled.")); + sun_button->set_toggle_mode(true); + sun_button->set_flat(true); + sun_button->connect("pressed", callable_mp(this, &Node3DEditor::_update_preview_environment), varray(), CONNECT_DEFERRED); + sun_button->set_disabled(true); + + hbc_menu->add_child(sun_button); + + environ_button = memnew(Button); + environ_button->set_tooltip(TTR("Toggle preview environment.\nIf a WorldEnvironment node is added to the scene, preview environment is disabled.")); + environ_button->set_toggle_mode(true); + environ_button->set_flat(true); + environ_button->connect("pressed", callable_mp(this, &Node3DEditor::_update_preview_environment), varray(), CONNECT_DEFERRED); + environ_button->set_disabled(true); + + hbc_menu->add_child(environ_button); + + sun_environ_settings = memnew(Button); + sun_environ_settings->set_tooltip(TTR("Edit Sun and Environment settings.")); + sun_environ_settings->set_flat(true); + sun_environ_settings->connect("pressed", callable_mp(this, &Node3DEditor::_sun_environ_settings_pressed)); + + hbc_menu->add_child(sun_environ_settings); + + hbc_menu->add_child(memnew(VSeparator)); // Drag and drop support; preview_node = memnew(Node3D); @@ -6723,6 +7009,152 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { EDITOR_DEF("editors/3d/navigation/show_viewport_rotation_gizmo", true); over_gizmo_handle = -1; + { + //sun popup + + sun_environ_popup = memnew(PopupPanel); + add_child(sun_environ_popup); + + HBoxContainer *sun_environ_hb = memnew(HBoxContainer); + + sun_environ_popup->add_child(sun_environ_hb); + + sun_vb = memnew(VBoxContainer); + sun_environ_hb->add_child(sun_vb); + sun_vb->set_custom_minimum_size(Size2(200 * EDSCALE, 0)); + sun_vb->hide(); + + sun_title = memnew(Label); + sun_vb->add_child(sun_title); + sun_title->set_text(TTR("Preview Sun")); + sun_title->set_align(Label::ALIGN_CENTER); + + CenterContainer *sun_direction_center = memnew(CenterContainer); + sun_direction = memnew(Control); + sun_direction->set_custom_minimum_size(Size2i(128, 128) * EDSCALE); + sun_direction_center->add_child(sun_direction); + sun_vb->add_margin_child(TTR("Sun Direction"), sun_direction_center); + sun_direction->connect("gui_input", callable_mp(this, &Node3DEditor::_sun_direction_input)); + sun_direction->connect("draw", callable_mp(this, &Node3DEditor::_sun_direction_draw)); + sun_direction->set_default_cursor_shape(CURSOR_MOVE); + + String sun_dir_shader_code = "shader_type canvas_item; uniform vec3 sun_direction; uniform vec3 sun_color; void fragment() { vec3 n; n.xy = UV * 2.0 - 1.0; n.z = sqrt(max(0.0, 1.0 - dot(n.xy, n.xy))); COLOR.rgb = dot(n,sun_direction) * sun_color; COLOR.a = 1.0 - smoothstep(0.99,1.0,length(n.xy)); }"; + sun_direction_shader.instance(); + sun_direction_shader->set_code(sun_dir_shader_code); + sun_direction_material.instance(); + sun_direction_material->set_shader(sun_direction_shader); + sun_direction_material->set_shader_param("sun_direction", Vector3(0, 0, 1)); + sun_direction_material->set_shader_param("sun_color", Vector3(1, 1, 1)); + sun_direction->set_material(sun_direction_material); + + sun_color = memnew(ColorPickerButton); + sun_color->set_edit_alpha(false); + sun_vb->add_margin_child(TTR("Sun Color"), sun_color); + sun_color->connect("color_changed", callable_mp(this, &Node3DEditor::_preview_settings_changed).unbind(1)); + + sun_energy = memnew(EditorSpinSlider); + sun_vb->add_margin_child(TTR("Sun Energy"), sun_energy); + sun_energy->connect("value_changed", callable_mp(this, &Node3DEditor::_preview_settings_changed).unbind(1)); + sun_energy->set_max(64.0); + + sun_max_distance = memnew(EditorSpinSlider); + sun_vb->add_margin_child(TTR("Shadow Max Distance"), sun_max_distance); + sun_max_distance->connect("value_changed", callable_mp(this, &Node3DEditor::_preview_settings_changed).unbind(1)); + sun_max_distance->set_min(1); + sun_max_distance->set_max(4096); + + 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_vb->add_spacer(); + sun_vb->add_child(sun_add_to_scene); + + sun_state = memnew(Label); + sun_environ_hb->add_child(sun_state); + sun_state->set_align(Label::ALIGN_CENTER); + sun_state->set_valign(Label::VALIGN_CENTER); + sun_state->set_h_size_flags(SIZE_EXPAND_FILL); + + VSeparator *sc = memnew(VSeparator); + sc->set_custom_minimum_size(Size2(50 * EDSCALE, 0)); + sc->set_v_size_flags(SIZE_EXPAND_FILL); + sun_environ_hb->add_child(sc); + + environ_vb = memnew(VBoxContainer); + sun_environ_hb->add_child(environ_vb); + environ_vb->set_custom_minimum_size(Size2(200 * EDSCALE, 0)); + environ_vb->hide(); + + environ_title = memnew(Label); + environ_vb->add_child(environ_title); + environ_title->set_text(TTR("Preview Environment")); + environ_title->set_align(Label::ALIGN_CENTER); + + environ_sky_color = memnew(ColorPickerButton); + environ_sky_color->set_edit_alpha(false); + environ_sky_color->connect("color_changed", callable_mp(this, &Node3DEditor::_preview_settings_changed).unbind(1)); + environ_vb->add_margin_child(TTR("Sky Color"), environ_sky_color); + environ_ground_color = memnew(ColorPickerButton); + environ_ground_color->connect("color_changed", callable_mp(this, &Node3DEditor::_preview_settings_changed).unbind(1)); + environ_ground_color->set_edit_alpha(false); + environ_vb->add_margin_child(TTR("Ground Color"), environ_ground_color); + environ_energy = memnew(EditorSpinSlider); + environ_energy->connect("value_changed", callable_mp(this, &Node3DEditor::_preview_settings_changed).unbind(1)); + environ_energy->set_max(8.0); + environ_vb->add_margin_child(TTR("Sky Energy"), environ_energy); + HBoxContainer *fx_vb = memnew(HBoxContainer); + fx_vb->set_h_size_flags(SIZE_EXPAND_FILL); + + environ_ao_button = memnew(Button); + environ_ao_button->set_text(TTR("AO")); + environ_ao_button->set_toggle_mode(true); + environ_ao_button->connect("pressed", callable_mp(this, &Node3DEditor::_preview_settings_changed), varray(), CONNECT_DEFERRED); + fx_vb->add_child(environ_ao_button); + environ_glow_button = memnew(Button); + environ_glow_button->set_text(TTR("Glow")); + environ_glow_button->set_toggle_mode(true); + environ_glow_button->connect("pressed", callable_mp(this, &Node3DEditor::_preview_settings_changed), varray(), CONNECT_DEFERRED); + fx_vb->add_child(environ_glow_button); + environ_tonemap_button = memnew(Button); + environ_tonemap_button->set_text(TTR("Tonemap")); + environ_tonemap_button->set_toggle_mode(true); + environ_tonemap_button->connect("pressed", callable_mp(this, &Node3DEditor::_preview_settings_changed), varray(), CONNECT_DEFERRED); + fx_vb->add_child(environ_tonemap_button); + environ_gi_button = memnew(Button); + environ_gi_button->set_text(TTR("GI")); + environ_gi_button->set_toggle_mode(true); + environ_gi_button->connect("pressed", callable_mp(this, &Node3DEditor::_preview_settings_changed), varray(), CONNECT_DEFERRED); + fx_vb->add_child(environ_gi_button); + environ_vb->add_margin_child(TTR("Post Process"), fx_vb); + + 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_vb->add_spacer(); + environ_vb->add_child(environ_add_to_scene); + + environ_state = memnew(Label); + sun_environ_hb->add_child(environ_state); + environ_state->set_align(Label::ALIGN_CENTER); + environ_state->set_valign(Label::VALIGN_CENTER); + environ_state->set_h_size_flags(SIZE_EXPAND_FILL); + + preview_sun = memnew(DirectionalLight3D); + preview_sun->set_shadow(true); + preview_sun->set_shadow_mode(DirectionalLight3D::SHADOW_PARALLEL_4_SPLITS); + preview_environment = memnew(WorldEnvironment); + environment.instance(); + preview_environment->set_environment(environment); + Ref<Sky> sky; + sky.instance(); + sky_material.instance(); + sky->set_material(sky_material); + environment->set_sky(sky); + environment->set_background(Environment::BG_SKY); + + _load_default_preview_settings(); + _preview_settings_changed(); + } } Node3DEditor::~Node3DEditor() { diff --git a/editor/plugins/node_3d_editor_plugin.h b/editor/plugins/node_3d_editor_plugin.h index bf478f850e..cf4aa33257 100644 --- a/editor/plugins/node_3d_editor_plugin.h +++ b/editor/plugins/node_3d_editor_plugin.h @@ -37,7 +37,10 @@ #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" #include "scene/gui/panel_container.h" +#include "scene/resources/environment.h" +#include "scene/resources/sky_material.h" class Camera3D; class Node3DEditor; @@ -732,6 +735,7 @@ private: static Node3DEditor *singleton; + void _node_added(Node *p_node); void _node_removed(Node *p_node); Vector<Ref<EditorNode3DGizmoPlugin>> gizmo_plugins_by_priority; Vector<Ref<EditorNode3DGizmoPlugin>> gizmo_plugins_by_name; @@ -744,6 +748,61 @@ private: void _refresh_menu_icons(); + // Preview Sun and Environment + + uint32_t world_env_count = 0; + uint32_t directional_light_count = 0; + + Button *sun_button; + Label *sun_state; + Label *sun_title; + VBoxContainer *sun_vb; + Popup *sun_environ_popup; + Control *sun_direction; + ColorPickerButton *sun_color; + EditorSpinSlider *sun_energy; + EditorSpinSlider *sun_max_distance; + Button *sun_add_to_scene; + + void _sun_direction_draw(); + void _sun_direction_input(const Ref<InputEvent> &p_event); + + Basis sun_rotation; + + Ref<Shader> sun_direction_shader; + Ref<ShaderMaterial> sun_direction_material; + + Button *environ_button; + Label *environ_state; + Label *environ_title; + VBoxContainer *environ_vb; + ColorPickerButton *environ_sky_color; + ColorPickerButton *environ_ground_color; + EditorSpinSlider *environ_energy; + Button *environ_ao_button; + Button *environ_glow_button; + Button *environ_tonemap_button; + Button *environ_gi_button; + Button *environ_add_to_scene; + + Button *sun_environ_settings; + + DirectionalLight3D *preview_sun; + WorldEnvironment *preview_environment; + Ref<Environment> environment; + Ref<ProceduralSkyMaterial> sky_material; + + bool sun_environ_updating = false; + + void _load_default_preview_settings(); + void _update_preview_environment(); + + void _preview_settings_changed(); + void _sun_environ_settings_pressed(); + + void _add_sun_to_scene(); + void _add_environment_to_scene(); + protected: void _notification(int p_what); //void _gui_input(InputEvent p_event); diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp index 71b18497b0..b6df66b8af 100644 --- a/editor/plugins/script_text_editor.cpp +++ b/editor/plugins/script_text_editor.cpp @@ -1066,7 +1066,7 @@ void ScriptTextEditor::_edit_option(int p_op) { return; } - tx->indent_left(); + tx->indent_selected_lines_left(); } break; case EDIT_INDENT_RIGHT: { Ref<Script> scr = script; @@ -1074,7 +1074,7 @@ void ScriptTextEditor::_edit_option(int p_op) { return; } - tx->indent_right(); + tx->indent_selected_lines_right(); } break; case EDIT_DELETE_LINE: { code_editor->delete_lines(); @@ -1632,16 +1632,16 @@ void ScriptTextEditor::_color_changed(const Color &p_color) { void ScriptTextEditor::_make_context_menu(bool p_selection, bool p_color, bool p_foldable, bool p_open_docs, bool p_goto_definition, Vector2 p_pos) { context_menu->clear(); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO); context_menu->add_separator(); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/cut"), EDIT_CUT); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/copy"), EDIT_COPY); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/paste"), EDIT_PASTE); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_paste"), EDIT_PASTE); context_menu->add_separator(); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/select_all"), EDIT_SELECT_ALL); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_text_select_all"), EDIT_SELECT_ALL); context_menu->add_separator(); context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_left"), EDIT_INDENT_LEFT); @@ -1743,14 +1743,14 @@ void ScriptTextEditor::_enable_code_editor() { search_menu->get_popup()->connect("id_pressed", callable_mp(this, &ScriptTextEditor::_edit_option)); edit_hb->add_child(edit_menu); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO); edit_menu->get_popup()->add_separator(); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/cut"), EDIT_CUT); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/copy"), EDIT_COPY); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/paste"), EDIT_PASTE); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_paste"), EDIT_PASTE); edit_menu->get_popup()->add_separator(); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/select_all"), EDIT_SELECT_ALL); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_text_select_all"), EDIT_SELECT_ALL); edit_menu->get_popup()->add_separator(); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_up"), EDIT_MOVE_LINE_UP); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_down"), EDIT_MOVE_LINE_DOWN); @@ -1763,7 +1763,7 @@ void ScriptTextEditor::_enable_code_editor() { 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/complete_symbol"), EDIT_COMPLETE); + 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); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_indent_to_spaces"), EDIT_CONVERT_INDENT_TO_SPACES); @@ -1915,12 +1915,6 @@ static ScriptEditorBase *create_editor(const RES &p_resource) { } void ScriptTextEditor::register_editor() { - ED_SHORTCUT("script_text_editor/undo", TTR("Undo"), KEY_MASK_CMD | KEY_Z); - ED_SHORTCUT("script_text_editor/redo", TTR("Redo"), KEY_MASK_CMD | KEY_Y); - ED_SHORTCUT("script_text_editor/cut", TTR("Cut"), KEY_MASK_CMD | KEY_X); - ED_SHORTCUT("script_text_editor/copy", TTR("Copy"), KEY_MASK_CMD | KEY_C); - ED_SHORTCUT("script_text_editor/paste", TTR("Paste"), KEY_MASK_CMD | KEY_V); - ED_SHORTCUT("script_text_editor/select_all", TTR("Select All"), KEY_MASK_CMD | KEY_A); ED_SHORTCUT("script_text_editor/move_up", TTR("Move Up"), KEY_MASK_ALT | KEY_UP); ED_SHORTCUT("script_text_editor/move_down", TTR("Move Down"), KEY_MASK_ALT | KEY_DOWN); ED_SHORTCUT("script_text_editor/delete_line", TTR("Delete Line"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_K); @@ -1936,10 +1930,8 @@ void ScriptTextEditor::register_editor() { 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/complete_symbol", TTR("Complete Symbol"), KEY_MASK_CTRL | KEY_SPACE); #else ED_SHORTCUT("script_text_editor/clone_down", TTR("Clone Down"), KEY_MASK_CMD | KEY_D); - ED_SHORTCUT("script_text_editor/complete_symbol", TTR("Complete Symbol"), KEY_MASK_CMD | KEY_SPACE); #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/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp index 8be82628cb..c8a46715ad 100644 --- a/editor/plugins/shader_editor_plugin.cpp +++ b/editor/plugins/shader_editor_plugin.cpp @@ -282,7 +282,7 @@ void ShaderEditor::_menu_option(int p_option) { } CodeEdit *tx = shader_editor->get_text_editor(); - tx->indent_left(); + tx->indent_selected_lines_left(); } break; case EDIT_INDENT_RIGHT: { @@ -291,7 +291,7 @@ void ShaderEditor::_menu_option(int p_option) { } CodeEdit *tx = shader_editor->get_text_editor(); - tx->indent_right(); + tx->indent_selected_lines_right(); } break; case EDIT_DELETE_LINE: { @@ -533,15 +533,15 @@ void ShaderEditor::_bookmark_item_pressed(int p_idx) { void ShaderEditor::_make_context_menu(bool p_selection, Vector2 p_position) { context_menu->clear(); if (p_selection) { - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/cut"), EDIT_CUT); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/copy"), EDIT_COPY); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY); } - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/paste"), EDIT_PASTE); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_paste"), EDIT_PASTE); context_menu->add_separator(); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/select_all"), EDIT_SELECT_ALL); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_text_select_all"), EDIT_SELECT_ALL); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO); context_menu->add_separator(); context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_left"), EDIT_INDENT_LEFT); @@ -585,14 +585,14 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) { edit_menu->set_text(TTR("Edit")); edit_menu->set_switch_on_hover(true); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO); edit_menu->get_popup()->add_separator(); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/cut"), EDIT_CUT); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/copy"), EDIT_COPY); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/paste"), EDIT_PASTE); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_paste"), EDIT_PASTE); edit_menu->get_popup()->add_separator(); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/select_all"), EDIT_SELECT_ALL); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_text_select_all"), EDIT_SELECT_ALL); edit_menu->get_popup()->add_separator(); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_up"), EDIT_MOVE_LINE_UP); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_down"), EDIT_MOVE_LINE_DOWN); @@ -602,7 +602,7 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) { 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_separator(); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/complete_symbol"), EDIT_COMPLETE); + 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)); search_menu = memnew(MenuButton); diff --git a/editor/plugins/skeleton_3d_editor_plugin.cpp b/editor/plugins/skeleton_3d_editor_plugin.cpp index e160e6ca0d..121ccfa417 100644 --- a/editor/plugins/skeleton_3d_editor_plugin.cpp +++ b/editor/plugins/skeleton_3d_editor_plugin.cpp @@ -388,7 +388,7 @@ PhysicalBone3D *Skeleton3DEditor::create_physical_bone(int bone_id, int bone_chi bone_shape->set_transform(capsule_transform); Transform body_transform; - body_transform.set_look_at(Vector3(0, 0, 0), child_rest.origin, Vector3(0, 1, 0)); + body_transform.set_look_at(Vector3(0, 0, 0), child_rest.origin); body_transform.origin = body_transform.basis.xform(Vector3(0, 0, -half_height)); Transform joint_transform; diff --git a/editor/plugins/text_editor.cpp b/editor/plugins/text_editor.cpp index d45011c8aa..b88f1c91e6 100644 --- a/editor/plugins/text_editor.cpp +++ b/editor/plugins/text_editor.cpp @@ -363,10 +363,10 @@ void TextEditor::_edit_option(int p_op) { code_editor->move_lines_down(); } break; case EDIT_INDENT_LEFT: { - tx->indent_left(); + tx->indent_selected_lines_left(); } break; case EDIT_INDENT_RIGHT: { - tx->indent_right(); + tx->indent_selected_lines_right(); } break; case EDIT_DELETE_LINE: { code_editor->delete_lines(); @@ -514,15 +514,15 @@ void TextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) { void TextEditor::_make_context_menu(bool p_selection, bool p_can_fold, bool p_is_folded, Vector2 p_position) { context_menu->clear(); if (p_selection) { - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/cut"), EDIT_CUT); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/copy"), EDIT_COPY); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY); } - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/paste"), EDIT_PASTE); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_paste"), EDIT_PASTE); context_menu->add_separator(); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/select_all"), EDIT_SELECT_ALL); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_text_select_all"), EDIT_SELECT_ALL); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO); context_menu->add_separator(); context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_left"), EDIT_INDENT_LEFT); context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_right"), EDIT_INDENT_RIGHT); @@ -584,14 +584,14 @@ TextEditor::TextEditor() { edit_menu->set_switch_on_hover(true); edit_menu->get_popup()->connect("id_pressed", callable_mp(this, &TextEditor::_edit_option)); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("un_redo"), EDIT_REDO); edit_menu->get_popup()->add_separator(); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/cut"), EDIT_CUT); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/copy"), EDIT_COPY); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/paste"), EDIT_PASTE); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_paste"), EDIT_PASTE); edit_menu->get_popup()->add_separator(); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/select_all"), EDIT_SELECT_ALL); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_text_select_all"), EDIT_SELECT_ALL); edit_menu->get_popup()->add_separator(); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_up"), EDIT_MOVE_LINE_UP); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_down"), EDIT_MOVE_LINE_DOWN); diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp index 5061067ded..a63e641c2b 100644 --- a/editor/plugins/visual_shader_editor_plugin.cpp +++ b/editor/plugins/visual_shader_editor_plugin.cpp @@ -1023,7 +1023,7 @@ void VisualShaderEditor::_update_options_menu() { Color unsupported_color = get_theme_color("error_color", "Editor"); Color supported_color = get_theme_color("warning_color", "Editor"); - static bool low_driver = ProjectSettings::get_singleton()->get("rendering/quality/driver/driver_name") == "GLES2"; + static bool low_driver = ProjectSettings::get_singleton()->get("rendering/driver/driver_name") == "GLES2"; Map<String, TreeItem *> folders; diff --git a/editor/pot_generator.cpp b/editor/pot_generator.cpp index 2d65c00a89..497cc0cbdc 100644 --- a/editor/pot_generator.cpp +++ b/editor/pot_generator.cpp @@ -55,7 +55,7 @@ void POTGenerator::_print_all_translation_strings() { #endif void POTGenerator::generate_pot(const String &p_file) { - if (!ProjectSettings::get_singleton()->has_setting("locale/translations_pot_files")) { + if (!ProjectSettings::get_singleton()->has_setting("internationalization/locale/translations_pot_files")) { WARN_PRINT("No files selected for POT generation."); return; } @@ -63,7 +63,7 @@ void POTGenerator::generate_pot(const String &p_file) { // Clear all_translation_strings of the previous round. all_translation_strings.clear(); - Vector<String> files = ProjectSettings::get_singleton()->get("locale/translations_pot_files"); + Vector<String> files = ProjectSettings::get_singleton()->get("internationalization/locale/translations_pot_files"); // Collect all translatable strings according to files order in "POT Generation" setting. for (int i = 0; i < files.size(); i++) { @@ -100,7 +100,7 @@ void POTGenerator::_write_to_pot(const String &p_file) { } String project_name = ProjectSettings::get_singleton()->get("application/config/name"); - Vector<String> files = ProjectSettings::get_singleton()->get("locale/translations_pot_files"); + Vector<String> files = ProjectSettings::get_singleton()->get("internationalization/locale/translations_pot_files"); String extracted_files = ""; for (int i = 0; i < files.size(); i++) { extracted_files += "# " + files[i] + "\n"; diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp index 7b00c688fa..7d421bdf81 100644 --- a/editor/project_manager.cpp +++ b/editor/project_manager.cpp @@ -474,15 +474,15 @@ private: } ProjectSettings::CustomMap initial_settings; if (rasterizer_button_group->get_pressed_button()->get_meta("driver_name") == "Vulkan") { - initial_settings["rendering/quality/driver/driver_name"] = "Vulkan"; + initial_settings["rendering/driver/driver_name"] = "Vulkan"; } else { - initial_settings["rendering/quality/driver/driver_name"] = "GLES2"; - initial_settings["rendering/vram_compression/import_etc2"] = false; - initial_settings["rendering/vram_compression/import_etc"] = true; + initial_settings["rendering/driver/driver_name"] = "GLES2"; + initial_settings["rendering/textures/vram_compression/import_etc2"] = false; + initial_settings["rendering/textures/vram_compression/import_etc"] = true; } initial_settings["application/config/name"] = project_name->get_text(); initial_settings["application/config/icon"] = "res://icon.png"; - initial_settings["rendering/environment/default_environment"] = "res://default_env.tres"; + initial_settings["rendering/environment/defaults/default_environment"] = "res://default_env.tres"; if (ProjectSettings::get_singleton()->save_custom(dir.plus_file("project.godot"), initial_settings, Vector<String>(), false) != OK) { set_message(TTR("Couldn't create project.godot in project path."), MESSAGE_ERROR); diff --git a/editor/project_settings_editor.cpp b/editor/project_settings_editor.cpp index 76fdf47eb6..6e2cd72796 100644 --- a/editor/project_settings_editor.cpp +++ b/editor/project_settings_editor.cpp @@ -75,8 +75,12 @@ void ProjectSettingsEditor::_advanced_pressed() { if (advanced->is_pressed()) { _update_advanced_bar(); advanced_bar->show(); + EditorSettings::get_singleton()->set_project_metadata("project_settings", "advanced_mode", true); + inspector->set_restrict_to_basic_settings(false); } else { advanced_bar->hide(); + EditorSettings::get_singleton()->set_project_metadata("project_settings", "advanced_mode", false); + inspector->set_restrict_to_basic_settings(true); } } @@ -191,9 +195,6 @@ void ProjectSettingsEditor::_update_advanced_bar() { add_button->set_disabled(disable_add); del_button->set_disabled(disable_del); - - error_label->set_text(error_msg); - error_label->set_visible(error_msg != ""); } String ProjectSettingsEditor::_get_setting_name() const { @@ -268,21 +269,216 @@ void ProjectSettingsEditor::_editor_restart_close() { restart_container->hide(); } +void ProjectSettingsEditor::_action_added(const String &p_name) { + String name = "input/" + p_name; + + if (ProjectSettings::get_singleton()->has_setting(name)) { + action_map->show_message(vformat(TTR("An action with the name '%s' already exists."), name)); + return; + } + + Dictionary action; + action["events"] = Array(); + action["deadzone"] = 0.5f; + + undo_redo->create_action(TTR("Add Input Action")); + undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", name, action); + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "clear", name); + + undo_redo->add_do_method(this, "_update_action_map_editor"); + undo_redo->add_undo_method(this, "_update_action_map_editor"); + undo_redo->add_do_method(this, "queue_save"); + undo_redo->add_undo_method(this, "queue_save"); + undo_redo->commit_action(); +} + +void ProjectSettingsEditor::_action_edited(const String &p_name, const Dictionary &p_action) { + const String property_name = "input/" + p_name; + Dictionary old_val = ProjectSettings::get_singleton()->get(property_name); + + if (old_val["deadzone"] != p_action["deadzone"]) { + // Deadzone Changed + undo_redo->create_action(TTR("Change Action deadzone")); + undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", property_name, p_action); + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", property_name, old_val); + + } else { + // Events changed + int event_count = ((Array)p_action["events"]).size(); + int old_event_count = ((Array)old_val["events"]).size(); + + if (event_count == old_event_count) { + undo_redo->create_action(TTR("Edit Input Action Event")); + } else if (event_count > old_event_count) { + undo_redo->create_action(TTR("Add Input Action Event")); + } else if (event_count < old_event_count) { + undo_redo->create_action(TTR("Remove Input Action Event")); + } + + undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", property_name, p_action); + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", property_name, old_val); + } + + undo_redo->add_do_method(this, "_update_action_map_editor"); + undo_redo->add_undo_method(this, "_update_action_map_editor"); + undo_redo->add_do_method(this, "queue_save"); + undo_redo->add_undo_method(this, "queue_save"); + undo_redo->commit_action(); +} + +void ProjectSettingsEditor::_action_removed(const String &p_name) { + const String property_name = "input/" + p_name; + + Dictionary old_val = ProjectSettings::get_singleton()->get(property_name); + int order = ProjectSettings::get_singleton()->get_order(property_name); + + undo_redo->create_action(TTR("Erase Input Action")); + undo_redo->add_do_method(ProjectSettings::get_singleton(), "clear", property_name); + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", property_name, old_val); + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", property_name, order); + + undo_redo->add_do_method(this, "_update_action_map_editor"); + undo_redo->add_undo_method(this, "_update_action_map_editor"); + undo_redo->add_do_method(this, "queue_save"); + undo_redo->add_undo_method(this, "queue_save"); + undo_redo->commit_action(); +} + +void ProjectSettingsEditor::_action_renamed(const String &p_old_name, const String &p_new_name) { + const String old_property_name = "input/" + p_old_name; + const String new_property_name = "input/" + p_new_name; + + if (ProjectSettings::get_singleton()->has_setting(new_property_name)) { + action_map->show_message(vformat(TTR("An action with the name '%s' already exists."), new_property_name)); + return; + } + + int order = ProjectSettings::get_singleton()->get_order(old_property_name); + Dictionary action = ProjectSettings::get_singleton()->get(old_property_name); + + undo_redo->create_action(TTR("Rename Input Action Event")); + // Do: clear old, set new + undo_redo->add_do_method(ProjectSettings::get_singleton(), "clear", old_property_name); + undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", new_property_name, action); + undo_redo->add_do_method(ProjectSettings::get_singleton(), "set_order", new_property_name, order); + // Undo: clear new, set old + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "clear", new_property_name); + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", old_property_name, action); + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", old_property_name, order); + + undo_redo->add_do_method(this, "_update_action_map_editor"); + undo_redo->add_undo_method(this, "_update_action_map_editor"); + undo_redo->add_do_method(this, "queue_save"); + undo_redo->add_undo_method(this, "queue_save"); + undo_redo->commit_action(); +} + +void ProjectSettingsEditor::_action_reordered(const String &p_action_name, const String &p_relative_to, bool p_before) { + const String action_name = "input/" + p_action_name; + const String target_name = "input/" + p_relative_to; + + // It is much easier to rebuild the custom "input" properties rather than messing around with the "order" values of them. + Variant action_value = ps->get(action_name); + Variant target_value = ps->get(target_name); + + List<PropertyInfo> props; + OrderedHashMap<String, Variant> action_values; + ProjectSettings::get_singleton()->get_property_list(&props); + + undo_redo->create_action(TTR("Update Input Action Order")); + + for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) { + PropertyInfo prop = E->get(); + // Skip builtins and non-inputs + if (ProjectSettings::get_singleton()->is_builtin_setting(prop.name) || !prop.name.begins_with("input/")) { + continue; + } + + action_values.insert(prop.name, ps->get(prop.name)); + + undo_redo->add_do_method(ProjectSettings::get_singleton(), "clear", prop.name); + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "clear", prop.name); + } + + for (OrderedHashMap<String, Variant>::Element E = action_values.front(); E; E = E.next()) { + String name = E.key(); + Variant value = E.get(); + + if (name == target_name) { + if (p_before) { + // Insert before target + undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", action_name, action_value); + undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", target_name, target_value); + + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", target_name, target_value); + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", action_name, action_value); + } else { + // Insert after target + undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", target_name, target_value); + undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", action_name, action_value); + + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", action_name, action_value); + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", target_name, target_value); + } + + } else if (name != action_name) { + undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", name, value); + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", name, value); + } + } + + undo_redo->add_do_method(this, "_update_action_map_editor"); + undo_redo->add_undo_method(this, "_update_action_map_editor"); + undo_redo->add_do_method(this, "queue_save"); + undo_redo->add_undo_method(this, "queue_save"); + undo_redo->commit_action(); +} + +void ProjectSettingsEditor::_update_action_map_editor() { + Vector<ActionMapEditor::ActionInfo> actions; + + List<PropertyInfo> props; + ProjectSettings::get_singleton()->get_property_list(&props); + + const Ref<Texture2D> builtin_icon = get_theme_icon("PinPressed", "EditorIcons"); + for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) { + const String property_name = E->get().name; + + if (!property_name.begins_with("input/")) { + continue; + } + + // Strip the "input/" from the left. + String display_name = property_name.substr(String("input/").size() - 1); + Dictionary action = ProjectSettings::get_singleton()->get(property_name); + + ActionMapEditor::ActionInfo action_info; + action_info.action = action; + action_info.editable = true; + action_info.name = display_name; + + const bool is_builtin_input = ProjectSettings::get_singleton()->get_input_presets().find(property_name) != nullptr; + if (is_builtin_input) { + action_info.editable = false; + action_info.icon = builtin_icon; + } + + actions.push_back(action_info); + } + + action_map->update_action_list(actions); +} + void ProjectSettingsEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_VISIBILITY_CHANGED: { if (!is_visible()) { EditorSettings::get_singleton()->set_project_metadata("dialog_bounds", "project_settings", Rect2(get_position(), get_size())); - if (advanced->is_pressed()) { - advanced->set_pressed(false); - advanced_bar->hide(); - } } } break; case NOTIFICATION_ENTER_TREE: { inspector->edit(ps); - error_label->add_theme_color_override("font_color", error_label->get_theme_color("error_color", "Editor")); add_button->set_icon(get_theme_icon("Add", "EditorIcons")); del_button->set_icon(get_theme_icon("Remove", "EditorIcons")); @@ -293,6 +489,8 @@ void ProjectSettingsEditor::_notification(int p_what) { restart_container->add_theme_style_override("panel", get_theme_stylebox("bg", "Tree")); restart_icon->set_texture(get_theme_icon("StatusWarning", "EditorIcons")); restart_label->add_theme_color_override("font_color", get_theme_color("warning_color", "Editor")); + + _update_action_map_editor(); } break; case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { search_box->set_right_icon(get_theme_icon("Search", "EditorIcons")); @@ -303,6 +501,8 @@ void ProjectSettingsEditor::_notification(int p_what) { void ProjectSettingsEditor::_bind_methods() { ClassDB::bind_method(D_METHOD("queue_save"), &ProjectSettingsEditor::queue_save); + + ClassDB::bind_method(D_METHOD("_update_action_map_editor"), &ProjectSettingsEditor::_update_action_map_editor); } ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { @@ -340,23 +540,19 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { search_bar->add_child(search_box); advanced = memnew(CheckButton); - advanced->set_text(TTR("Advanced")); + advanced->set_text(TTR("Advanced Settings")); advanced->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_advanced_pressed)); search_bar->add_child(advanced); } { // Advanced bar. - advanced_bar = memnew(VBoxContainer); - advanced_bar->set_h_size_flags(Control::SIZE_EXPAND_FILL); + advanced_bar = memnew(HBoxContainer); advanced_bar->hide(); header->add_child(advanced_bar); - advanced_bar->add_child(memnew(HSeparator)); - - HBoxContainer *hbc = memnew(HBoxContainer); + HBoxContainer *hbc = advanced_bar; hbc->set_h_size_flags(Control::SIZE_EXPAND_FILL); - advanced_bar->add_margin_child(TTR("Add or Remove Custom Project Settings:"), hbc, true); category_box = memnew(LineEdit); category_box->set_h_size_flags(Control::SIZE_EXPAND_FILL); @@ -365,7 +561,7 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { hbc->add_child(category_box); Label *l = memnew(Label); - l->set_text("/"); + l->set_text(" / "); hbc->add_child(l); property_box = memnew(LineEdit); @@ -408,9 +604,6 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { del_button->set_flat(true); del_button->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_delete_setting), varray(false)); hbc->add_child(del_button); - - error_label = memnew(Label); - advanced_bar->add_child(error_label); } inspector = memnew(SectionedInspector); @@ -448,10 +641,16 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { restart_close_button->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_editor_restart_close)); restart_hb->add_child(restart_close_button); - inputmap_editor = memnew(InputMapEditor); - inputmap_editor->set_name(TTR("Input Map")); - inputmap_editor->connect("inputmap_changed", callable_mp(this, &ProjectSettingsEditor::queue_save)); - tab_container->add_child(inputmap_editor); + action_map = memnew(ActionMapEditor); + action_map->set_name(TTR("Input Map")); + action_map->connect("action_added", callable_mp(this, &ProjectSettingsEditor::_action_added)); + action_map->connect("action_edited", callable_mp(this, &ProjectSettingsEditor::_action_edited)); + action_map->connect("action_removed", callable_mp(this, &ProjectSettingsEditor::_action_removed)); + action_map->connect("action_renamed", callable_mp(this, &ProjectSettingsEditor::_action_renamed)); + action_map->connect("action_reordered", callable_mp(this, &ProjectSettingsEditor::_action_reordered)); + action_map->set_toggle_editable_label(TTR("Show built-in Actions")); + action_map->set_show_uneditable(false); + tab_container->add_child(action_map); localization_editor = memnew(LocalizationEditor); localization_editor->set_name(TTR("Localization")); @@ -484,4 +683,13 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { get_ok_button()->set_text(TTR("Close")); set_hide_on_ok(true); + + bool use_advanced = EditorSettings::get_singleton()->get_project_metadata("project_settings", "advanced_mode", false); + + if (use_advanced) { + advanced->set_pressed(true); + advanced_bar->show(); + } + + inspector->set_restrict_to_basic_settings(!use_advanced); } diff --git a/editor/project_settings_editor.h b/editor/project_settings_editor.h index 88c96540ff..c28785bb27 100644 --- a/editor/project_settings_editor.h +++ b/editor/project_settings_editor.h @@ -32,10 +32,10 @@ #define PROJECT_SETTINGS_EDITOR_H #include "core/object/undo_redo.h" +#include "editor/action_map_editor.h" #include "editor/editor_data.h" #include "editor/editor_plugin_settings.h" #include "editor/editor_sectioned_inspector.h" -#include "editor/input_map_editor.h" #include "editor/localization_editor.h" #include "editor/shader_globals_editor.h" #include "editor_autoload_settings.h" @@ -44,38 +44,29 @@ class ProjectSettingsEditor : public AcceptDialog { GDCLASS(ProjectSettingsEditor, AcceptDialog); - enum InputType { - INPUT_KEY, - INPUT_KEY_PHYSICAL, - INPUT_JOY_BUTTON, - INPUT_JOY_MOTION, - INPUT_MOUSE_BUTTON - }; - static ProjectSettingsEditor *singleton; ProjectSettings *ps; Timer *timer; TabContainer *tab_container; SectionedInspector *inspector; - InputMapEditor *inputmap_editor; LocalizationEditor *localization_editor; EditorAutoloadSettings *autoload_settings; ShaderGlobalsEditor *shaders_global_variables_editor; EditorPluginSettings *plugin_settings; + ActionMapEditor *action_map; HBoxContainer *search_bar; LineEdit *search_box; CheckButton *advanced; - VBoxContainer *advanced_bar; + HBoxContainer *advanced_bar; LineEdit *category_box; LineEdit *property_box; Button *add_button; Button *del_button; OptionButton *type; OptionButton *feature_override; - Label *error_label; ConfirmationDialog *del_confirmation; @@ -103,6 +94,14 @@ class ProjectSettingsEditor : public AcceptDialog { void _editor_restart_close(); void _add_feature_overrides(); + + void _action_added(const String &p_name); + void _action_edited(const String &p_name, const Dictionary &p_action); + void _action_removed(const String &p_name); + void _action_renamed(const String &p_old_name, const String &p_new_name); + void _action_reordered(const String &p_action_name, const String &p_relative_to, bool p_before); + void _update_action_map_editor(); + ProjectSettingsEditor(); protected: diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index c1edeeeb0e..48c4d33184 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -107,8 +107,6 @@ void SceneTreeDock::_unhandled_key_input(Ref<InputEvent> p_event) { _tool_selected(TOOL_MOVE_DOWN); } else if (ED_IS_SHORTCUT("scene_tree/reparent", p_event)) { _tool_selected(TOOL_REPARENT); - } else if (ED_IS_SHORTCUT("scene_tree/merge_from_scene", p_event)) { - _tool_selected(TOOL_MERGE_FROM_SCENE); } else if (ED_IS_SHORTCUT("scene_tree/save_branch_as_scene", p_event)) { _tool_selected(TOOL_NEW_SCENE_FROM); } else if (ED_IS_SHORTCUT("scene_tree/delete_no_confirm", p_event)) { @@ -880,13 +878,6 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { } } break; - case TOOL_MERGE_FROM_SCENE: { - if (!profile_allow_editing) { - break; - } - - EditorNode::get_singleton()->merge_from_scene(); - } break; case TOOL_NEW_SCENE_FROM: { if (!profile_allow_editing) { break; @@ -2291,21 +2282,6 @@ void SceneTreeDock::set_selected(Node *p_node, bool p_emit_selected) { scene_tree->set_selected(p_node, p_emit_selected); } -void SceneTreeDock::import_subscene() { - import_subscene_dialog->popup_centered_clamped(Size2(500, 800) * EDSCALE, 0.8); -} - -void SceneTreeDock::_import_subscene() { - Node *parent = scene_tree->get_selected(); - if (!parent) { - parent = editor_data->get_edited_scene_root(); - ERR_FAIL_COND(!parent); - } - - import_subscene_dialog->move(parent, edited_scene); - editor_data->get_undo_redo().clear_history(); //no undo for now.. -} - void SceneTreeDock::_new_scene_from(String p_file) { List<Node *> selection = editor_selection->get_selected_node_list(); @@ -2622,7 +2598,6 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) { if (selection.size() == 1) { if (profile_allow_editing) { menu->add_separator(); - menu->add_icon_shortcut(get_theme_icon("Blend", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/merge_from_scene"), TOOL_MERGE_FROM_SCENE); menu->add_icon_shortcut(get_theme_icon("CreateNewSceneFrom", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/save_branch_as_scene"), TOOL_NEW_SCENE_FROM); } if (full_selection.size() == 1) { @@ -2921,7 +2896,7 @@ void SceneTreeDock::_create_remap_for_node(Node *p_node, Map<RES, RES> &r_remap) if (v.is_ref()) { RES res = v; if (res.is_valid()) { - if (res->get_path() == "" && !r_remap.has(res)) { + if ((res->get_path() == "" || res->get_path().find("::") > -1) && !r_remap.has(res)) { _create_remap_for_resource(res, r_remap); } } @@ -2948,7 +2923,7 @@ void SceneTreeDock::_create_remap_for_resource(RES p_resource, Map<RES, RES> &r_ if (v.is_ref()) { RES res = v; if (res.is_valid()) { - if (res->get_path() == "" && !r_remap.has(res)) { + if ((res->get_path() == "" || res->get_path().find("::") > -1) && !r_remap.has(res)) { _create_remap_for_resource(res, r_remap); } } @@ -3000,7 +2975,6 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel ED_SHORTCUT("scene_tree/reparent", TTR("Reparent")); ED_SHORTCUT("scene_tree/reparent_to_new_node", TTR("Reparent to New Node")); ED_SHORTCUT("scene_tree/make_root", TTR("Make Scene Root")); - ED_SHORTCUT("scene_tree/merge_from_scene", TTR("Merge From Scene")); ED_SHORTCUT("scene_tree/save_branch_as_scene", TTR("Save Branch as Scene")); ED_SHORTCUT("scene_tree/copy_node_path", TTR("Copy Node Path"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_C); ED_SHORTCUT("scene_tree/delete_no_confirm", TTR("Delete (No Confirm)"), KEY_MASK_SHIFT | KEY_DELETE); @@ -3130,10 +3104,6 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel add_child(placeholder_editable_instance_remove_dialog); placeholder_editable_instance_remove_dialog->connect("confirmed", callable_mp(this, &SceneTreeDock::_toggle_placeholder_from_selection)); - import_subscene_dialog = memnew(EditorSubScene); - add_child(import_subscene_dialog); - import_subscene_dialog->connect("subscene_selected", callable_mp(this, &SceneTreeDock::_import_subscene)); - new_scene_from_dialog = memnew(EditorFileDialog); new_scene_from_dialog->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE); add_child(new_scene_from_dialog); diff --git a/editor/scene_tree_dock.h b/editor/scene_tree_dock.h index a042188be6..9bc281c7fb 100644 --- a/editor/scene_tree_dock.h +++ b/editor/scene_tree_dock.h @@ -34,7 +34,6 @@ #include "editor/connections_dialog.h" #include "editor/create_dialog.h" #include "editor/editor_data.h" -#include "editor/editor_sub_scene.h" #include "editor/groups_editor.h" #include "editor/quick_open.h" #include "editor/rename_dialog.h" @@ -74,7 +73,6 @@ class SceneTreeDock : public VBoxContainer { TOOL_REPARENT_TO_NEW_NODE, TOOL_MAKE_ROOT, TOOL_NEW_SCENE_FROM, - TOOL_MERGE_FROM_SCENE, TOOL_MULTI_EDIT, TOOL_ERASE, TOOL_COPY_NODE_PATH, @@ -141,7 +139,6 @@ class SceneTreeDock : public VBoxContainer { ReparentDialog *reparent_dialog; EditorQuickOpen *quick_open; - EditorSubScene *import_subscene_dialog; EditorFileDialog *new_scene_from_dialog; LineEdit *filter; diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp index b9a3e2a801..b6347d3b46 100644 --- a/editor/scene_tree_editor.cpp +++ b/editor/scene_tree_editor.cpp @@ -236,6 +236,8 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent, bool p_scroll item->set_text(0, node_name); item->set_selectable(0, marked_selectable); item->set_custom_color(0, get_theme_color("accent_color", "Editor")); + } else if (!p_node->can_process()) { + item->set_custom_color(0, get_theme_color("disabled_font_color", "Editor")); } else if (!marked_selectable && !marked_children_selectable) { Node *node = p_node; while (node) { @@ -585,6 +587,11 @@ void SceneTreeEditor::_test_update_tree() { tree_dirty = true; } +void SceneTreeEditor::_tree_process_mode_changed() { + MessageQueue::get_singleton()->push_call(this, "_update_tree"); + tree_dirty = true; +} + void SceneTreeEditor::_tree_changed() { if (EditorNode::get_singleton()->is_exiting()) { return; //speed up exit @@ -655,6 +662,7 @@ void SceneTreeEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { get_tree()->connect("tree_changed", callable_mp(this, &SceneTreeEditor::_tree_changed)); + get_tree()->connect("tree_process_mode_changed", callable_mp(this, &SceneTreeEditor::_tree_process_mode_changed)); get_tree()->connect("node_removed", callable_mp(this, &SceneTreeEditor::_node_removed)); get_tree()->connect("node_renamed", callable_mp(this, &SceneTreeEditor::_node_renamed)); get_tree()->connect("node_configuration_warning_changed", callable_mp(this, &SceneTreeEditor::_warning_changed)); @@ -665,6 +673,7 @@ void SceneTreeEditor::_notification(int p_what) { } break; case NOTIFICATION_EXIT_TREE: { get_tree()->disconnect("tree_changed", callable_mp(this, &SceneTreeEditor::_tree_changed)); + get_tree()->disconnect("tree_process_mode_changed", callable_mp(this, &SceneTreeEditor::_tree_process_mode_changed)); get_tree()->disconnect("node_removed", callable_mp(this, &SceneTreeEditor::_node_removed)); get_tree()->disconnect("node_renamed", callable_mp(this, &SceneTreeEditor::_node_renamed)); tree->disconnect("item_collapsed", callable_mp(this, &SceneTreeEditor::_cell_collapsed)); @@ -1194,7 +1203,7 @@ SceneTreeEditor::SceneTreeEditor(bool p_label, bool p_can_rename, bool p_can_ope blocked = 0; update_timer = memnew(Timer); - update_timer->connect("timeout", callable_mp(this, &SceneTreeEditor::_update_tree)); + update_timer->connect("timeout", callable_mp(this, &SceneTreeEditor::_update_tree), varray(false)); update_timer->set_one_shot(true); update_timer->set_wait_time(0.5); add_child(update_timer); diff --git a/editor/scene_tree_editor.h b/editor/scene_tree_editor.h index 7d3419516d..6b505a6784 100644 --- a/editor/scene_tree_editor.h +++ b/editor/scene_tree_editor.h @@ -75,6 +75,7 @@ class SceneTreeEditor : public Control { void _test_update_tree(); void _update_tree(bool p_scroll_to_selected = false); void _tree_changed(); + void _tree_process_mode_changed(); void _node_removed(Node *p_node); void _node_renamed(Node *p_node); diff --git a/editor/settings_config_dialog.cpp b/editor/settings_config_dialog.cpp index 1dad3c091d..3852c389c7 100644 --- a/editor/settings_config_dialog.cpp +++ b/editor/settings_config_dialog.cpp @@ -31,6 +31,7 @@ #include "settings_config_dialog.h" #include "core/config/project_settings.h" +#include "core/input/input_map.h" #include "core/os/keyboard.h" #include "editor/debugger/editor_debugger_node.h" #include "editor_file_system.h" @@ -143,7 +144,7 @@ void EditorSettingsDialog::_unhandled_input(const Ref<InputEvent> &p_event) { if (k.is_valid() && k->is_pressed()) { bool handled = false; - if (ED_IS_SHORTCUT("editor/undo", p_event)) { + if (ED_IS_SHORTCUT("ui_undo", p_event)) { String action = undo_redo->get_current_action_name(); if (action != "") { EditorNode::get_log()->add_message("Undo: " + action, EditorLog::MSG_TYPE_EDITOR); @@ -152,7 +153,7 @@ void EditorSettingsDialog::_unhandled_input(const Ref<InputEvent> &p_event) { handled = true; } - if (ED_IS_SHORTCUT("editor/redo", p_event)) { + if (ED_IS_SHORTCUT("ui_redo", p_event)) { undo_redo->redo(); String action = undo_redo->get_current_action_name(); if (action != "") { @@ -184,7 +185,52 @@ void EditorSettingsDialog::_update_icons() { restart_label->add_theme_color_override("font_color", shortcuts->get_theme_color("warning_color", "Editor")); } +void EditorSettingsDialog::_event_config_confirmed() { + Ref<InputEventKey> k = shortcut_editor->get_event(); + if (k.is_null()) { + return; + } + + if (editing_action) { + if (current_action_event_index == -1) { + // Add new event + current_action_events.push_back(k); + } else { + // Edit existing event + current_action_events[current_action_event_index] = k; + } + + _update_builtin_action(current_action, current_action_events); + } else { + k = k->duplicate(); + Ref<Shortcut> current_sc = EditorSettings::get_singleton()->get_shortcut(shortcut_being_edited); + + undo_redo->create_action(TTR("Change Shortcut") + " '" + shortcut_being_edited + "'"); + undo_redo->add_do_method(current_sc.ptr(), "set_shortcut", k); + undo_redo->add_undo_method(current_sc.ptr(), "set_shortcut", current_sc->get_shortcut()); + undo_redo->add_do_method(this, "_update_shortcuts"); + undo_redo->add_undo_method(this, "_update_shortcuts"); + undo_redo->add_do_method(this, "_settings_changed"); + undo_redo->add_undo_method(this, "_settings_changed"); + undo_redo->commit_action(); + } +} + +void EditorSettingsDialog::_update_builtin_action(const String &p_name, const Array &p_events) { + Array old_input_array = EditorSettings::get_singleton()->get_builtin_action_overrides(current_action); + + undo_redo->create_action(TTR("Edit Built-in Action")); + undo_redo->add_do_method(EditorSettings::get_singleton(), "set_builtin_action_override", p_name, p_events); + undo_redo->add_undo_method(EditorSettings::get_singleton(), "set_builtin_action_override", p_name, old_input_array); + undo_redo->add_do_method(this, "_settings_changed"); + undo_redo->add_undo_method(this, "_settings_changed"); + undo_redo->commit_action(); + + _update_shortcuts(); +} + void EditorSettingsDialog::_update_shortcuts() { + // Before clearing the tree, take note of which categories are collapsed so that this state can be maintained when the tree is repopulated. Map<String, bool> collapsed; if (shortcuts->get_root() && shortcuts->get_root()->get_children()) { @@ -192,15 +238,93 @@ void EditorSettingsDialog::_update_shortcuts() { collapsed[item->get_text(0)] = item->is_collapsed(); } } - shortcuts->clear(); - List<String> slist; - EditorSettings::get_singleton()->get_shortcut_list(&slist); TreeItem *root = shortcuts->create_item(); - Map<String, TreeItem *> sections; + // Set up section for Common/Built-in actions + TreeItem *common_section = shortcuts->create_item(root); + + sections["Common"] = common_section; + common_section->set_text(0, TTR("Common")); + if (collapsed.has("Common")) { + common_section->set_collapsed(collapsed["Common"]); + } + common_section->set_custom_bg_color(0, shortcuts->get_theme_color("prop_subsection", "Editor")); + common_section->set_custom_bg_color(1, shortcuts->get_theme_color("prop_subsection", "Editor")); + + // Get the action map for the editor, and add each item to the "Common" section. + OrderedHashMap<StringName, InputMap::Action> action_map = InputMap::get_singleton()->get_action_map(); + for (OrderedHashMap<StringName, InputMap::Action>::Element E = action_map.front(); E; E = E.next()) { + String action_name = E.key(); + + if (!shortcut_filter.is_subsequence_ofi(action_name)) { + continue; + } + + InputMap::Action action = E.get(); + + Array events; // Need to get the list of events into an array so it can be set as metadata on the item. + Vector<String> event_strings; + + List<Ref<InputEvent>> defaults = InputMap::get_singleton()->get_builtins().find(action_name).value(); + // Remove all non-key events from the defaults. + for (List<Ref<InputEvent>>::Element *I = defaults.front(); I; I = I->next()) { + Ref<InputEventKey> k = I->get(); + if (k.is_null()) { + I->erase(); + } + } + + bool same_as_defaults = defaults.size() == action.inputs.size(); // Initially this is set to just whether the arrays are equal. Later we check the events if needed. + + int count = 0; + for (List<Ref<InputEvent>>::Element *I = action.inputs.front(); I; I = I->next()) { + // Add event and event text to respective arrays. + events.push_back(I->get()); + event_strings.push_back(I->get()->as_text()); + + // Only check if the events have been the same so far - once one fails, we don't need to check any more. + if (same_as_defaults) { + Ref<InputEventKey> k = defaults[count]; + // Only check keys, since we are in the editor. + if (k.is_valid() && !defaults[count]->shortcut_match(I->get())) { + same_as_defaults = false; + } + } + count++; + } + + // Join the text of the events with a delimiter so they can all be displayed in one cell. + String events_display_string = event_strings.is_empty() ? "None" : String("; ").join(event_strings); + + TreeItem *item = shortcuts->create_item(common_section); + item->set_text(0, action_name); + item->set_text(1, events_display_string); + + if (!same_as_defaults) { + item->add_button(1, shortcuts->get_theme_icon("Reload", "EditorIcons"), 2); + } + + if (events_display_string == "None") { + // Fade out unassigned shortcut labels for easier visual grepping. + item->set_custom_color(1, shortcuts->get_theme_color("font_color", "Label") * Color(1, 1, 1, 0.5)); + } + + item->add_button(1, shortcuts->get_theme_icon("Edit", "EditorIcons"), 0); + item->add_button(1, shortcuts->get_theme_icon("Close", "EditorIcons"), 1); + item->set_tooltip(0, action_name); + item->set_tooltip(1, events_display_string); + item->set_metadata(0, "Common"); + item->set_metadata(1, events); + } + + // Editor Shortcuts + + List<String> slist; + EditorSettings::get_singleton()->get_shortcut_list(&slist); + for (List<String>::Element *E = slist.front(); E; E = E->next()) { Ref<Shortcut> sc = EditorSettings::get_singleton()->get_shortcut(E->get()); if (!sc->has_meta("original")) { @@ -267,84 +391,119 @@ void EditorSettingsDialog::_shortcut_button_pressed(Object *p_item, int p_column TreeItem *ti = Object::cast_to<TreeItem>(p_item); ERR_FAIL_COND(!ti); - String item = ti->get_metadata(0); - Ref<Shortcut> sc = EditorSettings::get_singleton()->get_shortcut(item); - - if (p_idx == 0) { - press_a_key_label->set_text(TTR("Press a Key...")); - last_wait_for_key = Ref<InputEventKey>(); - press_a_key->popup_centered(Size2(250, 80) * EDSCALE); - //press_a_key->grab_focus(); - press_a_key->get_ok_button()->set_focus_mode(Control::FOCUS_NONE); - press_a_key->get_cancel_button()->set_focus_mode(Control::FOCUS_NONE); - shortcut_configured = item; - - } else if (p_idx == 1) { //erase - if (!sc.is_valid()) { - return; //pointless, there is nothing + if (ti->get_metadata(0) == "Common") { + // Editing a Built-in action, which can have multiple bindings. + button_idx = p_idx; + editing_action = true; + current_action = ti->get_text(0); + + switch (button_idx) { + case SHORTCUT_REVERT: { + Array events; + List<Ref<InputEvent>> defaults = InputMap::get_singleton()->get_builtins()[current_action]; + + // Convert the list to an array, and only keep key events as this is for the editor. + for (List<Ref<InputEvent>>::Element *E = defaults.front(); E; E = E->next()) { + Ref<InputEventKey> k = E->get(); + if (k.is_valid()) { + events.append(E->get()); + } + } + + _update_builtin_action(current_action, events); + } break; + case SHORTCUT_EDIT: + case SHORTCUT_ERASE: { + // For Edit end Delete, we will show a popup which displays each event so the user can select which one to edit/delete. + current_action_events = ti->get_metadata(1); + action_popup->clear(); + + for (int i = 0; i < current_action_events.size(); i++) { + Ref<InputEvent> ie = current_action_events[i]; + action_popup->add_item(ie->as_text()); + action_popup->set_item_metadata(i, ie); + } + + if (button_idx == SHORTCUT_EDIT) { + // If editing, add a button which can be used to add an additional event. + action_popup->add_icon_item(get_theme_icon("Add", "EditorIcons"), TTR("Add")); + } + + action_popup->set_position(get_position() + get_mouse_position()); + action_popup->take_mouse_focus(); + action_popup->popup(); + action_popup->set_as_minsize(); + } break; + default: + break; } - - undo_redo->create_action(TTR("Erase Shortcut")); - undo_redo->add_do_method(sc.ptr(), "set_shortcut", Ref<InputEvent>()); - undo_redo->add_undo_method(sc.ptr(), "set_shortcut", sc->get_shortcut()); - undo_redo->add_do_method(this, "_update_shortcuts"); - undo_redo->add_undo_method(this, "_update_shortcuts"); - undo_redo->add_do_method(this, "_settings_changed"); - undo_redo->add_undo_method(this, "_settings_changed"); - undo_redo->commit_action(); - } else if (p_idx == 2) { //revert to original - if (!sc.is_valid()) { - return; //pointless, there is nothing + } else { + // Editing an Editor Shortcut, which can only have 1 binding. + String item = ti->get_metadata(0); + Ref<Shortcut> sc = EditorSettings::get_singleton()->get_shortcut(item); + editing_action = false; + + switch (button_idx) { + case EditorSettingsDialog::SHORTCUT_EDIT: + shortcut_editor->popup_and_configure(sc->get_shortcut()); + shortcut_being_edited = item; + break; + case EditorSettingsDialog::SHORTCUT_ERASE: { + if (!sc.is_valid()) { + return; //pointless, there is nothing + } + + undo_redo->create_action(TTR("Erase Shortcut")); + undo_redo->add_do_method(sc.ptr(), "set_shortcut", Ref<InputEvent>()); + undo_redo->add_undo_method(sc.ptr(), "set_shortcut", sc->get_shortcut()); + undo_redo->add_do_method(this, "_update_shortcuts"); + undo_redo->add_undo_method(this, "_update_shortcuts"); + undo_redo->add_do_method(this, "_settings_changed"); + undo_redo->add_undo_method(this, "_settings_changed"); + undo_redo->commit_action(); + } break; + case EditorSettingsDialog::SHORTCUT_REVERT: { + if (!sc.is_valid()) { + return; //pointless, there is nothing + } + + Ref<InputEvent> original = sc->get_meta("original"); + + undo_redo->create_action(TTR("Restore Shortcut")); + undo_redo->add_do_method(sc.ptr(), "set_shortcut", original); + undo_redo->add_undo_method(sc.ptr(), "set_shortcut", sc->get_shortcut()); + undo_redo->add_do_method(this, "_update_shortcuts"); + undo_redo->add_undo_method(this, "_update_shortcuts"); + undo_redo->add_do_method(this, "_settings_changed"); + undo_redo->add_undo_method(this, "_settings_changed"); + undo_redo->commit_action(); + } break; + default: + break; } - - Ref<InputEvent> original = sc->get_meta("original"); - - undo_redo->create_action(TTR("Restore Shortcut")); - undo_redo->add_do_method(sc.ptr(), "set_shortcut", original); - undo_redo->add_undo_method(sc.ptr(), "set_shortcut", sc->get_shortcut()); - undo_redo->add_do_method(this, "_update_shortcuts"); - undo_redo->add_undo_method(this, "_update_shortcuts"); - undo_redo->add_do_method(this, "_settings_changed"); - undo_redo->add_undo_method(this, "_settings_changed"); - undo_redo->commit_action(); } } -void EditorSettingsDialog::_wait_for_key(const Ref<InputEvent> &p_event) { - Ref<InputEventKey> k = p_event; - - if (k.is_valid() && k->is_pressed() && k->get_keycode() != 0) { - last_wait_for_key = k; - const String str = keycode_get_string(k->get_keycode_with_modifiers()); - - press_a_key_label->set_text(str); - press_a_key->set_input_as_handled(); - } -} - -void EditorSettingsDialog::_press_a_key_confirm() { - if (last_wait_for_key.is_null()) { - return; +void EditorSettingsDialog::_builtin_action_popup_index_pressed(int p_index) { + switch (button_idx) { + case SHORTCUT_EDIT: { + if (p_index == action_popup->get_item_count() - 1) { + // Selected last item in list (Add button), therefore add new + current_action_event_index = -1; + shortcut_editor->popup_and_configure(); + } else { + // Configure existing + current_action_event_index = p_index; + shortcut_editor->popup_and_configure(action_popup->get_item_metadata(p_index)); + } + } break; + case SHORTCUT_ERASE: { + current_action_events.remove(p_index); + _update_builtin_action(current_action, current_action_events); + } break; + default: + break; } - - Ref<InputEventKey> ie; - ie.instance(); - ie->set_keycode(last_wait_for_key->get_keycode()); - ie->set_shift(last_wait_for_key->get_shift()); - ie->set_control(last_wait_for_key->get_control()); - ie->set_alt(last_wait_for_key->get_alt()); - ie->set_metakey(last_wait_for_key->get_metakey()); - - Ref<Shortcut> sc = EditorSettings::get_singleton()->get_shortcut(shortcut_configured); - - undo_redo->create_action(TTR("Change Shortcut") + " '" + shortcut_configured + "'"); - undo_redo->add_do_method(sc.ptr(), "set_shortcut", ie); - undo_redo->add_undo_method(sc.ptr(), "set_shortcut", sc->get_shortcut()); - undo_redo->add_do_method(this, "_update_shortcuts"); - undo_redo->add_undo_method(this, "_update_shortcuts"); - undo_redo->add_do_method(this, "_settings_changed"); - undo_redo->add_undo_method(this, "_settings_changed"); - undo_redo->commit_action(); } void EditorSettingsDialog::_tabs_tab_changed(int p_tab) { @@ -382,9 +541,14 @@ void EditorSettingsDialog::_editor_restart_close() { void EditorSettingsDialog::_bind_methods() { ClassDB::bind_method(D_METHOD("_unhandled_input"), &EditorSettingsDialog::_unhandled_input); ClassDB::bind_method(D_METHOD("_update_shortcuts"), &EditorSettingsDialog::_update_shortcuts); + ClassDB::bind_method(D_METHOD("_settings_changed"), &EditorSettingsDialog::_settings_changed); } EditorSettingsDialog::EditorSettingsDialog() { + action_popup = memnew(PopupMenu); + action_popup->connect("index_pressed", callable_mp(this, &EditorSettingsDialog::_builtin_action_popup_index_pressed)); + add_child(action_popup); + set_title(TTR("Editor Settings")); undo_redo = memnew(UndoRedo); @@ -442,21 +606,17 @@ EditorSettingsDialog::EditorSettingsDialog() { // Shortcuts Tab tab_shortcuts = memnew(VBoxContainer); + tabs->add_child(tab_shortcuts); tab_shortcuts->set_name(TTR("Shortcuts")); - hbc = memnew(HBoxContainer); - hbc->set_h_size_flags(Control::SIZE_EXPAND_FILL); - tab_shortcuts->add_child(hbc); - shortcut_search_box = memnew(LineEdit); shortcut_search_box->set_placeholder(TTR("Search")); shortcut_search_box->set_h_size_flags(Control::SIZE_EXPAND_FILL); - hbc->add_child(shortcut_search_box); + tab_shortcuts->add_child(shortcut_search_box); shortcut_search_box->connect("text_changed", callable_mp(this, &EditorSettingsDialog::_filter_shortcuts)); shortcuts = memnew(Tree); - tab_shortcuts->add_child(shortcuts, true); shortcuts->set_v_size_flags(Control::SIZE_EXPAND_FILL); shortcuts->set_columns(2); shortcuts->set_hide_root(true); @@ -464,21 +624,13 @@ EditorSettingsDialog::EditorSettingsDialog() { shortcuts->set_column_title(0, TTR("Name")); shortcuts->set_column_title(1, TTR("Binding")); shortcuts->connect("button_pressed", callable_mp(this, &EditorSettingsDialog::_shortcut_button_pressed)); + tab_shortcuts->add_child(shortcuts); - press_a_key = memnew(ConfirmationDialog); - //press_a_key->set_focus_mode(Control::FOCUS_ALL); - add_child(press_a_key); - - Label *l = memnew(Label); - l->set_text(TTR("Press a Key...")); - l->set_anchors_and_offsets_preset(Control::PRESET_WIDE); - l->set_align(Label::ALIGN_CENTER); - l->set_offset(SIDE_TOP, 20); - l->set_anchor_and_offset(SIDE_BOTTOM, Control::ANCHOR_BEGIN, 30); - press_a_key_label = l; - press_a_key->add_child(l); - press_a_key->connect("window_input", callable_mp(this, &EditorSettingsDialog::_wait_for_key)); - press_a_key->connect("confirmed", callable_mp(this, &EditorSettingsDialog::_press_a_key_confirm)); + // Adding event dialog + shortcut_editor = memnew(InputEventConfigurationDialog); + shortcut_editor->connect("confirmed", callable_mp(this, &EditorSettingsDialog::_event_config_confirmed)); + shortcut_editor->set_allowed_input_types(InputEventConfigurationDialog::InputType::INPUT_KEY); + add_child(shortcut_editor); set_hide_on_ok(true); diff --git a/editor/settings_config_dialog.h b/editor/settings_config_dialog.h index b1ee58ae8f..c38fceedf1 100644 --- a/editor/settings_config_dialog.h +++ b/editor/settings_config_dialog.h @@ -31,6 +31,7 @@ #ifndef SETTINGS_CONFIG_DIALOG_H #define SETTINGS_CONFIG_DIALOG_H +#include "editor/action_map_editor.h" #include "editor/editor_sectioned_inspector.h" #include "editor_inspector.h" #include "scene/gui/dialogs.h" @@ -52,16 +53,28 @@ class EditorSettingsDialog : public AcceptDialog { LineEdit *shortcut_search_box; SectionedInspector *inspector; + enum ShortcutButton { + SHORTCUT_EDIT, + SHORTCUT_ERASE, + SHORTCUT_REVERT + }; + + int button_idx; + int current_action_event_index = -1; + bool editing_action = false; + String current_action; + Array current_action_events; + PopupMenu *action_popup; + Timer *timer; UndoRedo *undo_redo; - Tree *shortcuts; - ConfirmationDialog *press_a_key; - Label *press_a_key_label; - Ref<InputEventKey> last_wait_for_key; - String shortcut_configured; + // Shortcuts String shortcut_filter; + Tree *shortcuts; + InputEventConfigurationDialog *shortcut_editor; + String shortcut_being_edited; virtual void cancel_pressed() override; virtual void ok_pressed() override; @@ -74,20 +87,20 @@ class EditorSettingsDialog : public AcceptDialog { void _notification(int p_what); void _update_icons(); - void _press_a_key_confirm(); - void _wait_for_key(const Ref<InputEvent> &p_event); + void _event_config_confirmed(); + + void _update_builtin_action(const String &p_name, const Array &p_events); void _tabs_tab_changed(int p_tab); void _focus_current_search_box(); - void _clear_shortcut_search_box(); - void _clear_search_box(); - void _filter_shortcuts(const String &p_filter); void _update_shortcuts(); void _shortcut_button_pressed(Object *p_item, int p_column, int p_idx); + void _builtin_action_popup_index_pressed(int p_index); + static void _undo_redo_callback(void *p_self, const String &p_name); Label *restart_label; diff --git a/editor/translations/af.po b/editor/translations/af.po index 9c2cb8bdee..e2a66e1acc 100644 --- a/editor/translations/af.po +++ b/editor/translations/af.po @@ -659,7 +659,7 @@ msgstr "Stel Oorgange na:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -2581,7 +2581,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2981,14 +2981,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Soek" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3365,7 +3357,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -5085,7 +5077,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -7022,6 +7014,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Soek" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7173,8 +7173,8 @@ msgstr "Skep" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10647,6 +10647,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Anim Dupliseer Sleutels" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Deursoek Hulp" @@ -10773,6 +10782,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Anim Dupliseer Sleutels" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/ar.po b/editor/translations/ar.po index 82edf48cf2..d12383f798 100644 --- a/editor/translations/ar.po +++ b/editor/translations/ar.po @@ -684,7 +684,7 @@ msgstr "إختر المقاطع المراد نسخها" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "نسخ" @@ -2551,7 +2551,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "غير قادر علي تفعيل إضافة البرنامج المُساعد في: '%s' تحميل الظبط فشل." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "غير قادر علي إيجاد منطقة النص البرمجي من أجل إضافة البرنامج في: 'res://" "addons/%s'." @@ -2983,14 +2984,6 @@ msgid "Help" msgstr "مساعدة" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "بحث" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "مستندات الإنترنت" @@ -3382,7 +3375,7 @@ msgstr "إجعلة مميزاً" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "لصق" @@ -5047,7 +5040,8 @@ msgid "Got:" msgstr "ما تم الحصول عليه:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "فشل التاكد من ترميز sha256" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6974,6 +6968,14 @@ msgstr "إغلاق المستندات" msgid "Run" msgstr "تشغيل" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "بحث" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "اخط خطوة ضمن" @@ -7120,8 +7122,8 @@ msgstr "نقاط التكسّر" msgid "Go To" msgstr "التوجه إلى" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "قص" @@ -10663,6 +10665,16 @@ msgid "Instance Child Scene" msgstr "نمذجة المشهد الابن" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "لا يمكن تنفيذ الإجراء على عُقدة من مشهد أجنبي!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "لصق العُقد" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "فصل النص البرمجي" @@ -10790,6 +10802,11 @@ msgid "Attach Script" msgstr "إلحاق نص برمجي" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "قص العُقد" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "إزالة عُقدة (عُقد)" diff --git a/editor/translations/bg.po b/editor/translations/bg.po index 886a8c8e6a..595899152d 100644 --- a/editor/translations/bg.po +++ b/editor/translations/bg.po @@ -640,7 +640,7 @@ msgstr "Изберете пътечки за копиране" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Копиране" @@ -2446,8 +2446,9 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "" +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "Не може да се зареди скриптът на добавка от: „%s“." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -2838,14 +2839,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Търсене" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3221,7 +3214,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Поставяне" @@ -4860,7 +4853,8 @@ msgid "Got:" msgstr "Получено:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Неуспешна проверка на хеш от вид „sha256“" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6763,6 +6757,14 @@ msgstr "Затваряне на документацията" msgid "Run" msgstr "Пускане" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Търсене" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6908,8 +6910,8 @@ msgstr "Точки на прекъсване" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Изрязване" @@ -10278,6 +10280,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Поставяне на възлите" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Разкачане на скрипта" @@ -10398,6 +10409,11 @@ msgid "Attach Script" msgstr "Закачане на скрипт" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Изрязване на възлите" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/bn.po b/editor/translations/bn.po index 03e3d0388a..18ac61a269 100644 --- a/editor/translations/bn.po +++ b/editor/translations/bn.po @@ -650,7 +650,7 @@ msgstr "গুণাগুণ/বৈশিষ্ট্য copy করুন" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "প্রতিলিপি/কপি করুন" @@ -2641,7 +2641,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "অ্যাড-অন প্লাগইন এনাবল করা সম্ভব হয় নি। কনফিগার পার্সিং ('%s') ব্যর্থ হয়েছে।" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "'res://addons/%s' লোকেশনে অ্যাড-অন প্লাগইনের স্ক্রিপ্ট ফাইল খুঁজে পাওয়া যায়নি।" @@ -3105,14 +3106,6 @@ msgid "Help" msgstr "হেল্প" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "অনুসন্ধান করুন" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp #, fuzzy msgid "Online Docs" @@ -3523,7 +3516,7 @@ msgstr "বোন্/হাড় তৈরি করুন" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "প্রতিলেপন/পেস্ট করুন" @@ -5358,7 +5351,8 @@ msgid "Got:" msgstr "প্রাপ্ত:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "sha256 হ্যাশ চেক ব্যর্থ হয়েছে" #: editor/plugins/asset_library_editor_plugin.cpp @@ -7422,6 +7416,14 @@ msgstr "ডকুমেন্টসমূহ বন্ধ করুন" msgid "Run" msgstr "চালান" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "অনুসন্ধান করুন" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "পদার্পণ করুন" @@ -7580,8 +7582,8 @@ msgstr "বিন্দু অপসারণ করুন" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "কর্তন/কাট করুন" @@ -11276,6 +11278,16 @@ msgstr "শীষ্য নোড ইন্সট্যান্স করুন #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "বাহিরের দৃশ্যের নোডে এটি করা সম্ভব হবে না!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "নোড-সমূহ প্রতিলেপন/পেস্ট করুন" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Detach Script" msgstr "স্ক্রিপ্ট সংযুক্ত করুন" @@ -11407,6 +11419,11 @@ msgid "Attach Script" msgstr "স্ক্রিপ্ট সংযুক্ত করুন" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "নোড-সমূহ কর্তন/কাট করুন" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "নোড(সমূহ) অপসারণ করুন" diff --git a/editor/translations/br.po b/editor/translations/br.po index 0b056dd9ed..3651e8fb0e 100644 --- a/editor/translations/br.po +++ b/editor/translations/br.po @@ -643,7 +643,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -2447,7 +2447,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2837,14 +2837,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3216,7 +3208,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4844,7 +4836,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6715,6 +6707,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6858,8 +6858,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10211,6 +10211,14 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10331,6 +10339,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/ca.po b/editor/translations/ca.po index 568e373a6a..38f08f66cd 100644 --- a/editor/translations/ca.po +++ b/editor/translations/ca.po @@ -655,7 +655,7 @@ msgstr "Seleccioneu les Pistes a Copiar" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Copiar" @@ -2547,7 +2547,8 @@ msgstr "" "configuració." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "No s'ha pogut trobar el camp d'Script per al complement a: 'res: // addons /" "%s'." @@ -2987,14 +2988,6 @@ msgid "Help" msgstr "Ajuda" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Cerca" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Documentació en línia" @@ -3398,7 +3391,7 @@ msgstr "Fes-lo Únic" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Enganxa" @@ -5094,7 +5087,8 @@ msgid "Got:" msgstr "Rebut:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Ha fallat la comprovació del hash sha256" #: editor/plugins/asset_library_editor_plugin.cpp @@ -7090,6 +7084,14 @@ msgstr "Tanca la Documentació" msgid "Run" msgstr "Executar" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Cerca" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Pas a Pas (per instruccions)" @@ -7241,8 +7243,8 @@ msgstr "Punts d’interrupció" msgid "Go To" msgstr "Anar a" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Talla" @@ -10944,6 +10946,16 @@ msgstr "Instancia una Escena Filla" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "No es pot operar en Nodes d'una escena externa!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Enganxa els Nodes" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Detach Script" msgstr "Adjunta-li un Script" @@ -11078,6 +11090,11 @@ msgid "Attach Script" msgstr "Adjunta-li un Script" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Talla els Nodes" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Elimina els Nodes" diff --git a/editor/translations/cs.po b/editor/translations/cs.po index 04eb87654d..625daea641 100644 --- a/editor/translations/cs.po +++ b/editor/translations/cs.po @@ -666,7 +666,7 @@ msgstr "Vybrat stopy ke kopírování" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopírovat" @@ -2538,7 +2538,8 @@ msgstr "" "Nelze povolit rozšiřující plugin: '%s' parsování konfigurace se nezdařilo." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "Nelze najít záznam skriptu pro rozšiřující plugin v: 'res://addons/%s'." @@ -2967,14 +2968,6 @@ msgid "Help" msgstr "Nápověda" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Hledat" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Online dokumentace" @@ -3368,7 +3361,7 @@ msgstr "Vytvořit unikátní" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Vložit" @@ -5033,7 +5026,8 @@ msgid "Got:" msgstr "Staženo:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Neúspěšná kontrola sha256 hashe" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6960,6 +6954,14 @@ msgstr "Zavřít dokumentaci" msgid "Run" msgstr "Spustit" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Hledat" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Vstoupit do" @@ -7105,8 +7107,8 @@ msgstr "Breakpointy" msgid "Go To" msgstr "Přejít na" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Vyjmout" @@ -10627,6 +10629,16 @@ msgid "Instance Child Scene" msgstr "Přidat instanci scény" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "Nelze manipulovat s uzly z cizí scény!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Vložit uzly" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Odpojit skript" @@ -10753,6 +10765,11 @@ msgid "Attach Script" msgstr "Připojit skript" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Vyjmout uzly" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Odstranit uzel/uzly" diff --git a/editor/translations/da.po b/editor/translations/da.po index 8569251e55..0f677c6f96 100644 --- a/editor/translations/da.po +++ b/editor/translations/da.po @@ -680,7 +680,7 @@ msgstr "Vælg spor til kopiering:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopier" @@ -2626,7 +2626,8 @@ msgstr "" "mislykkedes." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "Kan ikke finde scriptfelt for addon plugin på: 'res://addons/%s'." #: editor/editor_node.cpp @@ -3072,14 +3073,6 @@ msgid "Help" msgstr "Hjælp" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Søg" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Online Dokumentation" @@ -3465,7 +3458,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Indsæt" @@ -5234,7 +5227,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -7197,6 +7190,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Søg" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7350,8 +7351,8 @@ msgstr "Slet points" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Cut" @@ -10892,6 +10893,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Indsæt Node" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Ryd Script" @@ -11022,6 +11032,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Indsæt Node" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -13566,10 +13581,6 @@ msgstr "Konstanter kan ikke ændres." #~ msgid "Create folder" #~ msgstr "Opret mappe" -#, fuzzy -#~ msgid "Custom Node" -#~ msgstr "Indsæt Node" - #~ msgid "Invalid Path" #~ msgstr "Ugyldig sti" diff --git a/editor/translations/de.po b/editor/translations/de.po index abb61ade0d..0c8ab619c5 100644 --- a/editor/translations/de.po +++ b/editor/translations/de.po @@ -67,7 +67,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-02-07 05:50+0000\n" +"PO-Revision-Date: 2021-02-21 10:50+0000\n" "Last-Translator: So Wieso <sowieso@dukun.de>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot/de/>\n" @@ -76,7 +76,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-dev\n" +"X-Generator: Weblate 4.5\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -708,7 +708,7 @@ msgstr "Zu kopierende Spuren auswählen" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopieren" @@ -2602,7 +2602,8 @@ msgstr "" "fehlgeschlagen." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "Skript-Feld für Erweiterung in ‚res://addons/%s‘ konnte nicht gefunden " "werden." @@ -3043,14 +3044,6 @@ msgid "Help" msgstr "Hilfe" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Suchen" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Internetdokumentation" @@ -3216,13 +3209,12 @@ msgid "Open & Run a Script" msgstr "Skript öffnen und ausführen" #: editor/editor_node.cpp -#, fuzzy msgid "" "The following files are newer on disk.\n" "What action should be taken?" msgstr "" "Die folgenden Dateien wurden im Dateisystem verändert.\n" -"Wie soll weiter vorgegangen werden?:" +"Wie soll weiter vorgegangen werden?" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -3446,7 +3438,7 @@ msgstr "Einzigartig machen" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Einfügen" @@ -5122,7 +5114,8 @@ msgid "Got:" msgstr "Erhalten:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Sha256-Prüfung fehlgeschlagen" #: editor/plugins/asset_library_editor_plugin.cpp @@ -7062,6 +7055,14 @@ msgstr "Dokumentation schließen" msgid "Run" msgstr "Ausführen" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Suchen" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Hineinspringen" @@ -7210,8 +7211,8 @@ msgstr "Haltepunkte" msgid "Go To" msgstr "Springe zu" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Ausschneiden" @@ -10137,9 +10138,8 @@ msgid "Projects" msgstr "Projekte" #: editor/project_manager.cpp -#, fuzzy msgid "Loading, please wait..." -msgstr "Mirrors werden geladen, bitte warten..." +msgstr "Projekte werden geladen, bitte warten..." #: editor/project_manager.cpp msgid "Last Modified" @@ -10765,6 +10765,16 @@ msgid "Instance Child Scene" msgstr "Szene hier instantiieren" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "Bearbeiten von Nodes einer fremden Szene ist nicht möglich!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Nodes einfügen" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Skript loslösen" @@ -10892,6 +10902,11 @@ msgid "Attach Script" msgstr "Skript hinzufügen" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Nodes trennen" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Entferne Node(s)" diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot index bda182e494..21d516e8ee 100644 --- a/editor/translations/editor.pot +++ b/editor/translations/editor.pot @@ -621,7 +621,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -2425,7 +2425,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2815,14 +2815,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3194,7 +3186,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4822,7 +4814,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6693,6 +6685,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6836,8 +6836,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10189,6 +10189,14 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10309,6 +10317,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/el.po b/editor/translations/el.po index 5fb433a3cb..f6205b3b50 100644 --- a/editor/translations/el.po +++ b/editor/translations/el.po @@ -657,7 +657,7 @@ msgstr "Επιλογή Κομματιών για Αντιγραφή" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Αντιγραφή" @@ -2543,7 +2543,8 @@ msgstr "" "αρχείου ρύθμισης." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "Αδύνατη η έυρεση του πεδίου 'script' για την πρόσθετη επέκταση στο: 'res://" "addons/%s'." @@ -2984,14 +2985,6 @@ msgid "Help" msgstr "Βοήθεια" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Αναζήτηση" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Ηλεκτρονική τεκμηρίωση" @@ -3388,7 +3381,7 @@ msgstr "Κάνε μοναδικό" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Επικόλληση" @@ -5065,7 +5058,8 @@ msgid "Got:" msgstr "Δοσμένο:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Η δοκιμή κατακερματισμού sha256 απέτυχε" #: editor/plugins/asset_library_editor_plugin.cpp @@ -7020,6 +7014,14 @@ msgstr "Κλείσιμο Τεκμηρίωσης" msgid "Run" msgstr "Εκτέλεση" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Αναζήτηση" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Βήμα μέσα" @@ -7169,8 +7171,8 @@ msgstr "Σημεία Διακοπής" msgid "Go To" msgstr "Πήγαινε Σε" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Αποκοπή" @@ -10720,6 +10722,16 @@ msgid "Instance Child Scene" msgstr "Αρχικοποίηση σκηνής ως παιδί" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "Δεν είναι δυνατή η λειτουργία σε κόμβους από ξένη σκηνή!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Επικόλληση κόμβων" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Αποσύνδεση Δέσμης Ενεργειών" @@ -10852,6 +10864,11 @@ msgid "Attach Script" msgstr "Σύνδεση Δέσμης Ενεργειών" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Αποκοπή κόμβων" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Αφαίρεση κόμβων" diff --git a/editor/translations/eo.po b/editor/translations/eo.po index a485cca645..bbc0d13358 100644 --- a/editor/translations/eo.po +++ b/editor/translations/eo.po @@ -10,18 +10,19 @@ # Sr Half <flavio05@outlook.com>, 2020. # Cristian Yepez <cristianyepez@gmail.com>, 2020. # BinotaLIU <me@binota.org>, 2020. +# Jakub Fabijan <animatorzPolski@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2020-11-20 23:08+0000\n" -"Last-Translator: BinotaLIU <me@binota.org>\n" +"PO-Revision-Date: 2021-02-21 10:51+0000\n" +"Last-Translator: Jakub Fabijan <animatorzPolski@gmail.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.4-dev\n" +"X-Generator: Weblate 4.5\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -646,14 +647,13 @@ msgstr "Elekti vojetojn por duplikati" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Duplikati" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select All/None" -msgstr "Elektaro nur" +msgstr "Elekti Ĉiuj/Neniuj" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -2491,7 +2491,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2911,14 +2911,6 @@ msgid "Help" msgstr "Helpo" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Serĉo" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp #, fuzzy msgid "Online Docs" @@ -3295,7 +3287,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4940,7 +4932,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6822,6 +6814,14 @@ msgstr "" msgid "Run" msgstr "Ruli" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Serĉo" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6966,8 +6966,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10346,6 +10346,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Skali Elektaron" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Krei skripton" @@ -10470,6 +10479,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/es.po b/editor/translations/es.po index e9617793bb..20a252e6a4 100644 --- a/editor/translations/es.po +++ b/editor/translations/es.po @@ -708,7 +708,7 @@ msgstr "Selecciona las Pistas a Copiar" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Copiar" @@ -2600,7 +2600,8 @@ msgstr "" "configuración de '%s'." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "No se pudo encontrar el campo del script para el plugin addon en: 'res://" "addons/%s'." @@ -3040,14 +3041,6 @@ msgid "Help" msgstr "Ayuda" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Buscar" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Documentación Online" @@ -3445,7 +3438,7 @@ msgstr "Hacer Único" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Pegar" @@ -5126,7 +5119,8 @@ msgid "Got:" msgstr "Tiene:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Fallo en la comprobación del hash sha256" #: editor/plugins/asset_library_editor_plugin.cpp @@ -7067,6 +7061,14 @@ msgstr "Cerrar Documentación" msgid "Run" msgstr "Ejecutar" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Buscar" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Entrar En" @@ -7215,8 +7217,8 @@ msgstr "Breakpoints" msgid "Go To" msgstr "Ir A" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Cortar" @@ -10760,6 +10762,16 @@ msgid "Instance Child Scene" msgstr "Instanciar Escena Hija" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "¡No se puede operar sobre los nodos de una escena externa!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Pegar Nodos" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Sustraer Script" @@ -10887,6 +10899,11 @@ msgid "Attach Script" msgstr "Añadir Script" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Cortar Nodos" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Eliminar Nodo(s)" diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po index 89a9b0778e..a95f85e753 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-02-05 23:44+0000\n" +"PO-Revision-Date: 2021-02-21 10:50+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.5-dev\n" +"X-Generator: Weblate 4.5\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -664,7 +664,7 @@ msgstr "Elegir Pistas a Copiar" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Copiar" @@ -2556,7 +2556,8 @@ msgstr "" "configuración." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "No se pudo encontrar el campo script para el plugin de addon en: 'res://" "addons/%s'." @@ -2994,14 +2995,6 @@ msgid "Help" msgstr "Ayuda" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Buscar" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Documentación Online" @@ -3169,13 +3162,12 @@ msgid "Open & Run a Script" msgstr "Abrir y Correr un Script" #: editor/editor_node.cpp -#, fuzzy msgid "" "The following files are newer on disk.\n" "What action should be taken?" msgstr "" "Los siguientes archivos son nuevos en disco.\n" -"¿Qué acción se debería tomar?:" +"¿Qué acción se debería tomar?" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -3398,7 +3390,7 @@ msgstr "Convertir en Unico" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Pegar" @@ -5079,7 +5071,8 @@ msgid "Got:" msgstr "Recibido:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Fallo el chequeo del hash sha256" #: editor/plugins/asset_library_editor_plugin.cpp @@ -7014,6 +7007,14 @@ msgstr "Cerrar Docs" msgid "Run" msgstr "Ejecutar" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Buscar" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Step Into" @@ -7162,8 +7163,8 @@ msgstr "Puntos de interrupción" msgid "Go To" msgstr "Ir A" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Cortar" @@ -10081,9 +10082,8 @@ msgid "Projects" msgstr "Proyectos" #: editor/project_manager.cpp -#, fuzzy msgid "Loading, please wait..." -msgstr "Recuperando mirrors, esperá, por favor..." +msgstr "Cargando, esperá, por favor..." #: editor/project_manager.cpp msgid "Last Modified" @@ -10706,6 +10706,16 @@ msgid "Instance Child Scene" msgstr "Instanciar Escena Hija" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "No se puede operar sobre los nodos de una escena externa!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Pegar Nodos" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Desasignar Script" @@ -10834,6 +10844,11 @@ msgid "Attach Script" msgstr "Adjuntar Script" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Cortar Nodos" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Quitar Nodo(s)" diff --git a/editor/translations/et.po b/editor/translations/et.po index 3babd690d9..e6f2c1aac4 100644 --- a/editor/translations/et.po +++ b/editor/translations/et.po @@ -635,7 +635,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopeeri" @@ -2472,8 +2472,9 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "" +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "Lisa-skripti ei olnud võimalik laadida teelt: '%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -2869,14 +2870,6 @@ msgid "Help" msgstr "Abi" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Otsi" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Veebidokumentatsioonid" @@ -3248,7 +3241,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4876,7 +4869,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6747,6 +6740,14 @@ msgstr "" msgid "Run" msgstr "Käivita" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Otsi" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Trepi sissepoole" @@ -6890,8 +6891,8 @@ msgstr "Katkepunktid" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10252,6 +10253,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Kustuta sõlm(ed)" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10373,6 +10383,11 @@ msgid "Attach Script" msgstr "Manusta skript" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Kustuta sõlm(ed)" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/eu.po b/editor/translations/eu.po index 3cd7a78f25..ef200e15d6 100644 --- a/editor/translations/eu.po +++ b/editor/translations/eu.po @@ -626,7 +626,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -2440,7 +2440,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2830,14 +2830,6 @@ msgid "Help" msgstr "Laguntza" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Bilatu" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Lineako dokumentuak" @@ -3209,7 +3201,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4843,7 +4835,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6715,6 +6707,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Bilatu" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6858,8 +6858,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10221,6 +10221,14 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Scripta" @@ -10342,6 +10350,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/fa.po b/editor/translations/fa.po index a6b5b83312..29d3139e9c 100644 --- a/editor/translations/fa.po +++ b/editor/translations/fa.po @@ -658,7 +658,7 @@ msgstr "انتخاب میسرها جهت تکثیر" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "کپی" @@ -2481,8 +2481,9 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "" +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "امکان بارگیری اسکریپت افزونه از مسیر وجود ندارد: '%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -2879,14 +2880,6 @@ msgid "Help" msgstr "راهنما" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "جستجو" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3275,7 +3268,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "چسباندن" @@ -5020,7 +5013,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6991,6 +6984,14 @@ msgstr "" msgid "Run" msgstr "اجرا" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "جستجو" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7145,8 +7146,8 @@ msgstr "حذف کن" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "برش" @@ -10711,6 +10712,15 @@ msgid "Instance Child Scene" msgstr "ارثبری صحنهٔ فرزند" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "مسیر به سمت گره:" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "پیوست کردن اسکریپت" @@ -10842,6 +10852,11 @@ msgid "Attach Script" msgstr "پیوست کردن اسکریپت" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "ساختن گره" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "حذف گره(ها)" @@ -13366,10 +13381,6 @@ msgstr "ثوابت قابل تغییر نیستند." #~ msgstr "ساختن پوشه" #, fuzzy -#~ msgid "Custom Node" -#~ msgstr "ساختن گره" - -#, fuzzy #~ msgid "Invalid Path" #~ msgstr "مسیر نامعتبر." diff --git a/editor/translations/fi.po b/editor/translations/fi.po index 2768e46e1b..16daaed9b0 100644 --- a/editor/translations/fi.po +++ b/editor/translations/fi.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-02-05 23:44+0000\n" +"PO-Revision-Date: 2021-02-21 10:51+0000\n" "Last-Translator: Tapani Niemi <tapani.niemi@kapsi.fi>\n" "Language-Team: Finnish <https://hosted.weblate.org/projects/godot-engine/" "godot/fi/>\n" @@ -24,7 +24,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-dev\n" +"X-Generator: Weblate 4.5\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -648,7 +648,7 @@ msgstr "Valitse kopioitavat raidat" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopioi" @@ -2530,7 +2530,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "Lisäosan '%s' aktivointi epäonnistui, virheellinen asetustiedosto." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "Skriptikenttää ei löytynyt lisäosan tiedostosta: 'res://addons/%s'." #: editor/editor_node.cpp @@ -2957,14 +2958,6 @@ msgid "Help" msgstr "Ohje" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Hae" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Dokumentaatio" @@ -3129,13 +3122,12 @@ msgid "Open & Run a Script" msgstr "Avaa ja suorita skripti" #: editor/editor_node.cpp -#, fuzzy msgid "" "The following files are newer on disk.\n" "What action should be taken?" msgstr "" "Seuraavat tiedostot ovat uudempia levyllä.\n" -"Mikä toimenpide tulisi suorittaa?:" +"Mikä toimenpide tulisi suorittaa?" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -3359,7 +3351,7 @@ msgstr "Tee yksilölliseksi" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Liitä" @@ -5033,7 +5025,8 @@ msgid "Got:" msgstr "Saatiin:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "sha256-hajautusarvon tarkistus epäonnistui" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6965,6 +6958,14 @@ msgstr "Sulje dokumentaatio" msgid "Run" msgstr "Suorita" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Hae" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Siirry sisään" @@ -7112,8 +7113,8 @@ msgstr "Keskeytyskohdat" msgid "Go To" msgstr "Mene" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Leikkaa" @@ -10022,9 +10023,8 @@ msgid "Projects" msgstr "Projektit" #: editor/project_manager.cpp -#, fuzzy msgid "Loading, please wait..." -msgstr "Noudetaan peilipalvelimia, hetkinen..." +msgstr "Ladataan, hetkinen..." #: editor/project_manager.cpp msgid "Last Modified" @@ -10645,6 +10645,16 @@ msgid "Instance Child Scene" msgstr "Luo aliskenen ilmentymä" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "Ei voida suorittaa ulkopuolisen skenen solmuille!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Liitä solmut" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Irrota skripti" @@ -10774,6 +10784,11 @@ msgid "Attach Script" msgstr "Liitä skripti" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Leikkaa solmut" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Poista solmu(t)" diff --git a/editor/translations/fil.po b/editor/translations/fil.po index 40dc021b75..dc84dd744f 100644 --- a/editor/translations/fil.po +++ b/editor/translations/fil.po @@ -634,7 +634,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopya" @@ -2440,7 +2440,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2830,14 +2830,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3211,7 +3203,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4840,7 +4832,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6715,6 +6707,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6858,8 +6858,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10216,6 +10216,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Burahin ang (mga) Napiling Key" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10336,6 +10345,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/fr.po b/editor/translations/fr.po index a0ac83396b..44002bf560 100644 --- a/editor/translations/fr.po +++ b/editor/translations/fr.po @@ -728,7 +728,7 @@ msgstr "Sélectionner les pistes à copier" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Copier" @@ -2619,14 +2619,13 @@ msgstr "Réouvrir la scène fermée" #: editor/editor_node.cpp msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" -"Impossible d'activer le greffon depuis : « %s », l’analyse syntaxique de la " +"Impossible d'activer le plugin depuis : « %s », l’analyse syntaxique de la " "configuration a échoué." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" -"Impossible de trouver le champ de script pour le plugin dans : « res://" -"addons/%s »." +"Impossible de trouver le champ de script pour le plugin dans : « %s »." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -3065,14 +3064,6 @@ msgid "Help" msgstr "Aide" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Rechercher" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Documentation en ligne" @@ -3468,7 +3459,7 @@ msgstr "Rendre unique" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Coller" @@ -4308,7 +4299,7 @@ msgstr "Modifier un plugin" #: editor/plugin_config_dialog.cpp msgid "Create a Plugin" -msgstr "Créer un Plugin" +msgstr "Créer un plugin" #: editor/plugin_config_dialog.cpp msgid "Plugin Name:" @@ -5152,8 +5143,8 @@ msgid "Got:" msgstr "A :" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" -msgstr "Vérification de brouillage sha256 échouée" +msgid "Failed SHA-256 hash check" +msgstr "Vérification du hachage SHA-256 échouée" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -7098,6 +7089,14 @@ msgstr "Fermer les documentations" msgid "Run" msgstr "Lancer" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Rechercher" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Rentrer" @@ -7247,8 +7246,8 @@ msgstr "Point d'arrêts" msgid "Go To" msgstr "Atteindre" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Couper" @@ -10801,6 +10800,14 @@ msgid "Instance Child Scene" msgstr "Instancier une scène enfant" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "Impossible de copier le nœud racine dans la même scène." + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "Coller le(s) nœud(s)" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Détacher le script" @@ -10927,6 +10934,10 @@ msgid "Attach Script" msgstr "Attacher un script" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "Couper le(s) nœud(s)" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Supprimer le(s) nœud(s)" diff --git a/editor/translations/ga.po b/editor/translations/ga.po index 2e97bc49ee..6bddf1e53c 100644 --- a/editor/translations/ga.po +++ b/editor/translations/ga.po @@ -627,7 +627,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -2435,7 +2435,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2825,14 +2825,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3204,7 +3196,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4837,7 +4829,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6709,6 +6701,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6852,8 +6852,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10210,6 +10210,14 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10330,6 +10338,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/gl.po b/editor/translations/gl.po index 8a4250e00e..323fc16ec4 100644 --- a/editor/translations/gl.po +++ b/editor/translations/gl.po @@ -645,7 +645,7 @@ msgstr "Selecciona as Pistas a Copiar" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Copiar" @@ -2531,7 +2531,8 @@ msgstr "" "sintáctica da configuración de '%s'." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "Non se puido encontrar o campo do Script na característica adicional " "(Plugin) en 'res://addons/%s'." @@ -2967,14 +2968,6 @@ msgid "Help" msgstr "Axuda" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Buscar" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Documentación En Liña" @@ -3353,7 +3346,7 @@ msgstr "Facer Único" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Pegar" @@ -5004,7 +4997,7 @@ msgid "Got:" msgstr "Recibido:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6904,6 +6897,14 @@ msgstr "Pechar Documentación" msgid "Run" msgstr "Executar" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Buscar" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7047,8 +7048,8 @@ msgstr "" msgid "Go To" msgstr "Ir a" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Cortar" @@ -10506,6 +10507,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Pegar Nodos" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10626,6 +10636,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Cortar Nodos" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Eliminar Nodo(s)" diff --git a/editor/translations/he.po b/editor/translations/he.po index 78e6c10e33..7b3e8815ec 100644 --- a/editor/translations/he.po +++ b/editor/translations/he.po @@ -18,12 +18,13 @@ # yariv benj <yariv4400@gmail.com>, 2020. # Guy Dadon <guydadon14@gmail.com>, 2020. # bruvzg <bruvzg13@gmail.com>, 2020. +# Omer I.S. <omeritzicschwartz@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-12-03 19:28+0000\n" -"Last-Translator: Ziv D <wizdavid@gmail.com>\n" +"PO-Revision-Date: 2021-02-21 10:51+0000\n" +"Last-Translator: Omer I.S. <omeritzicschwartz@gmail.com>\n" "Language-Team: Hebrew <https://hosted.weblate.org/projects/godot-engine/" "godot/he/>\n" "Language: he\n" @@ -32,7 +33,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " "n % 10 == 0) ? 2 : 3));\n" -"X-Generator: Weblate 4.4-dev\n" +"X-Generator: Weblate 4.5\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -379,9 +380,8 @@ msgid "Anim Insert" msgstr "הוסף הנפשה" #: editor/animation_track_editor.cpp -#, fuzzy msgid "AnimationPlayer can't animate itself, only other players." -msgstr "נגן הנפשות לא יכול להנפיש את עצמו, רק שחקנים אחרים." +msgstr "נגן ההנפשות לא יכול להנפיש את עצמו, רק שחקנים אחרים." #: editor/animation_track_editor.cpp msgid "Anim Create & Insert" @@ -662,7 +662,7 @@ msgstr "בחירת רצועות להעתקה" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "העתקה" @@ -900,9 +900,8 @@ msgid "Connect a Signal to a Method" msgstr "שגיאת חיבור" #: editor/connections_dialog.cpp -#, fuzzy msgid "Edit Connection:" -msgstr "שגיאת חיבור" +msgstr "עריכת חיבור:" #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from the \"%s\" signal?" @@ -1102,7 +1101,7 @@ msgstr "דפדפן משאבים יתומים" #: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp #: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp msgid "Delete" -msgstr "למחוק" +msgstr "מחיקה" #: editor/dependency_editor.cpp msgid "Owns" @@ -1194,9 +1193,8 @@ msgid "License" msgstr "רישיון" #: editor/editor_about.cpp -#, fuzzy msgid "Third-party Licenses" -msgstr "רישיון צד שלישי" +msgstr "רשיונות צד שלישי" #: editor/editor_about.cpp msgid "" @@ -1657,9 +1655,8 @@ msgid "Script Editor" msgstr "פתיחת עורך סקריפטים" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Asset Library" -msgstr "ייצוא ספריה" +msgstr "ספריית משאבים" #: editor/editor_feature_profile.cpp msgid "Scene Tree Editing" @@ -2532,7 +2529,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "לא ניתן לפתוח את תוסף ההרחבות בנתיב: '%s' פענוח ההגדרות נכשל." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "לא ניתן למצוא שדה סקריפט עבור תוסף הרחבה בנתיב 'res://addons/%s'." #: editor/editor_node.cpp @@ -2952,14 +2950,6 @@ msgid "Help" msgstr "עזרה" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "חיפוש" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "מסמכים מקוונים" @@ -3120,13 +3110,12 @@ msgid "Open & Run a Script" msgstr "פתיחה והרצה של סקריפט" #: editor/editor_node.cpp -#, fuzzy msgid "" "The following files are newer on disk.\n" "What action should be taken?" msgstr "" "הקבצים הבאים הם חדשים בכונן.\n" -"באילו פעולות לנקוט?:" +"באילו פעולות לנקוט?" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -3347,7 +3336,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "הדבקה" @@ -5049,7 +5038,8 @@ msgid "Got:" msgstr "התקבל:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "בדיקת האש sha256 נכשלה" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5517,9 +5507,8 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp -#, fuzzy msgid "Zoom Reset" -msgstr "להתרחק" +msgstr "איפוס התקריב" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -7006,6 +6995,14 @@ msgstr "סגירת מסמכים" msgid "Run" msgstr "הרצה" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "חיפוש" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "לצעוד לתוך" @@ -7159,8 +7156,8 @@ msgstr "מחיקת נקודות" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "גזירה" @@ -7287,13 +7284,12 @@ msgid "Go to Previous Breakpoint" msgstr "מעבר לנקודת העצירה הקודמת" #: editor/plugins/shader_editor_plugin.cpp -#, fuzzy msgid "" "This shader has been modified on on disk.\n" "What action should be taken?" msgstr "" "הקבצים הבאים הם חדשים בכונן.\n" -"באילו פעולות לנקוט?:" +"באילו פעולות לנקוט?" #: editor/plugins/shader_editor_plugin.cpp msgid "Shader" @@ -10702,6 +10698,16 @@ msgid "Instance Child Scene" msgstr "יצירת מופע לסצנה הצאצאית" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "לא יכול לפעול על מפרקים מסצנה זרה!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "הדבקת מפרקים" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "ניתוק סקריפט" @@ -10825,6 +10831,11 @@ msgid "Attach Script" msgstr "חיבור סקריפט" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "גזירת מפרקים" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "הסרת מפרק(ים)" diff --git a/editor/translations/hi.po b/editor/translations/hi.po index 79fab4e89b..a4d46d6147 100644 --- a/editor/translations/hi.po +++ b/editor/translations/hi.po @@ -649,7 +649,7 @@ msgstr "कॉपी करने के लिए ट्रैक का चय #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "कॉपी" @@ -2518,7 +2518,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "ऐडऑन प्लगइन को सक्षम करने में असमर्थ: '%' कॉन्फिग का पार्सिंग विफल रहा।" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "ऐडऑन प्लगइन के लिए स्क्रिप्ट फ़ील्ड खोजने में असमर्थ: 'res://addons/% s'।" #: editor/editor_node.cpp @@ -2946,14 +2947,6 @@ msgid "Help" msgstr "मदद" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "ढूंढें" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "ऑनलाइन डॉक्स" @@ -3341,7 +3334,7 @@ msgstr "अद्वितीय बनाओ" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "चिपकाएँ" @@ -4989,7 +4982,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6880,6 +6873,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "ढूंढें" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7027,8 +7028,8 @@ msgstr "एक नया बनाएं" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10458,6 +10459,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "प्रतिलिपि" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "नई स्क्रिप्ट" @@ -10584,6 +10594,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "प्रतिलिपि" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/hr.po b/editor/translations/hr.po index 6835f26fc9..4803018028 100644 --- a/editor/translations/hr.po +++ b/editor/translations/hr.po @@ -631,7 +631,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopiraj" @@ -2447,7 +2447,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2837,14 +2837,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3216,7 +3208,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4848,7 +4840,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6719,6 +6711,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6862,8 +6862,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10228,6 +10228,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Brisati odabrani ključ/odabrane ključeve" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Odspoji Skriptu" @@ -10348,6 +10357,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/hu.po b/editor/translations/hu.po index 9224509238..db3403fdf1 100644 --- a/editor/translations/hu.po +++ b/editor/translations/hu.po @@ -663,7 +663,7 @@ msgstr "Másolandó nyomvonalak kiválasztása" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Másolás" @@ -2530,7 +2530,8 @@ msgstr "" "megbukott." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "Nem található szkript mező az addon pluginnak a következő helyen: 'res://" "addons/%s'." @@ -2970,14 +2971,6 @@ msgid "Help" msgstr "Súgó" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Keresés" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Online Dokumentáció" @@ -3354,7 +3347,7 @@ msgstr "Egyedivé tétel" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Beillesztés" @@ -5012,7 +5005,8 @@ msgid "Got:" msgstr "Kapott:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "sha256 hash ellenőrzés megbukott" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6923,6 +6917,14 @@ msgstr "Dokumentációs Lapok Bezárása" msgid "Run" msgstr "Futtatás" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Keresés" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Belépés" @@ -7068,8 +7070,8 @@ msgstr "Töréspontok" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Kivágás" @@ -10457,6 +10459,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Node-ok beillesztése" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Szkript leválasztása" @@ -10577,6 +10588,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Node-ok kivágása" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/id.po b/editor/translations/id.po index 6704c419d9..91e4392ab4 100644 --- a/editor/translations/id.po +++ b/editor/translations/id.po @@ -671,7 +671,7 @@ msgstr "Pilih Trek untuk Disalin" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopy" @@ -2548,7 +2548,8 @@ msgstr "" "gagal." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "Tidak dapat mencari bidang script untuk addon plugin pada: 'res://addons/%s'." @@ -2989,14 +2990,6 @@ msgid "Help" msgstr "Bantuan" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Cari" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Online Dokumentasi" @@ -3391,7 +3384,7 @@ msgstr "Jadikan Unik" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Tempel" @@ -5055,7 +5048,8 @@ msgid "Got:" msgstr "Yang Didapat:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Gagal mengecek hash sha256" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6994,6 +6988,14 @@ msgstr "Tutup Dokumentasi" msgid "Run" msgstr "Jalankan" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Cari" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Masuki" @@ -7144,8 +7146,8 @@ msgstr "Breakpoint" msgid "Go To" msgstr "Pergi Ke" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Potong" @@ -10697,6 +10699,16 @@ msgstr "Instansi Skena Anak" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "Tidak dapat bekerja pada node dari skena luar!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Rekatkan Node" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Detach Script" msgstr "Lampirkan Skrip" @@ -10827,6 +10839,11 @@ msgid "Attach Script" msgstr "Lampirkan Skrip" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Potong Node" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Hapus Node" diff --git a/editor/translations/is.po b/editor/translations/is.po index 45335e83e5..6de37d39fb 100644 --- a/editor/translations/is.po +++ b/editor/translations/is.po @@ -659,7 +659,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -2472,7 +2472,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2865,14 +2865,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3246,7 +3238,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4892,7 +4884,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6779,6 +6771,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6922,8 +6922,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10323,6 +10323,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Tvíteknir lyklar" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10447,6 +10456,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Tvíteknir lyklar" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/it.po b/editor/translations/it.po index 54c2122e93..2daa387575 100644 --- a/editor/translations/it.po +++ b/editor/translations/it.po @@ -60,8 +60,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-02-16 13:40+0000\n" -"Last-Translator: Riteo Siuga <lorenzocerqua@tutanota.com>\n" +"PO-Revision-Date: 2021-02-21 10:50+0000\n" +"Last-Translator: Micila Micillotto <micillotto@gmail.com>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot/it/>\n" "Language: it\n" @@ -473,10 +473,8 @@ msgid "Not possible to add a new track without a root" msgstr "Non è possibile aggiungere una nuova traccia senza un nodo radice" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Invalid track for Bezier (no suitable sub-properties)" -msgstr "" -"Traccia non valida per una curva di Bézier (nessuna sotto-proprietà adatta)" +msgstr "Traccia non valida per Bezier (nessuna sotto-proprietà valida)" #: editor/animation_track_editor.cpp msgid "Add Bezier Track" @@ -499,11 +497,10 @@ msgid "Add Track Key" msgstr "Aggiungi una chiave a una traccia" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Track path is invalid, so can't add a method key." msgstr "" -"La traccia non è valida, quindi non è possibile aggiungere una chiave di " -"chiamata di metodo." +"La traccia non è valida, quindi, non è stato possibile aggiungere una chiave " +"chiamata metodo." #: editor/animation_track_editor.cpp msgid "Add Method Track Key" @@ -537,7 +534,6 @@ msgstr "" "si tratta di una singola traccia." #: editor/animation_track_editor.cpp -#, fuzzy msgid "" "This animation belongs to an imported scene, so changes to imported tracks " "will not be saved.\n" @@ -549,14 +545,14 @@ msgid "" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" -"Quest'animazione appartiene a una scena importata, eventuali modifiche fatte " -"alle tracce importate non verranno salvate.\n" +"Questa animazione appartiene ad una scena importata, quindi i cambiamenti " +"alle tracce importate non saranno salvate.\n" "\n" -"Per abilitare la possibilità di aggiungere ulteriori tracce, andare nelle " -"impostazioni d'importazione della scena, impostare\n" -"\"Animation > Storage\" su \"Files\", attivare \"Animation > Keep Custom " -"Tracks\" e infine reimportare la scena.\n" -"Altrimenti, usare una preimpostazione che importi le animazioni in file " +"Per abilitare l'aggiunta di tracce personalizzate, naviga alle impostazioni " +"d'importazione della scena ed imposta\n" +"\"Animation > Storage\" a \"Files\", abilita \"Animation > Keep Custom Tracks" +"\", e poi re-importa.\n" +"In alternativa, usa un preset d'importo che importa le animazioni da file " "separati." #: editor/animation_track_editor.cpp @@ -623,23 +619,20 @@ msgid "Duplicate Selection" msgstr "Duplica la selezione" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Duplicate Transposed" -msgstr "Duplica trasposto" +msgstr "Duplica Trasposto" #: editor/animation_track_editor.cpp msgid "Delete Selection" msgstr "Elimina la selezione" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Go to Next Step" -msgstr "Va' al passo successivo" +msgstr "Vai allo Step Successivo" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Go to Previous Step" -msgstr "Va' al passo precedente" +msgstr "Vai allo Step Precedente" #: editor/animation_track_editor.cpp msgid "Optimize Animation" @@ -710,7 +703,7 @@ msgstr "Seleziona le tracce da copiare" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Copia" @@ -723,14 +716,12 @@ msgid "Add Audio Track Clip" msgstr "Aggiungi audio in una traccia di riproduzione audio" #: editor/animation_track_editor_plugins.cpp -#, fuzzy msgid "Change Audio Track Clip Start Offset" -msgstr "Cambia lo scostamento dell'inizio della traccia audio" +msgstr "Cambia Offset Inizio Clip Traccia Audio" #: editor/animation_track_editor_plugins.cpp -#, fuzzy msgid "Change Audio Track Clip End Offset" -msgstr "Cambia lo scostamento della fine della traccia audio" +msgstr "Cambia Offset Fine Clip Traccia Audio" #: editor/array_property_edit.cpp msgid "Resize Array" @@ -790,9 +781,8 @@ msgid "Standard" msgstr "Standard" #: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Toggle Scripts Panel" -msgstr "Commuta pannello degli script" +msgstr "Toggle Pannello Script" #: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp @@ -811,9 +801,8 @@ msgid "Reset Zoom" msgstr "Reimposta ingrandimento" #: editor/code_editor.cpp -#, fuzzy msgid "Warnings" -msgstr "Avvertenze" +msgstr "Avvisi" #: editor/code_editor.cpp msgid "Line and column numbers." @@ -2604,7 +2593,8 @@ msgstr "" "configurazione fallita." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "Impossibile trovare il campo dello script per il componente aggiuntivo in: " "'res://addons/%s'." @@ -3043,14 +3033,6 @@ msgid "Help" msgstr "Aiuto" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Cerca" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Documentazione online" @@ -3218,13 +3200,12 @@ msgid "Open & Run a Script" msgstr "Apri ed esegui uno script" #: editor/editor_node.cpp -#, fuzzy msgid "" "The following files are newer on disk.\n" "What action should be taken?" msgstr "" -"I file seguenti sono più recenti su disco.\n" -"Che azione deve essere intrapresa?:" +"I seguenti file sono più recenti sul disco.\n" +"Quale azione dovrebbe essere presa?" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -3447,7 +3428,7 @@ msgstr "Rendi Unico" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Incolla" @@ -5126,7 +5107,8 @@ msgid "Got:" msgstr "Ottenuto:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Check hash sha256 fallito" #: editor/plugins/asset_library_editor_plugin.cpp @@ -7070,6 +7052,14 @@ msgstr "Chiudi la documentazione" msgid "Run" msgstr "Esegui" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Cerca" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Passo dentro all'istruzione" @@ -7218,8 +7208,8 @@ msgstr "Punti di interruzione" msgid "Go To" msgstr "Vai a" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Taglia" @@ -7442,9 +7432,8 @@ msgid "Yaw" msgstr "Imbardata" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Size" -msgstr "Dimensione: " +msgstr "Dimensione" #: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" @@ -10147,9 +10136,8 @@ msgid "Projects" msgstr "Progetti" #: editor/project_manager.cpp -#, fuzzy msgid "Loading, please wait..." -msgstr "Recupero dei mirror, attendi..." +msgstr "Caricamento, per favore attendere..." #: editor/project_manager.cpp msgid "Last Modified" @@ -10772,6 +10760,16 @@ msgid "Instance Child Scene" msgstr "Istanzia Scena Figlia" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "Impossibile operare su nodi da scena esterna!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Incolla nodi" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Rimuovi Script" @@ -10898,6 +10896,11 @@ msgid "Attach Script" msgstr "Allega Script" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Taglia nodi" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Rimuovi nodo(i)" diff --git a/editor/translations/ja.po b/editor/translations/ja.po index 8ed2a31d77..6c7ce36693 100644 --- a/editor/translations/ja.po +++ b/editor/translations/ja.po @@ -36,8 +36,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-02-07 05:50+0000\n" -"Last-Translator: BinotaLIU <me@binota.org>\n" +"PO-Revision-Date: 2021-02-21 10:50+0000\n" +"Last-Translator: nitenook <admin@alterbaum.net>\n" "Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/" "godot/ja/>\n" "Language: ja\n" @@ -45,12 +45,12 @@ 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.5-dev\n" +"X-Generator: Weblate 4.5\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 "convert() の引数の型が無効です。TYPE_* 定数を使用してください。" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." @@ -676,7 +676,7 @@ msgstr "コピーするトラックを選択" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "コピー" @@ -1590,7 +1590,7 @@ msgstr "ファイルの保存:" #: editor/editor_export.cpp msgid "No export template found at the expected path:" -msgstr "エクスポート テンプレートが予想されたパスに見つかりません:" +msgstr "エクスポート テンプレートが予期されたパスに見つかりません:" #: editor/editor_export.cpp msgid "Packing" @@ -2554,7 +2554,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "アドオンプラグインを有効にできません: '%s' 設定の解析に失敗しました。" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "アドオンプラグインのスクリプトフィールドが 'res://addons/%s' から見つかりませ" "ん。" @@ -2988,14 +2989,6 @@ msgid "Help" msgstr "ヘルプ" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "検索" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "オンラインドキュメント" @@ -3161,13 +3154,12 @@ msgid "Open & Run a Script" msgstr "スクリプトを開いて実行" #: editor/editor_node.cpp -#, fuzzy msgid "" "The following files are newer on disk.\n" "What action should be taken?" msgstr "" "以下のファイルより新しいものがディスク上に存在します。\n" -"どうしますか?:" +"どうしますか?" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -3390,7 +3382,7 @@ msgstr "ユニーク化" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "貼り付け" @@ -5054,7 +5046,8 @@ msgid "Got:" msgstr "取得:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "sha256 ハッシュチェック失敗" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6981,6 +6974,14 @@ msgstr "ドキュメントを閉じる" msgid "Run" msgstr "実行" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "検索" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "ステップイン" @@ -7130,8 +7131,8 @@ msgstr "ブレークポイント" msgid "Go To" msgstr "参照" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "切り取り" @@ -10034,9 +10035,8 @@ msgid "Projects" msgstr "プロジェクト" #: editor/project_manager.cpp -#, fuzzy msgid "Loading, please wait..." -msgstr "ミラーを取得しています。しばらくお待ちください..." +msgstr "読み込み中、しばらくお待ちください..." #: editor/project_manager.cpp msgid "Last Modified" @@ -10658,6 +10658,16 @@ msgid "Instance Child Scene" msgstr "子シーンをインスタンス化" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "別のシーンからノードを操作することはできません!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "ノードを貼り付け" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "スクリプトをデタッチ" @@ -10783,6 +10793,11 @@ msgid "Attach Script" msgstr "スクリプトをアタッチ" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "ノードを切り取る" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "ノードを除去" @@ -10854,7 +10869,7 @@ msgstr "親ノードを新規ノードに変更" #: editor/scene_tree_dock.cpp msgid "Make Scene Root" -msgstr "シーンをルートにする" +msgstr "シーンのルートにする" #: editor/scene_tree_dock.cpp msgid "Merge From Scene" @@ -12136,9 +12151,8 @@ msgid "Select device from the list" msgstr "一覧からデバイスを選択" #: platform/android/export/export.cpp -#, fuzzy msgid "Unable to find the 'apksigner' tool." -msgstr "zipalign ツールが見つかりません。" +msgstr "'apksigner' ツールが見つかりません。" #: platform/android/export/export.cpp msgid "" @@ -12157,14 +12171,12 @@ msgid "Release keystore incorrectly configured in the export preset." msgstr "エクスポート設定にてリリース キーストアが誤って設定されています。" #: platform/android/export/export.cpp -#, fuzzy msgid "A valid Android SDK path is required in Editor Settings." -msgstr "エディタ設定のカスタムビルドのAndroid SDKパスが無効です。" +msgstr "エディタ設定でAndroid SDKパスの指定が必要です。" #: platform/android/export/export.cpp -#, fuzzy msgid "Invalid Android SDK path in Editor Settings." -msgstr "エディタ設定のカスタムビルドのAndroid SDKパスが無効です。" +msgstr "エディタ設定のAndroid SDKパスが無効です。" #: platform/android/export/export.cpp msgid "Missing 'platform-tools' directory!" @@ -12172,12 +12184,11 @@ msgstr "'platform-tools' ディレクトリがありません!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK platform-tools' adb command." -msgstr "" +msgstr "Android SDK platform-toolsのadbコマンドが見つかりません。" #: platform/android/export/export.cpp -#, fuzzy msgid "Please check in the Android SDK directory specified in Editor Settings." -msgstr "エディタ設定のカスタムビルドのAndroid SDKパスが無効です。" +msgstr "エディタ設定で指定されたAndroid SDKのディレクトリを確認してください。" #: platform/android/export/export.cpp msgid "Missing 'build-tools' directory!" @@ -12185,7 +12196,7 @@ msgstr "'build-tools' ディレクトリがありません!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK build-tools' apksigner command." -msgstr "" +msgstr "Android SDK build-toolsのapksignerコマンドが見つかりません。" #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." @@ -12662,9 +12673,8 @@ msgid "Finding meshes and lights" msgstr "" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Preparing geometry (%d/%d)" -msgstr "ジオメトリを解析しています..." +msgstr "ジオメトリを解析しています (%d/%d)" #: scene/3d/baked_lightmap.cpp #, fuzzy diff --git a/editor/translations/ka.po b/editor/translations/ka.po index 92ab76e773..b9f4a92e47 100644 --- a/editor/translations/ka.po +++ b/editor/translations/ka.po @@ -675,7 +675,7 @@ msgstr "დაყენდეს გადასვლები შემდე #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -2552,7 +2552,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2949,14 +2949,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3332,7 +3324,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -5014,7 +5006,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6934,6 +6926,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7084,8 +7084,8 @@ msgstr "შექმნა" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10534,6 +10534,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "ანიმაციის გასაღებების ასლის შექმნა" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "დამოკიდებულებების შემსწორებელი" @@ -10660,6 +10669,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "ანიმაციის გასაღებების ასლის შექმნა" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/ko.po b/editor/translations/ko.po index b8b9eed468..872cb1550c 100644 --- a/editor/translations/ko.po +++ b/editor/translations/ko.po @@ -662,7 +662,7 @@ msgstr "복사할 트랙 선택" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "복사" @@ -2529,7 +2529,8 @@ msgstr "" "실패했습니다." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "다음 경로에서 애드온 플러그인을 찾을 수 없음: 'res://addons/%s'." #: editor/editor_node.cpp @@ -2958,14 +2959,6 @@ msgid "Help" msgstr "도움말" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "검색" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "온라인 문서" @@ -3354,7 +3347,7 @@ msgstr "유일하게 만들기" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "붙여넣기" @@ -5016,7 +5009,8 @@ msgid "Got:" msgstr "받음:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "sha256 해시 확인 실패" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6940,6 +6934,14 @@ msgstr "문서 닫기" msgid "Run" msgstr "실행" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "검색" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "프로시저 단위 실행" @@ -7088,8 +7090,8 @@ msgstr "중단점" msgid "Go To" msgstr "이동" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "잘라내기" @@ -10593,6 +10595,16 @@ msgid "Instance Child Scene" msgstr "자식 씬 인스턴스화" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "다른 씬에서 수행할 수 없는 작업입니다!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "노드 붙여넣기" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "스크립트 떼기" @@ -10718,6 +10730,11 @@ msgid "Attach Script" msgstr "스크립트 붙이기" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "노드 잘라내기" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "노드 삭제" diff --git a/editor/translations/lt.po b/editor/translations/lt.po index f9353c1acc..313d6144e3 100644 --- a/editor/translations/lt.po +++ b/editor/translations/lt.po @@ -5,12 +5,12 @@ # Ignas Kiela <ignaskiela@super.lt>, 2017. # Kornelijus <kornelijus.github@gmail.com>, 2017, 2018. # Ignotas Gražys <ignotas.gr@gmail.com>, 2020. -# Kornelijus Tvarijanavičius <kornelitvari@protonmail.com>, 2020. +# Kornelijus Tvarijanavičius <kornelitvari@protonmail.com>, 2020, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-09-28 11:18+0000\n" +"PO-Revision-Date: 2021-02-21 10:51+0000\n" "Last-Translator: Kornelijus Tvarijanavičius <kornelitvari@protonmail.com>\n" "Language-Team: Lithuanian <https://hosted.weblate.org/projects/godot-engine/" "godot/lt/>\n" @@ -20,7 +20,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1 ? 0 : n%10>=2 && (n%100<10 || n" "%100>=20) ? 1 : n%10==0 || (n%100>10 && n%100<20) ? 2 : 3;\n" -"X-Generator: Weblate 4.3-dev\n" +"X-Generator: Weblate 4.5\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -650,7 +650,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -2504,7 +2504,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2901,14 +2901,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3287,7 +3279,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4778,7 +4770,6 @@ msgstr "Naujas pavadinimas:" #: editor/plugins/animation_tree_player_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp -#, fuzzy msgid "Scale:" msgstr "Skalė:" @@ -4980,7 +4971,7 @@ msgid "Got:" msgstr "Gauta:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6904,6 +6895,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7051,8 +7050,8 @@ msgstr "Sukurti" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10505,6 +10504,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Duplikuoti" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Atidaryti Skriptų Editorių" @@ -10629,6 +10637,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Transition Nodas" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -12848,10 +12861,6 @@ msgstr "" #~ msgid "Path to Node:" #~ msgstr "Kelias iki Nodo:" -#, fuzzy -#~ msgid "Custom Node" -#~ msgstr "Transition Nodas" - #~ msgid "Line:" #~ msgstr "Linija:" diff --git a/editor/translations/lv.po b/editor/translations/lv.po index 85519ccb59..8f70ed94f7 100644 --- a/editor/translations/lv.po +++ b/editor/translations/lv.po @@ -649,7 +649,7 @@ msgstr "Izvēlēties Celiņus ko Kopēt" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopēt" @@ -2477,7 +2477,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2867,14 +2867,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3247,7 +3239,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4878,7 +4870,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6759,6 +6751,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6906,8 +6906,8 @@ msgstr "Izveidot" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10327,6 +10327,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Dublicēt atslēgvietnes" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Galvenais Skripts:" @@ -10450,6 +10459,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Dublicēt atslēgvietnes" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/mi.po b/editor/translations/mi.po index d9edd212bd..301383d787 100644 --- a/editor/translations/mi.po +++ b/editor/translations/mi.po @@ -619,7 +619,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -2423,7 +2423,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2813,14 +2813,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3192,7 +3184,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4820,7 +4812,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6691,6 +6683,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6834,8 +6834,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10187,6 +10187,14 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10307,6 +10315,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/mk.po b/editor/translations/mk.po index 561adc90ff..1b01a6f792 100644 --- a/editor/translations/mk.po +++ b/editor/translations/mk.po @@ -626,7 +626,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Копирај" @@ -2430,7 +2430,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2820,14 +2820,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3199,7 +3191,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4827,7 +4819,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6698,6 +6690,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6841,8 +6841,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10194,6 +10194,14 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10314,6 +10322,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/ml.po b/editor/translations/ml.po index 22fdc508ae..71693f68dd 100644 --- a/editor/translations/ml.po +++ b/editor/translations/ml.po @@ -629,7 +629,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -2435,7 +2435,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2825,14 +2825,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3204,7 +3196,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4835,7 +4827,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6707,6 +6699,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6850,8 +6850,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10204,6 +10204,14 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10324,6 +10332,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/mr.po b/editor/translations/mr.po index 660429c147..a07cd2a007 100644 --- a/editor/translations/mr.po +++ b/editor/translations/mr.po @@ -626,7 +626,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -2430,7 +2430,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2820,14 +2820,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3199,7 +3191,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4827,7 +4819,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6698,6 +6690,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6841,8 +6841,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10195,6 +10195,14 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10315,6 +10323,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/ms.po b/editor/translations/ms.po index 01539c3fb7..9019b6b0e4 100644 --- a/editor/translations/ms.po +++ b/editor/translations/ms.po @@ -649,7 +649,7 @@ msgstr "Pilih Trek untuk Disalin" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Salin" @@ -2542,7 +2542,8 @@ msgstr "" "gagal." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "Tidak dapat mencari medan skrip untuk pemalam addon di: 'res://addons/%s'." @@ -3022,15 +3023,6 @@ msgid "Help" msgstr "Bantuan" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -#, fuzzy -msgid "Search" -msgstr "Cari" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp #, fuzzy msgid "Online Docs" @@ -3475,7 +3467,7 @@ msgstr "Buat Unik" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp #, fuzzy msgid "Paste" msgstr "Tampal" @@ -5150,7 +5142,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -7029,6 +7021,15 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +#, fuzzy +msgid "Search" +msgstr "Cari" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7172,8 +7173,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10545,6 +10546,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Anim Menduakan Kunci" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10666,6 +10676,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Anim Menduakan Kunci" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/nb.po b/editor/translations/nb.po index 3c54f55e99..1289275b3d 100644 --- a/editor/translations/nb.po +++ b/editor/translations/nb.po @@ -680,7 +680,7 @@ msgstr "Velg spor å kopiere:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Lim inn" @@ -2666,7 +2666,8 @@ msgstr "" "mislyktes." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "Kunne ikke finne skriptfelt for addon-plugin i: 'res://addons/%s'." #: editor/editor_node.cpp @@ -3115,14 +3116,6 @@ msgid "Help" msgstr "Hjelp" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Søk" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Online Dokumentasjon" @@ -3523,7 +3516,7 @@ msgstr "Gjør Unik" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Lim inn" @@ -5315,7 +5308,8 @@ msgid "Got:" msgstr "Fikk:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Feilet sha256 hash-sjekk" #: editor/plugins/asset_library_editor_plugin.cpp @@ -7345,6 +7339,14 @@ msgstr "Lukk Dokumentasjon" msgid "Run" msgstr "Kjør" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Søk" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Tre inn i" @@ -7498,8 +7500,8 @@ msgstr "Slett punkter" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Klipp ut" @@ -11085,6 +11087,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Lim inn Noder" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Nytt Skript" @@ -11214,6 +11225,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Kutt Noder" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/nl.po b/editor/translations/nl.po index c73520f563..1202219ee6 100644 --- a/editor/translations/nl.po +++ b/editor/translations/nl.po @@ -686,7 +686,7 @@ msgstr "Selecteer sporen om te kopieren" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopiëren" @@ -2577,7 +2577,8 @@ msgstr "" "mislukt." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "Onmogelijk om scriptveld te vinden voor de plugin op: 'res://addons/%s'." @@ -3011,14 +3012,6 @@ msgid "Help" msgstr "Help" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Zoeken" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Online Documentatie" @@ -3415,7 +3408,7 @@ msgstr "Maak Uniek" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Plakken" @@ -5087,7 +5080,8 @@ msgid "Got:" msgstr "Gekregen:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "SHA256-proef mislukt" #: editor/plugins/asset_library_editor_plugin.cpp @@ -7021,6 +7015,14 @@ msgstr "Sluit Docs" msgid "Run" msgstr "Uitvoeren" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Zoeken" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Stap In" @@ -7167,8 +7169,8 @@ msgstr "Breekpunten" msgid "Go To" msgstr "Ga Naar" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Knippen" @@ -10720,6 +10722,16 @@ msgid "Instance Child Scene" msgstr "Scène instantiëren" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "Kan deze operatie niet uitvoeren op knopen uit een vreemde scène!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Knopen plakken" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Script losmaken" @@ -10847,6 +10859,11 @@ msgid "Attach Script" msgstr "Script toevoegen" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Knopen knippen" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Verwijder knoop/knopen" diff --git a/editor/translations/or.po b/editor/translations/or.po index a95df2885d..269276221d 100644 --- a/editor/translations/or.po +++ b/editor/translations/or.po @@ -625,7 +625,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -2429,7 +2429,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2819,14 +2819,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3198,7 +3190,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4826,7 +4818,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6697,6 +6689,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6840,8 +6840,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10193,6 +10193,14 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10313,6 +10321,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/pl.po b/editor/translations/pl.po index 26ff92e60e..3cf039dd3b 100644 --- a/editor/translations/pl.po +++ b/editor/translations/pl.po @@ -51,8 +51,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-02-15 10:51+0000\n" -"Last-Translator: vrid <patryksoon@live.com>\n" +"PO-Revision-Date: 2021-02-21 10:51+0000\n" +"Last-Translator: Tomek <kobewi4e@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/" "godot/pl/>\n" "Language: pl\n" @@ -61,7 +61,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.5-dev\n" +"X-Generator: Weblate 4.5\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -689,7 +689,7 @@ msgstr "Wybierz ścieżki do skopiowania" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopiuj" @@ -2563,7 +2563,8 @@ msgstr "" "Nie można włączyć dodatku: \"%s\" - parsowanie konfiguracji nie powiodło się." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "Nie można odnaleźć pola skryptu w dodatku: \"res://addons/%s\"." #: editor/editor_node.cpp @@ -2994,14 +2995,6 @@ msgid "Help" msgstr "Pomoc" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Szukaj" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Dokumentacja online" @@ -3165,13 +3158,12 @@ msgid "Open & Run a Script" msgstr "Otwórz i Uruchom Skrypt" #: editor/editor_node.cpp -#, fuzzy msgid "" "The following files are newer on disk.\n" "What action should be taken?" msgstr "" "Następujące pliki są nowsze na dysku.\n" -"Jakie działania powinny zostać podjęte?:" +"Jakie działanie powinno zostać podjęte?" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -3394,7 +3386,7 @@ msgstr "Zrób unikalny" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Wklej" @@ -5068,7 +5060,8 @@ msgid "Got:" msgstr "Otrzymano:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Nie udało się przeprowadzić testu integralności sha256" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6999,6 +6992,14 @@ msgstr "Zamknij pliki pomocy" msgid "Run" msgstr "Uruchom" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Szukaj" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Krok w" @@ -7147,8 +7148,8 @@ msgstr "Punkty wstrzymania" msgid "Go To" msgstr "Idź do" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Wytnij" @@ -10060,9 +10061,8 @@ msgid "Projects" msgstr "Projekty" #: editor/project_manager.cpp -#, fuzzy msgid "Loading, please wait..." -msgstr "Pobieranie informacji o serwerach lustrzanych, proszę czekać..." +msgstr "Wczytywanie, proszę czekać..." #: editor/project_manager.cpp msgid "Last Modified" @@ -10684,6 +10684,16 @@ msgid "Instance Child Scene" msgstr "Dodaj instancję sceny" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "Nie można operować węzłami z innej sceny!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Wklej węzły" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Odłącz skrypt" @@ -10810,6 +10820,11 @@ msgid "Attach Script" msgstr "Dołącz skrypt" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Wytnij węzły" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Usuń węzeł(y)" diff --git a/editor/translations/pr.po b/editor/translations/pr.po index 2d2ecf41b6..ca53ec3af2 100644 --- a/editor/translations/pr.po +++ b/editor/translations/pr.po @@ -656,7 +656,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -2510,7 +2510,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2911,14 +2911,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3299,7 +3291,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4995,7 +4987,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6917,6 +6909,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7065,8 +7065,8 @@ msgstr "Yar, Blow th' Selected Down!" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10539,6 +10539,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Paste yer Node" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Discharge ye' Variable" @@ -10664,6 +10673,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Slit th' Node" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/pt.po b/editor/translations/pt.po index 49f2ff19c1..939735e8da 100644 --- a/editor/translations/pt.po +++ b/editor/translations/pt.po @@ -661,7 +661,7 @@ msgstr "Selecionar Pistas a Copiar" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Copiar" @@ -2542,7 +2542,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "Incapaz de ativar plugin em: '%s' falha de análise ou configuração." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "Incapaz de localizar campo Script para plugin em: 'res://addons/%s'." #: editor/editor_node.cpp @@ -2975,14 +2976,6 @@ msgid "Help" msgstr "Ajuda" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Procurar" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Documentação Online" @@ -3376,7 +3369,7 @@ msgstr "Fazer único" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Colar" @@ -5049,7 +5042,8 @@ msgid "Got:" msgstr "Obtido:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Verificação hash sha256 falhada" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6974,6 +6968,14 @@ msgstr "Fechar documentos" msgid "Run" msgstr "Executar" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Procurar" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Passar Dentro" @@ -7119,8 +7121,8 @@ msgstr "Pontos de paragem" msgid "Go To" msgstr "Ir Para" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Cortar" @@ -10651,6 +10653,16 @@ msgid "Instance Child Scene" msgstr "Instanciar Cena Filha" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "Não consigo operar em nós de uma cena externa!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Colar Nós" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Separar Script" @@ -10777,6 +10789,11 @@ msgid "Attach Script" msgstr "Anexar Script" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Cortar Nós" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Remover Nó(s)" diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po index 025ae380fd..f4535819c2 100644 --- a/editor/translations/pt_BR.po +++ b/editor/translations/pt_BR.po @@ -753,7 +753,7 @@ msgstr "Selecionar Trilhas para Copiar" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Copiar" @@ -2635,7 +2635,8 @@ msgstr "" "falhou." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "Não foi possível encontrar o campo de script para o plugin em: 'res://addons/" "%s'." @@ -3070,14 +3071,6 @@ msgid "Help" msgstr "Ajuda" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Pesquisar" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Documentação Online" @@ -3473,7 +3466,7 @@ msgstr "Tornar Único" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Colar" @@ -5152,7 +5145,8 @@ msgid "Got:" msgstr "Obtido:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Falha na verificação da hash sha256" #: editor/plugins/asset_library_editor_plugin.cpp @@ -7084,6 +7078,14 @@ msgstr "Fechar Docs" msgid "Run" msgstr "Rodar" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Pesquisar" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Passo para dentro" @@ -7230,8 +7232,8 @@ msgstr "Breakpoints" msgid "Go To" msgstr "Ir Para" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Recortar" @@ -10766,6 +10768,16 @@ msgid "Instance Child Scene" msgstr "Instânciar Cena Filha" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "Não é possível operar em nós de uma cena externa!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Colar Nodes" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Remover Script" @@ -10892,6 +10904,11 @@ msgid "Attach Script" msgstr "Adicionar Script" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Recortar Nós" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Remover Nó(s)" diff --git a/editor/translations/ro.po b/editor/translations/ro.po index 6497621bc8..1843f25bf0 100644 --- a/editor/translations/ro.po +++ b/editor/translations/ro.po @@ -661,7 +661,7 @@ msgstr "Selectează Pistele de Copiat" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Copiază" @@ -2548,7 +2548,8 @@ msgstr "" "Nu se poate inițializa plugin-ul la: '%s' analizarea configurației a eșuat." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "Nu a putut fi găsit câmpul scriptului pentru plugin la: 'res://addons/%s'." @@ -2985,14 +2986,6 @@ msgid "Help" msgstr "Ajutor" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Căutare" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Documentație Online" @@ -3367,7 +3360,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -5050,7 +5043,8 @@ msgid "Got:" msgstr "Primit:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Verificare hash sha256 eșuată" #: editor/plugins/asset_library_editor_plugin.cpp @@ -7048,6 +7042,14 @@ msgstr "" msgid "Run" msgstr "Execută" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Căutare" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7200,8 +7202,8 @@ msgstr "Șterge puncte" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10698,6 +10700,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Lipește Postura" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Curăță Scriptul" @@ -10827,6 +10838,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Creează Nod" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -13270,10 +13286,6 @@ msgstr "" #~ msgstr "Creează un Corp Static Convex" #, fuzzy -#~ msgid "Custom Node" -#~ msgstr "Creează Nod" - -#, fuzzy #~ msgid "Snap (s): " #~ msgstr "Pas (s):" diff --git a/editor/translations/ru.po b/editor/translations/ru.po index e079c49e3f..a38646e2e8 100644 --- a/editor/translations/ru.po +++ b/editor/translations/ru.po @@ -96,8 +96,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-02-05 23:44+0000\n" -"Last-Translator: narrnika <narr13niki@gmail.com>\n" +"PO-Revision-Date: 2021-02-21 10:51+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" @@ -106,7 +106,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.5-dev\n" +"X-Generator: Weblate 4.5\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -734,7 +734,7 @@ msgstr "Выбрать треки для копирования" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Копировать" @@ -2615,7 +2615,8 @@ msgstr "" "конфигурации." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "Не удаётся найти поле script для плагина: «res://addons/%s»." #: editor/editor_node.cpp @@ -3046,14 +3047,6 @@ msgid "Help" msgstr "Справка" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Поиск" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Онлайн документация" @@ -3220,13 +3213,12 @@ msgid "Open & Run a Script" msgstr "Открыть и запустить скрипт" #: editor/editor_node.cpp -#, fuzzy msgid "" "The following files are newer on disk.\n" "What action should be taken?" msgstr "" -"Следующие файлы новее на диске.\n" -"Какие меры должны быть приняты?:" +"Следующие файлы изменены на диске.\n" +"Какое действие следует выполнить?" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -3449,7 +3441,7 @@ msgstr "Сделать уникальным" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Вставить" @@ -3573,7 +3565,7 @@ msgstr "(Текущий)" #: editor/export_template_manager.cpp msgid "Retrieving mirrors, please wait..." -msgstr "Получение зеркал, пожалуйста подождите..." +msgstr "Получение зеркал, пожалуйста, подождите..." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" @@ -5119,7 +5111,8 @@ msgid "Got:" msgstr "Получено:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Не удалось проверить sha256 хэш" #: editor/plugins/asset_library_editor_plugin.cpp @@ -7045,6 +7038,14 @@ msgstr "Закрыть документацию" msgid "Run" msgstr "Запустить" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Поиск" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Шаг в" @@ -7194,8 +7195,8 @@ msgstr "Точки останова" msgid "Go To" msgstr "Перейти к" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Вырезать" @@ -10105,9 +10106,8 @@ msgid "Projects" msgstr "Проекты" #: editor/project_manager.cpp -#, fuzzy msgid "Loading, please wait..." -msgstr "Получение зеркал, пожалуйста подождите..." +msgstr "Загрузка, пожалуйста, ждите..." #: editor/project_manager.cpp msgid "Last Modified" @@ -10730,6 +10730,16 @@ msgid "Instance Child Scene" msgstr "Добавить дочернюю сцену" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "Не могу работать с узлами из внешней сцены!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Вставить узлы" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Открепить скрипт" @@ -10857,6 +10867,11 @@ msgid "Attach Script" msgstr "Прикрепить скрипт" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Вырезать узлы" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Удалить узел(узлы)" diff --git a/editor/translations/si.po b/editor/translations/si.po index 2e5a6f0f81..062cf64646 100644 --- a/editor/translations/si.po +++ b/editor/translations/si.po @@ -647,7 +647,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -2455,7 +2455,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2845,14 +2845,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3225,7 +3217,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4866,7 +4858,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6750,6 +6742,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6894,8 +6894,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10272,6 +10272,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "යතුරු පිටපත් කරන්න" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10396,6 +10405,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "යතුරු පිටපත් කරන්න" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/sk.po b/editor/translations/sk.po index 7a8b132fbd..9c179f743b 100644 --- a/editor/translations/sk.po +++ b/editor/translations/sk.po @@ -647,7 +647,7 @@ msgstr "Vybrať Track-y na skopírovanie" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopírovať" @@ -2519,7 +2519,8 @@ msgstr "" "Addon plugin nie je možné povoliť pri: '% s' analýze konfigurácie zlyhalo." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, 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'." @@ -2950,14 +2951,6 @@ msgid "Help" msgstr "Pomoc" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Vyhľadať" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Online Dokumentácie" @@ -3348,7 +3341,7 @@ msgstr "Spraviť Jedinečným" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Vložiť" @@ -5011,7 +5004,8 @@ msgid "Got:" msgstr "Má:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Zlyhalo sha256 hash check" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6949,6 +6943,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Vyhľadať" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7099,8 +7101,8 @@ msgstr "Všetky vybrané" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10589,6 +10591,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Vložiť" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Popis:" @@ -10713,6 +10724,11 @@ msgid "Attach Script" msgstr "Popis:" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Vložiť" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -13057,10 +13073,6 @@ msgstr "" #~ msgstr "Vytvoriť adresár" #, fuzzy -#~ msgid "Custom Node" -#~ msgstr "Vložiť" - -#, fuzzy #~ msgid "Create Area" #~ msgstr "Vytvoriť adresár" diff --git a/editor/translations/sl.po b/editor/translations/sl.po index bdee4655ab..1c6d1c566b 100644 --- a/editor/translations/sl.po +++ b/editor/translations/sl.po @@ -681,7 +681,7 @@ msgstr "Izberi Lastnost" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -2634,7 +2634,8 @@ msgstr "" "konfiguracije ni uspelo." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "Ni mogoče najti polja skripte za dodatni vtičnik na: 'res://addons/%s'." @@ -3086,14 +3087,6 @@ msgid "Help" msgstr "Pomoč" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Iskanje" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Spletna Dokumentacija" @@ -3480,7 +3473,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -5241,7 +5234,8 @@ msgid "Got:" msgstr "Dobil:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Neuspešno preverjanje preizkusa sha256" #: editor/plugins/asset_library_editor_plugin.cpp @@ -7244,6 +7238,14 @@ msgstr "" msgid "Run" msgstr "Zaženi" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Iskanje" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7397,8 +7399,8 @@ msgstr "Izbriši točke" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10940,6 +10942,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Prilepi Pozicijo" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Odstrani Gradnik VizualnaSkripta" @@ -11070,6 +11081,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Gradnik Prehod" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -13580,10 +13596,6 @@ msgstr "Konstante ni možno spreminjati." #~ msgid "Create folder" #~ msgstr "Ustvarite mapo" -#, fuzzy -#~ msgid "Custom Node" -#~ msgstr "Gradnik Prehod" - #~ msgid "Invalid Path" #~ msgstr "Neveljavna Pot" diff --git a/editor/translations/sq.po b/editor/translations/sq.po index 73c3b1cb43..09b3b2af2e 100644 --- a/editor/translations/sq.po +++ b/editor/translations/sq.po @@ -632,7 +632,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -2577,7 +2577,8 @@ msgstr "" "dështoi." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "I paaftë te gjej fushën e shkrimit për shtojcën në: 'res://addons/%s'." #: editor/editor_node.cpp @@ -3023,14 +3024,6 @@ msgid "Help" msgstr "Ndihmë" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Kërko" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Dokumentimi Online" @@ -3420,7 +3413,7 @@ msgstr "Bëje Unik" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Ngjit" @@ -5104,7 +5097,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -7012,6 +7005,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Kërko" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7159,8 +7160,8 @@ msgstr "Krijo pika." msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10583,6 +10584,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Dyfisho Nyjet" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Shkrim i Ri" @@ -10708,6 +10718,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Dyfisho Nyjet" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po index e56d9fd650..26c5abcbc8 100644 --- a/editor/translations/sr_Cyrl.po +++ b/editor/translations/sr_Cyrl.po @@ -720,7 +720,7 @@ msgstr "Постави прелаз на:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Копирај" @@ -2752,7 +2752,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "Неуспех при прикључивању додатка због конфигурационе датотеке: '%s'." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "Неуспех при налажењу поља за скриптицу у додатку „res://addons/%s“." #: editor/editor_node.cpp @@ -3213,14 +3214,6 @@ msgid "Help" msgstr "Помоћ" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Тражи" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Онлајн документација" @@ -3650,7 +3643,7 @@ msgstr "Учини Јединственим" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Налепи" @@ -5499,7 +5492,8 @@ msgid "Got:" msgstr "Добијено:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Неуспела провера sha256 суме" #: editor/plugins/asset_library_editor_plugin.cpp @@ -7638,6 +7632,14 @@ msgstr "Затвори документацију" msgid "Run" msgstr "Покрени" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Тражи" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Корак у" @@ -7800,8 +7802,8 @@ msgstr "Тачке прекида" msgid "Go To" msgstr "Иди На" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Исеци" @@ -11921,6 +11923,16 @@ msgstr "Инстанца Сцена Дете" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "Немогуће оперисати на чвору из стране сцене!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Налепи Чворове" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Detach Script" msgstr "Припој Скрипту" @@ -12076,6 +12088,11 @@ msgstr "Припој Скрипту" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Cut Node(s)" +msgstr "Направи чвор" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Remove Node(s)" msgstr "Уклони Чвор/ове" @@ -15106,10 +15123,6 @@ msgstr "Константе није могуће мењати." #~ msgstr "CheckBox Radio2" #, fuzzy -#~ msgid "Custom Node" -#~ msgstr "Направи чвор" - -#, fuzzy #~ msgid "Snap (s): " #~ msgstr "Један корак (сек.):" diff --git a/editor/translations/sr_Latn.po b/editor/translations/sr_Latn.po index c177f0983b..47cb13691e 100644 --- a/editor/translations/sr_Latn.po +++ b/editor/translations/sr_Latn.po @@ -654,7 +654,7 @@ msgstr "Postavi tranzicije na:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -2468,7 +2468,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2860,14 +2860,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3241,7 +3233,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4889,7 +4881,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6787,6 +6779,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6932,8 +6932,8 @@ msgstr "Napravi" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10354,6 +10354,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Animacija Uduplaj Ključeve" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10478,6 +10487,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Animacija Uduplaj Ključeve" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/sv.po b/editor/translations/sv.po index 4e08c39b9d..420918548f 100644 --- a/editor/translations/sv.po +++ b/editor/translations/sv.po @@ -662,7 +662,7 @@ msgstr "Välj Spår att Kopiera" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopiera" @@ -2598,7 +2598,8 @@ msgstr "" "Kunde inte aktivera addon plugin vid: '%s' parsning av config misslyckades." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "Kan inte hitta skriptfältet för addon plugin vid: 'res://addons/%s'." #: editor/editor_node.cpp @@ -3026,14 +3027,6 @@ msgid "Help" msgstr "Hjälp" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Sök" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Dokumentation Online" @@ -3422,7 +3415,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Klistra in" @@ -5169,7 +5162,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -7131,6 +7124,14 @@ msgstr "" msgid "Run" msgstr "Kör" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Sök" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7283,8 +7284,8 @@ msgstr "Radera punkter" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Klipp" @@ -10832,6 +10833,15 @@ msgid "Instance Child Scene" msgstr "Instansiera Barn-Scen" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Klistra in Noder" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Fäst Skript" @@ -10962,6 +10972,11 @@ msgid "Attach Script" msgstr "Fäst Skript" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Klipp ut Noder" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Ta bort Nod(er)" diff --git a/editor/translations/ta.po b/editor/translations/ta.po index 407ab40dc8..d1bc762e93 100644 --- a/editor/translations/ta.po +++ b/editor/translations/ta.po @@ -650,7 +650,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -2459,7 +2459,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2851,14 +2851,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3231,7 +3223,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4874,7 +4866,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6754,6 +6746,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6897,8 +6897,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10273,6 +10273,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "அசைவூட்டு போலிபச்சாவிகள்" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10397,6 +10406,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "அசைவூட்டு போலிபச்சாவிகள்" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/te.po b/editor/translations/te.po index eff6151683..02a7a33269 100644 --- a/editor/translations/te.po +++ b/editor/translations/te.po @@ -628,7 +628,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -2432,7 +2432,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2822,14 +2822,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3201,7 +3193,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4829,7 +4821,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6700,6 +6692,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6843,8 +6843,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10197,6 +10197,14 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10317,6 +10325,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/th.po b/editor/translations/th.po index 090e7388a2..2026248122 100644 --- a/editor/translations/th.po +++ b/editor/translations/th.po @@ -643,7 +643,7 @@ msgstr "เลือกแทร็กที่จะคัดลอก" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "คัดลอก" @@ -2489,7 +2489,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "ไม่สามารถเปิดใช้งานปลั๊กอิน: '%s'" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "ไม่พบชื่อสคริปต์ในปลั๊กอิน: 'res://addons/%s'" #: editor/editor_node.cpp @@ -2907,14 +2908,6 @@ msgid "Help" msgstr "ช่วยเหลือ" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "ค้นหา" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "คู่มือ" @@ -3301,7 +3294,7 @@ msgstr "ไม่ใช้ร่วมกับวัตถุอื่น" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "วาง" @@ -4949,7 +4942,8 @@ msgid "Got:" msgstr "ที่ได้รับ:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "ผิดพลาดในการตรวจสอบแฮช SHA256" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6853,6 +6847,14 @@ msgstr "ปิดคู่มือ" msgid "Run" msgstr "เริ่ม" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "ค้นหา" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "คำสั่งต่อไป" @@ -6998,8 +7000,8 @@ msgstr "เบรกพอยต์" msgid "Go To" msgstr "ไปยัง" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "ตัด" @@ -10476,6 +10478,16 @@ msgid "Instance Child Scene" msgstr "อินสแตนซ์ฉากลูก" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "ทำกับโหนดของฉากอื่นไม่ได้!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "วางโหนด" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "ค้นพบสคริปต์" @@ -10601,6 +10613,11 @@ msgid "Attach Script" msgstr "แนบสคริปต์" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "ตัดโหนด" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "ลบโหนด" diff --git a/editor/translations/tr.po b/editor/translations/tr.po index 624f32aa42..568265764b 100644 --- a/editor/translations/tr.po +++ b/editor/translations/tr.po @@ -56,12 +56,13 @@ # furkan atalar <fatalar55@gmail.com>, 2020. # Suleyman Poyraz <zaryob.dev@gmail.com>, 2020. # Çağlar KOPARIR <ckoparir@gmail.com>, 2021. +# Cem Eren Fukara <cefukara@hotmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-02-05 23:44+0000\n" -"Last-Translator: Oğuz Ersen <oguzersen@protonmail.com>\n" +"PO-Revision-Date: 2021-02-21 10:51+0000\n" +"Last-Translator: Cem Eren Fukara <cefukara@hotmail.com>\n" "Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/" "godot/tr/>\n" "Language: tr\n" @@ -69,7 +70,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-dev\n" +"X-Generator: Weblate 4.5\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -698,7 +699,7 @@ msgstr "Kopyalanacak izleri seç" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopyala" @@ -2038,7 +2039,7 @@ msgstr "Çevrimiçi Rehberler" #: editor/editor_help.cpp msgid "Properties" -msgstr "Özellikler" +msgstr "Özellikleri" #: editor/editor_help.cpp msgid "override:" @@ -2050,7 +2051,7 @@ msgstr "varsayılan:" #: editor/editor_help.cpp msgid "Methods" -msgstr "Yöntemler" +msgstr "Metotlar" #: editor/editor_help.cpp msgid "Theme Properties" @@ -2578,7 +2579,8 @@ msgstr "" "başarısız oldu." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "Eklentideki betik alanı bulunamıyor: 'res://addons/%s'." #: editor/editor_node.cpp @@ -3009,14 +3011,6 @@ msgid "Help" msgstr "Yardım" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Ara" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Çevrimiçi Belgeler" @@ -3182,13 +3176,12 @@ msgid "Open & Run a Script" msgstr "Aç & Bir Betik Çalıştır" #: editor/editor_node.cpp -#, fuzzy msgid "" "The following files are newer on disk.\n" "What action should be taken?" msgstr "" "Aşağıdaki dosyalar diskte daha yeni.\n" -"Hangi eylem yapılsın?:" +"Hangi eylem yapılsın?" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -3412,7 +3405,7 @@ msgstr "Benzersiz Yap" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Yapıştır" @@ -5085,7 +5078,8 @@ msgid "Got:" msgstr "Alınan:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Başarısız sha256 hash sınaması" #: editor/plugins/asset_library_editor_plugin.cpp @@ -7009,6 +7003,14 @@ msgstr "Belgeleri Kapat" msgid "Run" msgstr "Çalıştır" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Ara" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "İçeri Adımla" @@ -7156,8 +7158,8 @@ msgstr "Hata ayıklama noktaları" msgid "Go To" msgstr "Şuna Git" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Kes" @@ -10064,9 +10066,8 @@ msgid "Projects" msgstr "Projeler" #: editor/project_manager.cpp -#, fuzzy msgid "Loading, please wait..." -msgstr "Aynalar alınıyor, lütfen bekleyin..." +msgstr "Yükleniyor, lütfen bekleyin..." #: editor/project_manager.cpp msgid "Last Modified" @@ -10687,6 +10688,16 @@ msgid "Instance Child Scene" msgstr "Çocuk Sahnesini Örnekle" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "Yad bir sahnedeki düğümler üzerinde çalışamaz!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Düğümleri Yapıştır" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Betiği Ayır" @@ -10814,6 +10825,11 @@ msgid "Attach Script" msgstr "Betik İliştir" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Düğümleri Kes" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Düğümleri Kaldır" diff --git a/editor/translations/tzm.po b/editor/translations/tzm.po index bbd4822fbd..67b5af0d44 100644 --- a/editor/translations/tzm.po +++ b/editor/translations/tzm.po @@ -626,7 +626,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -2430,7 +2430,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2820,14 +2820,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3199,7 +3191,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4827,7 +4819,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6698,6 +6690,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6841,8 +6841,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10194,6 +10194,14 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10314,6 +10322,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/uk.po b/editor/translations/uk.po index 6b94e70e43..74f5becfea 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-02-05 23:44+0000\n" +"PO-Revision-Date: 2021-02-21 10:51+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.5-dev\n" +"X-Generator: Weblate 4.5\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -666,7 +666,7 @@ msgstr "Виберіть доріжки для копіювання" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Копіювати" @@ -2548,7 +2548,8 @@ msgstr "" "налаштування." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "Не вдалося знайти поле скрипт для доповнення плагіну в: 'res://addons/%s'." @@ -2984,14 +2985,6 @@ msgid "Help" msgstr "Довідка" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Пошук" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Онлайн документація" @@ -3157,13 +3150,12 @@ msgid "Open & Run a Script" msgstr "Відкрити і запустити скрипт" #: editor/editor_node.cpp -#, fuzzy msgid "" "The following files are newer on disk.\n" "What action should be taken?" msgstr "" -"Такі файли на диску новіші.\n" -"Що робити?:" +"На диску зберігаються новіші версії вказаних нижче файлів.\n" +"Що слід зробити?" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -3387,7 +3379,7 @@ msgstr "Зробити унікальним" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Вставити" @@ -5064,7 +5056,8 @@ msgid "Got:" msgstr "Отримав:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Помилка перевірки хешування sha256" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6996,6 +6989,14 @@ msgstr "Закрити документацію" msgid "Run" msgstr "Запустити" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Пошук" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Крок в" @@ -7145,8 +7146,8 @@ msgstr "Точки зупину" msgid "Go To" msgstr "Перейти" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Вирізати" @@ -10064,9 +10065,8 @@ msgid "Projects" msgstr "Проєкти" #: editor/project_manager.cpp -#, fuzzy msgid "Loading, please wait..." -msgstr "Отримання дзеркал, будь ласка, зачекайте..." +msgstr "Завантаження. Будь ласка, зачекайте..." #: editor/project_manager.cpp msgid "Last Modified" @@ -10689,6 +10689,16 @@ msgid "Instance Child Scene" msgstr "Створити екземпляр дочірньої сцени" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "Не можна працювати із вузлами зі сторонньої сцени!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Вставити вузли" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Від'єднати скрипт" @@ -10815,6 +10825,11 @@ msgid "Attach Script" msgstr "Долучити скрипт" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Вирізати вузли" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Вилучити вузли" diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po index 14ece3e011..eccfc5f710 100644 --- a/editor/translations/ur_PK.po +++ b/editor/translations/ur_PK.po @@ -636,7 +636,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -2480,7 +2480,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2874,14 +2874,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3260,7 +3252,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4929,7 +4921,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6851,6 +6843,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6998,8 +6998,8 @@ msgstr ".تمام کا انتخاب" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -10444,6 +10444,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "ایکشن منتقل کریں" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "سب سکریپشن بنائیں" @@ -10571,6 +10580,11 @@ msgid "Attach Script" msgstr "سب سکریپشن بنائیں" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "ایکشن منتقل کریں" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" diff --git a/editor/translations/vi.po b/editor/translations/vi.po index c88429c3d4..3d01339f40 100644 --- a/editor/translations/vi.po +++ b/editor/translations/vi.po @@ -654,7 +654,7 @@ msgstr "Chọn các Track để sao chép:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Sao chép" @@ -2550,7 +2550,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2966,14 +2966,6 @@ msgid "Help" msgstr "Trợ giúp" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Tìm kiếm" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Tài liệu trực tuyến" @@ -3363,7 +3355,7 @@ msgstr "Duy nhất" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Dán" @@ -5043,7 +5035,7 @@ msgid "Got:" msgstr "Nhận được:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6990,6 +6982,14 @@ msgstr "Đóng Docs" msgid "Run" msgstr "Chạy" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Tìm kiếm" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7139,8 +7139,8 @@ msgstr "Tạo các điểm." msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Cắt" @@ -10668,6 +10668,16 @@ msgstr "" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "Không thể hoạt động trên các nút từ ngoại cảnh!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Dán các nút" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Detach Script" msgstr "Đính kèm Script" @@ -10795,6 +10805,11 @@ msgid "Attach Script" msgstr "Đính kèm Script" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Cắt các nút" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Xóa các nút" diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po index 20e4c929ac..3b0394b1d7 100644 --- a/editor/translations/zh_CN.po +++ b/editor/translations/zh_CN.po @@ -75,12 +75,13 @@ # TakWolf <takwolf@foxmail.com>, 2020. # twoBornottwoB <305766341@qq.com>, 2021. # Magian <magian1127@gmail.com>, 2021. +# Weiduo Xie <xwditfr@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Chinese (Simplified) (Godot Engine)\n" "POT-Creation-Date: 2018-01-20 12:15+0200\n" -"PO-Revision-Date: 2021-02-07 05:50+0000\n" -"Last-Translator: BinotaLIU <me@binota.org>\n" +"PO-Revision-Date: 2021-02-21 10:51+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" "Language: zh_CN\n" @@ -88,7 +89,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.5-dev\n" +"X-Generator: Weblate 4.5\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -709,7 +710,7 @@ msgstr "选择要复制的轨道" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "复制" @@ -2553,7 +2554,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "无法在 “%s” 上启用加载项插件:配置解析失败。" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "无法在 “res://addons/%s” 中找到加载项插件的脚本字段。" #: editor/editor_node.cpp @@ -2965,14 +2967,6 @@ msgid "Help" msgstr "帮助" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "搜索" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "在线文档" @@ -3134,13 +3128,12 @@ msgid "Open & Run a Script" msgstr "打开并运行脚本" #: editor/editor_node.cpp -#, fuzzy msgid "" "The following files are newer on disk.\n" "What action should be taken?" msgstr "" -"磁盘中的下列文件已更新。\n" -"请选择执行哪项操作?:" +"磁盘中的下列文件较新。\n" +"应该执行什么操作?" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -3359,7 +3352,7 @@ msgstr "唯一化" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "粘贴" @@ -5006,7 +4999,8 @@ msgid "Got:" msgstr "获得:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "SHA-256 哈希值校验失败" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5831,7 +5825,7 @@ msgstr "发射色彩" #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" -msgstr "CPUParticles" +msgstr "CPU粒子" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp @@ -5845,11 +5839,11 @@ msgstr "从节点创建发射点" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat 0" -msgstr "Flat 0" +msgstr "平面 0" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat 1" -msgstr "Flat 1" +msgstr "平面 1" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease In" @@ -6905,6 +6899,14 @@ msgstr "关闭文档" msgid "Run" msgstr "运行" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "搜索" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "单步进入" @@ -7050,8 +7052,8 @@ msgstr "断点" msgid "Go To" msgstr "转到" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "剪切" @@ -9903,9 +9905,8 @@ msgid "Projects" msgstr "项目" #: editor/project_manager.cpp -#, fuzzy msgid "Loading, please wait..." -msgstr "检索镜像,请等待..." +msgstr "正在加载,请稍候..." #: editor/project_manager.cpp msgid "Last Modified" @@ -10520,6 +10521,16 @@ msgid "Instance Child Scene" msgstr "实例化子场景" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "无法操作外部场景的节点!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "粘贴节点" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "分离脚本" @@ -10642,6 +10653,11 @@ msgid "Attach Script" msgstr "添加脚本" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "剪切节点" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "移除节点" diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po index c3fbf65005..728ecba4ba 100644 --- a/editor/translations/zh_HK.po +++ b/editor/translations/zh_HK.po @@ -682,7 +682,7 @@ msgstr "選擇模式" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "複製" @@ -2598,8 +2598,9 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "" +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "載入字形出現錯誤" #: editor/editor_node.cpp #, fuzzy @@ -3029,14 +3030,6 @@ msgid "Help" msgstr "幫助" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "搜尋" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp #, fuzzy msgid "Online Docs" @@ -3432,7 +3425,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "貼上" @@ -5206,7 +5199,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -7180,6 +7173,14 @@ msgstr "關閉場景" msgid "Run" msgstr "運行" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "搜尋" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7335,8 +7336,8 @@ msgstr "刪除" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "剪下" @@ -10900,6 +10901,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "貼上" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "腳本" @@ -11034,6 +11044,11 @@ msgid "Attach Script" msgstr "腳本" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "貼上" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -13466,10 +13481,6 @@ msgstr "" #~ msgstr "新增資料夾" #, fuzzy -#~ msgid "Custom Node" -#~ msgstr "貼上" - -#, fuzzy #~ msgid "Invalid Path" #~ msgstr "有效的路徑" diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po index c6241b6ffe..7ac1142466 100644 --- a/editor/translations/zh_TW.po +++ b/editor/translations/zh_TW.po @@ -29,7 +29,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-02-07 05:50+0000\n" +"PO-Revision-Date: 2021-02-21 10:51+0000\n" "Last-Translator: BinotaLIU <me@binota.org>\n" "Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hant/>\n" @@ -38,7 +38,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.5-dev\n" +"X-Generator: Weblate 4.5\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -659,7 +659,7 @@ msgstr "選擇軌道以複製" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "複製" @@ -2505,7 +2505,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "無法在「%s」上啟用擴充功能,解析組態設定失敗。" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "無法在擴充功能「res://addons/%s」中無法找到腳本欄位。" #: editor/editor_node.cpp @@ -2917,14 +2918,6 @@ msgid "Help" msgstr "說明" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "搜尋" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "線上說明文件" @@ -3086,13 +3079,12 @@ msgid "Open & Run a Script" msgstr "開啟並執行腳本" #: editor/editor_node.cpp -#, fuzzy msgid "" "The following files are newer on disk.\n" "What action should be taken?" msgstr "" "磁碟中的下列檔案已更新。\n" -"請選擇於執行之操作:" +"要執行什麼操作?" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -3311,7 +3303,7 @@ msgstr "獨立化" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "貼上" @@ -4958,7 +4950,8 @@ msgid "Got:" msgstr "獲得:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "SHA-256 雜湊檢查失敗" #: editor/plugins/asset_library_editor_plugin.cpp @@ -6858,6 +6851,14 @@ msgstr "關閉說明文件" msgid "Run" msgstr "執行" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "搜尋" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "逐步執行" @@ -7003,8 +7004,8 @@ msgstr "中斷點" msgid "Go To" msgstr "跳至" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "剪下" @@ -9857,9 +9858,8 @@ msgid "Projects" msgstr "專案" #: editor/project_manager.cpp -#, fuzzy msgid "Loading, please wait..." -msgstr "正在取得鏡像,請稍後..." +msgstr "載入中,請稍後..." #: editor/project_manager.cpp msgid "Last Modified" @@ -10473,6 +10473,16 @@ msgid "Instance Child Scene" msgstr "實體化子場景" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "無法對外部場景的節點進行操作!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "貼上節點" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "取消附加腳本" @@ -10595,6 +10605,11 @@ msgid "Attach Script" msgstr "附加腳本" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "剪下節點" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "移除節點" |