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
		
	
| 
											2 years ago
										 | @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)) |