You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			146 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			GDScript
		
	
			
		
		
	
	
			146 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			GDScript
		
	
| @tool
 | |
| extends GraphNode
 | |
| 
 | |
| const DEFAULT_COLOR := Color("#dad4cb")
 | |
| 
 | |
| const PORT_TOP_ICON := preload("icons/port_top.svg")
 | |
| const PORT_BOTTOM_ICON := preload("icons/port_bottom.svg")
 | |
| const PORT_LEFT_ICON := preload("icons/port_left.svg")
 | |
| const PORT_RIGHT_ICON := preload("icons/port_right.svg")
 | |
| 
 | |
| 
 | |
| @export var title_text: String:
 | |
| 	set(value):
 | |
| 		title_text = value
 | |
| 		if title_label:
 | |
| 			title_label.text = value
 | |
| 
 | |
| @export var text: String:
 | |
| 	set(value):
 | |
| 		text = value
 | |
| 		if label:
 | |
| 			label.text = " " if text.is_empty() else text
 | |
| 
 | |
| @export var icon: Texture2D:
 | |
| 	set(value):
 | |
| 		icon = value
 | |
| 		if icon_rect:
 | |
| 			icon_rect.texture = value
 | |
| 
 | |
| var layout_size: float:
 | |
| 	get:
 | |
| 		return size.y if horizontal else size.x
 | |
| 
 | |
| 
 | |
| var panel: PanelContainer
 | |
| var icon_rect: TextureRect
 | |
| var title_label: Label
 | |
| var container: VBoxContainer
 | |
| var label: Label
 | |
| 
 | |
| var frames: RefCounted = BeehaveUtils.get_frames()
 | |
| var horizontal: bool = false
 | |
| 
 | |
| 
 | |
| func _init(horizontal: bool = false) -> void:
 | |
| 	self.horizontal = horizontal
 | |
| 
 | |
| 
 | |
| func _ready() -> void:
 | |
| 	custom_minimum_size = Vector2(50, 50) * BeehaveUtils.get_editor_scale()
 | |
| 	draggable = false
 | |
| 
 | |
| 	add_theme_stylebox_override("frame", frames.empty)
 | |
| 	add_theme_stylebox_override("selected_frame", frames.empty)
 | |
| 	add_theme_color_override("close_color", Color.TRANSPARENT)
 | |
| 	add_theme_icon_override("close", ImageTexture.new())
 | |
| 
 | |
| 	# For top port
 | |
| 	add_child(Control.new())
 | |
| 
 | |
| 	panel = PanelContainer.new()
 | |
| 	panel.mouse_filter = Control.MOUSE_FILTER_PASS
 | |
| 	panel.add_theme_stylebox_override("panel", frames.normal)
 | |
| 	add_child(panel)
 | |
| 
 | |
| 	var vbox_container := VBoxContainer.new()
 | |
| 	panel.add_child(vbox_container)
 | |
| 
 | |
| 	var title_size := 24 * BeehaveUtils.get_editor_scale()
 | |
| 	var margin_container := MarginContainer.new()
 | |
| 	margin_container.add_theme_constant_override("margin_top", -title_size - 2 * BeehaveUtils.get_editor_scale())
 | |
| 	margin_container.mouse_filter = Control.MOUSE_FILTER_PASS
 | |
| 	vbox_container.add_child(margin_container)
 | |
| 
 | |
| 	var title_container := HBoxContainer.new()
 | |
| 	title_container.add_child(Control.new())
 | |
| 	title_container.mouse_filter = Control.MOUSE_FILTER_PASS
 | |
| 	title_container.size_flags_horizontal = Control.SIZE_EXPAND_FILL
 | |
| 	margin_container.add_child(title_container)
 | |
| 
 | |
| 	icon_rect = TextureRect.new()
 | |
| 	icon_rect.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED
 | |
| 	title_container.add_child(icon_rect)
 | |
| 
 | |
| 	title_label = Label.new()
 | |
| 	title_label.add_theme_color_override("font_color", DEFAULT_COLOR)
 | |
| 	title_label.add_theme_font_override("font", get_theme_font("title_font"))
 | |
| 	title_label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER
 | |
| 	title_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
 | |
| 	title_label.text = title_text
 | |
| 	title_container.add_child(title_label)
 | |
| 
 | |
| 	title_container.add_child(Control.new())
 | |
| 
 | |
| 	container = VBoxContainer.new()
 | |
| 	container.size_flags_vertical = Control.SIZE_EXPAND_FILL
 | |
| 	container.size_flags_horizontal = Control.SIZE_EXPAND_FILL
 | |
| 	panel.add_child(container)
 | |
| 
 | |
| 	label = Label.new()
 | |
| 	label.text = " " if text.is_empty() else text
 | |
| 	container.add_child(label)
 | |
| 
 | |
| 	# For bottom port
 | |
| 	add_child(Control.new())
 | |
| 
 | |
| 	minimum_size_changed.connect(_on_size_changed)
 | |
| 	_on_size_changed.call_deferred()
 | |
| 
 | |
| 
 | |
| func set_status(status: int) -> void:
 | |
| 	panel.add_theme_stylebox_override("panel", _get_stylebox(status))
 | |
| 
 | |
| 
 | |
| func _get_stylebox(status: int) -> StyleBox:
 | |
| 	match status:
 | |
| 		0: return frames.success
 | |
| 		1: return frames.failure
 | |
| 		2: return frames.running
 | |
| 		_: return frames.normal
 | |
| 
 | |
| 
 | |
| func set_slots(left_enabled: bool, right_enabled: bool) -> void:
 | |
| 	if horizontal:
 | |
| 		set_slot(1, left_enabled, 0, Color.WHITE, right_enabled, 0, Color.WHITE, PORT_LEFT_ICON, PORT_RIGHT_ICON)
 | |
| 	else:
 | |
| 		set_slot(0, left_enabled, 0, Color.WHITE, false, -2, Color.TRANSPARENT, PORT_TOP_ICON, null)
 | |
| 		set_slot(2, false, -1, Color.TRANSPARENT, right_enabled, 0, Color.WHITE, null, PORT_BOTTOM_ICON)
 | |
| 
 | |
| 
 | |
| func set_color(color: Color) -> void:
 | |
| 	set_input_color(color)
 | |
| 	set_output_color(color)
 | |
| 
 | |
| 
 | |
| func set_input_color(color: Color) -> void:
 | |
| 	set_slot_color_left(1 if horizontal else 0, color)
 | |
| 
 | |
| 
 | |
| func set_output_color(color: Color) -> void:
 | |
| 	set_slot_color_right(1 if horizontal else 2, color)
 | |
| 
 | |
| 
 | |
| func _on_size_changed():
 | |
| 	add_theme_constant_override("port_offset", 12 * BeehaveUtils.get_editor_scale() if horizontal else round(size.x / 2.0))
 |