feat: updated engine

This commit is contained in:
Sara Gerretsen 2026-07-10 17:04:34 +02:00
parent cbe99774ff
commit f4cf6b3999
6607 changed files with 910135 additions and 430025 deletions

View file

@ -31,9 +31,12 @@
#include "graph_edit.h"
#include "graph_edit.compat.inc"
#include "core/config/engine.h"
#include "core/input/input.h"
#include "core/math/geometry_2d.h"
#include "core/math/math_funcs.h"
#include "core/object/callable_mp.h"
#include "core/object/class_db.h"
#include "core/os/keyboard.h"
#include "scene/2d/line_2d.h"
#include "scene/gui/box_container.h"
@ -511,8 +514,8 @@ void GraphEdit::_update_scrollbars() {
v_scrollbar->show();
}
Size2 hmin = h_scrollbar->get_combined_minimum_size();
Size2 vmin = v_scrollbar->get_combined_minimum_size();
Size2 hmin = h_scrollbar->get_bound_minimum_size();
Size2 vmin = v_scrollbar->get_bound_minimum_size();
// Avoid scrollbar overlapping.
h_scrollbar->set_anchor_and_offset(SIDE_RIGHT, ANCHOR_END, v_scrollbar->is_visible() ? -vmin.width : 0);
@ -837,8 +840,8 @@ void GraphEdit::_notification(int p_what) {
menu_panel->add_theme_style_override(SceneStringName(panel), theme_cache.menu_panel);
} break;
case NOTIFICATION_READY: {
Size2 hmin = h_scrollbar->get_combined_minimum_size();
Size2 vmin = v_scrollbar->get_combined_minimum_size();
Size2 hmin = h_scrollbar->get_bound_minimum_size();
Size2 vmin = v_scrollbar->get_bound_minimum_size();
h_scrollbar->set_anchor_and_offset(SIDE_LEFT, ANCHOR_BEGIN, 0);
h_scrollbar->set_anchor_and_offset(SIDE_RIGHT, ANCHOR_END, 0);
@ -1829,7 +1832,7 @@ void GraphEdit::_minimap_draw() {
Vector2 node_size = minimap->_convert_from_graph_position(graph_frame->get_size() * zoom);
Rect2 node_rect = Rect2(node_position, node_size);
Ref<StyleBoxFlat> sb_minimap = minimap->theme_cache.node_style->duplicate();
Ref<StyleBoxFlat> sb_minimap = minimap->theme_cache.node_style;
// Override default values with colors provided by the GraphNode's stylebox, if possible.
Ref<StyleBoxFlat> sb_frame = graph_frame->get_theme_stylebox(graph_frame->is_selected() ? SNAME("panel_selected") : SceneStringName(panel));
@ -1838,6 +1841,7 @@ void GraphEdit::_minimap_draw() {
if (graph_frame->is_tint_color_enabled()) {
node_color = graph_frame->get_tint_color();
}
sb_minimap = sb_minimap->duplicate();
sb_minimap->set_bg_color(node_color);
}
@ -1855,12 +1859,13 @@ void GraphEdit::_minimap_draw() {
Vector2 node_size = minimap->_convert_from_graph_position(graph_node->get_size() * zoom);
Rect2 node_rect = Rect2(node_position, node_size);
Ref<StyleBoxFlat> sb_minimap = minimap->theme_cache.node_style->duplicate();
Ref<StyleBoxFlat> sb_minimap = minimap->theme_cache.node_style;
// Override default values with colors provided by the GraphNode's stylebox, if possible.
Ref<StyleBoxFlat> sb_frame = graph_node->is_selected() ? graph_node->theme_cache.panel_selected : graph_node->theme_cache.panel;
if (sb_frame.is_valid()) {
Color node_color = sb_frame->get_bg_color();
sb_minimap = sb_minimap->duplicate();
sb_minimap->set_bg_color(node_color);
}
@ -2590,7 +2595,7 @@ TypedArray<Dictionary> GraphEdit::_get_connections_intersecting_with_rect(const
TypedArray<Dictionary> GraphEdit::_get_connection_list_from_node(const StringName &p_node) const {
ERR_FAIL_COND_V(!connection_map.has(p_node), TypedArray<Dictionary>());
List<Ref<GraphEdit::Connection>> connections_from_node = connection_map.get(p_node);
List<Ref<GraphEdit::Connection>> connections_from_node(connection_map.get(p_node));
TypedArray<Dictionary> connections_from_node_dict;
for (const Ref<Connection> &conn : connections_from_node) {
@ -2949,7 +2954,7 @@ void GraphEdit::set_warped_panning(bool p_warped) {
}
void GraphEdit::update_warped_panning() {
panner->setup_warped_panning(get_viewport(), warped_panning);
panner->setup_warped_panning(this, warped_panning);
}
void GraphEdit::arrange_nodes() {
@ -3114,9 +3119,9 @@ void GraphEdit::_bind_methods() {
ADD_SIGNAL(MethodInfo("duplicate_nodes_request"));
ADD_SIGNAL(MethodInfo("delete_nodes_request", PropertyInfo(Variant::ARRAY, "nodes", PROPERTY_HINT_ARRAY_TYPE, "StringName")));
ADD_SIGNAL(MethodInfo("node_selected", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_RESOURCE_TYPE, "Node")));
ADD_SIGNAL(MethodInfo("node_deselected", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_RESOURCE_TYPE, "Node")));
ADD_SIGNAL(MethodInfo("frame_rect_changed", PropertyInfo(Variant::OBJECT, "frame", PROPERTY_HINT_RESOURCE_TYPE, "GraphFrame"), PropertyInfo(Variant::RECT2, "new_rect")));
ADD_SIGNAL(MethodInfo("node_selected", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_RESOURCE_TYPE, Node::get_class_static())));
ADD_SIGNAL(MethodInfo("node_deselected", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_RESOURCE_TYPE, Node::get_class_static())));
ADD_SIGNAL(MethodInfo("frame_rect_changed", PropertyInfo(Variant::OBJECT, "frame", PROPERTY_HINT_RESOURCE_TYPE, GraphFrame::get_class_static()), PropertyInfo(Variant::RECT2, "new_rect")));
ADD_SIGNAL(MethodInfo("popup_request", PropertyInfo(Variant::VECTOR2, "at_position")));
@ -3180,16 +3185,18 @@ GraphEdit::GraphEdit() {
panner->set_callbacks(callable_mp(this, &GraphEdit::_pan_callback), callable_mp(this, &GraphEdit::_zoom_callback));
top_layer = memnew(Control);
top_layer->set_name(StringName("_top_layer"));
add_child(top_layer, false, INTERNAL_MODE_BACK);
top_layer->set_mouse_filter(MOUSE_FILTER_IGNORE);
top_layer->set_anchors_and_offsets_preset(Control::PRESET_FULL_RECT);
top_layer->set_use_parent_material(true);
top_layer->connect(SceneStringName(draw), callable_mp(this, &GraphEdit::_top_layer_draw));
top_layer->connect(SceneStringName(focus_exited), callable_mp(panner.ptr(), &ViewPanner::release_pan_key));
connections_layer = memnew(Control);
add_child(connections_layer, false);
connections_layer->connect(SceneStringName(draw), callable_mp(this, &GraphEdit::_update_connections));
connections_layer->set_name("_connection_layer");
connections_layer->set_name(StringName("_connection_layer"));
connections_layer->set_disable_visibility_clip(true); // Necessary, so it can draw freely and be offset.
connections_layer->set_mouse_filter(MOUSE_FILTER_IGNORE);
@ -3207,11 +3214,13 @@ GraphEdit::GraphEdit() {
top_connection_layer->add_child(dragged_connection_line);
h_scrollbar = memnew(HScrollBar);
h_scrollbar->set_name("_h_scroll");
h_scrollbar->set_name(StringName("_h_scroll"));
h_scrollbar->set_use_parent_material(true);
top_layer->add_child(h_scrollbar);
v_scrollbar = memnew(VScrollBar);
v_scrollbar->set_name("_v_scroll");
v_scrollbar->set_name(StringName("_v_scroll"));
v_scrollbar->set_use_parent_material(true);
top_layer->add_child(v_scrollbar);
// Set large minmax so it can scroll even if not resized yet.
@ -3228,59 +3237,72 @@ GraphEdit::GraphEdit() {
menu_panel = memnew(PanelContainer);
menu_panel->set_visible(show_menu);
menu_panel->set_use_parent_material(true);
top_layer->add_child(menu_panel);
menu_panel->set_position(Vector2(10, 10));
menu_hbox = memnew(HBoxContainer);
menu_hbox->set_name(StringName("_menu_hbox"));
menu_panel->add_child(menu_hbox);
// Zoom label and controls.
zoom_label = memnew(Label);
zoom_label->set_name(StringName("_zoom_label"));
zoom_label->set_visible(show_zoom_label);
zoom_label->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
zoom_label->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_CENTER);
zoom_label->set_custom_minimum_size(Size2(48, 0));
zoom_label->set_use_parent_material(true);
menu_hbox->add_child(zoom_label);
_update_zoom_label();
zoom_minus_button = memnew(Button);
zoom_minus_button->set_name(StringName("_zoom_minus_button"));
zoom_minus_button->set_theme_type_variation(SceneStringName(FlatButton));
zoom_minus_button->set_visible(show_zoom_buttons);
zoom_minus_button->set_tooltip_text(ETR("Zoom Out"));
zoom_minus_button->set_focus_mode(FOCUS_ACCESSIBILITY);
zoom_minus_button->set_use_parent_material(true);
menu_hbox->add_child(zoom_minus_button);
zoom_minus_button->connect(SceneStringName(pressed), callable_mp(this, &GraphEdit::_zoom_minus));
zoom_reset_button = memnew(Button);
zoom_reset_button->set_name(StringName("_zoom_reset_button"));
zoom_reset_button->set_theme_type_variation(SceneStringName(FlatButton));
zoom_reset_button->set_visible(show_zoom_buttons);
zoom_reset_button->set_tooltip_text(ETR("Zoom Reset"));
zoom_reset_button->set_focus_mode(FOCUS_ACCESSIBILITY);
zoom_reset_button->set_use_parent_material(true);
menu_hbox->add_child(zoom_reset_button);
zoom_reset_button->connect(SceneStringName(pressed), callable_mp(this, &GraphEdit::_zoom_reset));
zoom_plus_button = memnew(Button);
zoom_plus_button->set_name(StringName("_zoom_plus_button"));
zoom_plus_button->set_theme_type_variation(SceneStringName(FlatButton));
zoom_plus_button->set_visible(show_zoom_buttons);
zoom_plus_button->set_tooltip_text(ETR("Zoom In"));
zoom_plus_button->set_focus_mode(FOCUS_ACCESSIBILITY);
zoom_plus_button->set_use_parent_material(true);
menu_hbox->add_child(zoom_plus_button);
zoom_plus_button->connect(SceneStringName(pressed), callable_mp(this, &GraphEdit::_zoom_plus));
// Grid controls.
toggle_grid_button = memnew(Button);
toggle_grid_button->set_name(StringName("_toggle_grid_button"));
toggle_grid_button->set_theme_type_variation(SceneStringName(FlatButton));
toggle_grid_button->set_visible(show_grid_buttons);
toggle_grid_button->set_toggle_mode(true);
toggle_grid_button->set_pressed(true);
toggle_grid_button->set_tooltip_text(ETR("Toggle the visual grid."));
toggle_grid_button->set_focus_mode(FOCUS_ACCESSIBILITY);
toggle_grid_button->set_use_parent_material(true);
menu_hbox->add_child(toggle_grid_button);
toggle_grid_button->connect(SceneStringName(pressed), callable_mp(this, &GraphEdit::_show_grid_toggled));
toggle_snapping_button = memnew(Button);
toggle_snapping_button->set_name(StringName("_toggle_snapping_button"));
toggle_snapping_button->set_theme_type_variation(SceneStringName(FlatButton));
toggle_snapping_button->set_visible(show_grid_buttons);
toggle_snapping_button->set_toggle_mode(true);
@ -3291,33 +3313,39 @@ GraphEdit::GraphEdit() {
toggle_snapping_button->connect(SceneStringName(pressed), callable_mp(this, &GraphEdit::_snapping_toggled));
snapping_distance_spinbox = memnew(SpinBox);
snapping_distance_spinbox->set_name(StringName("_snapping_distance_spinbox"));
snapping_distance_spinbox->set_visible(show_grid_buttons);
snapping_distance_spinbox->set_min(GRID_MIN_SNAPPING_DISTANCE);
snapping_distance_spinbox->set_max(GRID_MAX_SNAPPING_DISTANCE);
snapping_distance_spinbox->set_step(1);
snapping_distance_spinbox->set_value(snapping_distance);
snapping_distance_spinbox->set_tooltip_text(ETR("Change the snapping distance."));
snapping_distance_spinbox->set_use_parent_material(true);
menu_hbox->add_child(snapping_distance_spinbox);
snapping_distance_spinbox->connect(SceneStringName(value_changed), callable_mp(this, &GraphEdit::_snapping_distance_changed));
// Extra controls.
minimap_button = memnew(Button);
minimap_button->set_name(StringName("_minimap_button"));
minimap_button->set_theme_type_variation(SceneStringName(FlatButton));
minimap_button->set_visible(show_minimap_button);
minimap_button->set_toggle_mode(true);
minimap_button->set_tooltip_text(ETR("Toggle the graph minimap."));
minimap_button->set_pressed(show_grid);
minimap_button->set_focus_mode(FOCUS_ACCESSIBILITY);
minimap_button->set_use_parent_material(true);
menu_hbox->add_child(minimap_button);
minimap_button->connect(SceneStringName(pressed), callable_mp(this, &GraphEdit::_minimap_toggled));
arrange_button = memnew(Button);
arrange_button->set_name(StringName("_arrange_button"));
arrange_button->set_theme_type_variation(SceneStringName(FlatButton));
arrange_button->set_visible(show_arrange_button);
arrange_button->set_tooltip_text(ETR("Automatically arrange selected nodes."));
arrange_button->connect(SceneStringName(pressed), callable_mp(this, &GraphEdit::arrange_nodes));
arrange_button->set_focus_mode(FOCUS_ACCESSIBILITY);
arrange_button->set_use_parent_material(true);
menu_hbox->add_child(arrange_button);
// Minimap.
@ -3326,8 +3354,8 @@ GraphEdit::GraphEdit() {
const float minimap_opacity = 0.65;
minimap = memnew(GraphEditMinimap(this));
minimap->set_name(StringName("_minimap"));
top_layer->add_child(minimap);
minimap->set_name("_minimap");
minimap->set_modulate(Color(1, 1, 1, minimap_opacity));
minimap->set_mouse_filter(MOUSE_FILTER_PASS);
minimap->set_custom_minimum_size(Vector2(50, 50));
@ -3337,6 +3365,7 @@ GraphEdit::GraphEdit() {
minimap->set_offset(Side::SIDE_TOP, -minimap_size.height - MINIMAP_OFFSET);
minimap->set_offset(Side::SIDE_RIGHT, -MINIMAP_OFFSET);
minimap->set_offset(Side::SIDE_BOTTOM, -MINIMAP_OFFSET);
minimap->set_use_parent_material(true);
minimap->connect(SceneStringName(draw), callable_mp(this, &GraphEdit::_minimap_draw));
set_clip_contents(true);