gohud

떠 있는 창

← 위젯

GoSurface — 창의 틀

팝업·시트·드롭다운이 전부 이것 하나를 쓴다. 안전영역·가상 키보드·고정 머리말/바닥·스크롤 본문· 가장 위 창 판정·포커스 복원·뒤로가기 소유권·끌어서 높이 조절을 한 곳에서 처리한다.

배치모습쓰는 곳
CENTER화면 가운데 카드확인창·설정
BOTTOM아래에서 올라온 시트목록·관리 페이지
ANCHOR지정한 컨트롤 옆에 붙는 카드드롭다운·컨텍스트 메뉴
스스로 사라지지 않는다. close_requested 를 받아 숨기거나 지우는 것은 소유한 화면이다 — 왜 닫히는지(저장하고 닫기 vs 버리고 닫기)는 틀가 알 수 없다.

GoSheet — 아래에서 올라오는 페이지

var sheet := GoSheet.new()
add_child(sheet)
sheet.open("인벤토리")
sheet.toolbar().add_child(GoStyle.line_edit("검색…"))
sheet.toolbar().visible = true
sheet.footer().add_child(GoStyle.button("닫기", sheet.close, GoStyle.Tone.PRIMARY))
sheet.footer().visible = true

자체 CanvasLayer 를 가져 HUD 위에 확실히 올라온다. open() 은 본문을 비우고 뒤로 버튼·고정 줄을 끈다 — 돌아갈 데가 없는 화면에 죽은 버튼이 남으면 누른 사람은 그것을 고장으로 읽는다.

고정 줄과 스크롤 본문을 나누는 이유. 확인·취소를 body 에 넣으면 목록이 길어질 때 화면 밖으로 밀린다. footer() 는 언제나 보인다.

GoDialogsawait 로 받는 확인·알림

if await dialogs.confirm("저장 삭제", "되돌릴 수 없습니다."):
    delete_save()

confirm(title, body, ok_text, cancel_text, extra, args, destructive) — 본문 뒤는 전부 생략할 수 있고, alert() 는 버튼 하나로 같은 방식이다. 되돌릴 수 없는 일에는 destructive 를 켠다 — 확인 버튼이 채워진 GoStyle.Tone.DANGER_SOLID 버튼이 된다. 밝은 테마에서 옅게 물든 위험 버튼의 글자는 읽히려고 어두워지다 결국 검은 글자로 보이지만, 채워진 버튼은 빨간 바탕에 흰 글자를 지킨다. 창 하나를 재사용하므로 부를 때마다 색을 다시 입히고, 이미 떠 있을 때 부른 confirm() 은 곧바로 false 다. 번역 키로 물을 때는 confirm_key().

버튼 배치. action_layout 기본은 VERTICAL(긴 번역에도 안전)이고, HORIZONTAL 은 반씩 한 줄, AUTO 는 두 문구가 반 폭에 한 줄로 들어갈 때만 한 줄로 두고 아니면 세로로 접는다. action_gap 은 버튼 사이, body_gap 은 본문과 버튼 줄 사이 간격이다 — 버튼 사이보다 넓게 두면 "질문" 과 "고르기" 가 두 덩어리로 읽힌다. 창 하나만 다르게 하려면 열기 직전에 set_next_action_layout(). 버튼 줄은 처음 열 때 지어지므로 오토로드로 둔 GoDialogs 는 부팅 비용이 늘지 않는다.

GoForm — 폭을 제한하는 폼

브레이크포인트마다 최대 폭이 다르고, 가상 키보드가 올라오면 입력 칸이 그 위로 온다.

자손 라벨의 줄바꿈을 보장한다. 없으면 긴 문장 하나가 한 줄로 뻗고, 그 최소 폭이 화면을 넘겨 좌우가 잘린다 — 무슨 화면인지조차 분간할 수 없게 된다. 씬마다 손으로 켜는 방식은 반드시 빠뜨린다.

GoScroll — 손가락 스크롤

안에 하나만 넣는다. 머리말과 버튼 줄은 밖에 둔다 — 목록이 길어지면 그것들이 화면 밖으로 나가면 안 된다. use_panel_edge() 를 부르면 스크롤바가 카드의 기존 여백 자리로 나가고 내용은 원래 들여쓰기를 유지한다.