From 25071ac07f3d4d89e814be2ba5f806250ed4c58a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Daubelcour?= Date: Fri, 10 Oct 2025 01:03:46 -0400 Subject: [PATCH] Added Copy/Paste Properties For Groups Co-Authored-By: Tomasz Chabora <2223172+KoBeWi@users.noreply.github.com> Co-Authored-By: A Thousand Ships <96648715+AThousandShips@users.noreply.github.com> --- editor/inspector/editor_inspector.cpp | 286 +++++++++++++++++- editor/inspector/editor_inspector.h | 26 +- editor/scene/3d/skeleton_3d_editor_plugin.cpp | 8 +- 3 files changed, 303 insertions(+), 17 deletions(-) diff --git a/editor/inspector/editor_inspector.cpp b/editor/inspector/editor_inspector.cpp index 0d4b49ce0b..dbb629e33f 100644 --- a/editor/inspector/editor_inspector.cpp +++ b/editor/inspector/editor_inspector.cpp @@ -33,9 +33,12 @@ #include "core/input/input.h" #include "core/os/keyboard.h" +#include "core/variant/typed_dictionary.h" #include "editor/debugger/editor_debugger_inspector.h" +#include "editor/debugger/editor_debugger_node.h" #include "editor/doc/doc_tools.h" #include "editor/docks/inspector_dock.h" +#include "editor/editor_interface.h" #include "editor/editor_main_screen.h" #include "editor/editor_node.h" #include "editor/editor_string_names.h" @@ -1426,6 +1429,12 @@ void EditorProperty::menu_option(int p_option) { return; } } + + Dictionary dict = InspectorDock::get_inspector_singleton()->get_property_clipboard(); + if (dict.has("@pastebin_category_name") || dict.has("@pastebin_section_name")) { + return; + } + emit_changed(property, EditorInspector::get_property_clipboard()); } break; case MENU_COPY_PROPERTY_PATH: { @@ -1842,8 +1851,131 @@ Size2 EditorInspectorCategory::get_minimum_size() const { return ms; } +void EditorInspectorCategory::_collect_properties(const Object *p_object, LocalVector &r_properties) const { + List property_list; + p_object->get_property_list(&property_list, true); + + String current_category; + for (const PropertyInfo &prop_info : property_list) { + if (prop_info.usage & PROPERTY_USAGE_GROUP) { + continue; + } + if (prop_info.usage & PROPERTY_USAGE_CATEGORY) { + current_category = prop_info.name; + continue; + } + if (!(prop_info.usage & PROPERTY_USAGE_EDITOR)) { + continue; + } + if (!current_category.ends_with(info.name)) { + continue; + } + + r_properties.push_back(prop_info.name); + } +} + void EditorInspectorCategory::_handle_menu_option(int p_option) { switch (p_option) { + case MENU_COPY_VALUE: { + const Object *object = EditorInterface::get_singleton()->get_inspector()->get_edited_object(); + String category_name = info.name; + if (!EditorNode::get_editor_data().is_type_recognized(info.name) && ResourceLoader::exists(info.hint_string, "Script")) { + Ref