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)