Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save bitmammoth/7cb8a52f0ac7a9772385782156401858 to your computer and use it in GitHub Desktop.
Save bitmammoth/7cb8a52f0ac7a9772385782156401858 to your computer and use it in GitHub Desktop.
Godot - GraphEdits, GraphNodes, and PopupMenus at runtime
# Ref : https://www.reddit.com/r/godot/comments/7bi5uf/generating_a_scene_tree_dynamically/
# Create a root Node and name is DynamicNodeGraph
extends Node
var RootNode
var SomeGraphEdit
var SomePopupMenu
var SomePopupMenuVisible = false
var RMBPressed = false
func _menu_item_pressed(ID):
print("Menu Item Pressed: ", SomePopupMenu.get_item_text(ID))
if(SomePopupMenu.get_item_text(ID) == "Quit"):
get_tree().quit()
if(SomePopupMenu.get_item_text(ID) == "Add Node"):
var SomeGraphNode = GraphNode.new()
SomeGraphNode.rect_position = get_viewport().get_mouse_position()
SomeGraphNode.rect_min_size = Vector2(160, 120)
SomeGraphNode.set_slot(0, true, 0, Color(0.0, 1.0, 1.0, 1.0), true, 0, Color(1.0, 0.0, 0.0, 1.0))
SomeGraphNode.set_slot(1, false, 1, Color(1.0, 0.0, 1.0, 1.0), true, 2, Color(0.0, 1.0, 0.0, 1.0))
SomeGraphNode.set_slot(2, true, 2, Color(1.0, 1.0, 0.0, 1.0), true, 1, Color(0.0, 0.0, 1.0, 1.0))
var SomeLabel1 = Label.new()
SomeLabel1.set_text("Slot 1")
SomeGraphNode.add_child(SomeLabel1)
var SomeLabel2 = Label.new()
SomeLabel2.set_text("Slot 2")
SomeGraphNode.add_child(SomeLabel2)
var SomeLabel3 = Label.new()
SomeLabel3.set_text("Slot 3")
SomeGraphNode.add_child(SomeLabel3)
SomeGraphNode.set_title("Node Title")
SomeGraphEdit.add_child(SomeGraphNode)
func _node_connection_request(from, from_port, to, to_port):
SomeGraphEdit.connect_node(from, from_port, to, to_port)
func _init():
SomeGraphEdit = GraphEdit.new()
SomeGraphEdit.set_name("SomeGraphEdit")
SomeGraphEdit.set_anchor(MARGIN_RIGHT, SomeGraphEdit.ANCHOR_END, false)
SomeGraphEdit.set_anchor(MARGIN_BOTTOM, SomeGraphEdit.ANCHOR_END, false)
SomeGraphEdit.set_h_size_flags(3)
SomeGraphEdit.set_v_size_flags(3)
SomeGraphEdit.margin_top = 20
SomeGraphEdit.margin_left = 20
SomeGraphEdit.margin_right = -20
SomeGraphEdit.margin_bottom = -20
SomeGraphEdit.connect("connection_request", self, "_node_connection_request")
SomePopupMenu = PopupMenu.new()
SomePopupMenu.set_name("SomePopupMenu")
SomePopupMenu.add_item("New")
SomePopupMenu.add_item("Load")
SomePopupMenu.add_item("Save")
SomePopupMenu.add_separator()
SomePopupMenu.add_item("Add Node")
SomePopupMenu.add_separator()
SomePopupMenu.add_item("Simulate")
SomePopupMenu.add_separator()
SomePopupMenu.add_item("Quit")
SomePopupMenu.connect("id_pressed", self, "_menu_item_pressed")
SomeGraphEdit.add_child(SomePopupMenu)
func _ready():
RootNode = get_node("/root/DynamicNodeGraph")
RootNode.add_child(SomeGraphEdit)
SomeGraphEdit.set_scroll_ofs(Vector2(-400, -230))
func _input(event):
if(Input.is_action_pressed("ui_up")):
SomePopupMenu.rect_position = get_viewport().get_mouse_position()
SomePopupMenu.popup();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment