gohud

หน้าต่างลอย

← วิดเจ็ต

GoSurface — เปลือกนอก

ป๊อปอัป ชีต และดรอปดาวน์ ล้วนใช้ตัวนี้ตัวเดียว มันจัดการเซฟแอเรีย คีย์บอร์ดเสมือน หัวและท้ายที่ติดหนึบ เนื้อหาที่เลื่อนได้ การตัดสินว่าหน้าต่างไหนอยู่บนสุด การคืนโฟกัส ความเป็นเจ้าของปุ่มย้อนกลับ และการลากปรับขนาด

ตำแหน่งหน้าตาเป็นอย่างไรใช้กับอะไร
CENTERการ์ดกลางจอกล่องยืนยัน หน้าตั้งค่า
BOTTOMชีตที่ยกขึ้นมาจากด้านล่างรายการต่าง ๆ หน้าจัดการ
ANCHORการ์ดที่ตรึงไว้ข้างคอนโทรลหนึ่งดรอปดาวน์ เมนูคลิกขวา
มันไม่ลบตัวเองทิ้ง การตอบสนองต่อ close_requested — จะซ่อนหรือจะคืนหน่วยความจำ — เป็นหน้าที่ของหน้าจอที่เป็นเจ้าของ เพราะตัวเปลือกไม่มีทางรู้ว่ามันกำลังถูกปิดด้วยเหตุผลอะไร (บันทึกแล้วปิด หรือทิ้งไปเลย)

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() จะล้างเนื้อหาในตัวชีตและปิดปุ่มย้อนกลับกับแถวติดหนึบ — ปุ่มที่กดไม่ได้บนหน้าจอที่ไม่มีที่ให้ย้อนกลับ ทำให้คนอ่านว่าแอปพัง

GoDialogs — กล่องยืนยันที่ await ได้

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 เป็น autoload จึงไม่เพิ่มภาระตอนเปิดเกมเลย

GoForm — ฟอร์มที่จำกัดความกว้าง

มันรับประกันว่าป้ายข้อความที่เป็นลูกหลานของมันจะตัดบรรทัด ถ้าไม่มีสิ่งนี้ ประโยคยาว ๆ ประโยคเดียว จะยืดเป็นบรรทัดเดียวที่ความกว้างขั้นต่ำเกินหน้าจอ แล้วสองข้างจะถูกตัดหาย — จนดูไม่ออกด้วยซ้ำว่า คุณอยู่หน้าจอไหน ส่วนการไล่เปิดการตัดบรรทัดด้วยมือทีละซีนนั้น ลืมทุกครั้ง

GoScroll — การเลื่อนด้วยนิ้ว

ใส่ของไว้ข้างในแค่ ชิ้นเดียว ส่วนหัวและแถวปุ่มต้องอยู่ข้างนอก — รายการยาว ๆ ต้องไม่ดันมันตกจอไป use_panel_edge() ย้ายแถบเลื่อนเข้าไปอยู่ในระยะขอบที่การ์ดมีอยู่แล้ว ขณะที่เนื้อหายังคงระยะย่อหน้าเดิมไว้