diff options
author | Hendrik Brucker <hendrik.brucker@mail.de> | 2024-03-05 13:27:33 +0100 |
---|---|---|
committer | Hendrik Brucker <hendrik.brucker@mail.de> | 2024-03-05 13:27:33 +0100 |
commit | d32e0f808c082893165e292e9d2752b3b70a6d06 (patch) | |
tree | d1ac69bf5165307ca99a1e343045a530f8f3c767 /editor/plugins | |
parent | f5dbbf7fd067bbb435989a6839fe37e03e4ba057 (diff) | |
download | redot-engine-d32e0f808c082893165e292e9d2752b3b70a6d06.tar.gz |
Make editing properties more intuitive in VisualShader
Diffstat (limited to 'editor/plugins')
-rw-r--r-- | editor/plugins/visual_shader_editor_plugin.cpp | 65 |
1 files changed, 44 insertions, 21 deletions
diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp index f5fadc2f1b..0b7375b6ee 100644 --- a/editor/plugins/visual_shader_editor_plugin.cpp +++ b/editor/plugins/visual_shader_editor_plugin.cpp @@ -818,6 +818,7 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id, bool } hb->add_theme_constant_override("separation", 7 * EDSCALE); + // Default value button/property editor. Variant default_value; if (valid_left && !port_left_used) { @@ -2744,6 +2745,8 @@ void VisualShaderEditor::_edit_port_default_input(Object *p_button, int p_node, Variant value = vs_node->get_input_port_default_value(p_port); edited_property_holder->set_edited_property(value); + editing_node = p_node; + editing_port = p_port; if (property_editor) { property_editor->disconnect("property_changed", callable_mp(this, &VisualShaderEditor::_port_edited)); @@ -2751,29 +2754,49 @@ void VisualShaderEditor::_edit_port_default_input(Object *p_button, int p_node, } // TODO: Define these properties with actual PropertyInfo and feed it to the property editor widget. - property_editor = EditorInspector::instantiate_property_editor(edited_property_holder.ptr(), value.get_type(), "edited_property", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE); - if (property_editor) { - property_editor->set_object_and_property(edited_property_holder.ptr(), "edited_property"); - property_editor->update_property(); - property_editor->set_name_split_ratio(0); - property_editor_popup->add_child(property_editor); + property_editor = EditorInspector::instantiate_property_editor(edited_property_holder.ptr(), value.get_type(), "edited_property", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE, true); + ERR_FAIL_NULL_MSG(property_editor, "Failed to create property editor for type: " + Variant::get_type_name(value.get_type())); + + // Determine the best size for the popup based on the property type. + // This is done here, since the property editors are also used in the inspector where they have different layout requirements, so we can't just change their default minimum size. + Size2 popup_pref_size; + switch (value.get_type()) { + case Variant::VECTOR3: + case Variant::BASIS: + popup_pref_size.width = 320; + break; + case Variant::VECTOR4: + case Variant::QUATERNION: + case Variant::PLANE: + case Variant::TRANSFORM2D: + case Variant::TRANSFORM3D: + case Variant::PROJECTION: + popup_pref_size.width = 480; + break; + default: + popup_pref_size.width = 180; + break; + } + property_editor_popup->set_min_size(popup_pref_size); - property_editor->connect("property_changed", callable_mp(this, &VisualShaderEditor::_port_edited)); + property_editor->set_object_and_property(edited_property_holder.ptr(), "edited_property"); + property_editor->update_property(); + property_editor->set_name_split_ratio(0); + property_editor_popup->add_child(property_editor); - Button *button = Object::cast_to<Button>(p_button); - if (button) { - property_editor_popup->set_position(button->get_screen_position() + Vector2(0, button->get_size().height) * graph->get_zoom()); - } - property_editor_popup->reset_size(); - if (button) { - property_editor_popup->popup(); - } else { - property_editor_popup->popup_centered_ratio(); - } - } + property_editor->connect("property_changed", callable_mp(this, &VisualShaderEditor::_port_edited)); - editing_node = p_node; - editing_port = p_port; + Button *button = Object::cast_to<Button>(p_button); + if (button) { + property_editor_popup->set_position(button->get_screen_position() + Vector2(0, button->get_size().height) * graph->get_zoom()); + } + property_editor_popup->reset_size(); + if (button) { + property_editor_popup->popup(); + } else { + property_editor_popup->popup_centered_ratio(); + } + property_editor->select(0); // Focus the first focusable control. } void VisualShaderEditor::_set_custom_node_option(int p_index, int p_node, int p_op) { @@ -6515,7 +6538,7 @@ VisualShaderEditor::VisualShaderEditor() { graph_plugin->set_editor(this); property_editor_popup = memnew(PopupPanel); - property_editor_popup->set_min_size(Size2(180, 0) * EDSCALE); + property_editor_popup->set_min_size(Size2(360, 0) * EDSCALE); add_child(property_editor_popup); edited_property_holder.instantiate(); |