From f0362cd37b2ae3f3ddf4d6a4d54f44ecd87f4a69 Mon Sep 17 00:00:00 2001 From: Yogendra Manawat Date: Thu, 27 Jul 2023 12:54:40 +0530 Subject: [PATCH] Fixed Tree Selection Bug --- scene/gui/tree.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index ee9c6573f4a..7038145c800 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) {