extends PanelContainer
## Top identity bar: daemon/connection status dot + display name.
@onready var status_dot: Label = %StatusDot
@onready var name_label: Label = %NameLabel
@onready var manage_btn: Button = %ManageBtn
var _manager_panel: Window = null
var _app_version: String = "dev"
var _daemon_version: String = ""
func _ready() -> void:
# Parse --version=vXXX from launcher args
for arg: String in OS.get_cmdline_user_args():
if arg.begins_with("--version="):
_app_version = arg.substr(10)
break
KeetService.client.connected.connect(_on_connected)
KeetService.client.disconnected.connect(_on_disconnected)
KeetService.identity.identity_loaded.connect(_on_identity)
KeetService.daemon_status_changed.connect(_on_daemon_status)
manage_btn.pressed.connect(_on_manage_pressed)
_set_status("checking", "Checking daemon...")
# Fetch identity once connected
if KeetService.client.is_connected:
_on_connected()
func _on_daemon_status(status: String) -> void:
match status:
"connecting":
_set_status("yellow", "Connecting...")
"running":
pass # _on_connected handles this
"disconnected":
_set_status("red", "Disconnected")
func _on_connected() -> void:
_set_status("green", "")
KeetService.identity.get_identity()
# Fetch daemon version from status RPC
KeetService.client.call_rpc("status", {}, func(result: Variant, _err: Variant) -> void:
if result is Dictionary:
_daemon_version = str(result.get("daemonVersion", ""))
_update_version_display()
)
func _on_disconnected() -> void:
_set_status("red", "Disconnected")
func _on_identity(ident: Dictionary) -> void:
var display_name: String = ident.get("displayName", "")
if display_name == "":
display_name = ident.get("memberId", "unknown")
if display_name.length() > 12:
display_name = display_name.substr(0, 12) + "..."
name_label.text = "%s [%s]" % [display_name, _app_version]
_update_version_display()
func _update_version_display() -> void:
var tip: String = "app %s" % _app_version
if _daemon_version != "":
tip += " | daemon %s" % _daemon_version
name_label.tooltip_text = tip
func _set_status(color: String, message: String) -> void:
status_dot.text = "●"
match color:
"green":
status_dot.add_theme_color_override("font_color", Color.GREEN)
name_label.modulate = Color.WHITE
"yellow":
status_dot.add_theme_color_override("font_color", Color.YELLOW)
name_label.modulate = Color.WHITE
"red":
status_dot.add_theme_color_override("font_color", Color.RED)
name_label.modulate = Color(1, 1, 1, 0.5)
if message != "":
name_label.text = message
func _on_manage_pressed() -> void:
if _manager_panel == null:
var scene := preload("res://scenes/identity_manager_panel.tscn")
_manager_panel = scene.instantiate()
get_tree().root.add_child(_manager_panel)
if _manager_panel.visible:
_manager_panel.hide()
else:
_manager_panel.popup_centered()
_manager_panel.refresh()