diff options
-rw-r--r-- | scene/gui/tree.cpp | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index ee9c6573f4..7038145c80 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -247,29 +247,30 @@ void TreeItem::_propagate_check_through_parents(int p_column, bool p_emit_signal return; } - bool all_unchecked_and_not_indeterminate = true; - bool any_unchecked_or_indeterminate = false; + bool any_checked = false; + bool any_unchecked = false; + bool any_indeterminate = false; TreeItem *child_item = current->get_first_child(); while (child_item) { if (!child_item->is_checked(p_column)) { - any_unchecked_or_indeterminate = true; + any_unchecked = true; if (child_item->is_indeterminate(p_column)) { - all_unchecked_and_not_indeterminate = false; + any_indeterminate = true; break; } } else { - all_unchecked_and_not_indeterminate = false; + any_checked = true; } child_item = child_item->get_next(); } - if (all_unchecked_and_not_indeterminate) { - current->set_checked(p_column, false); - } else if (any_unchecked_or_indeterminate) { + if (any_indeterminate || (any_checked && any_unchecked)) { current->set_indeterminate(p_column, true); + } else if (current->is_indeterminate(p_column) && !any_checked) { + current->set_indeterminate(p_column, false); } else { - current->set_checked(p_column, true); + current->set_checked(p_column, any_checked); } if (p_emit_signal) { |