52 lines
1.2 KiB
GDScript
52 lines
1.2 KiB
GDScript
extends Node2D
|
|
|
|
signal action_selected(ID)
|
|
|
|
var next_ID = 1
|
|
var availabilityChecks = {}
|
|
|
|
var defaultOptionsAdded = false
|
|
|
|
var shortcuts = [KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9]
|
|
var action_ids
|
|
|
|
func _process(delta):
|
|
var popupMenu:PopupMenu = $PopupMenu
|
|
if popupMenu.visible:
|
|
for i in range(popupMenu.item_count):
|
|
var currentID = popupMenu.get_item_id(i)
|
|
if currentID < shortcuts.size() and Input.is_action_just_pressed(str(currentID)):
|
|
_on_popup_menu_id_pressed(currentID)
|
|
if currentID == popupMenu.item_count:
|
|
popupMenu.hide()
|
|
break
|
|
|
|
func appear():
|
|
var popupMenu:PopupMenu = $PopupMenu
|
|
popupMenu.show()
|
|
|
|
for i in range(popupMenu.item_count):
|
|
var currentID = popupMenu.get_item_id(i)
|
|
|
|
if currentID in availabilityChecks.keys():
|
|
var result = availabilityChecks[currentID].call()
|
|
popupMenu.set_item_disabled(i, !result)
|
|
|
|
if !defaultOptionsAdded:
|
|
defaultOptionsAdded = true
|
|
add_action("Cancel")
|
|
|
|
func add_availability_check(ID, availabilityCheck):
|
|
availabilityChecks[ID] = availabilityCheck
|
|
|
|
func add_action(actionName):
|
|
$PopupMenu.add_item(actionName, next_ID)
|
|
|
|
var last_ID = next_ID
|
|
next_ID += 1
|
|
|
|
return last_ID
|
|
|
|
func _on_popup_menu_id_pressed(id):
|
|
action_selected.emit(id)
|