gohud

Skins — where a Theme cannot reach

← Theming

MethodDecides
surface_box · floating_box · overlay_boxCard and panel faces, floating surfaces, pills laid over the game or a map
chip_box · chip_inkA chip's panel and the label colour that stays legible on it
slot_box · slot_inkQuick-slot faces and their text
disc_boxThe circle behind an avatar or badge
alert_box · skeleton_box · segment_boxInline alerts, placeholders, segmented controls
coach_ring_boxThe mark a coach tour puts around its target
draw_joystick · draw_coach_pointerThings drawn directly — the joystick and its pointer
divider_color · divider_thickness · section_boxDividers and section headings
badge_boxQuick-slot badges — quantity and time left
progress_fill_box · notice_box · tint_noticeBar fills (outlined where a fill cannot reach 3:1 on its track) and snackbars
class_name MySkin extends GoSkin

func draw_joystick(canvas: CanvasItem, center: Vector2, knob: Vector2,
        radius: float, knob_radius: float, ink: Color, base: Color, active: bool) -> void:
    # The widget has already worked out the positions — only drawing happens here
    canvas.draw_circle(center, radius, Color(base, 0.4))
    canvas.draw_circle(knob, knob_radius, ink)

Shapes StyleBoxFlat cannot make

ClassWhat it draws
GoStyleBoxCutDiagonally cut corners, one thickened accent edge, an outer glow
GoStyleBoxBracketCorner marks only, leaving the content unenclosed
GoStyleBoxMedievalA forged frame — rivets, corner engraving, a bevel highlight and iron, leather or parchment grain

All three serialise into a Theme resource like any other StyleBox — which is what lets a theme change shape.

Give padding through content_margin_*. Subclassing StyleBox in GDScript means _get_style_margin() is never called (measured on Godot 4.7). Fill the built-in fields or content will sit against the border.