Skip to content

Instantly share code, notes, and snippets.

@PLyczkowski
Created March 11, 2018 10:57
Show Gist options
  • Save PLyczkowski/04cb3ab4650d20ab730cd4c7af3a6b52 to your computer and use it in GitHub Desktop.
Save PLyczkowski/04cb3ab4650d20ab730cd4c7af3a6b52 to your computer and use it in GitHub Desktop.
Parts of code relevant to my GraphEdit keyboard navigation
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()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment