From 4e636376ca798b99c88d0b19e89b9c4a30956ffe Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Thu, 10 Sep 2020 14:54:35 -0500 Subject: Property Search: Set expansion for subpanels based on results --- source/blender/editors/include/UI_interface.h | 2 +- source/blender/editors/interface/interface_panel.c | 28 ++++++++++++++++++---- source/blender/editors/screen/area.c | 12 ++++------ 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 65b2e2c8484..ad9446f92c7 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -1692,7 +1692,7 @@ void UI_panel_label_offset(struct uiBlock *block, int *r_x, int *r_y); int UI_panel_size_y(const struct Panel *panel); bool UI_panel_is_dragging(const struct Panel *panel); bool UI_panel_matches_search_filter(const struct Panel *panel); -void UI_panel_set_expansion_from_seach_filter(const struct bContext *C, struct Panel *panel); +void UI_panels_set_expansion_from_seach_filter(const struct bContext *C, struct ARegion *region); bool UI_panel_category_is_visible(const struct ARegion *region); void UI_panel_category_add(struct ARegion *region, const char *name); diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c index 6e6de0932e7..8d63bc40ea1 100644 --- a/source/blender/editors/interface/interface_panel.c +++ b/source/blender/editors/interface/interface_panel.c @@ -831,17 +831,35 @@ bool UI_panel_matches_search_filter(const Panel *panel) return search_filter_matches; } -/** - * Uses the panel's search filter flag to set its expansion, - * activating animation if it was closed or opened. - */ -void UI_panel_set_expansion_from_seach_filter(const bContext *C, Panel *panel) +static void panel_set_expansion_from_seach_filter_recursive(const bContext *C, Panel *panel) { short start_flag = panel->flag; SET_FLAG_FROM_TEST(panel->flag, !UI_panel_matches_search_filter(panel), PNL_CLOSED); if (start_flag != panel->flag) { panel_activate_state(C, panel, PANEL_STATE_ANIMATION); } + + /* If the panel is filtered (removed) we need to check that its children are too. */ + LISTBASE_FOREACH (Panel *, child_panel, &panel->children) { + if (panel->type == NULL || (panel->type->flag & PNL_NO_HEADER)) { + continue; + } + panel_set_expansion_from_seach_filter_recursive(C, child_panel); + } +} + +/** + * Uses the panel's search filter flag to set its expansion, + * activating animation if it was closed or opened. + */ +void UI_panels_set_expansion_from_seach_filter(const bContext *C, ARegion *region) +{ + LISTBASE_FOREACH (Panel *, panel, ®ion->panels) { + if (panel->type == NULL || (panel->type->flag & PNL_NO_HEADER)) { + continue; + } + panel_set_expansion_from_seach_filter_recursive(C, panel); + } } /** \} */ diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index e114f598872..067fec01e05 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -2903,13 +2903,11 @@ void ED_region_panels_layout_ex(const bContext *C, } } - if (region->flag & RGN_FLAG_SEARCH_FILTER_UPDATE && - region->flag & RGN_FLAG_SEARCH_FILTER_ACTIVE) { - LISTBASE_FOREACH (Panel *, panel, ®ion->panels) { - if (panel->type == NULL || (panel->type->flag & PNL_NO_HEADER)) { - continue; /* Some panels don't have a type. */ - } - UI_panel_set_expansion_from_seach_filter(C, panel); + /* Update panel expansion based on property search results. */ + if (region->flag & RGN_FLAG_SEARCH_FILTER_UPDATE) { + /* Don't use the last update from the deactivation, or all the panels will be left closed. */ + if (region->flag & RGN_FLAG_SEARCH_FILTER_ACTIVE) { + UI_panels_set_expansion_from_seach_filter(C, region); } } -- cgit v1.2.3