Rebrand project and refresh title presentation

This commit is contained in:
Alexander Sellite 2026-08-25 17:14:12 -04:00
parent 17fef2c5d4
commit 7ae20789a9
138 changed files with 1511 additions and 1498 deletions

View file

@ -2,6 +2,13 @@ class_name BubbleButton
extends Button
const ICON_FILL_RATIO: float = 0.76
const LABELED_ICON_FILL_RATIO: float = 0.58
const BubbleGradientBackgroundType = preload(
"res://ui/components/bubble_menu/bubble_gradient_background.gd"
)
const BubbleHoverDrawerType = preload(
"res://ui/components/bubble_menu/bubble_hover_drawer.gd"
)
@export var profile: BubbleMenuProfile
@ -16,6 +23,9 @@ const ICON_FILL_RATIO: float = 0.76
@export_range(1, 256, 1) var minimum_font_size: int = 14
@export_range(1, 256, 1) var maximum_font_size: int = 32
@export_group("Icon")
@export_range(0.0, 1.0, 0.01) var icon_fill_ratio_override: float = 0.0
@export_group("Motion")
@export_range(0.0, 32.0, 0.1) var horizontal_amplitude: float = 1.8
@export_range(0.0, 32.0, 0.1) var vertical_amplitude: float = 4.0
@ -23,20 +33,37 @@ const ICON_FILL_RATIO: float = 0.76
@export_range(0.0, TAU, 0.01) var motion_phase: float = 0.0
@export_range(0.0, 0.2, 0.001) var deformation_amplitude: float = 0.016
@export_range(0.1, 30.0, 0.1) var deformation_period: float = 6.0
@export var hover_wiggle_amplitude: Vector2 = Vector2.ZERO
@export_range(0.1, 30.0, 0.1) var hover_wiggle_period: float = 2.0
@export_group("Hover Drawer")
@export var hover_drawer_text: String = ""
@export_enum("Right", "Left Vertical") var hover_drawer_mode: int = 0
@export_range(0.1, 12.0, 0.1) var hover_drawer_speed: float = 4.0
@export_group("Hit Area")
@export var elliptical_hit_area: bool = true
var neutral_position: Vector2 = Vector2.ZERO
var presented_size: Vector2 = Vector2.ZERO
var emphasis: float = 0.0
var _hovered: bool = false
var _drawer_focused: bool = false
var _drawer_reveal: float = 0.0
var _gradient_background: BubbleGradientBackground
var _hover_drawer: BubbleHoverDrawer
func _ready() -> void:
mouse_entered.connect(_set_hovered.bind(true))
mouse_exited.connect(_set_hovered.bind(false))
focus_entered.connect(_set_drawer_focused.bind(true))
focus_exited.connect(_set_drawer_focused.bind(false))
resized.connect(_update_pivot)
_update_pivot()
apply_profile()
_apply_icon_presentation(neutral_size)
_update_hover_drawer()
func _gui_input(event: InputEvent) -> void:
@ -97,6 +124,8 @@ func apply_layout(
presented_size = bubble_size
_update_pivot()
_apply_icon_presentation(bubble_size)
if _hover_drawer != null:
_hover_drawer.refresh_layout()
var label_control: Control = get_label_control()
var font_size := clampi(
roundi(minf(bubble_size.x, bubble_size.y) * font_size_ratio),
@ -134,17 +163,26 @@ func _uses_icon_only_presentation() -> bool:
func _apply_icon_presentation(bubble_size: Vector2) -> void:
if icon == null:
return
vertical_icon_alignment = VERTICAL_ALIGNMENT_CENTER
expand_icon = true
texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST
var fill_ratio: float = (
ICON_FILL_RATIO
if _uses_icon_only_presentation()
else LABELED_ICON_FILL_RATIO
)
if _uses_icon_only_presentation() and icon_fill_ratio_override > 0.0:
fill_ratio = icon_fill_ratio_override
add_theme_constant_override(
"icon_max_width",
maxi(1, roundi(minf(bubble_size.x, bubble_size.y) * fill_ratio)),
)
if not _uses_icon_only_presentation():
return
alignment = HORIZONTAL_ALIGNMENT_CENTER
icon_alignment = HORIZONTAL_ALIGNMENT_CENTER
vertical_icon_alignment = VERTICAL_ALIGNMENT_CENTER
expand_icon = true
texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST
add_theme_constant_override(
"icon_max_width",
maxi(1, roundi(minf(bubble_size.x, bubble_size.y) * ICON_FILL_RATIO)),
)
func advance_emphasis(delta: float) -> void:
@ -154,6 +192,27 @@ func advance_emphasis(delta: float) -> void:
target,
profile.emphasis_speed * delta
)
if _gradient_background != null:
_gradient_background.queue_redraw()
var drawer_target: float = 1.0 if (_hovered or _drawer_focused) else 0.0
_drawer_reveal = move_toward(
_drawer_reveal,
drawer_target,
hover_drawer_speed * delta,
)
if _hover_drawer != null:
_hover_drawer.set_reveal(_drawer_reveal)
func reset_hover_presentation() -> void:
_hovered = false
_drawer_focused = false
emphasis = 0.0
_drawer_reveal = 0.0
if _gradient_background != null:
_gradient_background.queue_redraw()
if _hover_drawer != null:
_hover_drawer.set_reveal(0.0)
func calculate_target(
@ -169,12 +228,17 @@ func calculate_target(
sin(phase * 0.73 + motion_phase) * horizontal_amplitude,
sin(phase) * vertical_amplitude
) * layout_scale * motion_scale
var hover_phase: float = elapsed / hover_wiggle_period * TAU
var hover_offset := Vector2(
sin(hover_phase),
sin(hover_phase * 2.0 + motion_phase) * 0.5,
) * hover_wiggle_amplitude * emphasis * layout_scale * motion_scale
idle_offset.y -= (
profile.hover_focus_lift
* emphasis
* layout_scale
)
return neutral_position + idle_offset
return neutral_position + idle_offset + hover_offset
func calculate_visual_scale(
@ -219,6 +283,8 @@ func apply_presentation(
func _has_point(point: Vector2) -> bool:
if not elliptical_hit_area:
return Rect2(Vector2.ZERO, size).has_point(point)
var radius: Vector2 = size * 0.5
if radius.x <= 0.0 or radius.y <= 0.0:
return false
@ -228,6 +294,12 @@ func _has_point(point: Vector2) -> bool:
func _set_hovered(value: bool) -> void:
_hovered = value
if _gradient_background != null:
_gradient_background.queue_redraw()
func _set_drawer_focused(value: bool) -> void:
_drawer_focused = value
func _update_pivot() -> void:
@ -237,6 +309,7 @@ func _update_pivot() -> void:
func apply_profile() -> void:
if profile == null:
return
_update_gradient_background()
add_theme_stylebox_override("normal", profile.make_normal_style())
var hover_style: StyleBoxFlat = profile.make_hover_style()
add_theme_stylebox_override("hover", hover_style)
@ -251,3 +324,35 @@ func apply_profile() -> void:
var label_control: Control = get_label_control()
if label_control != self:
label_control.add_theme_color_override("font_color", profile.text_color)
func _update_gradient_background() -> void:
if not profile.gradient_enabled:
if _gradient_background != null:
_gradient_background.queue_free()
_gradient_background = null
return
if _gradient_background == null:
_gradient_background = BubbleGradientBackgroundType.new()
_gradient_background.name = "GradientBackground"
add_child(_gradient_background)
move_child(_gradient_background, 0)
_gradient_background.configure(self, profile)
func _update_hover_drawer() -> void:
if hover_drawer_text.is_empty():
if _hover_drawer != null:
_hover_drawer.queue_free()
_hover_drawer = null
return
if _hover_drawer == null:
_hover_drawer = BubbleHoverDrawerType.new()
_hover_drawer.name = "HoverDrawer"
add_child(_hover_drawer)
move_child(_hover_drawer, 0)
_hover_drawer.configure(
self,
hover_drawer_text,
hover_drawer_mode as BubbleHoverDrawer.DrawerMode,
)