diff options
author | Haoyu Qiu <timothyqiu32@gmail.com> | 2022-08-31 09:26:54 +0800 |
---|---|---|
committer | Haoyu Qiu <timothyqiu32@gmail.com> | 2022-08-31 15:50:23 +0800 |
commit | 97f547a63aa1d99ad9cd20f30f674590344aff2a (patch) | |
tree | 0563ba33decff25aa373fdfc5ef7761f6eccce33 /editor | |
parent | c40855f8189e603bdadca8d32fa7988a249ed96b (diff) |
Fix crash when toggling flag property value
Diffstat (limited to 'editor')
-rw-r--r-- | editor/editor_properties.cpp | 47 |
1 files changed, 28 insertions, 19 deletions
diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp index b7910a152e..21f6be4584 100644 --- a/editor/editor_properties.cpp +++ b/editor/editor_properties.cpp @@ -832,26 +832,35 @@ void EditorPropertyFlags::setup(const Vector<String> &p_options) { bool first = true; uint32_t current_val; for (int i = 0; i < p_options.size(); i++) { + // An empty option is not considered a "flag". String option = p_options[i].strip_edges(); - if (!option.is_empty()) { - CheckBox *cb = memnew(CheckBox); - cb->set_text(option); - cb->set_clip_text(true); - cb->connect("pressed", callable_mp(this, &EditorPropertyFlags::_flag_toggled).bind(i)); - add_focusable(cb); - vbox->add_child(cb); - flags.push_back(cb); - Vector<String> text_split = p_options[i].split(":"); - if (text_split.size() != 1) { - current_val = text_split[1].to_int(); - } else { - current_val = 1 << i; - } - flag_values.push_back(current_val); - if (first) { - set_label_reference(cb); - first = false; - } + if (option.is_empty()) { + continue; + } + const int flag_index = flags.size(); // Index of the next element (added by the code below). + + // Value for a flag can be explicitly overridden. + Vector<String> text_split = p_options[i].split(":"); + if (text_split.size() != 1) { + current_val = text_split[1].to_int(); + } else { + current_val = 1 << i; + } + flag_values.push_back(current_val); + + // Create a CheckBox for the current flag. + CheckBox *cb = memnew(CheckBox); + cb->set_text(option); + cb->set_clip_text(true); + cb->connect("pressed", callable_mp(this, &EditorPropertyFlags::_flag_toggled).bind(flag_index)); + add_focusable(cb); + vbox->add_child(cb); + flags.push_back(cb); + + // Can't use `i == 0` because we want to find the first none-empty option. + if (first) { + set_label_reference(cb); + first = false; } } } |