70 lines
2.1 KiB
GDScript
70 lines
2.1 KiB
GDScript
class_name Panel90
|
|
extends Control
|
|
## Светлая панель с 1 px контуром и мягкой тенью. Основа всех блоков UI.
|
|
##
|
|
## KIND_GROUP — панель с тонкой полосой заголовка: бирюзовая точка,
|
|
## спокойный заголовок 10 px и волосяной разделитель. Без гравировки.
|
|
|
|
enum Kind { RAISED, SUNKEN, FLAT, GROUP }
|
|
|
|
@export var kind: Kind = Kind.RAISED:
|
|
set(v):
|
|
kind = v
|
|
queue_redraw()
|
|
@export var face: Color = Theme90.FACE:
|
|
set(v):
|
|
face = v
|
|
queue_redraw()
|
|
@export var title := "":
|
|
set(v):
|
|
title = v
|
|
queue_redraw()
|
|
@export var title_right := "":
|
|
set(v):
|
|
title_right = v
|
|
queue_redraw()
|
|
@export var title_size := Theme90.FS_MICRO
|
|
@export var deep := false:
|
|
set(v):
|
|
deep = v
|
|
queue_redraw()
|
|
|
|
|
|
func _ready() -> void:
|
|
if mouse_filter == Control.MOUSE_FILTER_STOP:
|
|
mouse_filter = Control.MOUSE_FILTER_IGNORE
|
|
queue_redraw()
|
|
|
|
|
|
func _draw() -> void:
|
|
var r := Rect2(Vector2.ZERO, size)
|
|
match kind:
|
|
Kind.RAISED:
|
|
draw_style_box(Theme90.box(face, Theme90.BORDER, 4, 1, Theme90.SHADOW), r)
|
|
Kind.SUNKEN:
|
|
draw_style_box(Theme90.well_box(face), r)
|
|
Kind.FLAT:
|
|
draw_rect(r, face)
|
|
Kind.GROUP:
|
|
_draw_group(r)
|
|
|
|
|
|
func _draw_group(r: Rect2) -> void:
|
|
draw_style_box(Theme90.box(face, Theme90.BORDER, 4, 1, Theme90.SHADOW), r)
|
|
var f := Theme90.ui()
|
|
var inner := r.grow(-1.0)
|
|
var head_y := inner.position.y + 5.0
|
|
if not title.is_empty():
|
|
draw_circle(Vector2(inner.position.x + 12.0, head_y + 5.5), 2.5, Theme90.ACCENT)
|
|
Theme90.text(self, f, Vector2(inner.position.x + 20.0, head_y), title,
|
|
title_size, Theme90.NAVY, inner.size.x - 40.0)
|
|
if not title_right.is_empty():
|
|
var tw := f.get_string_size(title_right, HORIZONTAL_ALIGNMENT_LEFT, -1,
|
|
Theme90.FS_MICRO).x
|
|
Theme90.text(self, f, Vector2(inner.end.x - tw - 10.0, head_y + 0.5),
|
|
title_right, Theme90.FS_MICRO, Theme90.SHADE)
|
|
if not title.is_empty() or not title_right.is_empty():
|
|
var ly := inner.position.y + 21.0
|
|
draw_rect(Rect2(inner.position.x + 8.0, ly, maxf(0.0, inner.size.x - 16.0), 1.0),
|
|
Theme90.HAIRLINE)
|