From 63a10e8365518a4867e6a77f1aeaed7e57884fcd Mon Sep 17 00:00:00 2001 From: Raul Santos Date: Sun, 6 Mar 2022 18:04:29 +0100 Subject: [PATCH] Support explicit values in flag properties, add C# flags support - Add support for explicit values in properties using `PROPERTY_HINT_FLAGS` that works the same way it does for enums. - Fix enums and flags in VisualScriptEditor (it wasn't considering the explicit value). - Use `PROPERTY_HINT_FLAGS` for C# enums with the FlagsAttribute instead of `PROPERTY_HINT_ENUM`. --- visual_script_editor.cpp | 44 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/visual_script_editor.cpp b/visual_script_editor.cpp index 5b8f5ca..2b14df0 100644 --- a/visual_script_editor.cpp +++ b/visual_script_editor.cpp @@ -869,7 +869,49 @@ void VisualScriptEditor::_update_graph(int p_only_id) { EditorResourcePreview::get_singleton()->queue_edited_resource_preview(res, this, "_button_resource_previewed", arr); } else if (pi.type == Variant::INT && pi.hint == PROPERTY_HINT_ENUM) { - button->set_text(pi.hint_string.get_slice(",", value)); + bool found = false; + Vector options = pi.hint_string.split(","); + int64_t current_val = 0; + for (int j = 0; j < options.size(); j++) { + const Vector text_split = options[j].split(":"); + if (text_split.size() != 1) { + current_val = text_split[1].to_int64(); + } + if (value.operator int() == current_val) { + button->set_text(text_split[0]); + found = true; + break; + } + current_val += 1; + } + if (!found) { + button->set_text(value); + } + } else if (pi.type == Variant::INT && pi.hint == PROPERTY_HINT_FLAGS) { + Vector value_texts; + const Vector options = pi.hint_string.split(","); + uint32_t v = value; + for (int j = 0; j < options.size(); j++) { + uint32_t current_val; + Vector text_split = options[j].split(":"); + if (text_split.size() != -1) { + current_val = text_split[1].to_int(); + } else { + current_val = 1 << i; + } + if ((v & current_val) == current_val) { + value_texts.push_back(text_split[0]); + } + } + if (value_texts.size() != 0) { + String value_text = value_texts[0]; + for (int j = 1; j < value_texts.size(); j++) { + value_text += " | " + value_texts[j]; + } + button->set_text(value_text); + } else { + button->set_text(value); + } } else { button->set_text(value); }