GraphEdit

实验性: This class may be changed or removed in future versions.

继承: Control < Item < Object

类似图结构的编辑器,使用GraphNodes。

描述

GraphEdit提供用于创建、操作和显示各种图形的工具。它在引擎中的主要目的是为可视化编程系统提供动力,例如可视化着色器,但它也可用于用户项目。

GraphEdit本身只是一个空容器,表示可以放置GraphNodes的无限网格。每个GraphNode代表图中的一个节点,即连接方案中的单个数据单元。GraphEdit反过来又有助于控制与节点以及节点之间的各种交互。当用户尝试连接、断开或删除GraphEdit时,GraphEdit中会发出信号,但默认情况下不会采取任何行动。利用此控件实现必要的逻辑以确定应如何处理每个请求是程序员的责任。

性能:使用GraphEdits时,强烈建议启用低处理器使用模式(参见OS.low_processor_usage_mode)。

注意:请记住,由于技术限制,Item.get_children()也会返回名为_connection_layer的连接层节点,这种行为可能会在未来的版本中改变。

属性

方法

PackedVector2Array

_get_connection_line(from_position: Vector2, to_position: Vector2) virtual const

bool

_is_in_input_hotzone(in_node: Object, in_port: int, mouse_position: Vector2) virtual

bool

_is_in_output_hotzone(in_node: Object, in_port: int, mouse_position: Vector2) virtual

bool

_is_node_hover_valid(from_node: StringName, from_port: int, to_node: StringName, to_port: int) virtual

void

add_valid_connection_type(from_type: int, to_type: int)

void

add_valid_left_disconnect_type(type: int)

void

add_valid_right_disconnect_type(type: int)

void

arrange_nodes()

void

attach_graph_element_to_frame(element: StringName, frame: StringName)

void

clear_connections()

Error

connect_node(from_node: StringName, from_port: int, to_node: StringName, to_port: int, keep_alive: bool = false)

void

detach_graph_element_from_frame(element: StringName)

void

disconnect_node(from_node: StringName, from_port: int, to_node: StringName, to_port: int)

void

force_connection_drag_end()

Array[StringName]

get_attached_nodes_of_frame(frame: StringName)

Dictionary

get_closest_connection_at_point(point: Vector2, max_distance: float = 4.0) const

int

get_connection_count(from_node: StringName, from_port: int)

PackedVector2Array

get_connection_line(from_node: Vector2, to_node: Vector2) const

Array[Dictionary]

get_connections_intersecting_with_rect(rect: Rect2) const

GraphFrame

get_element_frame(element: StringName)

HBoxContainer

get_menu_hbox()

bool

is_node_connected(from_node: StringName, from_port: int, to_node: StringName, to_port: int)

bool

is_valid_connection_type(from_type: int, to_type: int) const

void

remove_valid_connection_type(from_type: int, to_type: int)

void

remove_valid_left_disconnect_type(type: int)

void

remove_valid_right_disconnect_type(type: int)

void

set_connection_activity(from_node: StringName, from_port: int, to_node: StringName, to_port: int, amount: float)

void

set_selected(node: Item)

主题属性


信号

begin_node_move() 🔗

GraphElement的运动开始时发出。


connection_drag_ended() 🔗

在连接拖动结束时发出。


connection_drag_started(from_node: StringName, from_port: int, is_output: bool) 🔗

在连接拖动开始时发出。


connection_from_empty(to_node: StringName, to_port: int, release_position: Vector2) 🔗

当用户将连接从输入端口拖到图形的空白空间时发出。


connection_request(from_node: StringName, from_port: int, to_node: StringName, to_port: int) 🔗

当尝试创建from_nodeGraphNodefrom_portto_nodeGraphNodeto_port之间的连接时,向GraphEdit发出。


connection_to_empty(from_node: StringName, from_port: int, release_position: Vector2) 🔗

当用户将连接从输出端口拖到图形的空白空间时发出。


copy_nodes_request() 🔗

当此GraphEdit捕获ui_copy动作(默认为Ctrl+C)时发出。通常,此信号表示应复制选定的GraphElements。


cut_nodes_request() 🔗

当此GraphEdit捕获ui_cut动作(默认为Ctrl+X)时发出。通常,此信号表示应剪切选定的GraphElements。


delete_nodes_request(nodes: Array[StringName]) 🔗

当此GraphEdit捕获ui_graph_delete操作时发出(默认情况下为Delete)。

nodes是应删除的节点名称数组。这些通常包括所有选定的节点。


disconnection_request(from_node: StringName, from_port: int, to_node: StringName, to_port: int) 🔗

当试图删除from_nodeGraphNodefrom_portto_nodeGraphNodeto_port之间的连接时,向GraphEdit发出。


duplicate_nodes_request() 🔗

当此GraphEdit捕获ui_graph_duplicate动作(默认为Ctrl+D)时发出。通常,此信号表示应复制选定的GraphElement


end_node_move() 🔗

GraphElement的移动结束时发出。


frame_rect_changed(frame: GraphFrame, new_rect: Rect2) 🔗

GraphFrameframe调整为new_rect时发出。


graph_elements_linked_to_frame_request(elements: Array, frame: StringName) 🔗

当一个或多个GraphElement被放置到名为frameGraphFrame上时发出,当时它们以前没有附加到任何其他框架。

elements是要附加的GraphElement数组。


node_deselected(node: Item) 🔗

取消选择给定的GraphElement节点时发出。


node_selected(node: Item) 🔗

选择给定的GraphElement节点时发出。


paste_nodes_request() 🔗

当此GraphEdit捕获ui_paste动作(默认为Ctrl+V)时发出。通常,此信号表示应粘贴先前复制的GraphElement


popup_request(at_position: Vector2) 🔗

请求弹出窗口时发出。在GraphEdit中右键单击时发生。at_position是发送信号时鼠标指针的位置。


scroll_offset_changed(offset: Vector2) 🔗

当用户更改滚动偏移量时发出。在代码中更改时不会发出。


枚举

enum PanningScheme: 🔗

PanningScheme SCROLL_ZOOMS = 0

鼠标滚轮将缩放,Ctrl+鼠标滚轮将移动视图。

PanningScheme SCROLL_PANS = 1

鼠标滚轮将移动视图,Ctrl+鼠标滚轮将缩放。


enum GridPattern: 🔗

GridPattern GRID_PATTERN_LINES = 0

使用实线绘制网格。

GridPattern GRID_PATTERN_DOTS = 1

使用点绘制网格。


属性说明

bool connection_lines_antialiased = true 🔗

  • void set_connection_lines_antialiased(value: bool)

  • bool is_connection_lines_antialiased()

如果true,则节点之间的行将使用抗锯齿。


float connection_lines_curvature = 0.5 🔗

  • void set_connection_lines_curvature(value: float)

  • float get_connection_lines_curvature()

节点之间的线的曲率。0导致直线。


float connection_lines_thickness = 4.0 🔗

  • void set_connection_lines_thickness(value: float)

  • float get_connection_lines_thickness()

节点之间的线的粗细。


Array[Dictionary] connections = [] 🔗

GraphNode之间的连接。

单个连接以Dictionary形式表示,格式如下:

{
    from_node: StringName,
    from_port: int,
    to_node: StringName,
    to_port: int,
    keep_alive: bool
}

如果在重新绘制期间无效,keep_alive设置为false的连接可能会被自动删除。


GridPattern grid_pattern = 0 🔗

用于绘制网格的模式。


bool minimap_enabled = true 🔗

  • void set_minimap_enabled(value: bool)

  • bool is_minimap_enabled()

如果true,则小地图可见。


float minimap_opacity = 0.65 🔗

  • void set_minimap_opacity(value: float)

  • float get_minimap_opacity()

小地图矩形的不透明度。


Vector2 minimap_size = Vector2(240, 160) 🔗

小地图矩形的大小。地图本身基于网格区域的大小,并进行缩放以适应该矩形。


PanningScheme panning_scheme = 0 🔗

定义使用鼠标滚轮平移的控制方案。


bool right_disconnects = false 🔗

  • void set_right_disconnects(value: bool)

  • bool is_right_disconnects_enabled()

如果true,则通过拖动右端来断开GraphEdit中的现有连接。


Vector2 scroll_offset = Vector2(0, 0) 🔗

滚动偏移。


bool show_arrange_button = true 🔗

  • void set_show_arrange_button(value: bool)

  • bool is_showing_arrange_button()

如果true,则自动排列图形节点的按钮是可见的。


bool show_grid = true 🔗

  • void set_show_grid(value: bool)

  • bool is_showing_grid()

如果true,则网格可见。


bool show_grid_buttons = true 🔗

  • void set_show_grid_buttons(value: bool)

  • bool is_showing_grid_buttons()

如果true,则允许配置网格和抓拍选项的按钮是可见的。


bool show_menu = true 🔗

  • void set_show_menu(value: bool)

  • bool is_showing_menu()

如果true,则菜单工具栏可见。


bool show_minimap_button = true 🔗

  • void set_show_minimap_button(value: bool)

  • bool is_showing_minimap_button()

如果true,则切换小地图的按钮是可见的。


bool show_zoom_buttons = true 🔗

  • void set_show_zoom_buttons(value: bool)

  • bool is_showing_zoom_buttons()

如果true,则允许更改和重置缩放级别的按钮是可见的。


bool show_zoom_label = false 🔗

  • void set_show_zoom_label(value: bool)

  • bool is_showing_zoom_label()

如果true,则当前缩放级别的标签可见。缩放级别以百分比显示。


int snapping_distance = 20 🔗

  • void set_snapping_distance(value: int)

  • int get_snapping_distance()

以像素为单位的捕捉距离也决定了网格线距离。


bool snapping_enabled = true 🔗

  • void set_snapping_enabled(value: bool)

  • bool is_snapping_enabled()

如果true,则启用捕捉。


float zoom = 1.0 🔗

当前缩放值。


float zoom_max = 2.0736 🔗

  • void set_zoom_max(value: float)

  • float get_zoom_max()

缩放上限。


float zoom_min = 0.232568 🔗

  • void set_zoom_min(value: float)

  • float get_zoom_min()

缩放下限。


float zoom_step = 1.2 🔗

  • void set_zoom_step(value: float)

  • float get_zoom_step()

每个缩放级别的步骤。


方法说明

PackedVector2Array _get_connection_line(from_position: Vector2, to_position: Vector2) virtual const 🔗

可以覆盖以自定义绘制连接方式的虚拟方法。


bool _is_in_input_hotzone(in_node: Object, in_port: int, mouse_position: Vector2) virtual 🔗

返回mouse_position是否在输入热区内。

默认情况下,热区是一个Rect2,其中心位于in_nodeGraphNode.get_input_port_position()(in_port)(对于输出的情况,请调用GraphNode.get_output_port_position())。热区的宽度是主题属性port_grab_distance_horizontal的两倍,高度是port_grab_distance_vertical的两倍。

以下是助您入门的示例代码:

func _is_in_input_hotzone(in_node, in_port, mouse_position):
    var port_size = Vector2(get_theme_constant("port_grab_distance_horizontal"), get_theme_constant("port_grab_distance_vertical"))
    var port_pos = in_node.get_position() + in_node.get_input_port_position(in_port) - port_size / 2
    var rect = Rect2(port_pos, port_size)

    return rect.has_point(mouse_position)

bool _is_in_output_hotzone(in_node: Object, in_port: int, mouse_position: Vector2) virtual 🔗

返回mouse_position是否在输出热区内。有关热区的更多信息,请参阅_is_in_input_hotzone()。以下是助您入门的示例代码:

func _is_in_output_hotzone(in_node, in_port, mouse_position):
    var port_size = Vector2(get_theme_constant("port_grab_distance_horizontal"), get_theme_constant("port_grab_distance_vertical"))
    var port_pos = in_node.get_position() + in_node.get_output_port_position(in_port) - port_size / 2
    var rect = Rect2(port_pos, port_size)

    return rect.has_point(mouse_position)

bool _is_node_hover_valid(from_node: StringName, from_port: int, to_node: StringName, to_port: int) virtual 🔗

此虚拟方法可用于在用户将一个连接拖动到有效端口时添加额外的错误检测。如果连接确实有效,则返回true;如果连接不可能,则返回false。如果连接不可能,则不会自动连接到端口,因此不会向该端口发送连接请求。在此示例中,禁止向同一节点发送连接请求:

func _is_node_hover_valid(from, from_port, to, to_port):
    return from != to

void add_valid_connection_type(from_type: int, to_type: int) 🔗

允许两种不同端口类型之间的连接。端口类型使用GraphNode.set_slot()方法为每个插槽的左右端口单独定义。

另见is_valid_connection_type()remove_valid_connection_type()


void add_valid_left_disconnect_type(type: int) 🔗

如果具有指定的类型,则允许在从GraphNode插槽的左侧端口拖动时断开节点。另请参见remove_valid_left_disconnect_type()


void add_valid_right_disconnect_type(type: int) 🔗

如果具有指定的类型,则允许在从GraphNode插槽的右端口拖动时断开节点。另请参见remove_valid_right_disconnect_type()


void arrange_nodes() 🔗

重新排列布局中选定的节点,使连接之间的交叉最小,节点之间的水平和垂直间隙均匀。


void attach_graph_element_to_frame(element: StringName, frame: StringName) 🔗

elementGraphElement附加到frameGraphFrame


void clear_connections() 🔗

删除节点之间的所有连接。


Error connect_node(from_node: StringName, from_port: int, to_node: StringName, to_port: int, keep_alive: bool = false) 🔗

from_nodeGraphNodefrom_portto_nodeGraphNodeto_port之间创建连接。如果连接已经存在,则不创建连接。

如果在重新绘制期间无效,将keep_alive设置为false的连接可能会自动删除。


void detach_graph_element_from_frame(element: StringName) 🔗

从当前附加的GraphFrame中分离elementGraphElement


void disconnect_node(from_node: StringName, from_port: int, to_node: StringName, to_port: int) 🔗

删除from_nodeGraphNodefrom_portto_nodeGraphNodeto_port之间的连接。如果连接不存在,则不删除任何连接。


void force_connection_drag_end() 🔗

结束当前连接的创建。换句话说,如果您正在拖动连接,您可以使用此方法中止进程并删除光标后面的行。

这最好与connection_drag_startedconnection_drag_ended一起使用,以添加自定义行为,例如通过快捷方式添加节点。

注意:此方法抑制除connection_drag_ended之外的任何其他连接请求信号。


Array[StringName] get_attached_nodes_of_frame(frame: StringName) 🔗

返回使用给定名称附加到GraphFrame的节点名称数组。


Dictionary get_closest_connection_at_point(point: Vector2, max_distance: float = 4.0) const 🔗

返回与屏幕空间中给定点最接近的连接。如果在max_distance个像素中没有找到连接,则返回一个空的Dictionary

单个连接以Dictionary形式表示,格式如下:

{
    from_node: StringName,
    from_port: int,
    to_node: StringName,
    to_port: int,
    keep_alive: bool
}

例如,在给定的鼠标位置获取连接可以这样实现:

var connection = get_closest_connection_at_point(mouse_event.get_position())

int get_connection_count(from_node: StringName, from_port: int) 🔗

返回from_portfrom_node的连接数。


PackedVector2Array get_connection_line(from_node: Vector2, to_node: Vector2) const 🔗

返回将构成from_nodeto_node之间的连接的点。


Array[Dictionary] get_connections_intersecting_with_rect(rect: Rect2) const 🔗

返回一个Array,包含与给定的Rect2相交的连接列表。

单个连接以Dictionary形式表示,格式如下:

{
    from_node: StringName,
    from_port: int,
    to_node: StringName,
    to_port: int,
    keep_alive: bool
}

GraphFrame get_element_frame(element: StringName) 🔗

返回包含具有给定名称的GraphElementGraphFrame


HBoxContainer get_menu_hbox() 🔗

获取包含图形左上角的缩放和网格快照控件的HBoxContainer。您可以使用此方法重新定位工具栏或向其中添加您自己的自定义控件。

警告:这是一个必需的内部节点,删除和释放它可能会导致崩溃。


bool is_node_connected(from_node: StringName, from_port: int, to_node: StringName, to_port: int) 🔗

如果from_nodeGraphNodefrom_port连接到to_nodeGraphNodeto_port,则返回true


bool is_valid_connection_type(from_type: int, to_type: int) const 🔗

返回是否可以在两种不同的端口类型之间建立连接。端口类型使用GraphNode.set_slot()方法为每个插槽的左右端口单独定义。

另见add_valid_connection_type()remove_valid_connection_type()


void remove_valid_connection_type(from_type: int, to_type: int) 🔗

禁止add_valid_connection_type()先前允许的两种不同端口类型之间的连接。端口类型使用GraphNode.set_slot()方法为每个插槽的左侧和右侧端口单独定义。

另见is_valid_connection_type()


void remove_valid_left_disconnect_type(type: int) 🔗

如果具有指定的类型,则不允许从GraphNode插槽的左侧端口拖动时断开节点。使用它来禁用以前允许与add_valid_left_disconnect_type()断开的连接。


void remove_valid_right_disconnect_type(type: int) 🔗

如果具有指定的类型,则不允许从GraphNode插槽的右侧端口拖动时断开节点。使用它来禁用以前允许与add_valid_right_disconnect_type()断开的连接。


void set_connection_activity(from_node: StringName, from_port: int, to_node: StringName, to_port: int, amount: float) 🔗

使用activity主题属性中提供的颜色设置from_nodefrom_portto_nodeto_port之间连接的颜色。颜色使用amount作为权重在连接颜色和活动颜色之间线性插值。


void set_selected(node: Item) 🔗

将指定的node设置为选定的节点。


主题属性说明

Color activity = Color(1, 1, 1, 1) 🔗

根据连接的活动值为连接线插值颜色(参见set_connection_activity())。


Color connection_hover_tint_color = Color(0, 0, 0, 0.3) 🔗

当鼠标悬停在连接线上时,与连接线混合的颜色。


Color connection_rim_color = Color(0.1, 0.1, 0.1, 0.6) 🔗

每条连接线周围边缘的颜色,用于使相交线更易区分。


Color connection_valid_target_tint_color = Color(1, 1, 1, 0.4) 🔗

当当前拖动的连接悬停在有效目标端口上时,与连接线混合的颜色。


Color grid_major = Color(1, 1, 1, 0.2) 🔗

主要网格线/点的颜色。


Color grid_minor = Color(1, 1, 1, 0.05) 🔗

次要网格线/点的颜色。


Color selection_fill = Color(1, 1, 1, 0.3) 🔗

选择矩形的填充颜色。


Color selection_stroke = Color(1, 1, 1, 0.8) 🔗

选择矩形的轮廓颜色。


int connection_hover_thickness = 0 🔗

当鼠标悬停在连接上时,将连接线加宽一个百分比因子。值0禁用高亮显示。值100使线宽加倍。


int port_hotzone_inner_extent = 22 🔗

可以抓取端口的水平范围(内侧)。


int port_hotzone_outer_extent = 26 🔗

可以抓取端口的水平范围(外侧)。


Texture2D grid_toggle 🔗

网格切换按钮的图标。


Texture2D layout 🔗

用于自动排列图形的布局按钮的图标。


Texture2D minimap_toggle 🔗

小地图切换按钮的图标。


Texture2D snapping_toggle 🔗

抓拍切换按钮的图标。


Texture2D zoom_in 🔗

放大按钮的图标。


Texture2D zoom_out 🔗

缩小按钮的图标。


Texture2D zoom_reset 🔗

缩放重置按钮的图标。


StyleBox menu_panel 🔗


StyleBox panel 🔗

网格下绘制的背景。