Skip to content

Commit a29e913

Browse files
committed
Add "Incomplete" filter to object tree
Allows filtering out objects marked as "complete".
1 parent 49257dc commit a29e913

File tree

1 file changed

+23
-4
lines changed

1 file changed

+23
-4
lines changed

src/views/config.rs

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ pub struct ConfigViewState {
4242
pub load_error: Option<String>,
4343
pub object_search: String,
4444
pub filter_diffable: bool,
45+
pub filter_incomplete: bool,
4546
#[cfg(windows)]
4647
pub available_wsl_distros: Option<Vec<String>>,
4748
}
@@ -277,6 +278,13 @@ pub fn config_ui(
277278
{
278279
state.filter_diffable = !state.filter_diffable;
279280
}
281+
if ui
282+
.selectable_label(state.filter_incomplete, "Incomplete")
283+
.on_hover_text_at_pointer("Only show objects not marked complete")
284+
.clicked()
285+
{
286+
state.filter_incomplete = !state.filter_incomplete;
287+
}
280288
});
281289
if state.object_search.is_empty() {
282290
if had_search {
@@ -296,12 +304,19 @@ pub fn config_ui(
296304
.default_open(true)
297305
.show(ui, |ui| {
298306
let mut nodes = Cow::Borrowed(object_nodes);
299-
if !state.object_search.is_empty() || state.filter_diffable {
307+
if !state.object_search.is_empty() || state.filter_diffable || state.filter_incomplete {
300308
let search = state.object_search.to_ascii_lowercase();
301309
nodes = Cow::Owned(
302310
object_nodes
303311
.iter()
304-
.filter_map(|node| filter_node(node, &search, state.filter_diffable))
312+
.filter_map(|node| {
313+
filter_node(
314+
node,
315+
&search,
316+
state.filter_diffable,
317+
state.filter_incomplete,
318+
)
319+
})
305320
.collect(),
306321
);
307322
}
@@ -435,26 +450,30 @@ fn filter_node(
435450
node: &ProjectObjectNode,
436451
search: &str,
437452
filter_diffable: bool,
453+
filter_incomplete: bool,
438454
) -> Option<ProjectObjectNode> {
439455
match node {
440456
ProjectObjectNode::File(name, object) => {
441457
if (search.is_empty() || name.to_ascii_lowercase().contains(search))
442458
&& (!filter_diffable
443459
|| (object.base_path.is_some() && object.target_path.is_some()))
460+
&& (!filter_incomplete || matches!(object.complete, None | Some(false)))
444461
{
445462
Some(node.clone())
446463
} else {
447464
None
448465
}
449466
}
450467
ProjectObjectNode::Dir(name, children) => {
451-
if (search.is_empty() || name.to_ascii_lowercase().contains(search)) && !filter_diffable
468+
if (search.is_empty() || name.to_ascii_lowercase().contains(search))
469+
&& !filter_diffable
470+
&& !filter_incomplete
452471
{
453472
return Some(node.clone());
454473
}
455474
let new_children = children
456475
.iter()
457-
.filter_map(|child| filter_node(child, search, filter_diffable))
476+
.filter_map(|child| filter_node(child, search, filter_diffable, filter_incomplete))
458477
.collect::<Vec<_>>();
459478
if !new_children.is_empty() {
460479
Some(ProjectObjectNode::Dir(name.clone(), new_children))

0 commit comments

Comments
 (0)