瀏覽代碼

Allow auto-generated node names in `PopupMenu::add_submenu_item`

Yuri Sizov 1 年之前
父節點
當前提交
edcad2ea88
共有 3 個文件被更改,包括 12 次插入3 次删除
  1. 6 1
      core/string/ustring.cpp
  2. 1 1
      core/string/ustring.h
  3. 5 1
      scene/gui/popup_menu.cpp

+ 6 - 1
core/string/ustring.cpp

@@ -4699,11 +4699,16 @@ String String::property_name_encode() const {
 
 static const char32_t invalid_node_name_characters[] = { '.', ':', '@', '/', '\"', UNIQUE_NODE_PREFIX[0], 0 };
 
-String String::get_invalid_node_name_characters() {
+String String::get_invalid_node_name_characters(bool p_allow_internal) {
 	// Do not use this function for critical validation.
 	String r;
 	const char32_t *c = invalid_node_name_characters;
 	while (*c) {
+		if (p_allow_internal && *c == '@') {
+			c++;
+			continue;
+		}
+
 		if (c != invalid_node_name_characters) {
 			r += " ";
 		}

+ 1 - 1
core/string/ustring.h

@@ -437,7 +437,7 @@ public:
 	String property_name_encode() const;
 
 	// node functions
-	static String get_invalid_node_name_characters();
+	static String get_invalid_node_name_characters(bool p_allow_internal = false);
 	String validate_node_name() const;
 	String validate_identifier() const;
 	String validate_filename() const;

+ 5 - 1
scene/gui/popup_menu.cpp

@@ -1487,7 +1487,11 @@ void PopupMenu::add_icon_radio_check_shortcut(const Ref<Texture2D> &p_icon, cons
 }
 
 void PopupMenu::add_submenu_item(const String &p_label, const String &p_submenu, int p_id) {
-	ERR_FAIL_COND_MSG(p_submenu.validate_node_name() != p_submenu, "Invalid node name for submenu, the following characters are not allowed:\n" + String::get_invalid_node_name_characters());
+	String submenu_name_safe = p_submenu.replace("@", "_"); // Allow special characters for auto-generated names.
+	if (submenu_name_safe.validate_node_name() != submenu_name_safe) {
+		ERR_FAIL_MSG(vformat("Invalid node name '%s' for a submenu, the following characters are not allowed:\n%s", p_submenu, String::get_invalid_node_name_characters(true)));
+	}
+
 	Item item;
 	item.text = p_label;
 	item.xl_text = atr(p_label);