Skip to content

Commit b4650b6

Browse files
committed
Hide auto-generated objects in object list
With filter option to display them, if desired. decomp-toolkit will start writing auto-generated objects in objdiff.json for reporting purposes, so this maintains the existing behavior.
1 parent 1953799 commit b4650b6

File tree

2 files changed

+32
-41
lines changed

2 files changed

+32
-41
lines changed

objdiff-core/src/config/mod.rs

+4
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,10 @@ impl ProjectObject {
120120
#[allow(deprecated)]
121121
self.metadata.as_ref().and_then(|m| m.reverse_fn_order).or(self.reverse_fn_order)
122122
}
123+
124+
pub fn hidden(&self) -> bool {
125+
self.metadata.as_ref().and_then(|m| m.auto_generated).unwrap_or(false)
126+
}
123127
}
124128

125129
#[derive(Default, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize)]

objdiff-gui/src/views/config.rs

+28-41
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#[cfg(all(windows, feature = "wsl"))]
22
use std::string::FromUtf16Error;
33
use std::{
4-
borrow::Cow,
54
mem::take,
65
path::{PathBuf, MAIN_SEPARATOR},
76
};
@@ -50,6 +49,7 @@ pub struct ConfigViewState {
5049
pub object_search: String,
5150
pub filter_diffable: bool,
5251
pub filter_incomplete: bool,
52+
pub show_hidden: bool,
5353
#[cfg(all(windows, feature = "wsl"))]
5454
pub available_wsl_distros: Option<Vec<String>>,
5555
pub file_dialog_state: FileDialogState,
@@ -283,20 +283,18 @@ pub fn config_ui(
283283
root_open = Some(true);
284284
node_open = NodeOpen::Object;
285285
}
286-
if ui
287-
.selectable_label(state.filter_diffable, "Diffable")
288-
.on_hover_text_at_pointer("Only show objects with a source file")
289-
.clicked()
290-
{
291-
state.filter_diffable = !state.filter_diffable;
292-
}
293-
if ui
294-
.selectable_label(state.filter_incomplete, "Incomplete")
295-
.on_hover_text_at_pointer("Only show objects not marked complete")
296-
.clicked()
297-
{
298-
state.filter_incomplete = !state.filter_incomplete;
286+
let mut filters_text = RichText::new("Filter ⏷");
287+
if state.filter_diffable || state.filter_incomplete || state.show_hidden {
288+
filters_text = filters_text.color(appearance.replace_color);
299289
}
290+
egui::menu::menu_button(ui, filters_text, |ui| {
291+
ui.checkbox(&mut state.filter_diffable, "Diffable")
292+
.on_hover_text_at_pointer("Only show objects with a source file");
293+
ui.checkbox(&mut state.filter_incomplete, "Incomplete")
294+
.on_hover_text_at_pointer("Only show objects not marked complete");
295+
ui.checkbox(&mut state.show_hidden, "Hidden")
296+
.on_hover_text_at_pointer("Show hidden (auto-generated) objects");
297+
});
300298
});
301299
if state.object_search.is_empty() {
302300
if had_search {
@@ -315,27 +313,18 @@ pub fn config_ui(
315313
.open(root_open)
316314
.default_open(true)
317315
.show(ui, |ui| {
318-
let mut nodes = Cow::Borrowed(object_nodes);
319-
if !state.object_search.is_empty() || state.filter_diffable || state.filter_incomplete {
320-
let search = state.object_search.to_ascii_lowercase();
321-
nodes = Cow::Owned(
322-
object_nodes
323-
.iter()
324-
.filter_map(|node| {
325-
filter_node(
326-
node,
327-
&search,
328-
state.filter_diffable,
329-
state.filter_incomplete,
330-
)
331-
})
332-
.collect(),
333-
);
334-
}
335-
316+
let search = state.object_search.to_ascii_lowercase();
336317
ui.style_mut().wrap = Some(false);
337-
for node in nodes.iter() {
338-
display_node(ui, &mut new_selected_obj, node, appearance, node_open);
318+
for node in object_nodes.iter().filter_map(|node| {
319+
filter_node(
320+
node,
321+
&search,
322+
state.filter_diffable,
323+
state.filter_incomplete,
324+
state.show_hidden,
325+
)
326+
}) {
327+
display_node(ui, &mut new_selected_obj, &node, appearance, node_open);
339328
}
340329
});
341330
}
@@ -464,29 +453,27 @@ fn filter_node(
464453
search: &str,
465454
filter_diffable: bool,
466455
filter_incomplete: bool,
456+
show_hidden: bool,
467457
) -> Option<ProjectObjectNode> {
468458
match node {
469459
ProjectObjectNode::File(name, object) => {
470460
if (search.is_empty() || name.to_ascii_lowercase().contains(search))
471461
&& (!filter_diffable
472462
|| (object.base_path.is_some() && object.target_path.is_some()))
473463
&& (!filter_incomplete || matches!(object.complete(), None | Some(false)))
464+
&& (show_hidden || !object.hidden())
474465
{
475466
Some(node.clone())
476467
} else {
477468
None
478469
}
479470
}
480471
ProjectObjectNode::Dir(name, children) => {
481-
if (search.is_empty() || name.to_ascii_lowercase().contains(search))
482-
&& !filter_diffable
483-
&& !filter_incomplete
484-
{
485-
return Some(node.clone());
486-
}
487472
let new_children = children
488473
.iter()
489-
.filter_map(|child| filter_node(child, search, filter_diffable, filter_incomplete))
474+
.filter_map(|child| {
475+
filter_node(child, search, filter_diffable, filter_incomplete, show_hidden)
476+
})
490477
.collect::<Vec<_>>();
491478
if !new_children.is_empty() {
492479
Some(ProjectObjectNode::Dir(name.clone(), new_children))

0 commit comments

Comments
 (0)