From 481c49dfe576f53ea5c6519c4916a47df81fe3ee Mon Sep 17 00:00:00 2001 From: Dmitry Stepanov Date: Sun, 7 Dec 2025 09:46:21 +0300 Subject: [PATCH] take filter into account when checking if a folder is empty - renamed confusing `SetExpanderShown` --- fyrox-ui/src/file_browser/fs_tree.rs | 37 ++++++++++++++++++++-------- fyrox-ui/src/file_browser/mod.rs | 3 ++- fyrox-ui/src/tree.rs | 4 +-- 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/fyrox-ui/src/file_browser/fs_tree.rs b/fyrox-ui/src/file_browser/fs_tree.rs index 00cb29c0c..14ab52c2d 100644 --- a/fyrox-ui/src/file_browser/fs_tree.rs +++ b/fyrox-ui/src/file_browser/fs_tree.rs @@ -112,6 +112,7 @@ pub fn build_tree_item>( parent_path: P, menu: RcUiNodeHandle, expanded: bool, + filter: &PathFilter, ctx: &mut BuildContext, ) -> Handle { let content = GridBuilder::new( @@ -155,17 +156,17 @@ pub fn build_tree_item>( .add_column(Column::stretch()) .build(ctx); - let is_dir_empty = path - .as_ref() - .read_dir() - .map_or(true, |mut f| f.next().is_none()); + let is_dir_not_empty = path.as_ref().read_dir().is_ok_and(|iter| { + iter.flatten() + .any(|entry| filter.supports_all(&entry.path())) + }); TreeBuilder::new( WidgetBuilder::new() .with_user_data_value(TreeItemPath::non_root(path.as_ref().to_owned())) .with_context_menu(menu), ) .with_expanded(expanded) - .with_always_show_expander(!is_dir_empty) + .with_always_show_expander(is_dir_not_empty) .with_content(content) .build(ctx) } @@ -175,9 +176,10 @@ pub fn build_tree>( path: P, parent_path: P, menu: RcUiNodeHandle, + filter: &PathFilter, ui: &mut UserInterface, ) -> Handle { - let subtree = build_tree_item(path, parent_path, menu, false, &mut ui.build_ctx()); + let subtree = build_tree_item(path, parent_path, menu, false, filter, &mut ui.build_ctx()); if ui[parent].has_component::() { ui.send(parent, TreeRootMessage::AddItem(subtree)); } else { @@ -320,6 +322,7 @@ impl RootsCollection { path_components: &[Component], root: Option<&PathBuf>, menu: &RcUiNodeHandle, + filter: &PathFilter, ctx: &mut BuildContext, ) -> Self { if root.is_none() { @@ -342,8 +345,14 @@ impl RootsCollection { for (disk, disk_letter) in DisksProvider::new().iter() { let is_disk_part_of_path = dest_disk == Some(disk_letter); - let item = - build_tree_item(disk.as_ref(), "", menu.clone(), is_disk_part_of_path, ctx); + let item = build_tree_item( + disk.as_ref(), + "", + menu.clone(), + is_disk_part_of_path, + filter, + ctx, + ); if is_disk_part_of_path { root_item = item; @@ -378,7 +387,14 @@ pub fn build_single_folder( }; for path in entries { - build_tree(tree_item, path.as_path(), parent_path, menu.clone(), ui); + build_tree( + tree_item, + path.as_path(), + parent_path, + menu.clone(), + filter, + ui, + ); } } @@ -423,7 +439,7 @@ impl FsTree { let RootsCollection { items: mut root_items, root_item: mut parent, - } = RootsCollection::new(&dest_path_components, root, &menu, ctx); + } = RootsCollection::new(&dest_path_components, root, &menu, filter, ctx); let mut path_item = Handle::NONE; @@ -460,6 +476,7 @@ impl FsTree { &full_path, menu.clone(), is_part_of_final_path, + filter, ctx, ); diff --git a/fyrox-ui/src/file_browser/mod.rs b/fyrox-ui/src/file_browser/mod.rs index b721f984d..b939afd86 100644 --- a/fyrox-ui/src/file_browser/mod.rs +++ b/fyrox-ui/src/file_browser/mod.rs @@ -304,7 +304,7 @@ impl FileBrowser { if tree.is_expanded { need_build_tree = true; } else if !tree.always_show_expander { - ui.send(tree.handle(), TreeMessage::SetExpanderShown(true)) + ui.send(tree.handle(), TreeMessage::ExpanderVisible(true)) } } else if ui.node(parent_node).cast::().is_some() { need_build_tree = true; @@ -315,6 +315,7 @@ impl FileBrowser { path, &parent_path, self.item_context_menu.clone(), + &self.filter, ui, ); } diff --git a/fyrox-ui/src/tree.rs b/fyrox-ui/src/tree.rs index 9d511edff..98fc79adf 100644 --- a/fyrox-ui/src/tree.rs +++ b/fyrox-ui/src/tree.rs @@ -82,7 +82,7 @@ pub enum TreeMessage { RemoveItem(Handle), /// A message, that is used to prevent expander from being hidden when a tree does not have /// any child items. - SetExpanderShown(bool), + ExpanderVisible(bool), /// A message, that is used to specify a new set of children items of a tree. SetItems { /// A set of handles to new tree items. @@ -521,7 +521,7 @@ impl Control for Tree { } } } - &TreeMessage::SetExpanderShown(show) => { + &TreeMessage::ExpanderVisible(show) => { self.always_show_expander = show; self.invalidate_arrange(); }