GraphEdit
Наследует: Control < CanvasItem < Node < Object
Редактор графоподобных структур, использующий GraphNode.
Описание
GraphEdit предоставляет инструменты для создания, обработки и отображения различных графиков. Его основная цель в движке — питание систем визуального программирования, таких как визуальные шейдеры, но он также доступен для использования в пользовательских проектах.
GraphEdit сам по себе является лишь пустым контейнером, представляющим бесконечную сетку, в которой могут быть размещены GraphNode. Каждый GraphNode представляет собой узел в графике, отдельную единицу данных в связанной схеме. GraphEdit, в свою очередь, помогает контролировать различные взаимодействия с узлами и между узлами. Когда пользователь пытается подключить, отключить или удалить GraphNode, в GraphEdit выдается сигнал, но по умолчанию никаких действий не выполняется. Программист, использующий этот элемент управления, несет ответственность за реализацию необходимой логики для определения того, как должен обрабатываться каждый запрос.
Производительность: Настоятельно рекомендуется включить режим низкого использования процессора (см. OS.low_processor_usage_mode) при использовании GraphEdits.
Примечание: Имейте в виду, что Node.get_children() также вернет узел уровня соединения с именем _connection_layer из-за технических ограничений. Это поведение может измениться в будущих выпусках.
Свойства
clip_contents |
|
|
|
||
|
||
|
||
|
||
focus_mode |
|
|
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
Методы
_get_connection_line(from_position: Vector2, to_position: Vector2) virtual const |
|
_is_in_input_hotzone(in_node: Object, in_port: int, mouse_position: Vector2) virtual |
|
_is_in_output_hotzone(in_node: Object, in_port: int, mouse_position: Vector2) virtual |
|
_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 |
|
void |
|
void |
|
void |
attach_graph_element_to_frame(element: StringName, frame: StringName) |
void |
|
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 |
|
get_closest_connection_at_point(point: Vector2, max_distance: float = 4.0) const |
|
get_connection_count(from_node: StringName, from_port: int) |
|
get_connection_line(from_node: Vector2, to_node: Vector2) const |
|
get_connection_list_from_node(node: StringName) const |
|
get_connections_intersecting_with_rect(rect: Rect2) const |
|
get_element_frame(element: StringName) |
|
is_node_connected(from_node: StringName, from_port: int, to_node: StringName, to_port: int) |
|
is_valid_connection_type(from_type: int, to_type: int) const |
|
void |
remove_valid_connection_type(from_type: int, to_type: int) |
void |
|
void |
|
void |
set_connection_activity(from_node: StringName, from_port: int, to_node: StringName, to_port: int, amount: float) |
void |
set_selected(node: Node) |
Свойства темы
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Сигналы
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) 🔗
Отправляется в GraphEdit при попытке создания соединения между from_port from_node GraphNode и to_port to_node GraphNode.
connection_to_empty(from_node: StringName, from_port: int, release_position: Vector2) 🔗
Вызывается, когда пользователь перетаскивает соединение из выходного порта в пустое пространство графика.
copy_nodes_request() 🔗
Выдается, когда этот GraphEdit захватывает действие ui_copy (Ctrl + C по умолчанию). В общем случае этот сигнал указывает на то, что выбранные GraphElement должны быть скопированы.
cut_nodes_request() 🔗
Выдается, когда этот GraphEdit захватывает действие ui_cut (Ctrl + X по умолчанию). В общем случае этот сигнал указывает на то, что выбранные GraphElement-ы должны быть вырезаны.
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) 🔗
Отправляется в GraphEdit при попытке удалить соединение между from_port из from_node GraphNode и to_port из to_node GraphNode.
duplicate_nodes_request() 🔗
Выдается, когда этот GraphEdit захватывает действие ui_graph_duplicate (Ctrl + D по умолчанию). В общем случае этот сигнал указывает на то, что выбранные GraphElement должны быть дублированы.
end_node_move() 🔗
Выдается в конце движения GraphElement.
frame_rect_changed(frame: GraphFrame, new_rect: Rect2) 🔗
Вызывается, когда GraphFrame frame изменяет размер на new_rect.
graph_elements_linked_to_frame_request(elements: Array, frame: StringName) 🔗
Вызывается, когда один или несколько GraphElement помещаются на GraphFrame с именем frame, когда они ранее не были прикреплены ни к какому другому.
elements — это массив GraphElement, которые необходимо прикрепить.
Вызывается, когда указанный узел GraphElement отменяет выбор (теряет фокус).
Вызывается при выборе указанного узла 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
Mouse Wheel будет увеличивать масштаб, Ctrl + Mouse Wheel будет перемещать вид.
PanningScheme SCROLL_PANS = 1
Mouse Wheel перемещает вид, Ctrl + Mouse Wheel масштабирует.
enum GridPattern: 🔗
GridPattern GRID_PATTERN_LINES = 0
Нарисуйте сетку сплошными линиями.
GridPattern GRID_PATTERN_DOTS = 1
Нарисуйте сетку с помощью точек.
Описания свойств
bool connection_lines_antialiased = true 🔗
Если true, линии между узлами будут использовать сглаживание.
float connection_lines_curvature = 0.5 🔗
Кривизна линий между узлами. 0 приводит к прямым линиям.
float connection_lines_thickness = 4.0 🔗
Толщина линий между узлами.
Array[Dictionary] connections = [] 🔗
void set_connections(value: Array[Dictionary])
Array[Dictionary] get_connection_list()
Связи между GraphNode.
Связь представлена как Dictionary в форме:
{
from_node: StringName,
from_port: int,
to_node: StringName,
to_port: int,
keep_alive: bool
}
Связи с keep_alive, установленным на false, могут быть удалены автоматически, если они недействительны во время перерисовки.
GridPattern grid_pattern = 0 🔗
void set_grid_pattern(value: GridPattern)
GridPattern get_grid_pattern()
Узор, используемый для рисования сетки.
Если true, мини-карта видна.
float minimap_opacity = 0.65 🔗
Непрозрачность прямоугольника миникарты.
Vector2 minimap_size = Vector2(240, 160) 🔗
Размер прямоугольника миникарты. Сама карта основана на размере области сетки и масштабируется, чтобы вписаться в этот прямоугольник.
PanningScheme panning_scheme = 0 🔗
void set_panning_scheme(value: PanningScheme)
PanningScheme get_panning_scheme()
Определяет схему управления панорамированием с помощью колесика мыши.
bool right_disconnects = false 🔗
Если true, позволяет отключать существующие соединения в GraphEdit путем перетаскивания правого конца.
Vector2 scroll_offset = Vector2(0, 0) 🔗
Смещение прокрутки.
bool show_arrange_button = true 🔗
Если true, кнопка для автоматического упорядочивания узлов графа будет видна.
Если true, сетка видна.
bool show_grid_buttons = true 🔗
Если true, то видны кнопки, позволяющие настраивать параметры сетки и привязки.
Если true, панель инструментов меню видна.
bool show_minimap_button = true 🔗
Если true, кнопка переключения мини-карты будет видна.
bool show_zoom_buttons = true 🔗
Если true, видны кнопки, позволяющие изменять и сбрасывать уровень масштабирования.
bool show_zoom_label = false 🔗
Если true, то виден текст с текущим уровнем масштабирования. Уровень масштабирования отображается в процентах.
Расстояние привязки в пикселях, также определяет расстояние между линиями сетки.
bool snapping_enabled = true 🔗
Если true, включает привязку.
Dictionary type_names = {} 🔗
void set_type_names(value: Dictionary)
Dictionary get_type_names()
Dictionary удобочитаемых названий типов портов.
Текущее значение масштабирования.
Максимальный предел масштабирования.
Минимальный предел масштабирования.
Шаг каждого уровня масштабирования.
Описания метода
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_node.GraphNode.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
public override bool _IsNodeHoverValid(StringName fromNode, int fromPort, StringName toNode, int toPort)
{
return fromNode != toNode;
}
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) 🔗
Прикрепляет element GraphElement к frame GraphFrame.
void clear_connections() 🔗
Удаляет все соединения между узлами.
Error connect_node(from_node: StringName, from_port: int, to_node: StringName, to_port: int, keep_alive: bool = false) 🔗
Создайте соединение между from_port from_node GraphNode и to_port to_node GraphNode. Если соединение уже существует, соединение не создается.
Соединения с keep_alive, установленным на false, могут быть удалены автоматически, если они недействительны во время перерисовки.
void detach_graph_element_from_frame(element: StringName) 🔗
Отсоединяет element GraphElement от GraphFrame, к которому он в данный момент прикреплен.
void disconnect_node(from_node: StringName, from_port: int, to_node: StringName, to_port: int) 🔗
Удаляет связь между from_port from_node GraphNode и to_port to_node GraphNode. Если связь не существует, то связь не удаляется.
void force_connection_drag_end() 🔗
Завершает создание текущего соединения. Другими словами, если вы перетаскиваете соединение, вы можете использовать этот метод, чтобы прервать процесс и удалить линию, которая следовала за вашим курсором.
Лучше всего использовать его вместе с connection_drag_started и connection_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_port from_node.
PackedVector2Array get_connection_line(from_node: Vector2, to_node: Vector2) const 🔗
Возвращает точки, которые составят связь между from_node и to_node.
Array[Dictionary] get_connection_list_from_node(node: StringName) const 🔗
Возвращает Array, содержащий список всех соединений для node.
Соединение представлено как Dictionary в форме:
{
from_node: StringName,
from_port: int,
to_node: StringName,
to_port: int,
keep_alive: bool
}
Пример: Получить все соединения на определенном порту:
func get_connection_list_from_port(node, port):
var connections = get_connection_list_from_node(node)
var result = []
for connection in connections:
var dict = {}
if connection["from_node"] == node and connection["from_port"] == port:
dict["node"] = connection["to_node"]
dict["port"] = connection["to_port"]
dict["type"] = "левый"
result.push_back(dict)
elif connection["to_node"] == node and connection["to_port"] == port:
dict["node"] = connection["from_node"]
dict["port"] = connection["from_port"]
dict["type"] = "правый"
result.push_back(dict)
return result
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) 🔗
Возвращает GraphFrame, содержащий GraphElement с указанным именем.
Получает HBoxContainer, содержащий элементы управления масштабированием и привязкой к сетке в левом верхнем углу графика. Вы можете использовать этот метод для изменения положения панели инструментов или добавления к ней собственных элементов управления.
Предупреждение: Это обязательный внутренний узел, его удаление и освобождение может привести к сбою. Если вы хотите скрыть его или любой из его дочерних элементов, используйте их свойство CanvasItem.visible.
bool is_node_connected(from_node: StringName, from_port: int, to_node: StringName, to_port: int) 🔗
Возвращает true, если from_port узла from_node GraphNode подключен к to_port узла to_node GraphNode.
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) 🔗
Устанавливает окраску соединения между from_node from_port и to_node to_port с цветом, предоставленным в свойстве темы activity. Цвет линейно интерполируется между цветом соединения и цветом активности с использованием amount в качестве веса.
void set_selected(node: Node) 🔗
Устанавливает указанный 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 🔗
Горизонтальный диапазон, в пределах которого можно захватить порт (внешняя сторона).
Значок кнопки переключения сетки.
Значок кнопки макета для автоматического размещения графика.
Значок кнопки переключения мини-карты.
Значок для кнопки-переключателя привязки.
Значок кнопки увеличения масштаба.
Значок кнопки уменьшения масштаба.
Значок кнопки сброса масштаба.
There is currently no description for this theme property. Please help us by contributing one!
Фон, нарисованный под сеткой.
StyleBox используется, когда фокус находится на GraphEdit (при использовании со вспомогательными приложениями).