Popups e diálogos

Um menu de contexto e dois diálogos, cada um respondendo pelo próprio sinal.

O editor acima está rodando este projeto. Mude uma linha e ele recarrega.

Classes do Godot usadas

PopupMenuAcceptDialogConfirmationDialog

O código

scripts/main.gd
extends Node

var status: Label
var menu: PopupMenu
var accept: AcceptDialog
var confirm: ConfirmationDialog


func _ready() -> void:
	var column: VBoxContainer = _root()

	var title: Label = Label.new()
	title.text = 'Popups and dialogs'
	title.add_theme_font_size_override('font_size', 26)
	column.add_child(title)

	menu = PopupMenu.new()

	for item in ['cut', 'copy', 'paste']:
		menu.add_item(item)

	menu.add_separator()
	menu.add_item('delete')
	menu.id_pressed.connect(func(id: int): _say('menu item %d: %s' % [id, menu.get_item_text(id)]))
	add_child(menu)

	accept = AcceptDialog.new()
	accept.title = 'Heads up'
	accept.dialog_text = 'AcceptDialog has a single button and closes on it.'
	accept.confirmed.connect(func(): _say('accepted'))
	add_child(accept)

	confirm = ConfirmationDialog.new()
	confirm.title = 'Are you sure'
	confirm.dialog_text = 'ConfirmationDialog adds cancel, and each button has its own signal.'
	confirm.confirmed.connect(func(): _say('confirmed'))
	confirm.canceled.connect(func(): _say('canceled'))
	add_child(confirm)

	column.add_child(_button('open the popup menu', func(): menu.popup(Rect2i(get_viewport().get_mouse_position(), Vector2i.ZERO))))
	column.add_child(_button('open AcceptDialog', func(): accept.popup_centered()))
	column.add_child(_button('open ConfirmationDialog', func(): confirm.popup_centered()))

	status = Label.new()
	status.add_theme_color_override('font_color', Color('#8eef97'))
	column.add_child(status)

	_say('every dialog reports back through a signal')


func _button(text: String, action: Callable) -> Button:
	var button: Button = Button.new()
	button.text = text
	button.pressed.connect(action)

	return button


func _say(message: String) -> void:
	status.text = message


func _root() -> VBoxContainer:
	var background: ColorRect = ColorRect.new()
	background.color = Color('#12141a')
	add_child(background)
	background.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)

	var center: CenterContainer = CenterContainer.new()
	add_child(center)
	center.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)

	var column: VBoxContainer = VBoxContainer.new()
	column.add_theme_constant_override('separation', 16)
	center.add_child(column)

	return column

Mais exemplos de Interface