OverviewFilesCommitsIssuesDocsReleasesPeers

godot-keet / scripts / identity_bar.gd

101 lines · gd ref:
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()