Rebrand project and refresh title presentation
This commit is contained in:
parent
17fef2c5d4
commit
7ae20789a9
138 changed files with 1511 additions and 1498 deletions
|
|
@ -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,
|
||||
)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue