Initial WhaleTown V2 frontend
This commit is contained in:
45
scenes/ui/SettingsToggle.gd
Normal file
45
scenes/ui/SettingsToggle.gd
Normal file
@@ -0,0 +1,45 @@
|
||||
extends Button
|
||||
|
||||
# ============================================================================
|
||||
# SettingsToggle.gd - 设置面板开关控件
|
||||
# ============================================================================
|
||||
# 轻量自绘开关,避免默认 CheckButton 的厚重视觉。
|
||||
# ============================================================================
|
||||
|
||||
const ON_COLOR: Color = Color(0.337, 0.690, 0.934, 1.0)
|
||||
const OFF_COLOR: Color = Color(0.805, 0.843, 0.882, 1.0)
|
||||
const KNOB_COLOR: Color = Color(1.0, 1.0, 1.0, 1.0)
|
||||
const SHADOW_COLOR: Color = Color(0.114, 0.286, 0.420, 0.15)
|
||||
|
||||
func _ready() -> void:
|
||||
custom_minimum_size = Vector2(74, 40)
|
||||
focus_mode = Control.FOCUS_NONE
|
||||
mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
|
||||
toggle_mode = true
|
||||
text = ""
|
||||
add_theme_stylebox_override("normal", StyleBoxEmpty.new())
|
||||
add_theme_stylebox_override("hover", StyleBoxEmpty.new())
|
||||
add_theme_stylebox_override("pressed", StyleBoxEmpty.new())
|
||||
add_theme_stylebox_override("focus", StyleBoxEmpty.new())
|
||||
toggled.connect(func(_pressed: bool) -> void: queue_redraw())
|
||||
|
||||
func _draw() -> void:
|
||||
var trackRect: Rect2 = Rect2(Vector2(6, 7), Vector2(size.x - 12, size.y - 14))
|
||||
var radius: float = trackRect.size.y * 0.5
|
||||
var color: Color = ON_COLOR if button_pressed else OFF_COLOR
|
||||
draw_style_box(_create_round_box(color, int(radius)), trackRect)
|
||||
|
||||
var knobRadius: float = max(10.0, trackRect.size.y * 0.38)
|
||||
var x: float = trackRect.position.x + trackRect.size.x - radius if button_pressed else trackRect.position.x + radius
|
||||
var center: Vector2 = Vector2(x, trackRect.position.y + radius)
|
||||
draw_circle(center + Vector2(0, 1.2), knobRadius + 0.4, SHADOW_COLOR)
|
||||
draw_circle(center, knobRadius, KNOB_COLOR)
|
||||
|
||||
func _create_round_box(color: Color, radius: int) -> StyleBoxFlat:
|
||||
var style := StyleBoxFlat.new()
|
||||
style.bg_color = color
|
||||
style.corner_radius_top_left = radius
|
||||
style.corner_radius_top_right = radius
|
||||
style.corner_radius_bottom_left = radius
|
||||
style.corner_radius_bottom_right = radius
|
||||
return style
|
||||
Reference in New Issue
Block a user