115 lines
3.3 KiB
GDScript3
115 lines
3.3 KiB
GDScript3
|
|
class_name NotepadInkChoice
|
||
|
|
extends OptionButton
|
||
|
|
|
||
|
|
@export var ink_color := Color(0.19, 0.16, 0.12, 1.0)
|
||
|
|
|
||
|
|
@onready var _ink_outline: NotepadInkOutline = %InkOutline
|
||
|
|
|
||
|
|
var _hovered: bool = false
|
||
|
|
var _focused: bool = false
|
||
|
|
|
||
|
|
|
||
|
|
func _ready() -> void:
|
||
|
|
mouse_entered.connect(_set_hovered.bind(true))
|
||
|
|
mouse_exited.connect(_set_hovered.bind(false))
|
||
|
|
focus_entered.connect(_set_focused.bind(true))
|
||
|
|
focus_exited.connect(_set_focused.bind(false))
|
||
|
|
_apply_paper_style()
|
||
|
|
_style_popup()
|
||
|
|
queue_redraw()
|
||
|
|
|
||
|
|
|
||
|
|
func refresh_ink_state() -> void:
|
||
|
|
_refresh_ink()
|
||
|
|
|
||
|
|
|
||
|
|
func _draw() -> void:
|
||
|
|
var chevron_x: float = size.x - 13.0
|
||
|
|
var chevron_y: float = size.y * 0.5 - 1.0
|
||
|
|
var chevron := PackedVector2Array([
|
||
|
|
Vector2(chevron_x - 4.0, chevron_y - 2.0),
|
||
|
|
Vector2(chevron_x, chevron_y + 2.0),
|
||
|
|
Vector2(chevron_x + 4.0, chevron_y - 2.5),
|
||
|
|
])
|
||
|
|
draw_polyline(chevron, ink_color, 1.8, true)
|
||
|
|
var underline_y: float = size.y - 5.0
|
||
|
|
var underline := PackedVector2Array([
|
||
|
|
Vector2(7.0, underline_y),
|
||
|
|
Vector2(size.x * 0.34, underline_y + 0.7),
|
||
|
|
Vector2(size.x * 0.68, underline_y - 0.5),
|
||
|
|
Vector2(size.x - 8.0, underline_y + 0.2),
|
||
|
|
])
|
||
|
|
var underline_color: Color = ink_color
|
||
|
|
underline_color.a = 0.48
|
||
|
|
draw_polyline(underline, underline_color, 1.1, true)
|
||
|
|
|
||
|
|
|
||
|
|
func _set_hovered(value: bool) -> void:
|
||
|
|
_hovered = value
|
||
|
|
_refresh_ink()
|
||
|
|
|
||
|
|
|
||
|
|
func _set_focused(value: bool) -> void:
|
||
|
|
_focused = value
|
||
|
|
_refresh_ink()
|
||
|
|
|
||
|
|
|
||
|
|
func _refresh_ink() -> void:
|
||
|
|
if is_node_ready():
|
||
|
|
_ink_outline.set_mark_strength(
|
||
|
|
0.88 if (_hovered or _focused) and not disabled else 0.0
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
func _apply_paper_style() -> void:
|
||
|
|
var empty := StyleBoxEmpty.new()
|
||
|
|
for state: StringName in [
|
||
|
|
&"normal",
|
||
|
|
&"hover",
|
||
|
|
&"pressed",
|
||
|
|
&"focus",
|
||
|
|
&"disabled",
|
||
|
|
]:
|
||
|
|
add_theme_stylebox_override(state, empty)
|
||
|
|
var empty_arrow := ImageTexture.new()
|
||
|
|
add_theme_icon_override("arrow", empty_arrow)
|
||
|
|
add_theme_color_override("font_color", ink_color)
|
||
|
|
add_theme_color_override("font_hover_color", ink_color.darkened(0.08))
|
||
|
|
add_theme_color_override("font_focus_color", ink_color.darkened(0.08))
|
||
|
|
add_theme_color_override("font_pressed_color", ink_color.darkened(0.14))
|
||
|
|
add_theme_color_override("font_disabled_color", Color(ink_color, 0.42))
|
||
|
|
|
||
|
|
|
||
|
|
func _style_popup() -> void:
|
||
|
|
var popup: PopupMenu = get_popup()
|
||
|
|
var paper := StyleBoxFlat.new()
|
||
|
|
paper.bg_color = Color(0.93, 0.885, 0.73, 1.0)
|
||
|
|
paper.border_color = Color(0.22, 0.19, 0.15, 1.0)
|
||
|
|
paper.set_border_width_all(2)
|
||
|
|
paper.set_corner_radius_all(5)
|
||
|
|
var hover_paper := paper.duplicate() as StyleBoxFlat
|
||
|
|
hover_paper.bg_color = Color(0.82, 0.775, 0.63, 1.0)
|
||
|
|
hover_paper.border_color = Color(0.30, 0.26, 0.20, 0.62)
|
||
|
|
hover_paper.set_border_width_all(1)
|
||
|
|
popup.add_theme_stylebox_override("panel", paper)
|
||
|
|
popup.add_theme_stylebox_override("hover", hover_paper)
|
||
|
|
popup.add_theme_stylebox_override("separator", StyleBoxEmpty.new())
|
||
|
|
popup.add_theme_color_override("font_color", ink_color)
|
||
|
|
popup.add_theme_color_override("font_hover_color", ink_color.darkened(0.08))
|
||
|
|
popup.add_theme_color_override(
|
||
|
|
"font_separator_color",
|
||
|
|
Color(ink_color, 0.56),
|
||
|
|
)
|
||
|
|
var empty_mark := ImageTexture.new()
|
||
|
|
for icon_name: StringName in [
|
||
|
|
&"checked",
|
||
|
|
&"unchecked",
|
||
|
|
&"radio_checked",
|
||
|
|
&"radio_unchecked",
|
||
|
|
&"checked_disabled",
|
||
|
|
&"unchecked_disabled",
|
||
|
|
&"radio_checked_disabled",
|
||
|
|
&"radio_unchecked_disabled",
|
||
|
|
]:
|
||
|
|
popup.add_theme_icon_override(icon_name, empty_mark)
|