|
func _input(event): |
|
if self.has_focus() and self.visible and not event.is_echo() and event.is_pressed(): |
|
if event.is_action("ui_up"): |
|
accept_event() |
|
select_graph_node_up() |
|
elif event.is_action("ui_left"): |
|
accept_event() |
|
select_graph_node_left() |
|
elif event.is_action("ui_right"): |
|
accept_event() |
|
select_graph_node_right() |
|
elif event.is_action("ui_down"): |
|
accept_event() |
|
select_graph_node_down() |
|
|
|
func select_graph_node_up(): |
|
var selected_gn |
|
var selected_nodes = get_selected_nodes() |
|
if selected_nodes.size() > 0: |
|
selected_gn = selected_nodes[0] |
|
else: |
|
return |
|
|
|
var gn_above = {} # {distance, gn} |
|
for gn in graph_nodes: |
|
if gn != selected_gn: |
|
var rad = gn.offset.angle_to_point(selected_gn.offset) |
|
var angle = rad2deg(rad) |
|
|
|
if angle > -135 and angle <= -45: |
|
gn_above[selected_gn.offset.distance_to(gn.offset)] = gn |
|
|
|
if gn_above.size() > 0: |
|
var sorted_y_positions = gn_above.keys() |
|
sorted_y_positions.sort() |
|
select_gn(gn_above[sorted_y_positions[0]]) |
|
|
|
func select_graph_node_down(): |
|
var selected_gn |
|
var selected_nodes = get_selected_nodes() |
|
if selected_nodes.size() > 0: |
|
selected_gn = selected_nodes[0] |
|
else: |
|
return |
|
|
|
var gn_below = {} # {distance, gn} |
|
for gn in graph_nodes: |
|
if gn != selected_gn: |
|
var rad = gn.offset.angle_to_point(selected_gn.offset) |
|
var angle = rad2deg(rad) |
|
|
|
if angle > 45 and angle <= 135: |
|
gn_below[selected_gn.offset.distance_to(gn.offset)] = gn |
|
|
|
if gn_below.size() > 0: |
|
var sorted_y_positions = gn_below.keys() |
|
sorted_y_positions.sort() |
|
select_gn(gn_below[sorted_y_positions[0]]) |
|
|
|
func select_graph_node_right(): |
|
var selected_gn |
|
var selected_nodes = get_selected_nodes() |
|
if selected_nodes.size() > 0: |
|
selected_gn = selected_nodes[0] |
|
else: |
|
return |
|
|
|
var gn_right = {} # {distance, gn} |
|
for gn in graph_nodes: |
|
if gn != selected_gn: |
|
var rad = gn.offset.angle_to_point(selected_gn.offset) |
|
var angle = rad2deg(rad) |
|
|
|
if angle > -45 and angle <= 45: |
|
gn_right[selected_gn.offset.distance_to(gn.offset)] = gn |
|
|
|
if gn_right.size() > 0: |
|
var sorted_x_positions = gn_right.keys() |
|
sorted_x_positions.sort() |
|
select_gn(gn_right[sorted_x_positions[0]]) |
|
|
|
func select_graph_node_left(): |
|
var selected_gn |
|
var selected_nodes = get_selected_nodes() |
|
if selected_nodes.size() > 0: |
|
selected_gn = selected_nodes[0] |
|
else: |
|
return |
|
|
|
var gn_left = {} # {distance, gn} |
|
for gn in graph_nodes: |
|
if gn != selected_gn: |
|
var rad = gn.offset.angle_to_point(selected_gn.offset) |
|
var angle = rad2deg(rad) |
|
|
|
if angle > 135 or angle <= -135: |
|
gn_left[selected_gn.offset.distance_to(gn.offset)] = gn |
|
|
|
if gn_left.size() > 0: |
|
var sorted_x_positions = gn_left.keys() |
|
sorted_x_positions.sort() |
|
select_gn(gn_left[sorted_x_positions[0]]) |
|
|
|
func select_gn(gn): |
|
deselect_all() |
|
gn.selected = true |
|
emit_signal("node_selected", gn) |
|
var target_pos = Vector2(gn.offset.x - rect_size.x/2 + gn.rect_size.x/2, gn.offset.y - rect_size.y/2 + gn.rect_size.y/2) |
|
scroll_offset_tween.interpolate_property(self, "scroll_offset", self.scroll_offset, target_pos, 1.5, Tween.TRANS_QUINT, Tween.EASE_OUT) |
|
scroll_offset_tween.start() |