RapidGameFramework
Reusable Godot managers for data-driven small games
Loading...
Searching...
No Matches
performance_overlay.gd
Go to the documentation of this file.
1extends RefCounted
2
3
10
11var panel_name:String = "PerformanceOverlayPanel"
12var label_name:String = "PerformanceOverlayLabel"
13
14
15func render(parent:Control, monitor:Object, options:Dictionary = {}) -> Control:
16 if parent == null or monitor == null:
17 return null
18 var panel:PanelContainer = _get_or_create_panel(parent, options)
19 var label:Label = _get_or_create_label(panel, options)
20 label.text = _summary_text(monitor, options)
21 panel.visible = bool(options.get("visible", true))
22 _apply_panel_rect(panel, parent, options)
23 return panel
24
25
26func hide(parent:Control) -> void:
27 if parent == null:
28 return
29 var panel = parent.get_node_or_null(panel_name)
30 if panel is CanvasItem:
31 panel.visible = false
32
33
34func clear(parent:Control) -> void:
35 if parent == null:
36 return
37 var panel = parent.get_node_or_null(panel_name)
38 if panel != null:
39 panel.queue_free()
40
41
42func _get_or_create_panel(parent:Control, options:Dictionary) -> PanelContainer:
43 var name_value:String = str(options.get("panel_name", panel_name))
44 var panel = parent.get_node_or_null(name_value)
45 if panel is PanelContainer:
46 return panel
47 var created = PanelContainer.new()
48 created.name = name_value
49 created.mouse_filter = Control.MOUSE_FILTER_IGNORE
50 var style = StyleBoxFlat.new()
51 style.bg_color = Color(str(options.get("background_color", "#06111ccc")))
52 style.border_color = Color(str(options.get("border_color", "#5cc8ff")))
53 style.set_border_width_all(int(options.get("border_width", 1)))
54 style.set_corner_radius_all(int(options.get("corner_radius", 6)))
55 created.add_theme_stylebox_override("panel", style)
56 parent.add_child(created)
57 return created
58
59
60func _get_or_create_label(panel:PanelContainer, options:Dictionary) -> Label:
61 var name_value:String = str(options.get("label_name", label_name))
62 var label = panel.get_node_or_null(name_value)
63 if label is Label:
64 return label
65 var created = Label.new()
66 created.name = name_value
67 created.mouse_filter = Control.MOUSE_FILTER_IGNORE
68 created.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
69 created.clip_text = true
70 created.max_lines_visible = int(options.get("max_lines", 8))
71 created.add_theme_font_size_override("font_size", int(options.get("font_size", 11)))
72 created.add_theme_color_override("font_color", Color(str(options.get("font_color", "#eef3f8"))))
73 panel.add_child(created)
74 return created
75
76
77func _summary_text(monitor:Object, options:Dictionary) -> String:
78 var max_lines:int = max(1, int(options.get("max_lines", 8)))
79 var lines:Array = []
80 if monitor.has_method("format_summary_lines"):
81 lines = monitor.call("format_summary_lines")
82 elif monitor.has_method("get_summary"):
83 lines = [JSON.stringify(monitor.call("get_summary"))]
84 var text_lines:PackedStringArray = PackedStringArray()
85 for index in range(min(max_lines, lines.size())):
86 text_lines.append(str(lines[index]))
87 return "\n".join(text_lines)
88
89
90func _apply_panel_rect(panel:PanelContainer, parent:Control, options:Dictionary) -> void:
91 var width:float = float(options.get("width", min(360.0, parent.size.x - 16.0)))
92 var height:float = float(options.get("height", 150.0))
93 var margin:float = float(options.get("margin", 8.0))
94 panel.position = Vector2(margin, margin)
95 panel.size = Vector2(max(120.0, width), max(48.0, height))