StreamOverlay/UI/floating_menu.gd

87 lines
2.5 KiB
GDScript3
Raw Normal View History

extends GDSubMenuButton
class_name GDFloatingMenu
const COL_ON := Color.LIGHT_GREEN
const COL_OFF := Color.LIGHT_SALMON
@onready var indicators: Control = %indicators
@onready var ind_stream: TextureRect = %ind_stream
@onready var ind_mic: TextureRect = %ind_mic
@onready var ind_pixelate: TextureRect = %ind_pixelate
@onready var ind_browser: TextureRect = %ind_browser
var is_anchored := true
var anchored_position: Vector2
func start(_main_menu_button: GDSubMenuButton = null) -> void:
anchored_position = position
var _parent: Control = get_parent()
_parent.resized.connect(func(): calculate_anchored_pos(); is_anchored = false)
generate_panels_buttons()
super(self)
start_indicators()
func start_indicators() -> void:
# TODO: Setup NO-OBS-WS Stuff
var tot = indicators.get_child_count()
for i in tot:
var ind: TextureRect = indicators.get_child(i)
ind.show()
ind.position = (size/2 - ind.size/2)
ind.position += Vector2.from_angle(TAU*i/tot + PI/2) * (size.x/2 - ind.size.x/2)
pass
func generate_panels_buttons() -> void:
# TODO: Generate Panels?
pass
func _process(d: float) -> void:
super(d)
if not is_anchored and not is_dragged:
position = position.lerp(anchored_position, d*10)
if position.distance_squared_to(anchored_position) < 1:
position = anchored_position
is_anchored = true
func _on_gui_input(event: InputEvent) -> void:
super(event)
if event is InputEventMouseButton:
if event.button_index == MOUSE_BUTTON_LEFT:
if not event.is_pressed():
is_anchored = false
calculate_anchored_pos()
if event is InputEventMouseMotion and is_mouse_click_down:
if is_open:
expand_menu(false)
func calculate_anchored_pos() -> void:
var m_pos := global_position + size/2.0
var w_size := get_window().size / get_tree().root.content_scale_factor
if min(m_pos.x, abs(w_size.x - m_pos.x)) < min(m_pos.y, abs(w_size.y - m_pos.y)):
closest_edge = Edge.LEFT if m_pos.x < abs(w_size.x - m_pos.x) else Edge.RIGHT
else:
closest_edge = Edge.UP if m_pos.y < abs(w_size.y - m_pos.y) else Edge.BOT
match closest_edge:
Edge.UP:
anchored_position = Vector2(position.x, 0)
parent_dir = Vector2.DOWN
Edge.RIGHT:
anchored_position = Vector2(w_size.x - size.x, position.y)
parent_dir = Vector2.LEFT
Edge.BOT:
anchored_position = Vector2(position.x, w_size.y - size.y)
parent_dir = Vector2.UP
Edge.LEFT:
anchored_position = Vector2(0, position.y)
parent_dir = Vector2.RIGHT
anchored_position = anchored_position.clamp(Vector2(), Vector2(w_size)-size)
#region Hnadle Button Functions
#endregion