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`.
This commit is contained in:
Raul Santos 2022-03-06 18:04:29 +01:00
parent 1baee2189c
commit 329818f20b
No known key found for this signature in database
GPG key ID: B532473AE3A803E4
10 changed files with 101 additions and 36 deletions

View file

@ -889,7 +889,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;
const Vector<String> options = pi.hint_string.split(",");
int64_t current_val = 0;
for (const String &option : options) {
Vector<String> text_split = option.split(":");
if (text_split.size() != 1) {
current_val = text_split[1].to_int();
}
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<String> value_texts;
const Vector<String> options = pi.hint_string.split(",");
uint32_t v = value;
for (const String &option : options) {
uint32_t current_val;
Vector<String> text_split = option.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 (const String &text : value_texts) {
value_text += " | " + text;
}
button->set_text(value_text);
} else {
button->set_text(value);
}
} else {
button->set_text(value);
}