extends PanelContainer const res_action = preload("res://scenes/osd_action.tscn") enum ICON_POSITION { LEFT, CENTER, RIGHT } @onready var gui_tagline := $"OSDTagline" @onready var gui_title := $"OSDTitle" @onready var gui_actionbar := $"OSDActionBar" @onready var tagline: get: gui_tagline.text set(value): gui_tagline.text = value @onready var title: get: gui_title.text set(value): gui_title.text = value var last_shown = -(GlobalConfig.osd_dwell_time + GlobalConfig.osd_fade_time) func show_osd(a_tagline: String, a_title: String, a_actions: Array): # Clear actions for n in gui_actionbar.get_children(): gui_actionbar.remove_child(n) n.queue_free() tagline = a_tagline title = a_title for action in a_actions: var button = res_action.instantiate() var title: Label = button.get_node("Title") var icon: Label = button.get_node("Icon") title.text = action.title if action.icon != null: icon.text = action.icon if action.icon_pos == ICON_POSITION.LEFT: icon.set_anchors_preset(Control.PRESET_LEFT_WIDE) icon.set_position(Vector2(0,-12)) elif action.icon_pos == ICON_POSITION.CENTER: icon.set_anchors_preset(Control.PRESET_VCENTER_WIDE) icon.set_position(Vector2(-12,-12)) else: icon.set_anchors_preset(Control.PRESET_RIGHT_WIDE) icon.set_position(Vector2(-24,-12)) if action.toggles: button.toggle_mode = true button.toggled.connect(action.action) else: button.pressed.connect(action.action) gui_actionbar.add_child(button) last_shown = Time.get_ticks_msec() visible = true modulate.a = GlobalConfig.osd_opacity mouse_filter = Control.MOUSE_FILTER_STOP for n in gui_actionbar.get_children(): gui_actionbar.mouse_filter = Control.MOUSE_FILTER_STOP func hide_osd(): last_shown = -(GlobalConfig.osd_dwell_time + GlobalConfig.osd_fade_time) visible = false modulate.a = GlobalConfig.osd_opacity mouse_filter = Control.MOUSE_FILTER_IGNORE for n in gui_actionbar.get_children(): gui_actionbar.mouse_filter = Control.MOUSE_FILTER_IGNORE var mouse_inside = false var mouse_just_inside = false func _ready() -> void: mouse_entered.connect(func(): mouse_inside = true; mouse_just_inside = true) mouse_exited.connect(func(): mouse_inside = false) func _process(delta: float) -> void: var ft = GlobalConfig.osd_dwell_time + GlobalConfig.osd_fade_time var time_since_shown = Time.get_ticks_msec() - last_shown if mouse_inside and time_since_shown >= GlobalConfig.osd_dwell_time and time_since_shown < ft: if mouse_just_inside: mouse_just_inside = false visible = true modulate.a = GlobalConfig.osd_opacity mouse_filter = Control.MOUSE_FILTER_STOP for n in gui_actionbar.get_children(): gui_actionbar.mouse_filter = Control.MOUSE_FILTER_PASS last_shown = Time.get_ticks_msec() time_since_shown = 0 if time_since_shown >= ft and visible: modulate.a = GlobalConfig.osd_opacity visible = false mouse_filter = Control.MOUSE_FILTER_IGNORE for n in gui_actionbar.get_children(): gui_actionbar.mouse_filter = Control.MOUSE_FILTER_IGNORE elif time_since_shown >= GlobalConfig.osd_dwell_time and time_since_shown < ft: var percentage = min(1, float(time_since_shown - GlobalConfig.osd_dwell_time) / GlobalConfig.osd_fade_time) modulate.a = (1 - percentage) * GlobalConfig.osd_opacity visible = true elif time_since_shown < GlobalConfig.osd_dwell_time and not visible: modulate.a = GlobalConfig.osd_opacity visible = true mouse_filter = Control.MOUSE_FILTER_STOP for n in gui_actionbar.get_children(): gui_actionbar.mouse_filter = Control.MOUSE_FILTER_STOP